From 2f47877af4b5dd453f80c98cfd566dc31146f2ec Mon Sep 17 00:00:00 2001 From: Derek Su Date: Sun, 15 Dec 2024 23:35:57 +0800 Subject: [PATCH] feat(v2 upgrade/scheduler): disable v2 replica scheduling when node is being lively upgraded Longhorn 9104 Signed-off-by: Derek Su --- scheduler/replica_scheduler.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/scheduler/replica_scheduler.go b/scheduler/replica_scheduler.go index 034afacc37..e5fce8eeed 100644 --- a/scheduler/replica_scheduler.go +++ b/scheduler/replica_scheduler.go @@ -92,7 +92,7 @@ func (rcs *ReplicaScheduler) ScheduleReplica(replica *longhorn.Replica, replicas // - MultiError for non-fatal errors encountered. // - Error for any fatal errors encountered. func (rcs *ReplicaScheduler) FindDiskCandidates(replica *longhorn.Replica, replicas map[string]*longhorn.Replica, volume *longhorn.Volume) (map[string]*Disk, util.MultiError, error) { - nodesInfo, err := rcs.getNodeInfo() + nodesInfo, err := rcs.getNodeInfo(volume.Spec.DataEngine) if err != nil { return nil, nil, err } @@ -489,7 +489,7 @@ func filterDisksWithMatchingReplicas(disks map[string]*Disk, replicas map[string return disks } -func (rcs *ReplicaScheduler) getNodeInfo() (map[string]*longhorn.Node, error) { +func (rcs *ReplicaScheduler) getNodeInfo(dataEngine longhorn.DataEngineType) (map[string]*longhorn.Node, error) { nodeInfo, err := rcs.ds.ListNodes() if err != nil { return nil, err @@ -511,6 +511,14 @@ func (rcs *ReplicaScheduler) getNodeInfo() (map[string]*longhorn.Node, error) { if nodeSchedulableCondition.Status != longhorn.ConditionStatusTrue { continue } + + if types.IsDataEngineV2(dataEngine) { + dataEngineUpgradeRequestedCondition := types.GetCondition(node.Status.Conditions, longhorn.NodeConditionTypeDataEngineUpgradeRequested) + if dataEngineUpgradeRequestedCondition.Status != longhorn.ConditionStatusTrue { + continue + } + } + if !node.Spec.AllowScheduling { continue } @@ -573,7 +581,7 @@ func (rcs *ReplicaScheduler) CheckAndReuseFailedReplica(replicas map[string]*lon replicas = filterActiveReplicas(replicas) - allNodesInfo, err := rcs.getNodeInfo() + allNodesInfo, err := rcs.getNodeInfo(volume.Spec.DataEngine) if err != nil { return nil, err }