33 lines
1.2 KiB
Python
33 lines
1.2 KiB
Python
#!/usr/bin/env python3
|
|
"""Retry only persisted idempotent status reports, never repeat model work."""
|
|
import argparse
|
|
import json
|
|
from pathlib import Path
|
|
import time
|
|
from report import flush
|
|
from worker import atomic_json,session_lock
|
|
|
|
|
|
def main():
|
|
p=argparse.ArgumentParser(description=__doc__)
|
|
p.add_argument('--config',required=True)
|
|
p.add_argument('--once',action='store_true')
|
|
a=p.parse_args()
|
|
bridge=json.loads(Path(a.config).read_text(encoding='utf-8-sig'))
|
|
cfg=json.loads(Path(bridge['task_report_config']).read_text(encoding='utf-8-sig'))
|
|
health=Path(bridge['state_file']).parent/'report_relay-health.json'
|
|
with session_lock('task-report-relay:'+json.dumps(cfg,sort_keys=True)):
|
|
while True:
|
|
try:
|
|
counts=flush(cfg)
|
|
atomic_json(health,{'status':'ok' if not counts['pending'] and not counts['blocked'] else 'failed',
|
|
'updated':time.time(),'reports':counts})
|
|
except Exception:
|
|
atomic_json(health,{'status':'failed','updated':time.time(),'reason':'Inspect private report outbox'})
|
|
if a.once:raise
|
|
if a.once:return
|
|
time.sleep(5)
|
|
|
|
|
|
if __name__=='__main__':main()
|