Migrate snapshots sealed with legacy parents

This commit is contained in:
Nick Sweeting 2026-08-01 00:13:48 -07:00
parent d5ab6c50cb
commit 3bb1059ef5
No known key found for this signature in database
2 changed files with 46 additions and 0 deletions

View File

@ -1695,6 +1695,10 @@ def _run_due_snapshot_locked(snapshot, *, lock_seconds: int, interactive_interru
return False
parent_reconciled = snapshot.reconcile_parent_lifecycle(lock_seconds=lock_seconds)
if parent_reconciled is not None:
if parent_reconciled:
snapshot.refresh_from_db()
if snapshot.status == Snapshot.StatusChoices.SEALED and snapshot.fs_migration_needed:
return run_snapshot_maintenance(str(snapshot.id))
return parent_reconciled
if snapshot.is_paused:

View File

@ -1468,6 +1468,48 @@ class TestRecoverOrchestratorState:
assert snapshot.output_dir.joinpath("index.html").read_text(encoding="utf-8") == "legacy archive"
assert legacy_dir.is_symlink()
@pytest.mark.django_db(transaction=True)
def test_run_due_snapshot_migrates_filesystem_after_sealed_parent_reconciliation(self):
from django.utils import timezone
from archivebox.base_models.models import get_or_create_system_user_pk
from archivebox.core.models import ArchiveResult, Snapshot
from archivebox.crawls.models import Crawl
from archivebox.services.runner import run_due_snapshot
crawl = Crawl.objects.create(
urls="https://example.com/legacy-parent-sealed",
created_by_id=get_or_create_system_user_pk(),
status=Crawl.StatusChoices.SEALED,
retry_at=None,
)
snapshot = Snapshot.objects.create(
url="https://example.com/legacy-parent-sealed",
crawl=crawl,
status=Snapshot.StatusChoices.QUEUED,
retry_at=timezone.now(),
)
Snapshot.objects.filter(pk=snapshot.pk).update(fs_version="0.8.0")
snapshot.refresh_from_db()
legacy_dir = snapshot.output_dir
legacy_dir.mkdir(parents=True, exist_ok=True)
(legacy_dir / "index.html").write_text("legacy archive", encoding="utf-8")
ArchiveResult.objects.create(
snapshot=snapshot,
plugin="wget",
hook_name="on_Snapshot__06_wget",
status=ArchiveResult.StatusChoices.SUCCEEDED,
output_str="index.html",
)
assert run_due_snapshot(snapshot, lock_seconds=60) is True
snapshot.refresh_from_db()
assert snapshot.status == Snapshot.StatusChoices.SEALED
assert snapshot.fs_version == Snapshot._fs_current_version()
assert snapshot.output_dir.joinpath("index.html").read_text(encoding="utf-8") == "legacy archive"
assert legacy_dir.is_symlink()
@pytest.mark.django_db(transaction=True)
def test_run_due_snapshot_runs_queued_plugin_after_fs_migration(self):
from django.utils import timezone