From be309d2e9f8638e77e63bd27d267fc22d9b99a68 Mon Sep 17 00:00:00 2001 From: Hayden Briese Date: Sat, 30 Sep 2023 01:12:01 +1000 Subject: [PATCH] Use mutex when adding missing transaction event jobs --- .../features/transactions/transactions.events.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/api/src/features/transactions/transactions.events.ts b/api/src/features/transactions/transactions.events.ts index b3845c741..8afea0a6a 100644 --- a/api/src/features/transactions/transactions.events.ts +++ b/api/src/features/transactions/transactions.events.ts @@ -16,6 +16,9 @@ import { EIP712_TX_TYPE } from 'zksync-web3/build/src/utils'; import { decodeEventLog, getAbiItem, getEventSelector } from 'viem'; import { ProposalsService } from '../proposals/proposals.service'; import { ProposalEvent } from '../proposals/proposals.input'; +import { InjectRedis } from '@songkeys/nestjs-redis'; +import Redis from 'ioredis'; +import { Mutex } from 'redis-semaphore'; @Injectable() export class TransactionsEvents implements OnModuleInit { @@ -23,6 +26,7 @@ export class TransactionsEvents implements OnModuleInit { @InjectQueue(TRANSACTIONS_QUEUE.name) private queue: Queue, private db: DatabaseService, + @InjectRedis() private redis: Redis, private provider: ProviderService, private transactionsProcessor: TransactionsProcessor, private proposals: ProposalsService, @@ -38,8 +42,13 @@ export class TransactionsEvents implements OnModuleInit { this.transactionsProcessor.onTransaction((data) => this.reverted(data)); } - onModuleInit() { - this.addMissingJobs(); + async onModuleInit() { + const mutex = new Mutex(this.redis, 'transactions-missing-jobs'); + try { + if (await mutex.tryAcquire()) await this.addMissingJobs(); + } finally { + await mutex.release(); + } } private async executed({ log, receipt, block }: TransactionEventData) {