fix: handle Windows PermissionError on directory fsync

On Windows, opening a directory with O_RDONLY raises PermissionError.
Wrap the directory fsync in a try/except PermissionError — NTFS journals
metadata synchronously so the directory sync is unnecessary there.

Also adjust test assertions to expect 1 fsync call (file only) on
Windows vs 2 (file + directory) on POSIX.
This commit is contained in:
hussein1362
2026-04-22 13:19:53 +08:00
committed by Xubin Ren
parent 512bf59b3c
commit 0932189860
2 changed files with 19 additions and 8 deletions
+9 -4
View File
@@ -2,6 +2,7 @@
from __future__ import annotations
import sys
from pathlib import Path
from unittest.mock import patch
@@ -9,6 +10,8 @@ import pytest
from nanobot.session.manager import SessionManager
_IS_WINDOWS = sys.platform == "win32"
@pytest.fixture
def sessions_dir(tmp_path: Path) -> Path:
@@ -39,8 +42,9 @@ class TestSaveFsync:
with patch("os.fsync") as mock_fsync:
manager.save(session, fsync=True)
# Should be called twice: once for the file, once for the directory
assert mock_fsync.call_count == 2
# File fsync always runs; directory fsync only on non-Windows.
expected = 1 if _IS_WINDOWS else 2
assert mock_fsync.call_count == expected
def test_save_default_no_fsync(self, manager: SessionManager):
"""Default save() should not fsync (backward compat)."""
@@ -77,8 +81,9 @@ class TestFlushAll:
with patch("os.fsync") as mock_fsync:
manager.flush_all()
# file fsync + directory fsync
assert mock_fsync.call_count == 2
# file fsync always; directory fsync only on non-Windows
expected = 1 if _IS_WINDOWS else 2
assert mock_fsync.call_count == expected
def test_flush_all_continues_on_error(self, manager: SessionManager):
"""One broken session should not prevent others from flushing."""