Skip to content

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

Open
@LouisLou2

Description

@LouisLou2

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!

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions