feat(archive): complete recorded session lifecycle
This commit is contained in:
@@ -8,7 +8,7 @@ import re
|
||||
import secrets
|
||||
import stat
|
||||
import threading
|
||||
from collections.abc import Iterator
|
||||
from collections.abc import Iterable, Iterator
|
||||
from contextlib import suppress
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
@@ -175,6 +175,36 @@ class RecordedMediaInspector:
|
||||
self._cache[key] = _CachedManifest(identity=identity, manifest=manifest)
|
||||
return manifest
|
||||
|
||||
def delete_prepared(self, session_id: str, artifact_ids: Iterable[str]) -> None:
|
||||
"""Forget and remove path-free preparation sidecars for one session."""
|
||||
|
||||
unique_artifact_ids = tuple(dict.fromkeys(artifact_ids))
|
||||
with self._lock:
|
||||
for artifact_id in unique_artifact_ids:
|
||||
self._cache.pop((session_id, artifact_id), None)
|
||||
if self._cache_root is None:
|
||||
return
|
||||
for artifact_id in unique_artifact_ids:
|
||||
sidecar = self._cache_root / _sidecar_name(session_id, artifact_id)
|
||||
try:
|
||||
metadata = sidecar.lstat()
|
||||
except FileNotFoundError:
|
||||
continue
|
||||
except OSError as exc:
|
||||
raise SessionIntegrityError(
|
||||
"recorded media preparation could not be inspected"
|
||||
) from exc
|
||||
if stat.S_ISLNK(metadata.st_mode) or not stat.S_ISREG(metadata.st_mode):
|
||||
raise SessionIntegrityError(
|
||||
"recorded media preparation is not a regular file"
|
||||
)
|
||||
try:
|
||||
sidecar.unlink()
|
||||
except OSError as exc:
|
||||
raise SessionIntegrityError(
|
||||
"recorded media preparation could not be deleted"
|
||||
) from exc
|
||||
|
||||
def restore_prepared(
|
||||
self,
|
||||
artifact: RecordedMediaArtifact,
|
||||
|
||||
Reference in New Issue
Block a user