aboutsummaryrefslogtreecommitdiffstats
path: root/lib/db.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2023-01-17 23:19:56 -0800
committerAdam Soltys <[email protected]>2023-01-17 23:19:56 -0800
commitd62cc3b3db7d96ec48b71bb4adff99d134f934d7 (patch)
tree73a553e159ee7253c932373f519bb042b3e850bf /lib/db.js
parent33229e38a910e26083175a3e272278745378114c (diff)
downloadcoinos-server-d62cc3b3db7d96ec48b71bb4adff99d134f934d7.tar.gz
coinos-server-d62cc3b3db7d96ec48b71bb4adff99d134f934d7.zip
revert redlock
Diffstat (limited to 'lib/db.js')
-rw-r--r--lib/db.js39
1 files changed, 35 insertions, 4 deletions
diff --git a/lib/db.js b/lib/db.js
index fb99a756..1122038c 100644
--- a/lib/db.js
+++ b/lib/db.js
@@ -1,9 +1,40 @@
-import { Redis } from "ioredis";
-import Redlock from "redlock";
+import { sleep } from "$lib/utils";
+import { createClient } from "redis";
-export const db = new Redis("redis://db", { enableAutoPipelining: true });
+export const db = createClient({ url: "redis://db" });
+await db.connect();
export default db;
export let g = async k => JSON.parse(await db.get(k));
export let s = (k, v) => db.set(k, JSON.stringify(v));
-export let t = (f) => new Redlock([db]).using([db], 5000, f);
+
+let retries = {};
+export let t = async (k, f) => {
+ let result;
+ try {
+ result = await db.executeIsolated(async db => {
+ await db.watch(k);
+ let v = await db.get(k);
+ await db
+ .multi()
+ .set(k, await f(v))
+ .exec();
+ });
+ } catch (err) {
+ if (!err.message.includes("watch")) throw err;
+
+ let r = retries[k] || 0;
+ retries[k] = r + 1;
+
+ if (r < 10) {
+ await sleep(100);
+ await t(k, f);
+ } else {
+ delete retries[k];
+ throw new Error("unable to obtain lock");
+ }
+ }
+
+ delete retries[k];
+ return result;
+};