fix(worker): lease premium reconciliation queue entries (#2296)

This commit is contained in:
Hampus
2026-09-01 00:14:08 +02:00
committed by GitHub
parent 2ea2e79f6f
commit 7d710d881a
7 changed files with 220 additions and 5 deletions
@@ -88,6 +88,7 @@ export interface IKVProvider {
refillIntervalMs: number,
): Promise<number>;
scheduleBulkDeletion(queueKey: string, secondaryKey: string, score: number, value: string): Promise<void>;
claimBulkDeletion(queueKey: string, member: string, maxScore: number, leaseScore: number): Promise<boolean>;
removeBulkDeletion(queueKey: string, secondaryKey: string, member?: string): Promise<boolean>;
scan(pattern: string, count: number): Promise<Array<string>>;
dequeuePurgeBatch(
+24
View File
@@ -223,6 +223,17 @@ tokens = tokens - #urls
redis.call('SET', bucketKey, cjson.encode({tokens = tokens, lastRefill = lastRefill}), 'EX', 3600)
return cjson.encode({urls = urls, tokens = #urls})
`;
const CLAIM_BULK_DELETION_SCRIPT = `
local score = redis.call('ZSCORE', KEYS[1], ARGV[1])
if not score then
return 0
end
if tonumber(score) > tonumber(ARGV[2]) then
return 0
end
redis.call('ZADD', KEYS[1], ARGV[3], ARGV[1])
return 1
`;
const REMOVE_BULK_DELETION_SCRIPT = `
local member = ARGV[1]
if member ~= '' and redis.call('ZREM', KEYS[1], member) == 1 then
@@ -613,6 +624,19 @@ export class KVClient implements IKVProvider {
);
}
async claimBulkDeletion(queueKey: string, member: string, maxScore: number, leaseScore: number): Promise<boolean> {
const result = await this.executeScript(
'claimBulkDeletion',
CLAIM_BULK_DELETION_SCRIPT,
1,
queueKey,
member,
maxScore,
leaseScore,
);
return Number(result) === 1;
}
async removeBulkDeletion(queueKey: string, secondaryKey: string, member = ''): Promise<boolean> {
const result = await this.executeScript(
'removeBulkDeletion',
@@ -139,6 +139,12 @@ describe('KVClient script execution', () => {
keyCount: 2,
run: async (client) => client.scheduleBulkDeletion('queue:key', 'secondary:key', 1, 'value'),
},
{
name: 'claimBulkDeletion',
reply: 1,
keyCount: 1,
run: async (client) => client.claimBulkDeletion('queue:key', 'member', 1, 2),
},
{
name: 'removeBulkDeletion',
reply: 1,