Skip to content

Commit cfc2a38

Browse files
committed
add guard against releasing slots that haven't been reserved
1 parent d364ab9 commit cfc2a38

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

lib/kredis/types/slots.rb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,23 @@ def reserve
1919
release
2020
end
2121
else
22-
if incr <= available
22+
if available?
23+
incr
2324
true
2425
else
25-
release
2626
false
2727
end
2828
end
2929
end
3030
end
3131

3232
def release
33-
decr
33+
if get.to_i > 0
34+
decr
35+
true
36+
else
37+
false
38+
end
3439
end
3540

3641
def available?

test/types/slots_test.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,20 @@ class SlotsTest < ActiveSupport::TestCase
2626
assert @slots.available?
2727
end
2828

29+
test 'release when slots are reserved' do
30+
assert_not @slots.release
31+
32+
3.times do
33+
assert @slots.reserve
34+
end
35+
36+
3.times do
37+
assert @slots.release
38+
end
39+
40+
assert_not @slots.release
41+
end
42+
2943
test "reserve with block" do
3044
assert @slots.reserve
3145
assert @slots.reserve
@@ -70,6 +84,17 @@ class SlotsTest < ActiveSupport::TestCase
7084
assert_not slot.available?
7185
end
7286

87+
test "release single slot when reserved" do
88+
slot = Kredis.slot "myslot"
89+
90+
assert_not slot.release
91+
92+
assert slot.reserve
93+
assert slot.release
94+
95+
assert_not slot.release
96+
end
97+
7398
test "failing open" do
7499
stub_redis_down(@slots) do
75100
assert_not @slots.available?

0 commit comments

Comments
 (0)