1
0
mirror of https://github.com/misskey-dev/misskey.git synced 2026-06-10 07:13:58 +02:00

update deps (MisskeyIO#889)

- メンテナンスされないredis-lockを自前実装に変更
- 既にロックされている場合のリトライ間隔を調整
This commit is contained in:
あわわわとーにゅ
2025-01-15 03:24:33 +09:00
committed by kakkokari-gtyih
parent 46edd40409
commit 90e2dfef4e
25 changed files with 162 additions and 139 deletions

View File

@@ -0,0 +1,44 @@
import * as Redis from 'ioredis';
export async function acquireDistributedLock(
redis: Redis.Redis,
name: string,
timeout: number,
maxRetries: number,
retryInterval: number,
): Promise<() => Promise<void>> {
const lockKey = `lock:${name}`;
const identifier = Math.random().toString(36).slice(2);
let retries = 0;
while (retries < maxRetries) {
const result = await redis.set(lockKey, identifier, 'PX', timeout, 'NX');
if (result === 'OK') {
return async () => {
const currentIdentifier = await redis.get(lockKey);
if (currentIdentifier === identifier) {
await redis.del(lockKey);
}
};
}
await new Promise(resolve => setTimeout(resolve, retryInterval));
retries++;
}
throw new Error(`Failed to acquire lock ${name}`);
}
export function acquireApObjectLock(
redis: Redis.Redis,
uri: string,
): Promise<() => Promise<void>> {
return acquireDistributedLock(redis, `ap-object:${uri}`, 30 * 1000, 600, 100);
}
export function acquireChartInsertLock(
redis: Redis.Redis,
name: string,
): Promise<() => Promise<void>> {
return acquireDistributedLock(redis, `chart-insert:${name}`, 30 * 1000, 120, 500);
}