Description
Search before asking
- 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?
- I'm willing to submit a PR!