{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":465352866,"defaultBranch":"pull","name":"memcached","ownerLogin":"feihu-stripe","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2022-03-02T15:03:19.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/88515053?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1696870718.0","currentOid":""},"activityList":{"items":[{"before":"14ad1931b91eb12778ed0d2c6b2969e2aa0af24a","after":"4a75ac2415549eca39dece91c7292378018f785b","ref":"refs/heads/next","pushedAt":"2024-05-21T07:38:48.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: add mcp.backend_depth_limit(int)\n\nIf a backend has a queue depth limt over this amount, fast-fail any\nfurther requests.\n\nA global parallel request limit can mean a single slow or overloaded\nbackend causes the entire proxy to stop working. As a first layer of\ndefence the depth for a particular backend should be capped.","shortMessageHtmlLink":"proxy: add mcp.backend_depth_limit(int)"}},{"before":"9dc8b148345b27dd86580641d17f4268885b5894","after":"14ad1931b91eb12778ed0d2c6b2969e2aa0af24a","ref":"refs/heads/next","pushedAt":"2024-05-11T07:15:32.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: fix refcount leak in mcp.internal()\n\nIf running a fetch request without returning the result upstream to the\nuser, a successfully fetched item would leak its reference.","shortMessageHtmlLink":"proxy: fix refcount leak in mcp.internal()"}},{"before":"a4d8324942e653ec5fb5682d3ddeba38d00ff578","after":"9dc8b148345b27dd86580641d17f4268885b5894","ref":"refs/heads/next","pushedAt":"2024-05-06T05:27:37.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: fix backend depth counter\n\nThe \"request depth\" value for a backend could go negative in some cases.\nWe used a magic value to attempt to speed up the sub-connection selector\nbut I don't think that's necessary. Without the magic value we don't\nneed to reset the depth to 0, so it stays balanced.\n\nAdded some new asserts so test and bench suites can find this issue more\neasily going forward. Survived the full bench suite with asserts\nenabled.","shortMessageHtmlLink":"proxy: fix backend depth counter"}},{"before":"cf132f5c4f86e18d49d5d4fec4a73bc0d6227d01","after":"a4d8324942e653ec5fb5682d3ddeba38d00ff578","ref":"refs/heads/next","pushedAt":"2024-05-04T09:19:39.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: fix short writes caused by mcp.internal\n\nWasn't filling in the 'tosend' portion of a response structure when\nusing mcp.internal to create a response object.\n\nThis field is used as a fastpath check to see if a response has been\ncompletely transmitted to the socket or not. Since it was zero, we would\nalways consider an mcp.internal() based response as completely sent,\ncutting off the data for larger items.\n\nExpands tests for \"simply large\" and also a large enough to be chunked\nitem.","shortMessageHtmlLink":"proxy: fix short writes caused by mcp.internal"}},{"before":"5c7e102326de0ab8267cad27e2ce52648d9d8925","after":"cf132f5c4f86e18d49d5d4fec4a73bc0d6227d01","ref":"refs/heads/next","pushedAt":"2024-04-29T10:22:41.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: fix possible corruption with global objects\n\nIf a global object (ie; pool, global tbf) is created during\n`mcp_config_pools`, _and_ copied to each worker VM during a config\nreload, _but not used_ during `mcp_config_routes`, the worker VM's\ncould cause the global object to be reaped early.\n\nConvoluted:\n- Create pool obj\n- Return pool obj\n- Get pool proxy obj in `mcp_config_routes`, but don't use it!\n- Don't pass it to any funcgens!\n- Config thread moves on to next worker\n- Worker VM runs GC, clears pool proxy obj\n- _before_ config reload moves onto the next worker VM\n- Worker VM sees proxy refcount as 0, signals to reap object\n- The above can happen multiple times as refcount bounces between 1 and\n 0.\n\nI have no idea how realistic it is to hit this problem and what the\nsymptoms even are. I caused this via a long benchmark with constant\nreloads and hitting an assert in the debug binary. Changing the asserts\naround made them trigger from startup, making it easier to see the\nproblem.\n\nThe fix:\n- When we first reference a proxy object, take an extra reference.\n- We get a signal bit by negating the lua self reference.\n- Enqueue the object for the manager thread to examine after the\n config reload completes.\n- The manager thread ack's the object and reduces the refcount by 1,\n negating the self ref back to positive.\n- If needed, immediately reap.","shortMessageHtmlLink":"proxy: fix possible corruption with global objects"}},{"before":"37004115c9deb9ecb2722565bdcbd3c4e6a0d764","after":"5c7e102326de0ab8267cad27e2ce52648d9d8925","ref":"refs/heads/next","pushedAt":"2024-04-27T08:12:34.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"core: add queue info to `stats conns`\n\nAdds to `stats conns` the state of deferred IO queues: extstore or\nproxy. The number of queues waiting (it can be both proxy and extstore),\nand within each queue how many sub-IO's are waiting.","shortMessageHtmlLink":"core: add queue info to stats conns"}},{"before":"c824841a06d1c27b00274ea313e7a7b62f142cfa","after":"37004115c9deb9ecb2722565bdcbd3c4e6a0d764","ref":"refs/heads/next","pushedAt":"2024-04-25T07:06:59.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: allow passing nil to mcp.server_stats()\n\nignores nil as though the argument were blank instead.","shortMessageHtmlLink":"proxy: allow passing nil to mcp.server_stats()"}},{"before":"563d05a82f1156de4f5b9b90876737df0777bd11","after":"c824841a06d1c27b00274ea313e7a7b62f142cfa","ref":"refs/heads/next","pushedAt":"2024-04-16T08:36:37.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proto: fix md with x and E\n\nThe new md flag 'x' was ignoring the 'E' flag and getting an internal\nCAS id.","shortMessageHtmlLink":"proto: fix md with x and E"}},{"before":"6537dcdc3d4c69149521636ed8157f83113dd179","after":"563d05a82f1156de4f5b9b90876737df0777bd11","ref":"refs/heads/next","pushedAt":"2024-04-13T18:20:43.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"meta: md with I and x removes value\n\nIf `md` is given the `x` flags it will remove the value but leave the\nitem. When combined with 'I' it will mark this new item as stale as\nwell.\n\nThis allows the user to create a tombstone of a previous value with a\nnew TTL.","shortMessageHtmlLink":"meta: md with I and x removes value"}},{"before":"d995880c3daa58ded9e8af5a4c55eed08556686e","after":"6537dcdc3d4c69149521636ed8157f83113dd179","ref":"refs/heads/next","pushedAt":"2024-04-11T22:31:37.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: wait timeout API\n\nGive request contexts the ability to time out on wait operations. this\nallows moving along the logic without cancelling in flight requests or\nresetting backends.\n\nThis is done by adding an extra parameter to the various enqueue and\nwait functions. This parameter is seconds in floating point.","shortMessageHtmlLink":"proxy: wait timeout API"}},{"before":"22480de784b1f8bd3a6f832c18cbf28421a73667","after":"d995880c3daa58ded9e8af5a4c55eed08556686e","ref":"refs/heads/next","pushedAt":"2024-04-10T10:34:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: compile with rdynamic\n\nWhen building proxy, use -rdynamic to export symbols. This allows, to\nstart, re-exporting all of the lua symbols so modules don't need to\npre-link with lua and can be a lot smaller.","shortMessageHtmlLink":"proxy: compile with rdynamic"}},{"before":"ea66fe0c6fbf4f1f82f77eea3cdbed89064aa00f","after":"22480de784b1f8bd3a6f832c18cbf28421a73667","ref":"refs/heads/next","pushedAt":"2024-04-06T06:25:38.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"meta: E flag for overriding CAS value\n\nEcas means: if operation succeeds, set the item's CAS value to this.\nThis allows external versioning of item data. This could be a row\nversion, a time stamp, a crc32 or 64bit data integrity hash, and so on.\n\noverriding the CAS value may make some features not work as well (ie;\nruntime enable/disable of `stats sizes`)","shortMessageHtmlLink":"meta: E flag for overriding CAS value"}},{"before":"53f665066ac92fbc5e5e1ebd85e3b69587735b36","after":"ea66fe0c6fbf4f1f82f77eea3cdbed89064aa00f","ref":"refs/heads/next","pushedAt":"2024-03-29T22:56:32.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: `stats proxybe` to show bad backends\n\nstats command intended for backend state information.\n\nso far just outputs \"bad_label\" [count] for each backend currently\nmarked bad. The count is the number of backend objects marked bad.\n\nIf in \"per worker thread mode\" (default) if all workers recognize the\nbackend as down, the count will be the same as the number of worker\nthreads. If the IO thread is in use it would be 1.\n\nIf a backend has normal status, it is not included in the output.\n\nAlso fixes a bug with reconnects:\n\n- If a remote server is listening for new connections but not accepting\n them, the backend will fail in readvalidate and never get marked bad.\n- Now we only reset the fail counter and remove bad status if a backend\n is fully validated.","shortMessageHtmlLink":"proxy: stats proxybe to show bad backends"}},{"before":"4ff4e8169c5f73e37a17df482916752bc0b17d1f","after":"53f665066ac92fbc5e5e1ebd85e3b69587735b36","ref":"refs/heads/next","pushedAt":"2024-03-29T13:58:41.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: rctx:cfd() and `log_req` cfd\n\nlog_req() now takes an optional 4th integer argument which is supposed\nto be the client file descriptor\n\nlog_reqsample() takes an optional 7th integer argument which is supposed\nto be the client file descriptor\n\nrctx object now has an `rctx:cfd()` function to return the client fd.\n\nsince client objects are lost after a response has been returned\nupstream, we have to store the original cfd in the request context.","shortMessageHtmlLink":"proxy: rctx:cfd() and log_req cfd"}},{"before":"6f3eb9c773eed15f2d942dbc359872fe25e918c6","after":"4ff4e8169c5f73e37a17df482916752bc0b17d1f","ref":"refs/heads/next","pushedAt":"2024-03-22T15:38:36.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"crawler: fix potential memory corruption\n\nif the client closes during the finalization stages of the dump we can\ncrash attempting to write a final END/EN to the client buffer.","shortMessageHtmlLink":"crawler: fix potential memory corruption"}},{"before":"bc608f0fa127488d8eb11e007b8bb3f9634e6ce1","after":"6f3eb9c773eed15f2d942dbc359872fe25e918c6","ref":"refs/heads/next","pushedAt":"2024-03-19T18:41:14.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"core: Add a couple of sanity checks.\n\n - Handle failure to malloc for temp port number file initialization.\n - Ensure value of c->rbytes is positive before using it in memmove\n - Avoid implicit conversion of unsigned int to signed int for keylen","shortMessageHtmlLink":"core: Add a couple of sanity checks."}},{"before":"e58b8dcc62484e86cd0d91ca454b0d19d4a37549","after":"bc608f0fa127488d8eb11e007b8bb3f9634e6ce1","ref":"refs/heads/next","pushedAt":"2024-03-19T00:36:59.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"extstore: test fix on slow arm devices\n\ntried to fix this by looking for compaction to run in the watcher but it\nwasn't doing it. need to try harder later.","shortMessageHtmlLink":"extstore: test fix on slow arm devices"}},{"before":"0210db5d613e0f60d48dc068f64afb17c48477dd","after":"e58b8dcc62484e86cd0d91ca454b0d19d4a37549","ref":"refs/heads/next","pushedAt":"2024-03-14T01:26:41.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: run lua GC outside of request path\n\nKeeps the GC paused while requests run, since each individual request\ncan't generate much garbage. Instead we run steps inbetween batches of\nrequests, getting progressively more aggressive by how much extra memory\nis allocated.","shortMessageHtmlLink":"proxy: run lua GC outside of request path"}},{"before":"3304459c0956bd13d34ea42064a66071cc5bf73e","after":"0210db5d613e0f60d48dc068f64afb17c48477dd","ref":"refs/heads/next","pushedAt":"2024-03-13T04:20:37.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: fix anonymous funcs in V1 API\n\nmissed a spot when converting name from a reference to a builtin string.","shortMessageHtmlLink":"proxy: fix anonymous funcs in V1 API"}},{"before":"156ca8048a3738795acffef8a3adfb60ccc9b3a5","after":"3304459c0956bd13d34ea42064a66071cc5bf73e","ref":"refs/heads/next","pushedAt":"2024-03-08T10:28:53.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: add new request meta flag APIs\n\nAll throw errors if arguments are bad\n\n`req:flag_add(\"F\", token)`\n\nIf token is nil, just adds \"F\" to request.\nIf token is \"example\", adds \"Fexample\" to request.\nreturns boolean false if failed (flag exists, request too long)\n\n`req:flag_set(\"F\", token)`\n\nIf token is nil, adds \"F\" to request.\nIf token is \"example\", adds \"Fexample\" to request.\nIf request had flag with a token, but supplied token is nil, will\nremove token from flag in the request.\nreturns boolean false if failed (request too long)\n\n`req:flag_replace(\"F\", \"N\", token)`\n\nIf token is nil, adds \"N\" to request.\nIf token is \"example\", adds \"Nexample\" to request.\nreturns boolean false if failed (request too long)\n\n`req:flag_del(\"F\")`\n\nIf flag and/or flag+token exists, delete from request.\n\nThese functions are able to modify the underlying request string without\ncreating lua string garbage. IE:\n\n`req:flag_add(\"F\" .. token)` would create a new string then pass that\ninto the function, needing to GC it later.","shortMessageHtmlLink":"proxy: add new request meta flag APIs"}},{"before":"d9bf02f6331fc0098af8997d2a571fc4525696fc","after":"156ca8048a3738795acffef8a3adfb60ccc9b3a5","ref":"refs/heads/next","pushedAt":"2024-03-07T00:53:01.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"tests: add T_MEMD_EXTERNAL\n\nIf environment variable T_MEMD_EXTERNAL exists when tests run, a request\nto start a memcached daemon will instead print the command line and wait\nfor the user to start the daemon (ie; in GDB). it will poll and continue\nthe tests as soon as it can connect.\n\nThis is simpler than the old method I was using for T_MEMD_USE_MEMD\nwhere you'd manually start a memcached then run the test.","shortMessageHtmlLink":"tests: add T_MEMD_EXTERNAL"}},{"before":"e5a305085df64826cf04e6e4275dac6e43c0bd94","after":"d9bf02f6331fc0098af8997d2a571fc4525696fc","ref":"refs/heads/next","pushedAt":"2024-02-29T00:57:37.000Z","pushType":"push","commitsCount":5,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"fix build on uclibc-ng\n\nFix the following build failure with uclibc-ng raised since version\n1.6.18 and\nhttps://github.com/memcached/memcached/commit/875371a75cbf1f92350de2d1fa0fae4a35ed572b:\n\n/home/buildroot/autobuild/instance-2/output-1/host/lib/gcc/arc-buildroot-linux-uclibc/10.2.0/../../../../arc-buildroot-linux-uclibc/bin/ld: memcached-thread.o: in function `thread_setname':\nthread.c:(.text+0xea2): undefined reference to `pthread_setname_np'\n\nFixes:\n - http://autobuild.buildroot.org/results/e856d381f5ec7d2727f21c8bd46dacb456984416\n\nSigned-off-by: Fabrice Fontaine ","shortMessageHtmlLink":"fix build on uclibc-ng"}},{"before":"707eecf941c5df3b957e174f4f747f0630e08b22","after":"e5a305085df64826cf04e6e4275dac6e43c0bd94","ref":"refs/heads/next","pushedAt":"2024-02-21T17:44:47.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"crawler: include client flags in metadump output","shortMessageHtmlLink":"crawler: include client flags in metadump output"}},{"before":"9425a89acd9e823fae02621b95259ececce71f6f","after":"707eecf941c5df3b957e174f4f747f0630e08b22","ref":"refs/heads/next","pushedAt":"2024-02-20T12:08:00.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"extstore: fix CAS changing during recache\n\nIf an item is recached from disk back into main cache memory, its CAS\nvalue would update. This was likely unintentional.\n\nThe recache feature isn't commonly used so this was hard to track.","shortMessageHtmlLink":"extstore: fix CAS changing during recache"}},{"before":"4d02d804a0c70497e91991f1fa671033b0c6b522","after":"9425a89acd9e823fae02621b95259ececce71f6f","ref":"refs/heads/next","pushedAt":"2024-02-15T20:14:45.000Z","pushType":"push","commitsCount":6,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: add lua registry dump functions\n\nhelpful for finding memory leaks in C-side references.","shortMessageHtmlLink":"proxy: add lua registry dump functions"}},{"before":"9ed2b44d4ed7f02d762d3838739de473324f7c99","after":"4d02d804a0c70497e91991f1fa671033b0c6b522","ref":"refs/heads/next","pushedAt":"2024-01-29T20:59:28.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: extra output for proxylimits.t","shortMessageHtmlLink":"proxy: extra output for proxylimits.t"}},{"before":"d2258ab13ea9e34da1c6368af22222b07a2703c4","after":"9ed2b44d4ed7f02d762d3838739de473324f7c99","ref":"refs/heads/next","pushedAt":"2024-01-29T11:58:38.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: fix bug in config reload cleanup phase\n\nIn mcp_funcgen_cleanup there is a loop that frees all of the referenced\nsubrctx's, then a second loop that frees the top level funcgen\nreferences that were held. In the second loop I was treating a subfgen\nas a subrctx. Weirdly I'm pretty sure that code had test coverage!\n\nThis is obviously the right fix: will figure out what went wrong with\ntests later.","shortMessageHtmlLink":"proxy: fix bug in config reload cleanup phase"}},{"before":"494fbb4e707ea690365a3f61b1757aa6253d851f","after":"d2258ab13ea9e34da1c6368af22222b07a2703c4","ref":"refs/heads/next","pushedAt":"2024-01-23T02:52:58.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: fix unlocked usage of config VM\n\nThis bug means under some conditions it's possible for the Lua\nconfiguration VM to be accessed by multiple threads, leading to\ncorruption. Found by eyeballing it.\n\nIn practice this is likely impossible to trigger: only two threads\naccess the configuration VM:\n- Config thread\n- Config Manager thread (handles GC'ing of pools)\n\nThe manager thread only activates after a configuration reload when old\npool objects are being reaped. It's also only possible to trigger a\nconfiguration reload once per second.\n\nWe also _do_ use the configuration lock for most of the manager thread,\nthe bug just unlocks it early. This means to produce an error you would\nneed to:\n\n- Issue a reload\n- Reload completes\n- Some in-flight requests hold the old pool-objects open\n- Issue another reload (minimum time 1s)\n- A pool object GC's at the same time as the reload is triggered\n- The configuration thread serializes behind the manger thread and\n blocks on the config lock during a _very_ narrow window.\n- Manager thread releases lock\n- Configuration thread acquires lock\n- Manager thread issues lua GC calls while config thread is doing other\n things\n- Now config VM crash/corruption.\n\nIf you're issuing reloads more than a few seconds apart the odds of\ntriggering this bug are zero.","shortMessageHtmlLink":"proxy: fix unlocked usage of config VM"}},{"before":"490a4aa483e0073735d636c57ed5a7056e06ada3","after":"494fbb4e707ea690365a3f61b1757aa6253d851f","ref":"refs/heads/next","pushedAt":"2024-01-10T06:48:10.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: remove API docs from t/proxyfuncgen.lua\n\nthey live on the wiki now. were slightly wrong anyway.","shortMessageHtmlLink":"proxy: remove API docs from t/proxyfuncgen.lua"}},{"before":"1518d8950eec537c726ea3f4358625cf6d1427ab","after":"490a4aa483e0073735d636c57ed5a7056e06ada3","ref":"refs/heads/next","pushedAt":"2024-01-09T21:52:46.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"pull[bot]","name":null,"path":"/apps/pull","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/12910?s=80&v=4"},"commit":{"message":"proxy: command map router default routes\n\nAllow adding CMD_ANY_STORAGE as a sub-default in a command map under a\nrouter. Also ensures we fall back to the top level router default if a\ncommand map does not have an exact match.","shortMessageHtmlLink":"proxy: command map router default routes"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAET4zAhQA","startCursor":null,"endCursor":null}},"title":"Activity ยท feihu-stripe/memcached"}