# Copyright (C) 2015-2023 RhodeCode GmbH # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3 # (only), as published by the Free Software Foundation. # # 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 Affero General Public License # along with this program. If not, see . # # This program is dual-licensed. If you wish to learn more about the # RhodeCode Enterprise Edition, including its added features, Support services, # and proprietary license terms, please see https://rhodecode.com/licenses/ import atexit import logging import os import signal import sys import rhodecode log = logging.getLogger(__name__) cache_keys_by_pid = set() def sigHandler(signo, frame): """ signals trigger sys.exit so there's a single handler to cleanup the code. """ if rhodecode.is_test: return sys.exit(0) def free_cache_keys(*args): from rhodecode.model.db import CacheKey, Session if rhodecode.is_test: return ssh_cmd = os.environ.get('RC_CMD_SSH_WRAPPER') if ssh_cmd: return if cache_keys_by_pid: try: for cache_proc in set(cache_keys_by_pid): like_expression = f'{cache_proc}%' qry = CacheKey.query().filter(CacheKey.cache_key.like(like_expression)) count = qry.count() log.info('Clearing %s: %s cache keys, total: %s', cache_proc, len(cache_keys_by_pid), count) qry.delete(synchronize_session='fetch') cache_keys_by_pid.remove(cache_proc) Session().commit() except Exception: log.exception('Failed to clear keys, exiting gracefully') atexit.register(free_cache_keys) signal.signal(signal.SIGTERM, sigHandler) signal.signal(signal.SIGINT, sigHandler)