def worker_wrapper(*args, **kwargs): """ Wrapper of the worker. manages exceptions and logs. """ if 'rds' in kwargs: label = 'block_sync=%(pnn)s:%(rds)s' level = logging.VNOTICE else: label = 'pnn_sync=%(pnn)s' level = logging.SUMMARY logging.my_fmt(label=label % kwargs) logging.log(level, 'Starting Task') try: ret = func(*args, **kwargs) #pylint: disable=broad-except except Exception as exc: logging.error('Exception %s raised: %s', type(exc).__name__, traceback.format_exc().replace('\n', '~~')) return None timing = ret.pop('timing') if 'return' in ret: ret = ret['return'] logging.log(level, 'Finished: %s; timing: %s', ret, timing) return ret
def dataset_replica_update(dataset, pnn, rse, pcli, account, dry): """ Just wrapping the update method. """ try: rcli = Client(account=account) except CannotAuthenticate: logging.warning("cannot authenticate with account %s, skipping pnn %s", account, pnn) return None logging.my_fmt(label='update:rse=%s:rds=%s' % (pnn, dataset)) logging.notice('Starting.') try: ret = _replica_update(dataset, pnn, rse, pcli, rcli, dry) #pylint: disable=broad-except except Exception as exc: logging.error('Exception %s raised: %s', type(exc).__name__, traceback.format_exc().replace('\n', '~~')) return None logging.notice('Finished %s.', ret)
def sync(config, logs): """ Main Sync process """ logging.my_logfile(logs=logs) logging.my_fmt(label='main_sync') starttime = datetime.now() modify = {} workers = {} # this is the array of running pnns pnns = None # this is the array of pnn to be launched pool = None pcli = PhEDEx() install_mp_handler() conf = _load_config(config, modify, starttime) pnns = [] size = conf['main']['pool'] logging.summary('Starting') while conf['main']['run']: if pool is None: logging.notice('Started pool of size %d', size) pool = multiprocessing.NDPool(size) add = [ pnn for pnn, sec in conf.items() if pnn != 'main' if sec['run'] if pnn not in workers if pnn not in pnns ] pnns += add random.shuffle(pnns) if not _ping(): logging.warning('Cannot ping, not launching workers') else: _launch_workers(pool, workers, pnns, pcli) pnns = [] _poll_workers(workers, pnns) conf = _load_config(config, modify, starttime) if not conf['main']['run'] or\ conf['main']['pool'] != size: # trigger draining of all workers, close the pool and wait # for the task to be over conf = _load_config(config, {'default': {'run': False}}, starttime) _drain_up(workers, pnns) workers = {} pool.close() pool = None size = conf['main']['pool'] else: time.sleep(conf['main']['sleep']) logging.summary('Exiting.') return config