Como evitar sobreposição de jobs? DistributedMutex?

Sou novo em plugins. Estou tentando adaptar um plugin que leva cerca de uma hora para ser executado. Ao analisar /sidekiq, vejo que o job está sendo executado a cada 30 minutos. Assim, antes que o primeiro job termine, outra instância do mesmo job é iniciada, criando resultados duplicados. Como posso evitar isso?

Uma opção, é claro, seria fazer com que o job seja executado dentro do tempo permitido de 30 minutos, mas existem outras restrições, e eu preferiria deixá-lo rodar pelo tempo que precisar.

Tentei o seguinte, mas parece que não impede que uma segunda instância do job seja executada:

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

Acho que o job de e-mail de resumo realiza esse teste que foi adicionado no início deste ano. Você pode dar uma olhada nisso.

Acho que estou fazendo o mesmo que em 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, com a exceção de usar chaves em vez de do/end, mas não creio que isso importe.

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

No entanto, do_stuff está sendo executado várias vezes simultaneamente, e bem dentro do período de 180 minutos.

Se o mutex está dentro do bloco execute, isso significa apenas que ele bloqueará ali, aguardando por ele, ou seja, você verá dois jobs em execução: um realmente rodando e outro aguardando o mutex.

Talvez você queira verificar isso e retornar antecipadamente se houver outra instância em execução? É difícil adivinhar sabendo tão pouco sobre o caso de uso exato.