Record Core lifecycle recovery adoption
This commit is contained in:
@@ -67,6 +67,16 @@ cannot be retried until evidence confirms either that the effect occurred or is
|
|||||||
absent. Linked Dataflow uncertainty blocks the Workflow without duplicating
|
absent. Linked Dataflow uncertainty blocks the Workflow without duplicating
|
||||||
Dataflow's recovery authority.
|
Dataflow's recovery authority.
|
||||||
|
|
||||||
|
Core module lifecycle is adopted at four boundaries. Installer recovery is
|
||||||
|
prepared before snapshots so a full database restore preserves the attempted
|
||||||
|
operation. Pre-migration package changes use compensation, migrated changes use
|
||||||
|
forward recovery, destructive retirement requires a hashed and restore-checked
|
||||||
|
snapshot, and live graph changes restore the prior registry when no migration
|
||||||
|
ran. A deployment-wide database fence serializes these effects; any unresolved
|
||||||
|
predecessor blocks a differently keyed retry until explicit reconciliation.
|
||||||
|
Supervised installs become successful only after restart and health evidence is
|
||||||
|
recorded.
|
||||||
|
|
||||||
## Operator Contract
|
## Operator Contract
|
||||||
|
|
||||||
Ops lists non-terminal and manual-intervention operations. Operators must verify
|
Ops lists non-terminal and manual-intervention operations. Operators must verify
|
||||||
|
|||||||
@@ -161,7 +161,7 @@
|
|||||||
"resources": ["postgresql", "package-environment", "webui-bundle", "filesystem"],
|
"resources": ["postgresql", "package-environment", "webui-bundle", "filesystem"],
|
||||||
"mode": "compensation",
|
"mode": "compensation",
|
||||||
"fenced": true,
|
"fenced": true,
|
||||||
"adoption": "planned",
|
"adoption": "adopted",
|
||||||
"issue": "https://git.add-ideas.de/GovOPlaN/govoplan-core/issues/281"
|
"issue": "https://git.add-ideas.de/GovOPlaN/govoplan-core/issues/281"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -170,7 +170,7 @@
|
|||||||
"resources": ["postgresql", "package-environment", "webui-bundle", "runtime-nodes"],
|
"resources": ["postgresql", "package-environment", "webui-bundle", "runtime-nodes"],
|
||||||
"mode": "forward_recovery",
|
"mode": "forward_recovery",
|
||||||
"fenced": true,
|
"fenced": true,
|
||||||
"adoption": "planned",
|
"adoption": "adopted",
|
||||||
"issue": "https://git.add-ideas.de/GovOPlaN/govoplan-core/issues/281"
|
"issue": "https://git.add-ideas.de/GovOPlaN/govoplan-core/issues/281"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -179,7 +179,16 @@
|
|||||||
"resources": ["postgresql", "object-storage", "package-environment"],
|
"resources": ["postgresql", "object-storage", "package-environment"],
|
||||||
"mode": "snapshot_restore",
|
"mode": "snapshot_restore",
|
||||||
"fenced": true,
|
"fenced": true,
|
||||||
"adoption": "planned",
|
"adoption": "adopted",
|
||||||
|
"issue": "https://git.add-ideas.de/GovOPlaN/govoplan-core/issues/281"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "core.module-runtime.apply-graph",
|
||||||
|
"repository": "govoplan-core",
|
||||||
|
"resources": ["postgresql", "runtime-nodes", "module-registry"],
|
||||||
|
"mode": "compensation",
|
||||||
|
"fenced": true,
|
||||||
|
"adoption": "adopted",
|
||||||
"issue": "https://git.add-ideas.de/GovOPlaN/govoplan-core/issues/281"
|
"issue": "https://git.add-ideas.de/GovOPlaN/govoplan-core/issues/281"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -23,6 +23,11 @@ REQUIRED_PREFIXES = {
|
|||||||
"dataflow.",
|
"dataflow.",
|
||||||
"workflow-engine.",
|
"workflow-engine.",
|
||||||
"core.module-lifecycle.",
|
"core.module-lifecycle.",
|
||||||
|
"core.module-runtime.",
|
||||||
|
}
|
||||||
|
ATOMIC_EXTERNAL_READS = {
|
||||||
|
"connectors.sync.read-snapshot",
|
||||||
|
"mail.mailbox.sync-cursor",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -50,6 +55,7 @@ def test_non_atomic_operations_do_not_claim_plain_database_rollback() -> None:
|
|||||||
operations = json.loads(INVENTORY.read_text(encoding="utf-8"))["operations"]
|
operations = json.loads(INVENTORY.read_text(encoding="utf-8"))["operations"]
|
||||||
for item in operations:
|
for item in operations:
|
||||||
if item["mode"] == "atomic":
|
if item["mode"] == "atomic":
|
||||||
assert item["resources"] == ["postgresql"] or item["id"] == (
|
assert (
|
||||||
"connectors.sync.read-snapshot"
|
item["resources"] == ["postgresql"]
|
||||||
|
or item["id"] in ATOMIC_EXTERNAL_READS
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user