Merge PR #611: fix(session): atomic write for sessions.json to prevent data loss on crash
Authored by alireza78a.
Replaces open('w') + json.dump with tempfile.mkstemp + os.replace atomic
write pattern, matching the existing pattern in cron/jobs.py. Prevents
silent session loss if the process crashes or gets OOM-killed mid-write.
Resolved conflict: kept encoding='utf-8' from HEAD in the new fdopen call.
This commit is contained in:
commit
8f0b07ed29
1 changed files with 17 additions and 3 deletions
|
|
@ -353,12 +353,26 @@ class SessionStore:
|
||||||
|
|
||||||
def _save(self) -> None:
|
def _save(self) -> None:
|
||||||
"""Save sessions index to disk (kept for session key -> ID mapping)."""
|
"""Save sessions index to disk (kept for session key -> ID mapping)."""
|
||||||
|
import tempfile
|
||||||
self.sessions_dir.mkdir(parents=True, exist_ok=True)
|
self.sessions_dir.mkdir(parents=True, exist_ok=True)
|
||||||
sessions_file = self.sessions_dir / "sessions.json"
|
sessions_file = self.sessions_dir / "sessions.json"
|
||||||
|
|
||||||
data = {key: entry.to_dict() for key, entry in self._entries.items()}
|
data = {key: entry.to_dict() for key, entry in self._entries.items()}
|
||||||
with open(sessions_file, "w", encoding="utf-8") as f:
|
fd, tmp_path = tempfile.mkstemp(
|
||||||
json.dump(data, f, indent=2)
|
dir=str(self.sessions_dir), suffix=".tmp", prefix=".sessions_"
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
with os.fdopen(fd, "w", encoding="utf-8") as f:
|
||||||
|
json.dump(data, f, indent=2)
|
||||||
|
f.flush()
|
||||||
|
os.fsync(f.fileno())
|
||||||
|
os.replace(tmp_path, sessions_file)
|
||||||
|
except BaseException:
|
||||||
|
try:
|
||||||
|
os.unlink(tmp_path)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
raise
|
||||||
|
|
||||||
def _generate_session_key(self, source: SessionSource) -> str:
|
def _generate_session_key(self, source: SessionSource) -> str:
|
||||||
"""Generate a session key from a source."""
|
"""Generate a session key from a source."""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue