diff options
author | dormando <dormando@rydia.net> | 2023-02-28 18:55:27 -0800 |
---|---|---|
committer | dormando <dormando@rydia.net> | 2023-02-28 18:55:27 -0800 |
commit | 1a68343596ffb53a4feb58348964afbba9e387e0 (patch) | |
tree | b3b052ec536cf56a7cb19600c44ea2572db19597 | |
parent | b72d969ab84998ad3a8f91e37f83eaaf8e4fd8b5 (diff) | |
download | memcached-1a68343596ffb53a4feb58348964afbba9e387e0.tar.gz |
proxy: fix trailingdata error with ascii multiget
One of the side effects of pre-warming all of the tests I did with
multiget, and not having done a second round on the unit tests, is that
we somehow never tried an ascii multiget against a damn miss.
Easy to test, easy to fix.
-rw-r--r-- | proxy_network.c | 5 | ||||
-rw-r--r-- | t/proxyunits.t | 15 |
2 files changed, 20 insertions, 0 deletions
diff --git a/proxy_network.c b/proxy_network.c index 0334971..e18516f 100644 --- a/proxy_network.c +++ b/proxy_network.c @@ -1037,6 +1037,11 @@ static int proxy_backend_drive_machine(mcp_backend_t *be) { if (p->ascii_multiget && r->resp.type == MCMC_RESP_END) { // Ascii multiget hack mode; consume END's + be->rbufused -= r->resp.reslen; + if (be->rbufused > 0) { + memmove(be->rbuf, be->rbuf+r->resp.reslen, be->rbufused); + } + be->state = mcp_backend_next; break; } diff --git a/t/proxyunits.t b/t/proxyunits.t index 5d46d1c..b9b98a6 100644 --- a/t/proxyunits.t +++ b/t/proxyunits.t @@ -362,6 +362,21 @@ check_version($ps); is(scalar <$ps>, "$key\r\n", "multiget value $key"); } is(scalar <$ps>, "END\r\n", "final END from multiget"); + + # Test multiget workaround with misses (known bug) + print $ps $cmd; + is(scalar <$be>, "get /b/c\r\n", "multiget breakdown c"); + is(scalar <$be>, "get /b/b\r\n", "multiget breakdown b"); + is(scalar <$be>, "get /b/a\r\n", "multiget breakdown a"); + + print $be "END\r\nEND\r\nEND\r\n"; + is(scalar <$ps>, "END\r\n", "final END from multiget"); + + # If bugged, the backend will have closed. + print $ps "get /b/a\r\n"; + is(scalar <$be>, "get /b/a\r\n", "get works after empty multiget"); + print $be "END\r\n"; + is(scalar <$ps>, "END\r\n", "end after empty multiget"); } check_version($ps); |