diff options
| author | Adam Soltys <[email protected]> | 2023-01-17 23:19:56 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2023-01-17 23:19:56 -0800 |
| commit | d62cc3b3db7d96ec48b71bb4adff99d134f934d7 (patch) | |
| tree | 73a553e159ee7253c932373f519bb042b3e850bf /lib/db.js | |
| parent | 33229e38a910e26083175a3e272278745378114c (diff) | |
| download | coinos-server-d62cc3b3db7d96ec48b71bb4adff99d134f934d7.tar.gz coinos-server-d62cc3b3db7d96ec48b71bb4adff99d134f934d7.zip | |
revert redlock
Diffstat (limited to 'lib/db.js')
| -rw-r--r-- | lib/db.js | 39 |
1 files changed, 35 insertions, 4 deletions
@@ -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; +}; |
