diff --git a/archivebox/services/runner.py b/archivebox/services/runner.py index dd9582ba..5ee0bc2f 100644 --- a/archivebox/services/runner.py +++ b/archivebox/services/runner.py @@ -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: diff --git a/archivebox/tests/test_cli_run.py b/archivebox/tests/test_cli_run.py index 8a55e8ac..5a143ad7 100644 --- a/archivebox/tests/test_cli_run.py +++ b/archivebox/tests/test_cli_run.py @@ -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