@@ -1322,7 +1322,7 @@ func (nc *NodeController) syncOrphans(node *longhorn.Node, collectedDataInfo map
13221322 return nil
13231323}
13241324
1325- func (nc * NodeController ) getNewAndMissingOrphanedReplicaDataStores (diskName , diskUUID , diskPath string , replicaDataStores map [string ]string ) (map [string ]string , map [string ]string ) {
1325+ func (nc * NodeController ) getNewAndMissingOrphanedReplicaDataStores (diskName , diskUUID , diskPath string , orphanedReplicaDataStores map [string ]string ) (map [string ]string , map [string ]string ) {
13261326 newOrphanedReplicaDataStores := map [string ]string {}
13271327 missingOrphanedReplicaDataStores := map [string ]string {}
13281328
@@ -1339,13 +1339,19 @@ func (nc *NodeController) getNewAndMissingOrphanedReplicaDataStores(diskName, di
13391339 }
13401340 }
13411341
1342- for dataStore := range replicaDataStores {
1342+ for dataStore := range orphanedReplicaDataStores {
13431343 orphanName := types .GetOrphanChecksumNameForOrphanedDataStore (nc .controllerID , diskName , diskPath , diskUUID , dataStore )
13441344 if _ , ok := orphanMap [orphanName ]; ! ok {
13451345 newOrphanedReplicaDataStores [dataStore ] = ""
13461346 }
13471347 }
13481348
1349+ replicas , err := nc .ds .ListReplicasByDiskUUIDRO (diskUUID )
1350+ if err != nil {
1351+ nc .logger .WithError (err ).Warnf ("Failed to list replicas for disk %v" , diskUUID )
1352+ return map [string ]string {}, map [string ]string {}
1353+ }
1354+
13491355 for _ , orphan := range orphanMap {
13501356 if orphan .Spec .Parameters [longhorn .OrphanDiskName ] != diskName ||
13511357 orphan .Spec .Parameters [longhorn .OrphanDiskUUID ] != diskUUID ||
@@ -1354,9 +1360,25 @@ func (nc *NodeController) getNewAndMissingOrphanedReplicaDataStores(diskName, di
13541360 }
13551361
13561362 dataStore := orphan .Spec .Parameters [longhorn .OrphanDataName ]
1357- if _ , ok := replicaDataStores [dataStore ]; ! ok {
1363+ reused := false
1364+ for _ , r := range replicas {
1365+ if r .Spec .DataDirectoryName == dataStore {
1366+ reused = true
1367+ break
1368+ }
1369+ }
1370+ _ , ok := orphanedReplicaDataStores [dataStore ]
1371+
1372+ if ! ok {
1373+ if reused {
1374+ if err := datastore .AddOrphanDeleteCustomResourceOnlyLabel (nc .ds , orphan .Name ); err != nil {
1375+ nc .logger .Infof ("failed to add label delete-custom-resource-only to orphan %v " , orphan .Name )
1376+ return map [string ]string {}, map [string ]string {}
1377+ }
1378+ }
13581379 missingOrphanedReplicaDataStores [dataStore ] = ""
13591380 }
1381+
13601382 }
13611383
13621384 return newOrphanedReplicaDataStores , missingOrphanedReplicaDataStores
@@ -1437,7 +1459,12 @@ func (nc *NodeController) canDeleteOrphan(orphan *longhorn.Orphan, autoDeleteEna
14371459
14381460 // When dataCleanableCondition is false, it means the associated node is not ready, missing or evicted (check updateDataCleanableCondition()).
14391461 // In this case, we can delete the orphan directly because the data is not reachable and no need to keep the orphan resource.
1440- canDelete := autoDeleteAllowed || dataCleanableCondition .Status == longhorn .ConditionStatusFalse
1462+ isReasonNodeOrDisk := (dataCleanableCondition .Reason == longhorn .OrphanConditionTypeDataCleanableReasonNodeUnavailable ) ||
1463+ (dataCleanableCondition .Reason == longhorn .OrphanConditionTypeDataCleanableReasonNodeEvicted ) ||
1464+ (dataCleanableCondition .Reason == longhorn .OrphanConditionTypeDataCleanableReasonDiskInvalid ) ||
1465+ (dataCleanableCondition .Reason == longhorn .OrphanConditionTypeDataCleanableReasonDiskEvicted ) ||
1466+ (dataCleanableCondition .Reason == longhorn .OrphanConditionTypeDataCleanableReasonDiskChanged )
1467+ canDelete := autoDeleteAllowed || ((dataCleanableCondition .Status == longhorn .ConditionStatusFalse ) && isReasonNodeOrDisk )
14411468 if ! canDelete {
14421469 nc .logger .Debugf ("Orphan %v is not ready to be deleted, autoDeleteAllowed: %v, dataCleanableCondition: %v" , orphan .Name , autoDeleteAllowed , dataCleanableCondition .Status )
14431470 }
0 commit comments