Skip to content

Commit

Permalink
feat(volume): add condition for wait backing image
Browse files Browse the repository at this point in the history
ref: longhorn/longhorn 6615

Signed-off-by: Jack Lin <jack.lin@suse.com>
  • Loading branch information
ChanYiLin authored and David Ko committed Oct 2, 2023
1 parent 71432f6 commit 6023e8d
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 4 deletions.
7 changes: 7 additions & 0 deletions controller/replica_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -369,13 +369,20 @@ func (rc *ReplicaController) CreateInstance(obj interface{}) (*longhorn.Instance
backingImagePath := ""
if r.Spec.BackingImage != "" {
if backingImagePath, err = rc.GetBackingImagePathForReplicaStarting(r); err != nil {
r.Status.Conditions = types.SetCondition(r.Status.Conditions, longhorn.ReplicaConditionTypeWaitForBackingImage,
longhorn.ConditionStatusTrue, longhorn.ReplicaConditionReasonWaitForBackingImageFailed, err.Error())
return nil, err
}
if backingImagePath == "" {
r.Status.Conditions = types.SetCondition(r.Status.Conditions, longhorn.ReplicaConditionTypeWaitForBackingImage,
longhorn.ConditionStatusTrue, longhorn.ReplicaConditionReasonWaitForBackingImageWaiting, "")
return nil, nil
}
}

r.Status.Conditions = types.SetCondition(r.Status.Conditions, longhorn.ReplicaConditionTypeWaitForBackingImage,
longhorn.ConditionStatusFalse, "", "")

if IsRebuildingReplica(r) {
canStart, err := rc.CanStartRebuildingReplica(r)
if err != nil {
Expand Down
26 changes: 26 additions & 0 deletions controller/volume_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,32 @@ func (c *VolumeController) ReconcileEngineReplicaState(v *longhorn.Volume, es ma
}
}()

// Aggregate replica wait for backing image condition
aggregatedReplicaWaitForBackingImageError := util.NewMultiError()
waitForBackingImage := false
for _, r := range rs {
waitForBackingImageCondition := types.GetCondition(r.Status.Conditions, longhorn.ReplicaConditionTypeWaitForBackingImage)
if waitForBackingImageCondition.Status == longhorn.ConditionStatusTrue {
waitForBackingImage = true
if waitForBackingImageCondition.Reason == longhorn.ReplicaConditionReasonWaitForBackingImageFailed {
aggregatedReplicaWaitForBackingImageError.Append(util.NewMultiError(waitForBackingImageCondition.Message))
}
}
}
if waitForBackingImage {
if len(aggregatedReplicaWaitForBackingImageError) > 0 {
failureMessage := aggregatedReplicaWaitForBackingImageError.Join()
v.Status.Conditions = types.SetCondition(v.Status.Conditions, longhorn.VolumeConditionTypeWaitForBackingImage,
longhorn.ConditionStatusTrue, longhorn.VolumeConditionReasonWaitForBackingImageFailed, failureMessage)
} else {
v.Status.Conditions = types.SetCondition(v.Status.Conditions, longhorn.VolumeConditionTypeWaitForBackingImage,
longhorn.ConditionStatusTrue, longhorn.VolumeConditionReasonWaitForBackingImageWaiting, "")
}
} else {
v.Status.Conditions = types.SetCondition(v.Status.Conditions, longhorn.VolumeConditionTypeWaitForBackingImage,
longhorn.ConditionStatusFalse, "", "")
}

e, err := c.ds.PickVolumeCurrentEngine(v, es)
if err != nil {
return err
Expand Down
4 changes: 4 additions & 0 deletions controller/volume_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1090,6 +1090,10 @@ func newVolume(name string, replicaCount int) *longhorn.Volume {
Status: longhorn.VolumeStatus{
OwnerID: TestOwnerID1,
Conditions: []longhorn.Condition{
{
Type: string(longhorn.VolumeConditionTypeWaitForBackingImage),
Status: longhorn.ConditionStatusFalse,
},
{
Type: string(longhorn.VolumeConditionTypeTooManySnapshots),
Status: longhorn.ConditionStatusFalse,
Expand Down
5 changes: 4 additions & 1 deletion k8s/pkg/apis/longhorn/v1beta2/replica.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ const (
)

const (
ReplicaConditionTypeRebuildFailed = "RebuildFailed"
ReplicaConditionTypeRebuildFailed = "RebuildFailed"
ReplicaConditionTypeWaitForBackingImage = "WaitForBackingImage"
ReplicaConditionReasonWaitForBackingImageFailed = "GetBackingImageFailed"
ReplicaConditionReasonWaitForBackingImageWaiting = "Waiting"

ReplicaConditionReasonRebuildFailedDisconnection = "Disconnection"
ReplicaConditionReasonRebuildFailedGeneral = "General"
Expand Down
9 changes: 6 additions & 3 deletions k8s/pkg/apis/longhorn/v1beta2/volume.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,10 @@ type VolumeCloneStatus struct {
}

const (
VolumeConditionTypeScheduled = "scheduled"
VolumeConditionTypeRestore = "restore"
VolumeConditionTypeTooManySnapshots = "toomanysnapshots"
VolumeConditionTypeScheduled = "Scheduled"
VolumeConditionTypeRestore = "Restore"
VolumeConditionTypeTooManySnapshots = "TooManySnapshots"
VolumeConditionTypeWaitForBackingImage = "WaitForBackingImage"
)

const (
Expand All @@ -110,6 +111,8 @@ const (
VolumeConditionReasonRestoreInProgress = "RestoreInProgress"
VolumeConditionReasonRestoreFailure = "RestoreFailure"
VolumeConditionReasonTooManySnapshots = "TooManySnapshots"
VolumeConditionReasonWaitForBackingImageFailed = "GetBackingImageFailed"
VolumeConditionReasonWaitForBackingImageWaiting = "Waiting"
)

type SnapshotDataIntegrity string
Expand Down

0 comments on commit 6023e8d

Please sign in to comment.