Skip to content

Commit b14df1d

Browse files
committed
remove holder key
1 parent 03d4fa9 commit b14df1d

File tree

3 files changed

+19
-11
lines changed

3 files changed

+19
-11
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
DEFAULT_SEMAPHORE_TTL: Final[datetime.timedelta] = datetime.timedelta(seconds=10)
1313
SEMAPHORE_KEY_PREFIX: Final[str] = "semaphores:"
14-
SEMAPHORE_HOLDER_KEY_PREFIX: Final[str] = "semaphores:holders:"
1514

1615
DEFAULT_DECODE_RESPONSES: Final[bool] = True
1716
DEFAULT_HEALTH_CHECK_INTERVAL: Final[datetime.timedelta] = datetime.timedelta(seconds=5)

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,17 @@ def validate_timeout(
176176
raise ValueError(msg)
177177
return v
178178

179+
async def _initialize_semaphore(self) -> None:
180+
"""Initializes the semaphore in Redis if not already done."""
181+
ttl_seconds = int(self.ttl.total_seconds())
182+
cls = type(self)
183+
assert cls.register_semaphore is not None # nosec
184+
await cls.register_semaphore( # pylint: disable=not-callable
185+
keys=[self.tokens_key, self.holders_key],
186+
args=[self.capacity, ttl_seconds],
187+
client=self.redis_client.redis,
188+
)
189+
179190
async def acquire(self) -> bool:
180191
"""
181192
Acquire the semaphore.
@@ -202,14 +213,7 @@ async def acquire(self) -> bool:
202213
self.blocking_timeout.total_seconds() if self.blocking_timeout else 0
203214
)
204215

205-
# Execute the Lua scripts atomically
206-
cls = type(self)
207-
assert cls.register_semaphore is not None # nosec
208-
await cls.register_semaphore( # pylint: disable=not-callable
209-
keys=[self.tokens_key, self.holders_key],
210-
args=[self.capacity, ttl_seconds],
211-
client=self.redis_client.redis,
212-
)
216+
await self._initialize_semaphore()
213217

214218
try:
215219
# this is blocking pop with timeout
@@ -234,6 +238,7 @@ async def acquire(self) -> bool:
234238
assert tokens_key_token[0] == self.tokens_key # nosec
235239
token = tokens_key_token[1]
236240

241+
cls = type(self)
237242
assert cls.acquire_script is not None # nosec
238243
result = await cls.acquire_script( # pylint: disable=not-callable
239244
keys=[self.holders_key, self.holder_key],
@@ -387,6 +392,7 @@ async def get_current_count(self) -> int:
387392

388393
async def get_available_count(self) -> int:
389394
"""Get the number of available semaphore slots"""
395+
await self._initialize_semaphore()
390396
return await handle_redis_returns_union_types(
391397
self.redis_client.redis.llen(self.tokens_key)
392398
)

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from servicelib.redis import RedisClientSDK
1515
from servicelib.redis._constants import (
1616
DEFAULT_SEMAPHORE_TTL,
17-
SEMAPHORE_HOLDER_KEY_PREFIX,
1817
SEMAPHORE_KEY_PREFIX,
1918
)
2019
from servicelib.redis._errors import SemaphoreLostError
@@ -60,7 +59,7 @@ async def test_semaphore_initialization(
6059
assert semaphore.instance_id is not None
6160
assert semaphore.semaphore_key == f"{SEMAPHORE_KEY_PREFIX}{semaphore_name}"
6261
assert semaphore.holder_key.startswith(
63-
f"{SEMAPHORE_HOLDER_KEY_PREFIX}{semaphore_name}:"
62+
f"{SEMAPHORE_KEY_PREFIX}{semaphore_name}:holders_:"
6463
)
6564

6665

@@ -109,6 +108,9 @@ async def test_semaphore_acquire_release_single(
109108
)
110109

111110
# Initially not acquired
111+
assert await semaphore.get_current_count() == 0
112+
assert await semaphore.get_available_count() == semaphore_capacity
113+
assert await semaphore.is_acquired() is False
112114

113115
# Acquire successfully
114116
result = await semaphore.acquire()
@@ -117,6 +119,7 @@ async def test_semaphore_acquire_release_single(
117119
# Check Redis state
118120
assert await semaphore.get_current_count() == 1
119121
assert await semaphore.get_available_count() == semaphore_capacity - 1
122+
assert await semaphore.is_acquired() is True
120123

121124
# Acquire again on same instance should return True immediately and keep the same count (reentrant)
122125
result = await semaphore.acquire()

0 commit comments

Comments
 (0)