Просмотр исходного кода

delete old volume replica

related to https://github.com/chrislusf/seaweedfs/issues/1607

old is:
* older compaction revision
* older modified time
* smaller volume size
Chris Lu 4 лет назад
Родитель
Сommit
de3bdd0651
1 измененных файлов с 14 добавлено и 12 удалено
  1. 14 12
      weed/shell/command_volume_fix_replication.go

+ 14 - 12
weed/shell/command_volume_fix_replication.go

@@ -369,18 +369,20 @@ func countReplicas(replicas []*VolumeReplica) (diffDc, diffRack, diffNode map[st
 
 func pickOneReplicaToDelete(replicas []*VolumeReplica, replicaPlacement *super_block.ReplicaPlacement) *VolumeReplica {
 
-	allSame := true
-	oldest := replicas[0]
-	for _, replica := range replicas {
-		if replica.info.ModifiedAtSecond < oldest.info.ModifiedAtSecond {
-			oldest = replica
-			allSame = false
+	sort.Slice(replicas, func(i, j int) bool {
+		a, b := replicas[i], replicas[j]
+		if a.info.CompactRevision != b.info.CompactRevision {
+			return a.info.CompactRevision < b.info.CompactRevision
 		}
-	}
-	if !allSame {
-		return oldest
-	}
+		if a.info.ModifiedAtSecond != b.info.ModifiedAtSecond {
+			return a.info.ModifiedAtSecond < b.info.ModifiedAtSecond
+		}
+		if a.info.Size != b.info.Size {
+			return a.info.Size < b.info.Size
+		}
+		return false
+	})
+
+	return replicas[0]
 
-	// TODO what if all the replicas have the same timestamp?
-	return oldest
 }