execute_locked_block.rb 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. class Service::ExecuteLockedBlock < Service::Base
  3. attr_reader :resource, :ttl, :redis_url
  4. def self.locked?(resource)
  5. dlm = Redlock::Client.new
  6. dlm.locked?(resource)
  7. end
  8. def self.locked!(resource)
  9. raise(ExecuteLockedBlockError) if locked?(resource)
  10. end
  11. def self.lock(resource, ttl)
  12. dlm = Redlock::Client.new
  13. dlm.lock(resource, ttl)
  14. end
  15. def self.unlock(lock_info)
  16. dlm = Redlock::Client.new
  17. dlm.unlock(lock_info)
  18. end
  19. def self.extend(lock_info)
  20. dlm = Redlock::Client.new
  21. dlm.lock(nil, nil, extend: lock_info)
  22. end
  23. def initialize(resource, ttl)
  24. super()
  25. @resource = resource
  26. @ttl = ttl
  27. end
  28. def execute(&)
  29. dlm = Redlock::Client.new
  30. dlm.lock(resource, ttl, &)
  31. end
  32. class ExecuteLockedBlockError < StandardError
  33. def initialize(message = __('This resource cannot be locked, because it has already been locked by another process.'))
  34. super
  35. end
  36. end
  37. end