|
@ -369,18 +369,20 @@ func countReplicas(replicas []*VolumeReplica) (diffDc, diffRack, diffNode map[st |
|
|
|
|
|
|
|
|
func pickOneReplicaToDelete(replicas []*VolumeReplica, replicaPlacement *super_block.ReplicaPlacement) *VolumeReplica { |
|
|
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 a.info.ModifiedAtSecond != b.info.ModifiedAtSecond { |
|
|
|
|
|
return a.info.ModifiedAtSecond < b.info.ModifiedAtSecond |
|
|
} |
|
|
} |
|
|
if !allSame { |
|
|
|
|
|
return oldest |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
} |
|
|
} |