Come evitare sovrapposizioni tra job? DistributedMutex?

Sono un principiante con i plugin. Sto cercando di adattare un plugin che richiede circa un’ora per essere eseguito. Guardando /sidekiq, vedo che il lavoro viene eseguito ogni 30 minuti. Quindi, prima che il primo lavoro sia completato, un’altra istanza dello stesso lavoro inizia, creando risultati duplicati. Come posso evitarlo?

Un’opzione, naturalmente, è far sì che il lavoro venga eseguito nei suoi 30 minuti consentiti, ma ci sono altri vincoli e preferirei lasciarlo eseguire per tutto il tempo che desidera.

Ho provato questo, ma non sembra impedire l’esecuzione di una seconda istanza del lavoro:

DistributedMutex.synchronize("custom_digest", validity: 180.minutes)

Credo che il lavoro di email di riepilogo esegua un test simile a quello aggiunto all’inizio di quest’anno. Potresti darci un’occhiata.

Penso di stare facendo la stessa cosa di https://review.discourse.org/t/feature-allow-post-process-mutex-to-be-held-longer/5017 e https://review.discourse.org/t/fix-post-and-topic-creation-race-condition/5247, con la sola eccezione di utilizzare le parentesi graffe invece di do/end, ma non credo che ciò abbia importanza.

DistributedMutex.synchronize(“custom_digest”, validity: 180.minutes) {
do_stuff
}

Eppure do_stuff viene eseguito più volte contemporaneamente, e ben all’interno dei 180 minuti.

Se il mutex si trova all’interno del blocco execute, significa semplicemente che si bloccherà lì in attesa di esso, il che comporta che vedrai due job in esecuzione: uno effettivamente in esecuzione e l’altro in attesa del mutex.

Forse vorresti controllarlo e restituire un valore anticipatamente se è presente un’altra istanza in esecuzione? È difficile indovinare conoscendo così poco sul caso d’uso esatto.