diff --git a/services/scheduler/app.py b/services/scheduler/app.py index 523a15c..5eb774f 100644 --- a/services/scheduler/app.py +++ b/services/scheduler/app.py @@ -125,8 +125,16 @@ def is_source_due( if last_status == "failed": if retry_count >= MAX_RETRY_COUNT: return False - if next_retry_at and now < next_retry_at.replace(tzinfo=None): - return False + if next_retry_at: + # Normalize tz-awareness to match 'now' + if now.tzinfo is not None and next_retry_at.tzinfo is None: + nra = next_retry_at.replace(tzinfo=timezone.utc) + elif now.tzinfo is None and next_retry_at.tzinfo is not None: + nra = next_retry_at.replace(tzinfo=None) + else: + nra = next_retry_at + if now < nra: + return False # Backoff elapsed or no next_retry_at set — allow retry return True @@ -139,7 +147,12 @@ def is_source_due( return True cadence = get_cadence_for_source(source_type, source_config) - elapsed = (now - last_completed_at.replace(tzinfo=None)).total_seconds() + # Ensure both datetimes have matching tz-awareness for subtraction + if now.tzinfo is not None and last_completed_at.tzinfo is None: + last_completed_at = last_completed_at.replace(tzinfo=timezone.utc) + elif now.tzinfo is None and last_completed_at.tzinfo is not None: + last_completed_at = last_completed_at.replace(tzinfo=None) + elapsed = (now - last_completed_at).total_seconds() return elapsed >= cadence