This is an automated email from the ASF dual-hosted git repository. potiuk pushed a commit to branch v2-8-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 5aa424d5639d0de38f09a2afbfd3c4c01a62be1c Author: Alexander Millin <[email protected]> AuthorDate: Sat Mar 16 14:25:20 2024 +0300 Fix incorrect serialisation of the FixedTimezone (#38139) This issue introduced in Airflow 2.8. When the `start_date` of a DAG is specified with a fixed timezone, its serialisation will not be correct and this causes the scheduler to crash. (cherry picked from commit 0720ea08a065bd46fac3372b7ed00687078d7655) --- airflow/serialization/serialized_objects.py | 2 +- tests/serialization/test_dag_serialization.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/airflow/serialization/serialized_objects.py b/airflow/serialization/serialized_objects.py index 7c8906d697..81df0581b7 100644 --- a/airflow/serialization/serialized_objects.py +++ b/airflow/serialization/serialized_objects.py @@ -459,7 +459,7 @@ class BaseSerialization: return cls._encode(var.timestamp(), type_=DAT.DATETIME) elif isinstance(var, datetime.timedelta): return cls._encode(var.total_seconds(), type_=DAT.TIMEDELTA) - elif isinstance(var, Timezone): + elif isinstance(var, (Timezone, FixedTimezone)): return cls._encode(encode_timezone(var), type_=DAT.TIMEZONE) elif isinstance(var, relativedelta.relativedelta): return cls._encode(encode_relativedelta(var), type_=DAT.RELATIVEDELTA) diff --git a/tests/serialization/test_dag_serialization.py b/tests/serialization/test_dag_serialization.py index 30407eb945..06966b78c1 100644 --- a/tests/serialization/test_dag_serialization.py +++ b/tests/serialization/test_dag_serialization.py @@ -25,7 +25,7 @@ import json import multiprocessing import os import pickle -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone as dt_timezone from glob import glob from pathlib import Path from typing import TYPE_CHECKING @@ -686,7 +686,16 @@ class TestStringifiedDAGs: datetime(2019, 7, 30, tzinfo=timezone.utc), datetime(2019, 8, 1, tzinfo=timezone.utc), ), - (pendulum.datetime(2019, 8, 1, tz="UTC"), None, pendulum.datetime(2019, 8, 1, tz="UTC")), + ( + datetime(2019, 8, 1, tzinfo=dt_timezone(timedelta(hours=1))), + datetime(2019, 7, 30, tzinfo=dt_timezone(timedelta(hours=1))), + datetime(2019, 8, 1, tzinfo=dt_timezone(timedelta(hours=1))), + ), + ( + pendulum.datetime(2019, 8, 1, tz="UTC"), + None, + pendulum.datetime(2019, 8, 1, tz="UTC"), + ), ], ) def test_deserialization_start_date(self, dag_start_date, task_start_date, expected_task_start_date):
