feat(FN-4813): complete Step 3 — add owning-node handoff policy
Fusion-Task-Id: FN-4813 Fusion-Task-Lineage: 846893a5-2afa-4817-8f64-8c444d2fd713
This commit is contained in:
committed by
gsxdsm
parent
735c8f413b
commit
2ff19bc9c9
@@ -1,4 +1,4 @@
|
||||
import type { NodeStatus, UnavailableNodePolicy } from "@fusion/core";
|
||||
import type { NodeStatus, OwningNodeHandoffPolicy, Task, UnavailableNodePolicy } from "@fusion/core";
|
||||
import type { EffectiveNode } from "./effective-node.js";
|
||||
|
||||
export type PolicyDecision =
|
||||
@@ -6,6 +6,11 @@ export type PolicyDecision =
|
||||
| { allowed: true; fallbackToLocal: true; reason: string }
|
||||
| { allowed: false; reason: string };
|
||||
|
||||
export type HandoffDecision =
|
||||
| { action: "park"; reason: string }
|
||||
| { action: "reassign-local"; reason: string }
|
||||
| { action: "reassign-any"; reason: string };
|
||||
|
||||
const UNHEALTHY_STATUSES: ReadonlySet<NodeStatus> = new Set(["offline", "error", "connecting"]);
|
||||
|
||||
export function applyUnavailableNodePolicy(params: {
|
||||
@@ -40,3 +45,36 @@ export function applyUnavailableNodePolicy(params: {
|
||||
reason: `Node ${effectiveNode.nodeId} is ${nodeHealth}; policy is block`,
|
||||
};
|
||||
}
|
||||
|
||||
export function decideOwningNodeHandoff(params: {
|
||||
task: Task;
|
||||
ownerNodeId: string;
|
||||
ownerNodeHealth: NodeStatus | undefined;
|
||||
localNodeId: string;
|
||||
handoffPolicy: OwningNodeHandoffPolicy | undefined;
|
||||
}): HandoffDecision {
|
||||
const { ownerNodeId, ownerNodeHealth, localNodeId, handoffPolicy } = params;
|
||||
if (ownerNodeHealth === "online") {
|
||||
return { action: "park", reason: "owner_recovered" };
|
||||
}
|
||||
|
||||
if (ownerNodeId === localNodeId) {
|
||||
return { action: "reassign-local", reason: "owner_local_recover" };
|
||||
}
|
||||
|
||||
if (handoffPolicy === "block") {
|
||||
return { action: "park", reason: "handoff_blocked_by_policy" };
|
||||
}
|
||||
|
||||
if (handoffPolicy === "reassign-any-healthy") {
|
||||
return {
|
||||
action: "reassign-any",
|
||||
reason: `owner_${ownerNodeHealth ?? "unknown"}_any_healthy_eligible`,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
action: "reassign-local",
|
||||
reason: `owner_${ownerNodeHealth ?? "unknown"}_local_takes_over`,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user