本文整理汇总了Python中synergy.db.dao.unit_of_work_dao.UnitOfWorkDao.get_reprocessing_candidates方法的典型用法代码示例。如果您正苦于以下问题:Python UnitOfWorkDao.get_reprocessing_candidates方法的具体用法?Python UnitOfWorkDao.get_reprocessing_candidates怎么用?Python UnitOfWorkDao.get_reprocessing_candidates使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类synergy.db.dao.unit_of_work_dao.UnitOfWorkDao
的用法示例。
在下文中一共展示了UnitOfWorkDao.get_reprocessing_candidates方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: test_select_reprocessing_candidates
# 需要导入模块: from synergy.db.dao.unit_of_work_dao import UnitOfWorkDao [as 别名]
# 或者: from synergy.db.dao.unit_of_work_dao.UnitOfWorkDao import get_reprocessing_candidates [as 别名]
def test_select_reprocessing_candidates(self):
logger = get_logger(PROCESS_UNIT_TEST)
uow_dao = UnitOfWorkDao(logger)
try:
initial_candidates = uow_dao.get_reprocessing_candidates()
except:
initial_candidates = []
try:
initial_positive_candidates = uow_dao.get_reprocessing_candidates('2010123123')
except:
initial_positive_candidates = []
positive_timeperiods = {u'2010123123': PROCESS_SITE_HOURLY, # hourly time qualifier
u'2010123100': PROCESS_SITE_DAILY, # daily time qualifier
u'2010120000': PROCESS_SITE_MONTHLY, # monthly time qualifier
u'2010000000': PROCESS_SITE_YEARLY} # yearly time qualifier
negative_timeperiods = {u'2009123123': PROCESS_SITE_HOURLY, # hourly time qualifier
u'2009123100': PROCESS_SITE_DAILY, # daily time qualifier
u'2009120000': PROCESS_SITE_MONTHLY, # monthly time qualifier
u'2009000000': PROCESS_SITE_YEARLY} # yearly time qualifier
all_timeperiods = dict()
all_timeperiods.update(positive_timeperiods)
all_timeperiods.update(negative_timeperiods)
created_uow = []
for timeperiod, process_name in all_timeperiods.items():
created_uow.append(create_and_insert_unit_of_work(process_name,
0,
1,
timeperiod=timeperiod,
state=unit_of_work.STATE_INVALID))
candidates = uow_dao.get_reprocessing_candidates('2010123123')
self.assertEqual(len(candidates) - len(initial_positive_candidates), len(positive_timeperiods))
candidates = uow_dao.get_reprocessing_candidates()
self.assertEqual(len(candidates) - len(initial_candidates), len(all_timeperiods))
for uow_id in created_uow:
uow_dao.remove(uow_id)
示例2: GarbageCollector
# 需要导入模块: from synergy.db.dao.unit_of_work_dao import UnitOfWorkDao [as 别名]
# 或者: from synergy.db.dao.unit_of_work_dao.UnitOfWorkDao import get_reprocessing_candidates [as 别名]
class GarbageCollector(object):
""" GC is triggered directly by Synergy Scheduler.
It scans for invalid or stalled unit_of_work and re-triggers them.
GC is vital for the health of the system.
Deployment with no GC is considered invalid """
def __init__(self, scheduler):
self.logger = get_logger(PROCESS_GC, append_to_console=False, redirect_stdstream=False)
self.managed_handlers = scheduler.managed_handlers
self.mq_transmitter = MqTransmitter(self.logger)
self.timetable = scheduler.timetable
self.lock = Lock()
self.uow_dao = UnitOfWorkDao(self.logger)
self.reprocess_uows = collections.defaultdict(PriorityQueue)
self.timer = RepeatTimer(settings.settings['gc_run_interval'], self._run)
@thread_safe
def scan_uow_candidates(self):
""" method performs two actions:
- enlist stale or invalid units of work into reprocessing queue
- cancel UOWs that are older than 2 days and have been submitted more than 1 hour ago """
try:
since = settings.settings['synergy_start_timeperiod']
uow_list = self.uow_dao.get_reprocessing_candidates(since)
except LookupError as e:
self.logger.info('flow: no UOW candidates found for reprocessing: {0}'.format(e))
return
for uow in uow_list:
try:
if uow.process_name not in self.managed_handlers:
self.logger.debug('process {0} is not known to the Synergy Scheduler. Skipping its UOW.'
.format(uow.process_name))
continue
thread_handler = self.managed_handlers[uow.process_name]
assert isinstance(thread_handler, ManagedThreadHandler)
if not thread_handler.process_entry.is_on:
self.logger.debug('process {0} is inactive. Skipping its UOW.'.format(uow.process_name))
continue
entry = PriorityEntry(uow)
if entry in self.reprocess_uows[uow.process_name]:
# given UOW is already registered in the reprocessing queue
continue
# ASSUMPTION: UOW is re-created by a state machine during reprocessing
# thus - any UOW older 2 days could be marked as STATE_CANCELED
if datetime.utcnow() - uow.created_at > timedelta(hours=settings.settings['gc_life_support_hours']):
self._cancel_uow(uow)
continue
# if the UOW has been idle for more than 1 hour - resubmit it
if datetime.utcnow() - uow.submitted_at > timedelta(hours=settings.settings['gc_resubmit_after_hours'])\
or uow.is_invalid:
# enlist the UOW into the reprocessing queue
self.reprocess_uows[uow.process_name].put(entry)
except Exception as e:
self.logger.error('flow exception: {0}'.format(e), exc_info=True)
def _flush_queue(self, q, ignore_priority=False):
"""
:param q: PriorityQueue instance holding GarbageCollector entries
:param ignore_priority: If True - all GarbageCollector entries should be resubmitted
If False - only those entries whose waiting time has expired will be resubmitted
"""
assert isinstance(q, PriorityQueue)
current_timestamp = compute_release_time(lag_in_minutes=0)
for _ in range(len(q)):
entry = q.pop()
assert isinstance(entry, PriorityEntry)
if ignore_priority or entry.release_time < current_timestamp:
self._resubmit_uow(entry.entry)
else:
q.put(entry)
break
@thread_safe
def flush(self, ignore_priority=False):
""" method iterates over each reprocessing queues and re-submits UOW whose waiting time has expired """
for process_name, q in self.reprocess_uows.items():
self._flush_queue(q, ignore_priority)
@thread_safe
def validate(self):
""" method iterates over the reprocessing queue and synchronizes state of every UOW with the DB
should it change via the MX to STATE_CANCELED - remove the UOW from the queue """
for process_name, q in self.reprocess_uows.items():
if not q:
continue
invalid_entries = list()
for entry in q.queue:
assert isinstance(entry, PriorityEntry)
uow = self.uow_dao.get_one(entry.entry.db_id)
#.........这里部分代码省略.........
示例3: GarbageCollectorWorker
# 需要导入模块: from synergy.db.dao.unit_of_work_dao import UnitOfWorkDao [as 别名]
# 或者: from synergy.db.dao.unit_of_work_dao.UnitOfWorkDao import get_reprocessing_candidates [as 别名]
class GarbageCollectorWorker(AbstractMqWorker):
""" GC is triggered by an empty message from RabbitMQ. It scans for invalid or stalled unit_of_work
and re-triggers them. GC is vital for the health of the system.
Deployment with no running GC is considered invalid """
def __init__(self, process_name):
super(GarbageCollectorWorker, self).__init__(process_name)
self.lock = Lock()
self.publishers = PublishersPool(self.logger)
self.uow_dao = UnitOfWorkDao(self.logger)
self.managed_dao = ManagedProcessDao(self.logger)
self.managed_entries = dict()
def __del__(self):
try:
self.logger.info('Closing Flopsy Publishers Pool...')
self.publishers.close()
except Exception as e:
self.logger.error('Exception caught while closing Flopsy Publishers Pool: %s' % str(e))
super(GarbageCollectorWorker, self).__del__()
@thread_safe
def _mq_callback(self, message):
""" method looks for stale or invalid units of work re-runs them if needed"""
try:
managed_entries = self.managed_dao.get_all()
self._update_managed_entries(managed_entries)
since = settings.settings['synergy_start_timeperiod']
uow_list = self.uow_dao.get_reprocessing_candidates(since)
for uow in uow_list:
if uow.process_name not in self.managed_entries:
self.logger.debug('Process %r is not known to the Synergy Scheduler. Skipping its unit_of_work.'
% uow.process_name)
continue
process_entry = self.managed_entries[uow.process_name]
assert isinstance(process_entry, ManagedProcessEntry)
if not process_entry.is_on:
self.logger.debug('Process %r is inactive at the Synergy Scheduler. Skipping its unit_of_work.'
% uow.process_name)
continue
self._process_single_document(uow)
except LookupError as e:
self.logger.info('Normal behaviour. %r' % e)
except Exception as e:
self.logger.error('_mq_callback: %s' % str(e), exc_info=True)
finally:
self.consumer.acknowledge(message.delivery_tag)
def _update_managed_entries(self, managed_entries):
self.managed_entries = {me.process_name: me for me in managed_entries}
def _process_single_document(self, uow):
""" actually inspects UOW retrieved from the database"""
repost = False
if uow.is_invalid:
repost = True
elif uow.is_in_progress or uow.is_requested:
last_activity = uow.started_at
if last_activity is None:
last_activity = uow.created_at
if datetime.utcnow() - last_activity > timedelta(hours=REPOST_AFTER_HOURS):
repost = True
if repost:
mq_request = SynergyMqTransmission(process_name=uow.process_name,
unit_of_work_id=uow.db_id)
if datetime.utcnow() - uow.created_at < timedelta(hours=LIFE_SUPPORT_HOURS):
uow.state = unit_of_work.STATE_REQUESTED
uow.number_of_retries += 1
self.uow_dao.update(uow)
publisher = self.publishers.get(uow.process_name)
publisher.publish(mq_request.document)
publisher.release()
self.logger.info('UOW marked for re-processing: process %s; timeperiod %s; id %s; attempt %d'
% (uow.process_name, uow.timeperiod, uow.db_id, uow.number_of_retries))
self.performance_ticker.tracker.increment_success()
else:
uow.state = unit_of_work.STATE_CANCELED
self.uow_dao.update(uow)
publisher = self.publishers.get(QUEUE_UOW_REPORT)
publisher.publish(mq_request.document)
publisher.release()
self.logger.info('UOW transferred to STATE_CANCELED: process %s; timeperiod %s; id %s; attempt %d'
% (uow.process_name, uow.timeperiod, uow.db_id, uow.number_of_retries))