|
@@ -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
|
|
|
}
|