From cfc2a383ac48f5324263e8d34ca8afcb3f58a085 Mon Sep 17 00:00:00 2001 From: sampatbadhe Date: Sat, 19 Feb 2022 13:47:03 +0530 Subject: [PATCH 1/2] add guard against releasing slots that haven't been reserved --- lib/kredis/types/slots.rb | 11 ++++++++--- test/types/slots_test.rb | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/kredis/types/slots.rb b/lib/kredis/types/slots.rb index 5909d30..11fff0e 100644 --- a/lib/kredis/types/slots.rb +++ b/lib/kredis/types/slots.rb @@ -19,10 +19,10 @@ def reserve release end else - if incr <= available + if available? + incr true else - release false end end @@ -30,7 +30,12 @@ def reserve end def release - decr + if get.to_i > 0 + decr + true + else + false + end end def available? diff --git a/test/types/slots_test.rb b/test/types/slots_test.rb index c12b277..3cf2ebc 100644 --- a/test/types/slots_test.rb +++ b/test/types/slots_test.rb @@ -26,6 +26,20 @@ class SlotsTest < ActiveSupport::TestCase assert @slots.available? end + test 'release when slots are reserved' do + assert_not @slots.release + + 3.times do + assert @slots.reserve + end + + 3.times do + assert @slots.release + end + + assert_not @slots.release + end + test "reserve with block" do assert @slots.reserve assert @slots.reserve @@ -70,6 +84,17 @@ class SlotsTest < ActiveSupport::TestCase assert_not slot.available? end + test "release single slot when reserved" do + slot = Kredis.slot "myslot" + + assert_not slot.release + + assert slot.reserve + assert slot.release + + assert_not slot.release + end + test "failing open" do stub_redis_down(@slots) do assert_not @slots.available? From 3e366914db301361dd3784eb3df6d7bebdd93e78 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 19 Feb 2022 14:21:43 +0100 Subject: [PATCH 2/2] Add Slots#taken method --- lib/kredis/types/slots.rb | 8 ++++++-- test/types/slots_test.rb | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/kredis/types/slots.rb b/lib/kredis/types/slots.rb index 11fff0e..94c5286 100644 --- a/lib/kredis/types/slots.rb +++ b/lib/kredis/types/slots.rb @@ -30,7 +30,7 @@ def reserve end def release - if get.to_i > 0 + if taken > 0 decr true else @@ -40,11 +40,15 @@ def release def available? failsafe returning: false do - get.to_i < available + taken < available end end def reset del end + + def taken + get.to_i + end end diff --git a/test/types/slots_test.rb b/test/types/slots_test.rb index 3cf2ebc..ef11204 100644 --- a/test/types/slots_test.rb +++ b/test/types/slots_test.rb @@ -26,7 +26,7 @@ class SlotsTest < ActiveSupport::TestCase assert @slots.available? end - test 'release when slots are reserved' do + test "release when slots are reserved" do assert_not @slots.release 3.times do @@ -38,6 +38,8 @@ class SlotsTest < ActiveSupport::TestCase end assert_not @slots.release + + assert_equal 0, @slots.taken end test "reserve with block" do