diff --git a/lib/redis/semaphore.rb b/lib/redis/semaphore.rb index 461fa72..a7b5fa5 100644 --- a/lib/redis/semaphore.rb +++ b/lib/redis/semaphore.rb @@ -27,7 +27,7 @@ def initialize(name, opts = {}) def exists_or_create! token = @redis.getset(exists_key, EXISTS_TOKEN) - if token.nil? + if token.nil? || all_tokens.empty? create! else # Previous versions of redis-semaphore did not set `version_key`. diff --git a/spec/semaphore_spec.rb b/spec/semaphore_spec.rb index e2c0d65..86457dd 100644 --- a/spec/semaphore_spec.rb +++ b/spec/semaphore_spec.rb @@ -143,6 +143,19 @@ expect(semaphore.locked?).to be true end end + + it "should recover after being killed after lpop of AVAILABLE" do + semaphore.lock + semaphore.unlock + + expect(semaphore.available_count). to eq(1) + + @redis.lpop(semaphore.send(:available_key)) + + semaphore.lock(-1) + + expect(semaphore.locked?).to be true + end end describe "semaphore with expiration" do