(redis_t, lock_name: str)
| 255 | @staticmethod |
| 256 | @contextlib.contextmanager |
| 257 | def reader_lock(redis_t, lock_name: str): |
| 258 | current_cache_rlock = redis_lock.Lock(redis_t, f"{lock_name}-rlock") |
| 259 | current_cache_wlock = redis_lock.Lock(redis_t, f"{lock_name}-wlock") |
| 260 | lock_reader = f"{lock_name}-reader" |
| 261 | # make sure only one reader is entering |
| 262 | current_cache_rlock.acquire(timeout=60) |
| 263 | try: |
| 264 | current_cache_readers = redis_t.get(lock_reader) |
| 265 | if current_cache_readers is None or int(current_cache_readers) == 0: |
| 266 | CacheUtils.acquire(current_cache_wlock, lock_name) |
| 267 | redis_t.incr(lock_reader) |
| 268 | finally: |
| 269 | current_cache_rlock.release() |
| 270 | try: |
| 271 | yield |
| 272 | finally: |
| 273 | # make sure only one reader is leaving |
| 274 | current_cache_rlock.acquire(timeout=60) |
| 275 | try: |
| 276 | redis_t.decr(lock_reader) |
| 277 | if int(redis_t.get(lock_reader)) == 0: |
| 278 | redis_t.delete(lock_reader) |
| 279 | current_cache_wlock.reset() |
| 280 | finally: |
| 281 | current_cache_rlock.release() |
| 282 | |
| 283 | @staticmethod |
| 284 | @contextlib.contextmanager |
no test coverage detected