# HG changeset patch # User Marcin Kuzminski # Date 2018-01-22 10:30:32 # Node ID e8ec1e0510c163a01b81a36368758d744b6274a2 # Parent fcee5614745dd4a676d28bebef4c2691e673914a metadata: store workers and prevent to excesive metadata writes. diff --git a/rhodecode/subscribers.py b/rhodecode/subscribers.py --- a/rhodecode/subscribers.py +++ b/rhodecode/subscribers.py @@ -25,6 +25,8 @@ import Queue import subprocess32 import os + +from dateutil.parser import parse from pyramid.i18n import get_localizer from pyramid.threadlocal import get_current_request from pyramid.interfaces import IRoutesMapper @@ -127,16 +129,36 @@ def write_metadata_if_needed(event): from rhodecode.lib import system_info from rhodecode.lib import ext_json + fname = '.rcmetadata.json' + ini_loc = os.path.dirname(rhodecode.CONFIG.get('__file__')) + metadata_destination = os.path.join(ini_loc, fname) + + def get_update_age(): + now = datetime.datetime.utcnow() + + with open(metadata_destination, 'rb') as f: + data = ext_json.json.loads(f.read()) + if 'created_on' in data: + update_date = parse(data['created_on']) + diff = now - update_date + return diff.total_seconds() / 60.0 + + return 0 + def write(): - fname = '.rcmetadata.json' - ini_loc = os.path.dirname(rhodecode.CONFIG.get('__file__')) - metadata_destination = os.path.join(ini_loc, fname) - configuration = system_info.SysInfo( system_info.rhodecode_config)()['value'] license_token = configuration['config']['license_token'] + + setup = dict( + workers=configuration['config']['server:main'].get( + 'workers', '?'), + worker_type=configuration['config']['server:main'].get( + 'worker_class', 'sync'), + ) dbinfo = system_info.SysInfo(system_info.database_info)()['value'] del dbinfo['url'] + metadata = dict( desc='upgrade metadata info', license_token=license_token, @@ -146,6 +168,7 @@ def write_metadata_if_needed(event): database=dbinfo, cpu=system_info.SysInfo(system_info.cpu)()['value'], memory=system_info.SysInfo(system_info.memory)()['value'], + setup=setup ) with open(metadata_destination, 'wb') as f: @@ -155,6 +178,15 @@ def write_metadata_if_needed(event): if settings.get('metadata.skip'): return + # only write this every 24h, workers restart caused unwanted delays + try: + age_in_min = get_update_age() + except Exception: + age_in_min = 0 + + if age_in_min < 60 * 60 * 24: + return + try: write() except Exception: