Skip to content

Commit 299afe6

Browse files
committed
refactor
1 parent 48d623f commit 299afe6

File tree

5 files changed

+25
-20
lines changed

5 files changed

+25
-20
lines changed

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
COUNT_SEMAPHORE_SCRIPT,
4141
RELEASE_SEMAPHORE_SCRIPT,
4242
RENEW_SEMAPHORE_SCRIPT,
43+
SCRIPT_BAD_EXIT_CODE,
44+
SCRIPT_OK_EXIT_CODE,
4345
)
4446

4547
_logger = logging.getLogger(__name__)
@@ -210,11 +212,11 @@ async def release(self) -> None:
210212
)
211213

212214
assert isinstance(result, list) # nosec
213-
success, status, current_count, expired_count = result
215+
exit_code, status, current_count, expired_count = result
214216
result = status
215217

216218
if result == "released":
217-
assert success == 1 # nosec
219+
assert exit_code == SCRIPT_BAD_EXIT_CODE # nosec
218220
_logger.debug(
219221
"Released semaphore '%s' (instance: %s, count: %s, expired: %s)",
220222
self.key,
@@ -225,7 +227,7 @@ async def release(self) -> None:
225227
else:
226228
# Instance wasn't in the semaphore set - this shouldn't happen
227229
# but let's handle it gracefully
228-
assert success == 0 # nosec
230+
assert exit_code == SCRIPT_OK_EXIT_CODE # nosec
229231
raise SemaphoreNotAcquiredError(name=self.key)
230232

231233
async def _try_acquire(self) -> bool:
@@ -238,11 +240,11 @@ async def _try_acquire(self) -> bool:
238240
client=self.redis_client.redis,
239241
)
240242

241-
# Lua script returns: [success, status, current_count, expired_count]
243+
# Lua script returns: [exit_code, status, current_count, expired_count]
242244
assert isinstance(result, list) # nosec
243-
success, status, current_count, expired_count = result
245+
exit_code, status, current_count, expired_count = result
244246

245-
if success == 1:
247+
if exit_code == SCRIPT_OK_EXIT_CODE:
246248
_logger.debug(
247249
"Acquired semaphore '%s' (instance: %s, count: %s, expired: %s)",
248250
self.key,
@@ -285,11 +287,11 @@ async def reacquire(self) -> None:
285287
)
286288

287289
assert isinstance(result, list) # nosec
288-
success, status, current_count, expired_count = result
290+
exit_code, status, current_count, expired_count = result
289291

290292
# Lua script returns: 'renewed' or status message
291293
if status == "renewed":
292-
assert success == 1 # nosec
294+
assert exit_code == SCRIPT_OK_EXIT_CODE # nosec
293295
_logger.debug(
294296
"Renewed semaphore '%s' (instance: %s, count: %s, expired: %s)",
295297
self.key,
@@ -298,7 +300,7 @@ async def reacquire(self) -> None:
298300
expired_count,
299301
)
300302
else:
301-
assert success == 0 # nosec
303+
assert exit_code == SCRIPT_BAD_EXIT_CODE # nosec
302304
if status == "expired":
303305
_logger.warning(
304306
"Semaphore '%s' holder key expired (instance: %s, count: %s, expired: %s)",

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,6 @@ def _load_script(script_name: str) -> str:
2626
RELEASE_SEMAPHORE_SCRIPT: Final[str] = _load_script("release_semaphore")
2727
RENEW_SEMAPHORE_SCRIPT: Final[str] = _load_script("renew_semaphore")
2828
COUNT_SEMAPHORE_SCRIPT: Final[str] = _load_script("count_semaphore")
29+
30+
SCRIPT_BAD_EXIT_CODE: Final[int] = 255
31+
SCRIPT_OK_EXIT_CODE: Final[int] = 0

packages/service-library/src/servicelib/redis/lua/acquire_semaphore.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
-- ARGV[2]: capacity (max concurrent holders)
66
-- ARGV[3]: ttl_seconds
77
--
8-
-- Returns: {success, status, current_count, expired_count}
9-
-- success: 1 if acquired, 0 if failed
8+
-- Returns: {exit_code, status, current_count, expired_count}
9+
-- exit_code: 0 if acquired, 255 if failed
1010
-- status: 'acquired' or 'capacity_full'
1111
-- current_count: number of holders after operation
1212
-- expired_count: number of expired entries cleaned up
@@ -34,7 +34,7 @@ if current_count < capacity then
3434
redis.call('ZADD', semaphore_key, current_time, instance_id)
3535
redis.call('SETEX', holder_key, ttl_seconds, '1')
3636

37-
return {1, 'acquired', current_count + 1, expired_count}
37+
return {0, 'acquired', current_count + 1, expired_count}
3838
else
39-
return {0, 'capacity_full', current_count, expired_count}
39+
return {255, 'capacity_full', current_count, expired_count}
4040
end

packages/service-library/src/servicelib/redis/lua/release_semaphore.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
-- ARGV[2]: ttl_seconds
66
--
77
-- Returns: {success, status, current_count, expired_count}
8-
-- success: 1 if released, 0 if failed
8+
-- exit_code: 0 if released, 255 if failed
99
-- status: 'released', 'not_held', or 'already_expired'
1010
-- current_count: number of holders after operation
1111
-- expired_count: number of expired entries cleaned up
@@ -39,8 +39,8 @@ local removed_holder = redis.call('DEL', holder_key)
3939
local current_count = redis.call('ZCARD', semaphore_key)
4040

4141
if removed_from_zset == 1 then
42-
return {1, 'released', current_count, expired_count}
42+
return {0, 'released', current_count, expired_count}
4343
else
4444
-- This shouldn't happen since we checked ZSCORE above, but handle it
45-
return {0, 'already_expired', current_count, expired_count}
45+
return {255, 'already_expired', current_count, expired_count}
4646
end

packages/service-library/src/servicelib/redis/lua/renew_semaphore.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
-- ARGV[2]: ttl_seconds
66
--
77
-- Returns: {success, status, current_count, expired_count}
8-
-- success: 1 if renewed, 0 if failed
8+
-- exit_code: 0 if renewed, 255 if failed
99
-- status: 'renewed', 'not_held', or 'expired'
1010
-- current_count: number of holders after operation
1111
-- expired_count: number of expired entries cleaned up
@@ -29,7 +29,7 @@ local score = redis.call('ZSCORE', semaphore_key, instance_id)
2929
if score == false then
3030
-- Instance doesn't hold the semaphore
3131
local current_count = redis.call('ZCARD', semaphore_key)
32-
return {0, 'not_held', current_count, expired_count}
32+
return {255, 'not_held', current_count, expired_count}
3333
end
3434

3535
-- Step 3: Check if the holder key still exists (not expired)
@@ -38,12 +38,12 @@ if exists == 0 then
3838
-- Holder key expired, remove from semaphore and fail renewal
3939
redis.call('ZREM', semaphore_key, instance_id)
4040
local current_count = redis.call('ZCARD', semaphore_key)
41-
return {0, 'expired', current_count, expired_count + 1}
41+
return {255, 'expired', current_count, expired_count + 1}
4242
end
4343

4444
-- Step 4: Renew both the semaphore entry and holder key
4545
redis.call('ZADD', semaphore_key, current_time, instance_id)
4646
redis.call('SETEX', holder_key, ttl_seconds, '1')
4747

4848
local current_count = redis.call('ZCARD', semaphore_key)
49-
return {1, 'renewed', current_count, expired_count}
49+
return {0, 'renewed', current_count, expired_count}

0 commit comments

Comments
 (0)