summaryrefslogtreecommitdiff
path: root/ext/kv/01_db.ts
diff options
context:
space:
mode:
authorIgor Zinkovsky <igor@deno.com>2023-12-12 22:51:23 -0800
committerGitHub <noreply@github.com>2023-12-12 22:51:23 -0800
commit86769b0d1cfb7341df31278913524492d5f9ab52 (patch)
treedba094702ec2c4ad19a59f61151a777fd3f3e0b9 /ext/kv/01_db.ts
parent0ceae7a490d933144f63be5bc9d5ba0b27bf5c6e (diff)
feat(ext/kv) add backoffSchedule to enqueue (#21474)
Also reduces the time to run `kv_queue_undelivered_test.ts` test from 100 seconds down to 3 seconds. closes #21437
Diffstat (limited to 'ext/kv/01_db.ts')
-rw-r--r--ext/kv/01_db.ts36
1 files changed, 32 insertions, 4 deletions
diff --git a/ext/kv/01_db.ts b/ext/kv/01_db.ts
index 2b0e141f8..18d190718 100644
--- a/ext/kv/01_db.ts
+++ b/ext/kv/01_db.ts
@@ -43,6 +43,20 @@ function validateQueueDelay(delay: number) {
}
}
+const maxQueueBackoffIntervals = 5;
+const maxQueueBackoffInterval = 60 * 60 * 1000;
+
+function validateBackoffSchedule(backoffSchedule: number[]) {
+ if (backoffSchedule.length > maxQueueBackoffIntervals) {
+ throw new TypeError("invalid backoffSchedule");
+ }
+ for (const interval of backoffSchedule) {
+ if (interval < 0 || interval > maxQueueBackoffInterval || isNaN(interval)) {
+ throw new TypeError("invalid backoffSchedule");
+ }
+ }
+}
+
interface RawKvEntry {
key: Deno.KvKey;
value: RawValue;
@@ -224,18 +238,25 @@ class Kv {
async enqueue(
message: unknown,
- opts?: { delay?: number; keysIfUndelivered?: Deno.KvKey[] },
+ opts?: {
+ delay?: number;
+ keysIfUndelivered?: Deno.KvKey[];
+ backoffSchedule?: number[];
+ },
) {
if (opts?.delay !== undefined) {
validateQueueDelay(opts?.delay);
}
+ if (opts?.backoffSchedule !== undefined) {
+ validateBackoffSchedule(opts?.backoffSchedule);
+ }
const enqueues = [
[
core.serialize(message, { forStorage: true }),
opts?.delay ?? 0,
opts?.keysIfUndelivered ?? [],
- null,
+ opts?.backoffSchedule ?? null,
],
];
@@ -468,16 +489,23 @@ class AtomicOperation {
enqueue(
message: unknown,
- opts?: { delay?: number; keysIfUndelivered?: Deno.KvKey[] },
+ opts?: {
+ delay?: number;
+ keysIfUndelivered?: Deno.KvKey[];
+ backoffSchedule?: number[];
+ },
): this {
if (opts?.delay !== undefined) {
validateQueueDelay(opts?.delay);
}
+ if (opts?.backoffSchedule !== undefined) {
+ validateBackoffSchedule(opts?.backoffSchedule);
+ }
this.#enqueues.push([
core.serialize(message, { forStorage: true }),
opts?.delay ?? 0,
opts?.keysIfUndelivered ?? [],
- null,
+ opts?.backoffSchedule ?? null,
]);
return this;
}