Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions controller/node_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -1326,7 +1326,7 @@ func (nc *NodeController) syncOrphans(node *longhorn.Node, collectedDataInfo map
return nc.deleteOrphansForEngineAndReplicaInstances(node)
}

func (nc *NodeController) getNewAndMissingOrphanedReplicaDataStores(diskName, diskUUID, diskPath string, replicaDataStores map[string]string) (map[string]string, map[string]string) {
func (nc *NodeController) getNewAndMissingOrphanedReplicaDataStores(diskName, diskUUID, diskPath string, orphanedReplicaDataStores map[string]string) (map[string]string, map[string]string) {
newOrphanedReplicaDataStores := map[string]string{}
missingOrphanedReplicaDataStores := map[string]string{}

Expand All @@ -1343,13 +1343,19 @@ func (nc *NodeController) getNewAndMissingOrphanedReplicaDataStores(diskName, di
}
}

for dataStore := range replicaDataStores {
for dataStore := range orphanedReplicaDataStores {
orphanName := types.GetOrphanChecksumNameForOrphanedDataStore(nc.controllerID, diskName, diskPath, diskUUID, dataStore)
if _, ok := orphanMap[orphanName]; !ok {
newOrphanedReplicaDataStores[dataStore] = ""
}
}

replicas, err := nc.ds.ListReplicasByDiskUUIDRO(diskUUID)
if err != nil {
nc.logger.WithError(err).Warnf("Failed to list replicas for disk %v", diskUUID)
return map[string]string{}, map[string]string{}
}

for _, orphan := range orphanMap {
if orphan.Spec.Parameters[longhorn.OrphanDiskName] != diskName ||
orphan.Spec.Parameters[longhorn.OrphanDiskUUID] != diskUUID ||
Expand All @@ -1358,7 +1364,19 @@ func (nc *NodeController) getNewAndMissingOrphanedReplicaDataStores(diskName, di
}

dataStore := orphan.Spec.Parameters[longhorn.OrphanDataName]
if _, ok := replicaDataStores[dataStore]; !ok {
for _, r := range replicas {
if r.Spec.DataDirectoryName == dataStore {
if err := datastore.AddOrphanDeleteCustomResourceOnlyLabel(nc.ds, orphan.Name); err != nil {
nc.logger.Infof("failed to add label delete-custom-resource-only to orphan %v ", orphan.Name)
return map[string]string{}, map[string]string{}
}

break
}
}
_, ok := orphanedReplicaDataStores[dataStore]

if !ok {
missingOrphanedReplicaDataStores[dataStore] = ""
}
}
Expand Down
6 changes: 5 additions & 1 deletion controller/orphan_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -622,7 +622,6 @@ func (oc *OrphanController) updateDataCleanableCondition(orphan *longhorn.Orphan
if orphan.Spec.Type == longhorn.OrphanTypeReplicaData {
reason = oc.checkOrphanedReplicaDataCleanable(node, orphan)
}

return nil
}

Expand All @@ -647,6 +646,11 @@ func (oc *OrphanController) checkOrphanedReplicaDataCleanable(node *longhorn.Nod
return longhorn.OrphanConditionTypeDataCleanableReasonDiskEvicted
}

exists, _ := datastore.IsLabelLonghornDeleteCustomResourceOnlyExisting(orphan)
if exists {
return longhorn.OrphanConditionTypeDataCleanableReasonSkipped
}

return ""
}

Expand Down
33 changes: 33 additions & 0 deletions datastore/longhorn.go
Original file line number Diff line number Diff line change
Expand Up @@ -3484,6 +3484,18 @@ func (s *DataStore) ListReplicasByDiskUUID(uuid string) (map[string]*longhorn.Re
return s.listReplicas(diskSelector)
}

func (s *DataStore) ListReplicasByDiskUUIDRO(uuid string) ([]*longhorn.Replica, error) {
diskSelector, err := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{
MatchLabels: map[string]string{
types.LonghornDiskUUIDKey: uuid,
},
})
if err != nil {
return nil, err
}
return s.replicaLister.Replicas(s.namespace).List(diskSelector)
}

func getBackingImageSelector(backingImageName, diskUUID string) (labels.Selector, error) {
matchLabels := map[string]string{
types.GetLonghornLabelKey(types.LonghornLabelBackingImage): backingImageName,
Expand Down Expand Up @@ -3732,6 +3744,27 @@ func AddSystemBackupDeleteCustomResourceOnlyLabel(ds *DataStore, systemBackupNam
return nil
}

// AddOrphanDeleteCustomResourceOnlyLabel adds the label `longhorn.io/delete-custom-resource-only: true` to the Orphan
func AddOrphanDeleteCustomResourceOnlyLabel(ds *DataStore, OrphanName string) error {
orphan, err := ds.GetOrphan(OrphanName)
if err != nil {
return err
}
if exists, err := IsLabelLonghornDeleteCustomResourceOnlyExisting(orphan); err != nil {
return err
} else if exists {
return nil
}
if err := labelLonghornDeleteCustomResourceOnly(orphan); err != nil {
return err
}
if _, err = ds.UpdateOrphan(orphan); err != nil {
return err
}

return nil
}

func FixupRecurringJob(v *longhorn.Volume) error {
if v.Spec.CloneMode == longhorn.CloneModeLinkedClone {
// Do not add recurring job for linked-clone volume as these volumes do not support snapshot/backup operations
Expand Down
1 change: 1 addition & 0 deletions k8s/pkg/apis/longhorn/v1beta2/orphan.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const (
OrphanConditionTypeDataCleanableReasonDiskInvalid = "DiskInvalid"
OrphanConditionTypeDataCleanableReasonDiskEvicted = "DiskEvicted"
OrphanConditionTypeDataCleanableReasonDiskChanged = "DiskChanged"
OrphanConditionTypeDataCleanableReasonSkipped = "Skipped"
)

const (
Expand Down