light poller commit1
This commit is contained in:
@@ -106,7 +106,7 @@ def register_socketio_handlers(socketio):
|
||||
def poller():
|
||||
while True:
|
||||
loop_started = time.monotonic()
|
||||
next_sleep = poller_control.MIN_POLL_INTERVAL_SECONDS
|
||||
next_sleep = 10.0
|
||||
for profile in _poller_profiles():
|
||||
if not profile:
|
||||
continue
|
||||
@@ -114,47 +114,92 @@ def register_socketio_handlers(socketio):
|
||||
settings = poller_control.get_settings(pid)
|
||||
state = poller_control.state_for(pid)
|
||||
now = time.monotonic()
|
||||
next_sleep = min(next_sleep, poller_control.effective_fast_interval(settings, state))
|
||||
if not poller_control.should_fast_poll(now, settings, state):
|
||||
live_interval = poller_control.effective_live_interval(settings, state)
|
||||
list_interval = poller_control.effective_list_interval(settings, state)
|
||||
next_sleep = min(
|
||||
next_sleep,
|
||||
max(poller_control.MIN_POLL_INTERVAL_SECONDS, live_interval - (now - state.last_live_at)),
|
||||
max(poller_control.MIN_POLL_INTERVAL_SECONDS, list_interval - (now - state.last_list_at)),
|
||||
max(poller_control.MIN_POLL_INTERVAL_SECONDS, float(settings["system_stats_interval_seconds"]) - (now - state.last_system_at)),
|
||||
max(poller_control.MIN_POLL_INTERVAL_SECONDS, float(settings["slow_stats_interval_seconds"]) - (now - state.last_slow_at)),
|
||||
max(poller_control.MIN_POLL_INTERVAL_SECONDS, float(settings["queue_stats_interval_seconds"]) - (now - state.last_queue_at)),
|
||||
)
|
||||
|
||||
run_live = poller_control.should_live_poll(now, settings, state)
|
||||
run_list = poller_control.should_list_poll(now, settings, state)
|
||||
run_system = poller_control.should_system_poll(now, settings, state)
|
||||
run_slow = poller_control.should_slow_poll(now, settings, state)
|
||||
run_queue = poller_control.should_queue_poll(now, settings, state)
|
||||
if not (run_live or run_list or run_system or run_slow or run_queue):
|
||||
continue
|
||||
|
||||
tick_started = time.monotonic()
|
||||
changed = False
|
||||
ok = True
|
||||
error = ""
|
||||
active = False
|
||||
active = state.last_active
|
||||
emitted_payload_size = 0
|
||||
rtorrent_call_count = 0
|
||||
skipped_emissions = 0
|
||||
heartbeat = {"ok": True, "profile_id": pid, "tick": state.tick_count + 1, "error": ""}
|
||||
|
||||
try:
|
||||
diff = torrent_cache.refresh(profile)
|
||||
rtorrent_call_count += 1
|
||||
state.last_fast_at = now
|
||||
ok = bool(diff.get("ok"))
|
||||
error = str(diff.get("error") or "")
|
||||
rows = torrent_cache.snapshot(pid)
|
||||
active = _is_active_rows(rows)
|
||||
speed_status = _speed_status_from_rows(pid, rows) if diff.get("ok") else None
|
||||
if diff.get("ok") and (diff["added"] or diff["updated"] or diff["removed"]):
|
||||
changed = True
|
||||
payload = {**diff, "summary": cached_summary(pid, rows, force=True), "speed_status": speed_status}
|
||||
emitted_payload_size += len(json.dumps(payload, default=str))
|
||||
_emit_profile(socketio, "torrent_patch", payload, pid)
|
||||
elif not diff.get("ok"):
|
||||
_emit_profile(socketio, "rtorrent_error", diff, pid)
|
||||
else:
|
||||
# Note: Speeds and peak records may change even when no torrent rows need repainting.
|
||||
if speed_status:
|
||||
payload = {"ok": True, "profile_id": pid, "added": [], "updated": [], "removed": [], "speed_status": speed_status}
|
||||
speed_status = _speed_status_from_rows(pid, rows)
|
||||
|
||||
if run_live:
|
||||
live = torrent_cache.refresh_live(profile)
|
||||
rtorrent_call_count += 1
|
||||
state.last_live_at = now
|
||||
state.last_fast_at = now
|
||||
ok = bool(live.get("ok"))
|
||||
error = str(live.get("error") or "")
|
||||
rows = torrent_cache.snapshot(pid)
|
||||
active = _is_active_rows(rows)
|
||||
speed_status = _speed_status_from_rows(pid, rows) if live.get("ok") else speed_status
|
||||
if live.get("ok"):
|
||||
if live.get("updated") or speed_status:
|
||||
changed = changed or bool(live.get("updated"))
|
||||
payload = {
|
||||
"ok": True,
|
||||
"profile_id": pid,
|
||||
"updated": live.get("updated") or [],
|
||||
"speed_status": speed_status,
|
||||
"requires_full_refresh": bool(live.get("requires_full_refresh")),
|
||||
}
|
||||
emitted_payload_size += len(json.dumps(payload, default=str))
|
||||
_emit_profile(socketio, "torrent_live_patch", payload, pid)
|
||||
else:
|
||||
skipped_emissions += 1
|
||||
if live.get("requires_full_refresh"):
|
||||
# Note: Missing or unknown hashes mean the next slow list tick must reconcile rows.
|
||||
state.last_list_at = 0.0
|
||||
run_list = True
|
||||
else:
|
||||
_emit_profile(socketio, "rtorrent_error", live, pid)
|
||||
|
||||
if run_list:
|
||||
diff = torrent_cache.refresh(profile)
|
||||
rtorrent_call_count += 1
|
||||
state.last_list_at = now
|
||||
ok = bool(diff.get("ok"))
|
||||
error = str(diff.get("error") or "")
|
||||
rows = torrent_cache.snapshot(pid)
|
||||
active = _is_active_rows(rows)
|
||||
speed_status = _speed_status_from_rows(pid, rows) if diff.get("ok") else speed_status
|
||||
if diff.get("ok") and (diff["added"] or diff["updated"] or diff["removed"]):
|
||||
changed = True
|
||||
payload = {**diff, "summary": cached_summary(pid, rows, force=True), "speed_status": speed_status}
|
||||
emitted_payload_size += len(json.dumps(payload, default=str))
|
||||
_emit_profile(socketio, "torrent_patch", payload, pid)
|
||||
elif not diff.get("ok"):
|
||||
_emit_profile(socketio, "rtorrent_error", diff, pid)
|
||||
else:
|
||||
skipped_emissions += 1
|
||||
|
||||
if poller_control.should_system_poll(now, settings, state):
|
||||
if run_system:
|
||||
state.last_system_at = now
|
||||
rows = torrent_cache.snapshot(pid)
|
||||
status = rtorrent.system_status(profile, rows)
|
||||
rtorrent_call_count += 1
|
||||
if bool(profile.get("is_remote")):
|
||||
@@ -185,9 +230,11 @@ def register_socketio_handlers(socketio):
|
||||
if poller_control.should_tracker_poll(now, settings, state):
|
||||
state.last_tracker_at = now
|
||||
|
||||
if poller_control.should_slow_poll(now, settings, state) or poller_control.should_queue_poll(now, settings, state):
|
||||
state.last_slow_at = now
|
||||
state.last_queue_at = now
|
||||
if run_slow or run_queue:
|
||||
if run_slow:
|
||||
state.last_slow_at = now
|
||||
if run_queue:
|
||||
state.last_queue_at = now
|
||||
if state.slow_task_running:
|
||||
skipped_emissions += 1
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user