fury icon indicating copy to clipboard operation
fury copied to clipboard

[Python] TimestampSerializer fails on Windows for early time near epoch

Open LouisLou2 opened this issue 9 months ago • 0 comments

Search before asking

  • [x] I had searched in the issues and found no similar issues.

Version

Fury: Latest development branch OS: Windows 11 Python: 3.12 The issue is not present on Linux

Component(s)

Python

Minimal reproduce step

The issue occurs in CrossLanguageTest.java when running on Windows. The error happens when Fury tries to serialize datetime objects with timestamps close to the epoch (1970-01-01).

The root cause is in python/pyfury/_serialization.pyx at line 1192:

timestamp = int(value.timestamp() * 1000000)

The timestamp() method on naive datetime objects fails on Windows for early dates. This can be reproduced with:

import datetime

# This fails on Windows
d = datetime.datetime.fromtimestamp(timestamp=100)  # Early date: Jan 1, 1970 00:01:40
t = d.timestamp()  # OSError: [Errno 22] Invalid argument

# These work fine on Windows
d1 = datetime.datetime.fromtimestamp(timestamp=1000000)  # Later date
t1 = d1.timestamp()  # Works fine

d2 = datetime.datetime.fromtimestamp(timestamp=100, tz=datetime.timezone.utc)  # With timezone
t2 = d2.timestamp()  # Works fine

What did you expect to see?

Cross-language serialization tests should pass on both Linux and Windows platforms.

What did you see instead?

On Windows, serialization fails with:

ERROR:root:Execute ['test_cross_language_serializer', 'C:\\Users\\86511\\AppData\\Local\\Temp\\test_cross_language_serializer2918297548183494188data'] failed with [Errno 22] Invalid argument
Traceback (most recent call last):
  File "d:\projects\fury_dev\fury\python\pyfury\tests\test_cross_language.py", line 622, in <module>
    func(*args[1:])
  File "d:\projects\fury_dev\fury\python\pyfury\tests\test_cross_language.py", line 337, in test_cross_language_serializer
    fury.serialize(obj, buffer=new_buf)
  File "python/pyfury/_serialization.pyx", line 639, in pyfury._serialization.Fury.serialize
  File "python/pyfury/_serialization.pyx", line 688, in pyfury._serialization.Fury._serialize
  File "python/pyfury/_serialization.pyx", line 746, in pyfury._serialization.Fury.xserialize_ref
  File "python/pyfury/_serialization.pyx", line 764, in pyfury._serialization.Fury.xserialize_nonref
  File "python/pyfury/_serialization.pyx", line 1071, in pyfury._serialization.CrossLanguageCompatibleSerializer.xwrite
  File "python/pyfury/_serialization.pyx", line 1192, in pyfury._serialization.TimestampSerializer.write
OSError: [Errno 22] Invalid argument
Traceback (most recent call last):
  File "C:\Users\86511\.conda\envs\pyfury_dev6\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\86511\.conda\envs\pyfury_dev6\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "d:\projects\fury_dev\fury\python\pyfury\tests\test_cross_language.py", line 622, in <module>
    func(*args[1:])
  File "d:\projects\fury_dev\fury\python\pyfury\tests\test_cross_language.py", line 337, in test_cross_language_serializer
    fury.serialize(obj, buffer=new_buf)
  File "python/pyfury/_serialization.pyx", line 639, in pyfury._serialization.Fury.serialize
  File "python/pyfury/_serialization.pyx", line 688, in pyfury._serialization.Fury._serialize
  File "python/pyfury/_serialization.pyx", line 746, in pyfury._serialization.Fury.xserialize_ref
  File "python/pyfury/_serialization.pyx", line 764, in pyfury._serialization.Fury.xserialize_nonref
  File "python/pyfury/_serialization.pyx", line 1071, in pyfury._serialization.CrossLanguageCompatibleSerializer.xwrite
  File "python/pyfury/_serialization.pyx", line 1192, in pyfury._serialization.TimestampSerializer.write
OSError: [Errno 22] Invalid argument

The error trace shows that it occurs in TimestampSerializer.write when calling value.timestamp() on datetime objects with early timestamps.

Anything Else?

This appears to be a Windows-specific issue in Python's datetime implementation. There's an open Python issue for this: Timestamp conversion on windows fails with timestamps close to EPOCH #81708

Workaround: Add timezone information to datetime objects before calling timestamp(), for example by using:

datetime.datetime.fromtimestamp(timestamp=100, tz=datetime.UTC)

Are you willing to submit a PR?

  • [x] I'm willing to submit a PR!

LouisLou2 avatar Mar 24 '25 06:03 LouisLou2