Lines Matching refs:L
13 lua_State *L; member
26 lua_State *L = c->L; in _mcplib_append_stats() local
28 lua_pushlstring(L, key, klen); in _mcplib_append_stats()
29 lua_pushlstring(L, val, vlen); in _mcplib_append_stats()
30 lua_rawset(L, -3); in _mcplib_append_stats()
43 lua_State *L = c->L; in _mcplib_append_section_stats() local
45 int tidx = lua_absindex(L, -1); in _mcplib_append_section_stats()
55 if (lua_rawgeti(L, tidx, section) == LUA_TNIL) { in _mcplib_append_section_stats()
56 lua_pop(L, 1); // drop the nil in _mcplib_append_section_stats()
58 lua_newtable(L); in _mcplib_append_section_stats()
59 lua_pushvalue(L, -1); // copy the table in _mcplib_append_section_stats()
60 lua_rawseti(L, tidx, section); // remember the table in _mcplib_append_section_stats()
64 lua_pushstring(L, stat); in _mcplib_append_section_stats()
65 lua_pushlstring(L, val, vlen); in _mcplib_append_section_stats()
66 lua_rawset(L, -3); // put key/val into sub-table in _mcplib_append_section_stats()
67 lua_pop(L, 1); // pop sub-table. in _mcplib_append_section_stats()
70 lua_pushlstring(L, key, klen); in _mcplib_append_section_stats()
71 lua_pushlstring(L, val, vlen); in _mcplib_append_section_stats()
72 lua_rawset(L, tidx); in _mcplib_append_section_stats()
77 static int mcplib_server_stats(lua_State *L) { in mcplib_server_stats() argument
78 int argc = lua_gettop(L); in mcplib_server_stats()
79 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_server_stats()
80 lua_newtable(L); // the table to return. in mcplib_server_stats()
82 L, in mcplib_server_stats()
85 if (argc == 0 || lua_isnil(L, 1)) { in mcplib_server_stats()
89 const char *cmd = luaL_checkstring(L, 1); in mcplib_server_stats()
109 proxy_lua_error(L, "unknown subcommand passed to server_stats"); in mcplib_server_stats()
136 static int mcplib_register_cron(lua_State *L) { in mcplib_register_cron() argument
137 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_register_cron()
138 const char *name = luaL_checkstring(L, 1); in mcplib_register_cron()
139 luaL_checktype(L, 2, LUA_TTABLE); in mcplib_register_cron()
142 mcp_cron_t *ce = lua_newuserdatauv(L, sizeof(mcp_cron_t), 1); in mcplib_register_cron()
150 if (lua_getfield(L, 2, "func") != LUA_TNIL) { in mcplib_register_cron()
151 luaL_checktype(L, -1, LUA_TFUNCTION); in mcplib_register_cron()
152 lua_setiuservalue(L, 3, 1); // pop value in mcplib_register_cron()
154 proxy_lua_error(L, "proxy cron entry missing 'func' field"); in mcplib_register_cron()
158 if (lua_getfield(L, 2, "rerun") != LUA_TNIL) { in mcplib_register_cron()
159 int rerun = lua_toboolean(L, -1); in mcplib_register_cron()
164 lua_pop(L, 1); // pop val or nil in mcplib_register_cron()
168 if (lua_getfield(L, 2, "every") != LUA_TNIL) { in mcplib_register_cron()
169 luaL_checktype(L, -1, LUA_TNUMBER); in mcplib_register_cron()
170 int every = lua_tointeger(L, -1); in mcplib_register_cron()
172 proxy_lua_error(L, "proxy cron entry 'every' must be > 0"); in mcplib_register_cron()
177 proxy_lua_error(L, "proxy cron entry missing 'every' field"); in mcplib_register_cron()
180 lua_pop(L, 1); // pop val or nil in mcplib_register_cron()
189 lua_rawgeti(L, LUA_REGISTRYINDEX, ctx->cron_ref); in mcplib_register_cron()
194 if (lua_getfield(L, -1, name) != LUA_TNIL) { in mcplib_register_cron()
195 mcp_cron_t *oldce = lua_touserdata(L, -1); in mcplib_register_cron()
200 lua_pop(L, 1); // drop val/nil in mcplib_register_cron()
202 lua_pushvalue(L, 3); // duplicate cron entry in mcplib_register_cron()
203 lua_setfield(L, -2, name); // pop duplicate cron entry in mcplib_register_cron()
204 lua_pop(L, 1); // drop cron table in mcplib_register_cron()
217 static int mcplib_schedule_config_reload(lua_State *L) { in mcplib_schedule_config_reload() argument
218 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_schedule_config_reload()
223 static int mcplib_time_real_millis(lua_State *L) { in mcplib_time_real_millis() argument
227 lua_pushinteger(L, t); in mcplib_time_real_millis()
231 static int mcplib_time_mono_millis(lua_State *L) { in mcplib_time_mono_millis() argument
235 lua_pushinteger(L, t); in mcplib_time_mono_millis()
248 static int mcplib_backend_wrap_gc(lua_State *L) { in mcplib_backend_wrap_gc() argument
249 mcp_backend_wrap_t *bew = luaL_checkudata(L, -1, "mcp.backendwrap"); in mcplib_backend_wrap_gc()
250 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_wrap_gc()
287 static int mcplib_backend_gc(lua_State *L) { in mcplib_backend_gc() argument
297 static int mcplib_backend(lua_State *L) { in mcplib_backend() argument
301 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend()
302 mcp_backend_label_t *be = lua_newuserdatauv(L, sizeof(mcp_backend_label_t), 0); in mcplib_backend()
311 if (lua_istable(L, 1)) { in mcplib_backend()
315 if (lua_getfield(L, 1, "label") != LUA_TNIL) { in mcplib_backend()
316 label = luaL_checklstring(L, -1, &llen); in mcplib_backend()
318 proxy_lua_error(L, "backend must have a label argument"); in mcplib_backend()
322 if (lua_getfield(L, 1, "host") != LUA_TNIL) { in mcplib_backend()
323 name = luaL_checklstring(L, -1, &nlen); in mcplib_backend()
325 proxy_lua_error(L, "backend must have a host argument"); in mcplib_backend()
330 if (lua_getfield(L, 1, "port") != LUA_TNIL) { in mcplib_backend()
331 port = luaL_checklstring(L, -1, &plen); in mcplib_backend()
333 proxy_lua_error(L, "backend must have a port argument"); in mcplib_backend()
337 if (lua_getfield(L, 1, "tcpkeepalive") != LUA_TNIL) { in mcplib_backend()
338 be->tunables.tcp_keepalive = lua_toboolean(L, -1); in mcplib_backend()
340 lua_pop(L, 1); in mcplib_backend()
342 if (lua_getfield(L, 1, "tls") != LUA_TNIL) { in mcplib_backend()
343 be->tunables.use_tls = lua_toboolean(L, -1); in mcplib_backend()
345 lua_pop(L, 1); in mcplib_backend()
347 if (lua_getfield(L, 1, "failurelimit") != LUA_TNIL) { in mcplib_backend()
348 int limit = luaL_checkinteger(L, -1); in mcplib_backend()
350 proxy_lua_error(L, "failurelimit must be >= 0"); in mcplib_backend()
356 lua_pop(L, 1); in mcplib_backend()
358 if (lua_getfield(L, 1, "depthlimit") != LUA_TNIL) { in mcplib_backend()
359 int limit = luaL_checkinteger(L, -1); in mcplib_backend()
361 proxy_lua_error(L, "depthlimit must be >= 0"); in mcplib_backend()
367 lua_pop(L, 1); in mcplib_backend()
369 if (lua_getfield(L, 1, "connecttimeout") != LUA_TNIL) { in mcplib_backend()
370 lua_Number secondsf = luaL_checknumber(L, -1); in mcplib_backend()
377 lua_pop(L, 1); in mcplib_backend()
380 if (lua_getfield(L, 1, "retrytimeout") != LUA_TNIL) { in mcplib_backend()
382 _mcplib_backend_get_waittime(luaL_checknumber(L, -1)); in mcplib_backend()
384 lua_pop(L, 1); in mcplib_backend()
386 if (lua_getfield(L, 1, "retrywaittime") != LUA_TNIL) { in mcplib_backend()
388 _mcplib_backend_get_waittime(luaL_checknumber(L, -1)); in mcplib_backend()
390 lua_pop(L, 1); in mcplib_backend()
392 if (lua_getfield(L, 1, "retrytimeout") != LUA_TNIL) { in mcplib_backend()
393 lua_Number secondsf = luaL_checknumber(L, -1); in mcplib_backend()
400 lua_pop(L, 1); in mcplib_backend()
402 if (lua_getfield(L, 1, "readtimeout") != LUA_TNIL) { in mcplib_backend()
403 lua_Number secondsf = luaL_checknumber(L, -1); in mcplib_backend()
410 lua_pop(L, 1); in mcplib_backend()
412 if (lua_getfield(L, 1, "down") != LUA_TNIL) { in mcplib_backend()
413 int down = lua_toboolean(L, -1); in mcplib_backend()
416 lua_pop(L, 1); in mcplib_backend()
418 if (lua_getfield(L, 1, "flaptime") != LUA_TNIL) { in mcplib_backend()
419 lua_Number secondsf = luaL_checknumber(L, -1); in mcplib_backend()
426 lua_pop(L, 1); in mcplib_backend()
428 if (lua_getfield(L, 1, "flapbackofframp") != LUA_TNIL) { in mcplib_backend()
429 float ramp = luaL_checknumber(L, -1); in mcplib_backend()
435 lua_pop(L, 1); in mcplib_backend()
437 if (lua_getfield(L, 1, "flapbackoffmax") != LUA_TNIL) { in mcplib_backend()
438 luaL_checknumber(L, -1); in mcplib_backend()
439 uint32_t max = lua_tointeger(L, -1); in mcplib_backend()
442 lua_pop(L, 1); in mcplib_backend()
444 if (lua_getfield(L, 1, "connections") != LUA_TNIL) { in mcplib_backend()
445 int c = luaL_checkinteger(L, -1); in mcplib_backend()
447 proxy_lua_error(L, "backend connections argument must be >= 0"); in mcplib_backend()
450 proxy_lua_error(L, "backend connections argument must be <= 8"); in mcplib_backend()
456 lua_pop(L, 1); in mcplib_backend()
459 label = luaL_checklstring(L, 1, &llen); in mcplib_backend()
460 name = luaL_checklstring(L, 2, &nlen); in mcplib_backend()
461 port = luaL_checklstring(L, 3, &plen); in mcplib_backend()
465 proxy_lua_error(L, "backend label too long"); in mcplib_backend()
470 proxy_lua_error(L, "backend name too long"); in mcplib_backend()
475 proxy_lua_error(L, "backend port too long"); in mcplib_backend()
486 if (lua_istable(L, 1)) { in mcplib_backend()
487 lua_pop(L, 3); // drop label, name, port. in mcplib_backend()
489 luaL_getmetatable(L, "mcp.backend"); in mcplib_backend()
490 lua_setmetatable(L, -2); // set metatable to userdata. in mcplib_backend()
496 static mcp_backend_wrap_t *_mcplib_backend_checkcache(lua_State *L, mcp_backend_label_t *bel) { in _mcplib_backend_checkcache() argument
500 int ret = lua_gettable(L, lua_upvalueindex(MCP_BACKEND_UPVALUE)); in _mcplib_backend_checkcache()
502 mcp_backend_wrap_t *be_orig = luaL_checkudata(L, -1, "mcp.backendwrap"); in _mcplib_backend_checkcache()
511 lua_pop(L, 1); in _mcplib_backend_checkcache()
514 lua_pop(L, 1); // pop the nil. in _mcplib_backend_checkcache()
520 static mcp_backend_wrap_t *_mcplib_make_backendconn(lua_State *L, mcp_backend_label_t *bel, in _mcplib_make_backendconn() argument
522 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in _mcplib_make_backendconn()
524 mcp_backend_wrap_t *bew = lua_newuserdatauv(L, sizeof(mcp_backend_wrap_t), 0); in _mcplib_make_backendconn()
525 luaL_getmetatable(L, "mcp.backendwrap"); in _mcplib_make_backendconn()
526 lua_setmetatable(L, -2); // set metatable to userdata. in _mcplib_make_backendconn()
530 proxy_lua_error(L, "out of memory allocating backend connection"); in _mcplib_make_backendconn()
554 proxy_lua_error(L, "out of memory allocating backend"); in _mcplib_make_backendconn()
561 proxy_lua_error(L, "out of memory allocating backend"); in _mcplib_make_backendconn()
582 proxy_lua_error(L, "TLS requested but not initialized: call mcp.init_tls()"); in _mcplib_make_backendconn()
608 lua_pushvalue(L, -2); // push the label string back to the top. in _mcplib_make_backendconn()
610 lua_pushvalue(L, -2); // copy the backend reference to the top. in _mcplib_make_backendconn()
612 lua_settable(L, lua_upvalueindex(MCP_BACKEND_UPVALUE)); in _mcplib_make_backendconn()
620 static int mcplib_pool_gc(lua_State *L) { in mcplib_pool_gc() argument
621 mcp_pool_t *p = luaL_checkudata(L, -1, "mcp.pool"); in mcplib_pool_gc()
625 luaL_unref(L, LUA_REGISTRYINDEX, p->phc_ref); in mcplib_pool_gc()
629 luaL_unref(L, LUA_REGISTRYINDEX, p->pool[x].ref); in mcplib_pool_gc()
688 static void _mcplib_pool_dist(lua_State *L, mcp_pool_t *p) { in _mcplib_pool_dist() argument
689 luaL_checktype(L, -1, LUA_TTABLE); in _mcplib_pool_dist()
690 if (lua_getfield(L, -1, "new") != LUA_TFUNCTION) { in _mcplib_pool_dist()
691 proxy_lua_error(L, "key distribution object missing 'new' function"); in _mcplib_pool_dist()
696 lua_createtable(L, p->pool_size, 0); // give the new pool table a sizing hint. in _mcplib_pool_dist()
699 lua_createtable(L, 0, 4); in _mcplib_pool_dist()
703 lua_pushinteger(L, x); in _mcplib_pool_dist()
704 lua_setfield(L, -2, "id"); in _mcplib_pool_dist()
707 lua_pushstring(L, be->name); in _mcplib_pool_dist()
708 lua_setfield(L, -2, "addr"); in _mcplib_pool_dist()
709 lua_pushstring(L, be->port); in _mcplib_pool_dist()
710 lua_setfield(L, -2, "port"); in _mcplib_pool_dist()
713 lua_rawseti(L, -2, x); in _mcplib_pool_dist()
719 lua_pushvalue(L, 2); in _mcplib_pool_dist()
723 int res = lua_pcall(L, 2, 2, 0); in _mcplib_pool_dist()
726 lua_error(L); // error should be on the stack already. in _mcplib_pool_dist()
734 luaL_checktype(L, -1, LUA_TLIGHTUSERDATA); in _mcplib_pool_dist()
735 luaL_checktype(L, -2, LUA_TUSERDATA); in _mcplib_pool_dist()
736 phc = lua_touserdata(L, -1); in _mcplib_pool_dist()
738 lua_pop(L, 1); in _mcplib_pool_dist()
740 p->phc_ref = luaL_ref(L, LUA_REGISTRYINDEX); in _mcplib_pool_dist()
746 static void _mcplib_pool_make_be_loop(lua_State *L, mcp_pool_t *p, int offset, proxy_event_thread_t… in _mcplib_pool_make_be_loop() argument
750 lua_geti(L, 1, x); // get next server into the stack. in _mcplib_pool_make_be_loop()
753 mcp_backend_label_t *bel = luaL_checkudata(L, -1, "mcp.backend"); in _mcplib_pool_make_be_loop()
759 lua_pushstring(L, p->beprefix); in _mcplib_pool_make_be_loop()
763 lua_pushstring(L, ":io:"); in _mcplib_pool_make_be_loop()
766 lua_pushstring(L, ":w"); in _mcplib_pool_make_be_loop()
767 lua_pushinteger(L, offset); in _mcplib_pool_make_be_loop()
768 lua_pushstring(L, ":"); in _mcplib_pool_make_be_loop()
771 lua_pushlstring(L, bel->label, bel->llen); in _mcplib_pool_make_be_loop()
772 lua_concat(L, toconcat); in _mcplib_pool_make_be_loop()
774 lua_pushvalue(L, -1); // copy the label string for the create method. in _mcplib_pool_make_be_loop()
775 mcp_backend_wrap_t *bew = _mcplib_backend_checkcache(L, bel); in _mcplib_pool_make_be_loop()
777 bew = _mcplib_make_backendconn(L, bel, t); in _mcplib_pool_make_be_loop()
787 s->ref = luaL_ref(L, LUA_REGISTRYINDEX); // references and pops object. in _mcplib_pool_make_be_loop()
788 lua_pop(L, 1); // pop the mcp.backend label object. in _mcplib_pool_make_be_loop()
789 lua_pop(L, 1); // drop extra label copy. in _mcplib_pool_make_be_loop()
794 static void _mcplib_pool_make_be(lua_State *L, mcp_pool_t *p) { in _mcplib_pool_make_be() argument
796 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in _mcplib_pool_make_be()
797 _mcplib_pool_make_be_loop(L, p, 0, ctx->proxy_io_thread); in _mcplib_pool_make_be()
802 _mcplib_pool_make_be_loop(L, p, t->thread_baseid, t->proxy_event_thread); in _mcplib_pool_make_be()
808 static int mcplib_pool(lua_State *L) { in mcplib_pool() argument
809 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_pool()
810 int argc = lua_gettop(L); in mcplib_pool()
811 luaL_checktype(L, 1, LUA_TTABLE); in mcplib_pool()
812 int n = luaL_len(L, 1); // get length of array table in mcplib_pool()
816 mcp_pool_t *p = lua_newuserdatauv(L, plen, 0); in mcplib_pool()
825 p->ctx = PROXY_GET_CTX(L); in mcplib_pool()
827 luaL_setmetatable(L, "mcp.pool"); in mcplib_pool()
830 int type = lua_type(L, 2); in mcplib_pool()
832 _mcplib_pool_make_be(L, p); in mcplib_pool()
833 lua_getglobal(L, "mcp"); in mcplib_pool()
835 if (lua_getfield(L, -1, "dist_jump_hash") != LUA_TNIL) { in mcplib_pool()
836 _mcplib_pool_dist(L, p); in mcplib_pool()
837 lua_pop(L, 1); // pop "dist_jump_hash" value. in mcplib_pool()
839 lua_pop(L, 1); in mcplib_pool()
841 lua_pop(L, 1); // pop "mcp" in mcplib_pool()
847 luaL_checktype(L, 2, LUA_TTABLE); in mcplib_pool()
849 if (lua_getfield(L, 2, "iothread") != LUA_TNIL) { in mcplib_pool()
850 luaL_checktype(L, -1, LUA_TBOOLEAN); in mcplib_pool()
851 int use_iothread = lua_toboolean(L, -1); in mcplib_pool()
857 lua_pop(L, 1); // remove value. in mcplib_pool()
859 lua_pop(L, 1); // pop the nil. in mcplib_pool()
862 if (lua_getfield(L, 2, "beprefix") != LUA_TNIL) { in mcplib_pool()
863 luaL_checktype(L, -1, LUA_TSTRING); in mcplib_pool()
865 const char *bepfx = lua_tolstring(L, -1, &len); in mcplib_pool()
868 lua_pop(L, 1); // pop beprefix string. in mcplib_pool()
870 lua_pop(L, 1); // pop the nil. in mcplib_pool()
872 _mcplib_pool_make_be(L, p); in mcplib_pool()
875 if (lua_getfield(L, 2, "dist") != LUA_TNIL) { in mcplib_pool()
877 _mcplib_pool_dist(L, p); in mcplib_pool()
878 lua_pop(L, 1); // remove the dist table from stack. in mcplib_pool()
880 lua_pop(L, 1); // pop the nil. in mcplib_pool()
883 lua_getglobal(L, "mcp"); in mcplib_pool()
885 if (lua_getfield(L, -1, "dist_jump_hash") != LUA_TNIL) { in mcplib_pool()
886 _mcplib_pool_dist(L, p); in mcplib_pool()
887 lua_pop(L, 1); // pop "dist_jump_hash" value. in mcplib_pool()
889 lua_pop(L, 1); in mcplib_pool()
891 lua_pop(L, 1); // pop "mcp" in mcplib_pool()
894 if (lua_getfield(L, 2, "filter") != LUA_TNIL) { in mcplib_pool()
895 luaL_checktype(L, -1, LUA_TSTRING); in mcplib_pool()
896 const char *f_type = lua_tostring(L, -1); in mcplib_pool()
902 proxy_lua_ferror(L, "unknown hash filter specified: %s\n", f_type); in mcplib_pool()
905 lua_pop(L, 1); // pops "filter" value. in mcplib_pool()
907 if (lua_getfield(L, 2, "filter_conf") == LUA_TSTRING) { in mcplib_pool()
909 const char *conf = lua_tolstring(L, -1, &len); in mcplib_pool()
911 … proxy_lua_ferror(L, "hash filter conf must be between 2 and %d characters", KEY_HASH_FILTER_MAX); in mcplib_pool()
917 proxy_lua_error(L, "hash filter requires 'filter_conf' string"); in mcplib_pool()
919 lua_pop(L, 1); // pops "filter_conf" value. in mcplib_pool()
921 lua_pop(L, 1); // pop the nil. in mcplib_pool()
924 if (lua_getfield(L, 2, "hash") != LUA_TNIL) { in mcplib_pool()
925 luaL_checktype(L, -1, LUA_TLIGHTUSERDATA); in mcplib_pool()
926 struct proxy_hash_func *phf = lua_touserdata(L, -1); in mcplib_pool()
928 lua_pop(L, 1); in mcplib_pool()
930 lua_pop(L, 1); // pop the nil. in mcplib_pool()
933 if (lua_getfield(L, 2, "seed") != LUA_TNIL) { in mcplib_pool()
934 luaL_checktype(L, -1, LUA_TSTRING); in mcplib_pool()
936 const char *seedstr = lua_tolstring(L, -1, &seedlen); in mcplib_pool()
942 lua_pop(L, 1); in mcplib_pool()
944 lua_pop(L, 1); // pop the nil. in mcplib_pool()
948 proxy_lua_error(L, "cannot create pool missing 'dist' argument"); in mcplib_pool()
954 static int mcplib_pool_proxy_gc(lua_State *L) { in mcplib_pool_proxy_gc() argument
955 mcp_pool_proxy_t *pp = luaL_checkudata(L, -1, "mcp.pool_proxy"); in mcplib_pool_proxy_gc()
988 static int mcplib_backend_use_iothread(lua_State *L) { in mcplib_backend_use_iothread() argument
989 luaL_checktype(L, -1, LUA_TBOOLEAN); in mcplib_backend_use_iothread()
990 int state = lua_toboolean(L, -1); in mcplib_backend_use_iothread()
991 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_use_iothread()
1000 static int mcplib_backend_use_tls(lua_State *L) { in mcplib_backend_use_tls() argument
1001 luaL_checktype(L, -1, LUA_TBOOLEAN); in mcplib_backend_use_tls()
1002 int state = lua_toboolean(L, -1); in mcplib_backend_use_tls()
1003 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_use_tls()
1006 proxy_lua_error(L, "cannot set mcp.backend_use_tls: TLS support not compiled"); in mcplib_backend_use_tls()
1017 static int mcplib_init_tls(lua_State *L) { in mcplib_init_tls() argument
1019 proxy_lua_error(L, "cannot run mcp.init_tls: TLS support not compiled"); in mcplib_init_tls()
1021 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_init_tls()
1028 static int mcplib_tcp_keepalive(lua_State *L) { in mcplib_tcp_keepalive() argument
1029 luaL_checktype(L, -1, LUA_TBOOLEAN); in mcplib_tcp_keepalive()
1030 int state = lua_toboolean(L, -1); in mcplib_tcp_keepalive()
1031 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_tcp_keepalive()
1040 static int mcplib_backend_failure_limit(lua_State *L) { in mcplib_backend_failure_limit() argument
1041 int limit = luaL_checkinteger(L, -1); in mcplib_backend_failure_limit()
1042 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_failure_limit()
1045 proxy_lua_error(L, "backend_failure_limit must be >= 0"); in mcplib_backend_failure_limit()
1056 static int mcplib_backend_depth_limit(lua_State *L) { in mcplib_backend_depth_limit() argument
1057 int limit = luaL_checkinteger(L, -1); in mcplib_backend_depth_limit()
1058 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_depth_limit()
1061 proxy_lua_error(L, "backend_depth_limit must be >= 0"); in mcplib_backend_depth_limit()
1072 static int mcplib_backend_connect_timeout(lua_State *L) { in mcplib_backend_connect_timeout() argument
1073 lua_Number secondsf = luaL_checknumber(L, -1); in mcplib_backend_connect_timeout()
1076 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_connect_timeout()
1086 static int mcplib_backend_retry_waittime(lua_State *L) { in mcplib_backend_retry_waittime() argument
1087 lua_Number secondsf = luaL_checknumber(L, -1); in mcplib_backend_retry_waittime()
1088 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_retry_waittime()
1100 static int mcplib_backend_retry_timeout(lua_State *L) { in mcplib_backend_retry_timeout() argument
1101 return mcplib_backend_retry_waittime(L); in mcplib_backend_retry_timeout()
1104 static int mcplib_backend_read_timeout(lua_State *L) { in mcplib_backend_read_timeout() argument
1105 lua_Number secondsf = luaL_checknumber(L, -1); in mcplib_backend_read_timeout()
1108 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_read_timeout()
1118 static int mcplib_backend_flap_time(lua_State *L) { in mcplib_backend_flap_time() argument
1119 lua_Number secondsf = luaL_checknumber(L, -1); in mcplib_backend_flap_time()
1122 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_flap_time()
1132 static int mcplib_backend_flap_backoff_ramp(lua_State *L) { in mcplib_backend_flap_backoff_ramp() argument
1133 float factor = luaL_checknumber(L, -1); in mcplib_backend_flap_backoff_ramp()
1134 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_flap_backoff_ramp()
1146 static int mcplib_backend_flap_backoff_max(lua_State *L) { in mcplib_backend_flap_backoff_max() argument
1147 luaL_checknumber(L, -1); in mcplib_backend_flap_backoff_max()
1148 uint32_t max = lua_tointeger(L, -1); in mcplib_backend_flap_backoff_max()
1149 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_backend_flap_backoff_max()
1158 static int mcplib_stat_limit(lua_State *L) { in mcplib_stat_limit() argument
1159 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_stat_limit()
1160 int limit = luaL_checkinteger(L, -1); in mcplib_stat_limit()
1177 static int mcplib_active_req_limit(lua_State *L) { in mcplib_active_req_limit() argument
1178 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_active_req_limit()
1179 uint64_t limit = luaL_checkinteger(L, -1); in mcplib_active_req_limit()
1200 static int mcplib_buffer_memory_limit(lua_State *L) { in mcplib_buffer_memory_limit() argument
1201 proxy_ctx_t *ctx = PROXY_GET_CTX(L); in mcplib_buffer_memory_limit()
1202 uint64_t limit = luaL_checkinteger(L, -1); in mcplib_buffer_memory_limit()
1221 static int mcplib_attach(lua_State *L) { in mcplib_attach() argument
1223 LIBEVENT_THREAD *t = PROXY_GET_THR(L); in mcplib_attach()
1225 int hook = luaL_checkinteger(L, 1); in mcplib_attach()
1242 if (lua_isfunction(L, 2)) { in mcplib_attach()
1244 lua_pushvalue(L, 2); // function must be at top of stack. in mcplib_attach()
1245 mcplib_funcgenbare_new(L); // convert it into a function generator. in mcplib_attach()
1246 fgen = luaL_checkudata(L, -1, "mcp.funcgen"); // set our pointer ref. in mcplib_attach()
1247 lua_replace(L, 2); // move the function generator over the input in mcplib_attach()
1250 lua_pop(L, 1); // drop the extra generator function reference. in mcplib_attach()
1251 } else if ((fgen = luaL_testudata(L, 2, "mcp.funcgen")) != NULL) { in mcplib_attach()
1254 proxy_lua_error(L, "mcp.attach: must pass a function"); in mcplib_attach()
1259 proxy_lua_error(L, "mcp.attach: cannot use a previously replaced function"); in mcplib_attach()
1267 if (lua_isstring(L, 3)) { in mcplib_attach()
1269 const char *stag = lua_tolstring(L, 3, &len); in mcplib_attach()
1271 proxy_lua_error(L, "mcp.attach: tag must be 1 to 8 characters"); in mcplib_attach()
1284 lua_pushvalue(L, 2); // duplicate the ref. in mcplib_attach()
1294 proxy_lua_error(L, "mcp.attach: failure allocating tagged hooks"); in mcplib_attach()
1314 proxy_lua_error(L, "mcp.attach: failure to resize tagged hooks"); in mcplib_attach()
1330 luaL_unref(L, LUA_REGISTRYINDEX, href->lua_ref); in mcplib_attach()
1331 mcp_funcgen_dereference(L, href->ctx); in mcplib_attach()
1334 lua_pushvalue(L, -1); // duplicate the funcgen in mcplib_attach()
1335 mcp_funcgen_reference(L); in mcplib_attach()
1336 href->lua_ref = luaL_ref(L, LUA_REGISTRYINDEX); in mcplib_attach()
1348 static int mcplib_ct_log(lua_State *L) { in mcplib_ct_log() argument
1349 const char *msg = luaL_checkstring(L, -1); in mcplib_ct_log()
1355 static int mcplib_log(lua_State *L) { in mcplib_log() argument
1356 LIBEVENT_THREAD *t = PROXY_GET_THR(L); in mcplib_log()
1357 const char *msg = luaL_checkstring(L, -1); in mcplib_log()
1363 static int mcplib_log_req(lua_State *L) { in mcplib_log_req() argument
1364 LIBEVENT_THREAD *t = PROXY_GET_THR(L); in mcplib_log_req()
1378 mcp_request_t *rq = luaL_checkudata(L, 1, "mcp.request"); in mcplib_log_req()
1379 int type = lua_type(L, 2); in mcplib_log_req()
1381 mcp_resp_t *rs = luaL_checkudata(L, 2, "mcp.response"); in mcplib_log_req()
1390 const char *detail = luaL_optlstring(L, 3, NULL, &dlen); in mcplib_log_req()
1391 int cfd = luaL_optinteger(L, 4, 0); in mcplib_log_req()
1422 static int mcplib_log_reqsample(lua_State *L) { in mcplib_log_reqsample() argument
1423 LIBEVENT_THREAD *t = PROXY_GET_THR(L); in mcplib_log_reqsample()
1437 int ms = luaL_checkinteger(L, 1); in mcplib_log_reqsample()
1438 int rate = luaL_checkinteger(L, 2); in mcplib_log_reqsample()
1439 int allerr = lua_toboolean(L, 3); in mcplib_log_reqsample()
1440 mcp_request_t *rq = luaL_checkudata(L, 4, "mcp.request"); in mcplib_log_reqsample()
1441 int type = lua_type(L, 5); in mcplib_log_reqsample()
1443 mcp_resp_t *rs = luaL_checkudata(L, 5, "mcp.response"); in mcplib_log_reqsample()
1452 const char *detail = luaL_optlstring(L, 6, NULL, &dlen); in mcplib_log_reqsample()
1453 int cfd = luaL_optinteger(L, 7, 0); in mcplib_log_reqsample()
1481 static void proxy_register_defines(lua_State *L) { in proxy_register_defines() argument
1483 lua_pushinteger(L, x); \ in proxy_register_defines()
1484 lua_setfield(L, -2, #x); in proxy_register_defines()
1486 lua_pushinteger(L, x); \ in proxy_register_defines()
1487 lua_setfield(L, -2, l); in proxy_register_defines()
1517 lua_pushboolean(L, 1); in proxy_register_defines()
1518 lua_setfield(L, -2, "WAIT_RESUME"); in proxy_register_defines()
1522 static void proxy_register_startarg(lua_State *L) { in proxy_register_startarg() argument
1523 int idx = lua_absindex(L, -1); // remember 'mcp' table. in proxy_register_startarg()
1526 lua_pushboolean(L, 0); in proxy_register_startarg()
1527 lua_setfield(L, idx, "start_arg"); in proxy_register_startarg()
1534 lua_pushstring(L, sarg); in proxy_register_startarg()
1537 lua_newtable(L); in proxy_register_startarg()
1538 int nidx = lua_absindex(L, -1); in proxy_register_startarg()
1545 lua_pushstring(L, name); // table -> key in proxy_register_startarg()
1548 lua_pushboolean(L, 1); // table -> key -> True in proxy_register_startarg()
1550 lua_pushstring(L, value); // table -> key -> value in proxy_register_startarg()
1552 lua_settable(L, nidx); in proxy_register_startarg()
1556 lua_setfield(L, idx, "start_arg"); in proxy_register_startarg()
1561 lua_State *L = state; in proxy_register_libs() local
1721 void **extra = lua_getextraspace(L); in proxy_register_libs()
1726 luaL_newmetatable(L, "mcp.request"); in proxy_register_libs()
1727 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1728 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1729 luaL_setfuncs(L, mcplib_request_m, 0); // register methods in proxy_register_libs()
1730 lua_pop(L, 1); in proxy_register_libs()
1732 luaL_newmetatable(L, "mcp.response"); in proxy_register_libs()
1733 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1734 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1735 luaL_setfuncs(L, mcplib_response_m, 0); // register methods in proxy_register_libs()
1736 lua_pop(L, 1); in proxy_register_libs()
1738 luaL_newmetatable(L, "mcp.pool_proxy"); in proxy_register_libs()
1739 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1740 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1741 luaL_setfuncs(L, mcplib_pool_proxy_m, 0); // register methods in proxy_register_libs()
1742 lua_pop(L, 1); // drop the hash selector metatable in proxy_register_libs()
1744 luaL_newmetatable(L, "mcp.ratelim_tbf"); in proxy_register_libs()
1745 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1746 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1747 luaL_setfuncs(L, mcplib_ratelim_tbf_m, 0); // register methods in proxy_register_libs()
1748 lua_pop(L, 1); in proxy_register_libs()
1750 luaL_newmetatable(L, "mcp.ratelim_proxy_tbf"); in proxy_register_libs()
1751 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1752 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1753 luaL_setfuncs(L, mcplib_ratelim_proxy_tbf_m, 0); // register methods in proxy_register_libs()
1754 lua_pop(L, 1); in proxy_register_libs()
1756 luaL_newmetatable(L, "mcp.inspector"); in proxy_register_libs()
1757 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1758 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1759 luaL_setfuncs(L, mcplib_inspector_m, 0); // register methods in proxy_register_libs()
1760 lua_pop(L, 1); in proxy_register_libs()
1762 luaL_newmetatable(L, "mcp.mutator"); in proxy_register_libs()
1763 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1764 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1765 luaL_setfuncs(L, mcplib_mutator_m, 0); // register methods in proxy_register_libs()
1766 lua_pop(L, 1); in proxy_register_libs()
1768 luaL_newmetatable(L, "mcp.rcontext"); in proxy_register_libs()
1769 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1770 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1771 luaL_setfuncs(L, mcplib_rcontext_m, 0); // register methods in proxy_register_libs()
1772 lua_pop(L, 1); in proxy_register_libs()
1774 luaL_newmetatable(L, "mcp.funcgen"); in proxy_register_libs()
1775 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1776 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1777 luaL_setfuncs(L, mcplib_funcgen_m, 0); // register methods in proxy_register_libs()
1778 lua_pop(L, 1); in proxy_register_libs()
1781 luaL_newmetatable(L, "mcp.rfunc"); in proxy_register_libs()
1782 lua_pop(L, 1); in proxy_register_libs()
1785 luaL_newmetatable(L, "mcp.funcgen"); in proxy_register_libs()
1786 lua_pop(L, 1); in proxy_register_libs()
1788 luaL_newlibtable(L, mcplib_f_routes); in proxy_register_libs()
1794 luaL_newmetatable(L, "mcp.backend"); in proxy_register_libs()
1795 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1796 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1797 luaL_setfuncs(L, mcplib_backend_m, 0); // register methods in proxy_register_libs()
1798 lua_pop(L, 1); in proxy_register_libs()
1800 luaL_newmetatable(L, "mcp.backendwrap"); in proxy_register_libs()
1801 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1802 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1803 luaL_setfuncs(L, mcplib_backend_wrap_m, 0); // register methods in proxy_register_libs()
1804 lua_pop(L, 1); in proxy_register_libs()
1806 luaL_newmetatable(L, "mcp.pool"); in proxy_register_libs()
1807 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1808 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1809 luaL_setfuncs(L, mcplib_pool_m, 0); // register methods in proxy_register_libs()
1810 lua_pop(L, 1); // drop the hash selector metatable in proxy_register_libs()
1812 luaL_newmetatable(L, "mcp.ratelim_global_tbf"); in proxy_register_libs()
1813 lua_pushvalue(L, -1); // duplicate metatable. in proxy_register_libs()
1814 lua_setfield(L, -2, "__index"); // mt.__index = mt in proxy_register_libs()
1815 luaL_setfuncs(L, mcplib_ratelim_global_tbf_m, 0); // register methods in proxy_register_libs()
1816 lua_pop(L, 1); in proxy_register_libs()
1818 luaL_newlibtable(L, mcplib_f_config); in proxy_register_libs()
1827 proxy_register_defines(L); in proxy_register_libs()
1829 mcplib_open_hash_xxhash(L); in proxy_register_libs()
1830 lua_setfield(L, -2, "hash_xxhash"); in proxy_register_libs()
1834 mcplib_open_dist_jump_hash(L); in proxy_register_libs()
1835 lua_setfield(L, -2, "dist_jump_hash"); in proxy_register_libs()
1836 mcplib_open_dist_ring_hash(L); in proxy_register_libs()
1837 lua_setfield(L, -2, "dist_ring_hash"); in proxy_register_libs()
1840 lua_newtable(L); // {} in proxy_register_libs()
1841 lua_newtable(L); // {}, {} for metatable in proxy_register_libs()
1842 lua_pushstring(L, "v"); // {}, {}, "v" for weak values. in proxy_register_libs()
1843 lua_setfield(L, -2, "__mode"); // {}, {__mode = "v"} in proxy_register_libs()
1844 lua_setmetatable(L, -2); // {__mt = {__mode = "v"} } in proxy_register_libs()
1847 luaL_setfuncs(L, mcplib_f_routes, 1); // store upvalues. in proxy_register_libs()
1849 luaL_setfuncs(L, mcplib_f_config, 1); // store upvalues. in proxy_register_libs()
1853 proxy_register_startarg(L); in proxy_register_libs()
1855 lua_setglobal(L, "mcp"); // set the lib table to mcp global. in proxy_register_libs()