From 61b91e10ad41e6d207d60113a2f6f2b63a706940 Mon Sep 17 00:00:00 2001 From: Igor Zinkovsky Date: Fri, 29 Sep 2023 11:40:36 -0700 Subject: fix(ext/kv): send queue wake messages accross different kv instances (#20465) fixes #20454 Current KV queues implementation assumes that `enqueue` and `listenQueue` are called on the same instance of `Deno.Kv`. It's possible that the same Deno process opens multiple KV instances pointing to the same fs path, and in that case `listenQueue` should still get notified of messages enqueued through a different KV instance. --- cli/tests/unit/kv_test.ts | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'cli') diff --git a/cli/tests/unit/kv_test.ts b/cli/tests/unit/kv_test.ts index 25abf4cde..7cb8ebccf 100644 --- a/cli/tests/unit/kv_test.ts +++ b/cli/tests/unit/kv_test.ts @@ -1819,6 +1819,40 @@ Deno.test({ }, }); +Deno.test({ + name: "different kv instances for enqueue and queueListen", + async fn() { + const filename = await Deno.makeTempFile({ prefix: "queue_db" }); + try { + const db0 = await Deno.openKv(filename); + const db1 = await Deno.openKv(filename); + const promise = deferred(); + let dequeuedMessage: unknown = null; + const listener = db0.listenQueue((msg) => { + dequeuedMessage = msg; + promise.resolve(); + }); + try { + const res = await db1.enqueue("test"); + assert(res.ok); + assertNotEquals(res.versionstamp, null); + await promise; + assertEquals(dequeuedMessage, "test"); + } finally { + db0.close(); + await listener; + db1.close(); + } + } finally { + try { + await Deno.remove(filename); + } catch { + // pass + } + } + }, +}); + Deno.test({ name: "queue graceful close", async fn() { -- cgit v1.2.3