Skip to content

Commit 20aa4f2

Browse files
sampatbadhedhh
andauthored
Add guard against releasing slots that haven't been reserved (#71)
* add guard against releasing slots that haven't been reserved * Add Slots#taken method Co-authored-by: David Heinemeier Hansson <[email protected]>
1 parent d364ab9 commit 20aa4f2

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

lib/kredis/types/slots.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,36 @@ 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 taken > 0
34+
decr
35+
true
36+
else
37+
false
38+
end
3439
end
3540

3641
def available?
3742
failsafe returning: false do
38-
get.to_i < available
43+
taken < available
3944
end
4045
end
4146

4247
def reset
4348
del
4449
end
50+
51+
def taken
52+
get.to_i
53+
end
4554
end

test/types/slots_test.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,22 @@ 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+
42+
assert_equal 0, @slots.taken
43+
end
44+
2945
test "reserve with block" do
3046
assert @slots.reserve
3147
assert @slots.reserve
@@ -70,6 +86,17 @@ class SlotsTest < ActiveSupport::TestCase
7086
assert_not slot.available?
7187
end
7288

89+
test "release single slot when reserved" do
90+
slot = Kredis.slot "myslot"
91+
92+
assert_not slot.release
93+
94+
assert slot.reserve
95+
assert slot.release
96+
97+
assert_not slot.release
98+
end
99+
73100
test "failing open" do
74101
stub_redis_down(@slots) do
75102
assert_not @slots.available?

0 commit comments

Comments
 (0)