# RhodeCode VCSServer provides access to different vcs backends via network. # Copyright (C) 2014-2024 RhodeCode GmbH # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import redis from ..._vendor import redis_lock from .utils import ArchiveCacheLock class GenerationLock: """ Locking mechanism that detects if a lock is acquired with GenerationLock(lock_key): compute_archive() """ lock_timeout = 7200 def __init__(self, lock_key, url): self.lock_key = lock_key self._create_client(url) self.lock = self.get_lock() def _create_client(self, url): connection_pool = redis.ConnectionPool.from_url(url) self.writer_client = redis.StrictRedis( connection_pool=connection_pool ) self.reader_client = self.writer_client def get_lock(self): return redis_lock.Lock( redis_client=self.writer_client, name=self.lock_key, expire=self.lock_timeout, strict=True ) def __enter__(self): acquired = self.lock.acquire(blocking=False) if not acquired: raise ArchiveCacheLock('Failed to create a lock') def __exit__(self, exc_type, exc_val, exc_tb): self.lock.release()