summaryrefslogtreecommitdiff
path: root/proxy_await.c
diff options
context:
space:
mode:
authordormando <dormando@rydia.net>2022-07-23 12:46:03 -0700
committerdormando <dormando@rydia.net>2022-07-24 23:02:50 -0700
commit5bb0ea710283fb61ea24fc7dd3de4dab7a209f55 (patch)
tree06c1a9002942048708e515ec0eb8c6678e68739f /proxy_await.c
parent4cc3e7915adf34bb7f455b1b59c253298d4b83e7 (diff)
downloadmemcached-5bb0ea710283fb61ea24fc7dd3de4dab7a209f55.tar.gz
proxy: fix mcp.await() when using extended args
was checking the third lua arg, popping it, then likely never finding the fourth arg. now checks fourth arg first and pops it, then works backwards.
Diffstat (limited to 'proxy_await.c')
-rw-r--r--proxy_await.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/proxy_await.c b/proxy_await.c
index ada4d31..387df08 100644
--- a/proxy_await.c
+++ b/proxy_await.c
@@ -40,16 +40,10 @@ int mcplib_await(lua_State *L) {
if (n <= 0) {
proxy_lua_error(L, "mcp.await arguments must have at least one pool");
}
- if (lua_isnumber(L, 3)) {
- wait_for = lua_tointeger(L, 3);
- lua_pop(L, 1);
- if (wait_for > n) {
- wait_for = n;
- }
- }
if (lua_isnumber(L, 4)) {
type = lua_tointeger(L, 4);
+ lua_pop(L, 1);
switch (type) {
case AWAIT_GOOD:
case AWAIT_ANY:
@@ -61,6 +55,14 @@ int mcplib_await(lua_State *L) {
}
}
+ if (lua_isnumber(L, 3)) {
+ wait_for = lua_tointeger(L, 3);
+ lua_pop(L, 1);
+ if (wait_for > n) {
+ wait_for = n;
+ }
+ }
+
// FIRST is only looking for one valid request.
if (type == AWAIT_FIRST) {
wait_for = 1;
@@ -184,7 +186,6 @@ int mcplib_await_run(conn *c, mc_resp *resp, lua_State *L, int coro_ref) {
assert(aw != NULL);
lua_rawgeti(L, LUA_REGISTRYINDEX, aw->argtable_ref); // -> 1
//dump_stack(L);
- P_DEBUG("%s: argtable len: %d\n", __func__, (int)lua_rawlen(L, -1));
mcp_request_t *rq = aw->rq;
aw->coro_ref = coro_ref;
@@ -195,6 +196,7 @@ int mcplib_await_run(conn *c, mc_resp *resp, lua_State *L, int coro_ref) {
// prepare the request key
const char *key = MCP_PARSER_KEY(rq->pr);
size_t len = rq->pr.klen;
+ int n = 0;
bool await_first = true;
// loop arg table and run each hash selector
lua_pushnil(L); // -> 3
@@ -216,7 +218,9 @@ int mcplib_await_run(conn *c, mc_resp *resp, lua_State *L, int coro_ref) {
// pop value, keep key.
lua_pop(L, 1);
+ n++;
}
+ P_DEBUG("%s: argtable len: %d\n", __func__, n);
lua_pop(L, 1); // remove table key.
aw->resp = resp; // cuddle the current mc_resp to fill later
@@ -247,6 +251,7 @@ int mcplib_await_return(io_pending_proxy_t *p) {
//dump_stack(L);
aw->pending--;
+ assert(aw->pending >= 0);
// Await not yet satisfied.
// If wait_for != 0 check for response success
// if success and wait_for is *now* 0, we complete.
@@ -323,6 +328,7 @@ int mcplib_await_return(io_pending_proxy_t *p) {
if (completing) {
P_DEBUG("%s: completing\n", __func__);
+ assert(p->c->thread == p->thread);
aw->completed = true;
// if we haven't completed yet, the connection reference is still
// valid. So now we pull it, reduce count, and readd if necessary.