Как предотвратить пересечение задач? DistributedMutex?

Привет, новичок в плагинах! Я пытаюсь адаптировать плагин, который выполняется около часа. Просматривая /sidekiq, я вижу, что задача запускается каждые 30 минут. Таким образом, до завершения первой задачи запускается новый экземпляр той же задачи, что приводит к дублированию результатов. Как это предотвратить?

Один из вариантов, конечно, — уложиться в отведённые 30 минут, но есть и другие ограничения, и я бы предпочел позволить задаче выполняться столько, сколько потребуется.

Я пробовал это, но, похоже, это не предотвращает запуск второго экземпляра задачи:

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

Полагаю, что задача по отправке сводного письма выполняет именно этот тест, который был добавлен в начале этого года. Возможно, стоит на него взглянуть.

Я думаю, что делаю то же самое, что и в https://review.discourse.org/t/feature-allow-post-process-mutex-to-be-held-longer/5017 и https://review.discourse.org/t/fix-post-and-topic-creation-race-condition/5247, за исключением использования фигурных скобок вместо do/end, но, по-моему, это не имеет значения.

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

Однако do_stuff выполняется несколько раз одновременно, и это происходит в пределах тех самых 180 минут.

Если мьютекс находится внутри блока execute, это просто означает, что выполнение заблокируется там в ожидании его освобождения, то есть вы увидите два запущенных задания: одно фактически выполняющееся, а другое ожидающее мьютекс.

Возможно, стоит проверить наличие другого запущенного экземпляра и завершить выполнение досрочно? С учётом столь малого объёма информации о конкретном случае использования сложно сказать наверняка.