Fence and reconcile module lifecycle effects
This commit is contained in:
@@ -50,7 +50,13 @@ def _identity(node: str, incarnation: str) -> RuntimeIdentity:
|
||||
)
|
||||
|
||||
|
||||
def _start(factory, identity, *, key: str = "build-1"):
|
||||
def _start(
|
||||
factory,
|
||||
identity,
|
||||
*,
|
||||
key: str = "build-1",
|
||||
block_unresolved_resource: bool = False,
|
||||
):
|
||||
return begin_durable_recovery_operation(
|
||||
factory,
|
||||
identity=identity,
|
||||
@@ -68,6 +74,7 @@ def _start(factory, identity, *, key: str = "build-1"):
|
||||
lease_resource_key="campaign:build:version-1",
|
||||
resource_type="campaign_version",
|
||||
resource_id="version-1",
|
||||
block_unresolved_resource=block_unresolved_resource,
|
||||
)
|
||||
|
||||
|
||||
@@ -273,6 +280,36 @@ def test_other_runtime_cannot_use_an_active_fence() -> None:
|
||||
engine.dispose()
|
||||
|
||||
|
||||
def test_unresolved_predecessor_can_block_new_effects_on_same_resource() -> None:
|
||||
engine, factory = _fixture()
|
||||
try:
|
||||
started = _start(
|
||||
factory,
|
||||
_identity("worker-1", "incarnation-1"),
|
||||
block_unresolved_resource=True,
|
||||
)
|
||||
assert started.operation is not None
|
||||
started.operation.unresolved(
|
||||
status=RecoveryStatus.OUTCOME_UNKNOWN,
|
||||
summary="Provider outcome is unknown",
|
||||
evidence={"request_sent": True},
|
||||
failure_summary="Reconcile before retry",
|
||||
)
|
||||
|
||||
with pytest.raises(
|
||||
RecoveryOperationStateConflict,
|
||||
match="outcome_unknown",
|
||||
):
|
||||
_start(
|
||||
factory,
|
||||
_identity("worker-2", "incarnation-2"),
|
||||
key="build-2",
|
||||
block_unresolved_resource=True,
|
||||
)
|
||||
finally:
|
||||
engine.dispose()
|
||||
|
||||
|
||||
def test_expired_crash_fence_is_taken_over_as_recovery_required() -> None:
|
||||
engine, factory = _fixture()
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user