mirror of https://github.com/tootsuite/mastodon
				
				
				
			
		
			
				
	
	
		
			20 lines
		
	
	
		
			743 B
		
	
	
	
		
			Ruby
		
	
	
			
		
		
	
	
			20 lines
		
	
	
		
			743 B
		
	
	
	
		
			Ruby
		
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| module Lockable
 | |
|   # @param [String] lock_name
 | |
|   # @param [ActiveSupport::Duration] autorelease Automatically release the lock after this time
 | |
|   # @param [Boolean] raise_on_failure Raise an error if a lock cannot be acquired, or fail silently
 | |
|   # @raise [Mastodon::RaceConditionError]
 | |
|   def with_lock(lock_name, autorelease: 15.minutes, raise_on_failure: true)
 | |
|     with_redis do |redis|
 | |
|       RedisLock.acquire(redis: redis, key: "lock:#{lock_name}", autorelease: autorelease.seconds) do |lock|
 | |
|         if lock.acquired?
 | |
|           yield
 | |
|         elsif raise_on_failure
 | |
|           raise Mastodon::RaceConditionError, "Could not acquire lock for #{lock_name}, try again later"
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |