Skip to content

Commit 2e9cc8a

Browse files
committed
ensure changing capacity changes the key as well
1 parent d2f13f0 commit 2e9cc8a

File tree

3 files changed

+15
-12
lines changed

3 files changed

+15
-12
lines changed

packages/service-library/src/servicelib/redis/_semaphore.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,19 +141,25 @@ def __init__(self, **data) -> None:
141141
@property
142142
def semaphore_key(self) -> str:
143143
"""Redis key for the semaphore sorted set."""
144-
return f"{SEMAPHORE_KEY_PREFIX}{self.key}"
144+
return f"{SEMAPHORE_KEY_PREFIX}{self.key}_cap{self.capacity}"
145145

146146
@computed_field # type: ignore[prop-decorator]
147147
@property
148148
def tokens_key(self) -> str:
149149
"""Redis key for the token pool LIST."""
150-
return f"{SEMAPHORE_KEY_PREFIX}{self.key}:tokens"
150+
return f"{self.semaphore_key}:tokens"
151151

152152
@computed_field # type: ignore[prop-decorator]
153153
@property
154154
def holders_set(self) -> str:
155155
"""Redis key for the holders SET."""
156-
return f"{SEMAPHORE_KEY_PREFIX}{self.key}:holders_set"
156+
return f"{self.semaphore_key}:holders_set"
157+
158+
@computed_field # type: ignore[prop-decorator]
159+
@property
160+
def holder_key(self) -> str:
161+
"""Redis key for this instance's holder entry."""
162+
return f"{self.semaphore_key}:holders:{self.instance_id}"
157163

158164
@computed_field # type: ignore[prop-decorator]
159165
@property
@@ -167,12 +173,6 @@ def tokens_set_ttl(self) -> datetime.timedelta:
167173
"""TTL for the tokens SET"""
168174
return self.ttl * 5
169175

170-
@computed_field # type: ignore[prop-decorator]
171-
@property
172-
def holder_key(self) -> str:
173-
"""Redis key for this instance's holder entry."""
174-
return f"{SEMAPHORE_KEY_PREFIX}{self.key}:holders:{self.instance_id}"
175-
176176
@field_validator("ttl")
177177
@classmethod
178178
def validate_ttl(cls, v: datetime.timedelta) -> datetime.timedelta:

packages/service-library/tests/redis/test_semaphore.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ async def test_semaphore_initialization(
6060
assert semaphore.ttl == DEFAULT_SEMAPHORE_TTL
6161
assert semaphore.blocking is True
6262
assert semaphore.instance_id is not None
63-
assert semaphore.semaphore_key == f"{SEMAPHORE_KEY_PREFIX}{semaphore_name}"
63+
assert (
64+
semaphore.semaphore_key
65+
== f"{SEMAPHORE_KEY_PREFIX}{semaphore_name}_cap{semaphore_capacity}"
66+
)
6467
assert semaphore.tokens_key.startswith(f"{semaphore.semaphore_key}:")
6568
assert semaphore.holders_set.startswith(f"{semaphore.semaphore_key}:")
6669
assert semaphore.holder_key.startswith(f"{semaphore.semaphore_key}:")

packages/service-library/tests/redis/test_semaphore_decorator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ async def coro_that_should_fail() -> Literal["should not reach here"]:
134134

135135
# Find and delete all holder keys for this semaphore
136136
holder_keys = await redis_client_sdk.redis.keys(
137-
f"{SEMAPHORE_KEY_PREFIX}{semaphore_name}:holders:*"
137+
f"{SEMAPHORE_KEY_PREFIX}{semaphore_name}_cap{semaphore_capacity}:holders:*"
138138
)
139139
assert holder_keys, "Holder keys should exist before deletion"
140140
await redis_client_sdk.redis.delete(*holder_keys)
@@ -734,7 +734,7 @@ async def use_failing_cm() -> None:
734734

735735
# Find and delete all holder keys for this semaphore
736736
holder_keys = await redis_client_sdk.redis.keys(
737-
f"{SEMAPHORE_KEY_PREFIX}{semaphore_name}:holders:*"
737+
f"{SEMAPHORE_KEY_PREFIX}{semaphore_name}_cap{semaphore_capacity}:holders:*"
738738
)
739739
assert holder_keys, "Holder keys should exist before deletion"
740740
await redis_client_sdk.redis.delete(*holder_keys)

0 commit comments

Comments
 (0)