Skip to content

Commit 29b516c

Browse files
committed
modify MembershipState comparator
1 parent 7bc912f commit 29b516c

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/store/impl/MembershipStoreImpl.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -279,30 +279,30 @@ private MembershipState getRepresentativeQuorum(
279279
Collection<MembershipState> records) {
280280

281281
// Collate objects by field value: field value -> order set of records
282-
Map<FederationNamenodeServiceState, Set<MembershipState>> occurenceMap =
282+
Map<FederationNamenodeServiceState, TreeSet<MembershipState>> occurenceMap =
283283
new HashMap<>();
284284
for (MembershipState record : records) {
285285
FederationNamenodeServiceState state = record.getState();
286-
Set<MembershipState> matchingSet = occurenceMap.get(state);
286+
TreeSet<MembershipState> matchingSet = occurenceMap.get(state);
287287
if (matchingSet == null) {
288-
matchingSet = new HashSet<>();
288+
// TreeSet orders elements by descending date via comparators
289+
matchingSet = new TreeSet<>();
289290
occurenceMap.put(state, matchingSet);
290291
}
291292
matchingSet.add(record);
292293
}
293294

294295
// Select largest group
295-
Set<MembershipState> largestSet = new HashSet<>();
296-
for (Set<MembershipState> matchingSet : occurenceMap.values()) {
296+
TreeSet<MembershipState> largestSet = new TreeSet<>();
297+
for (TreeSet<MembershipState> matchingSet : occurenceMap.values()) {
297298
if (largestSet.size() < matchingSet.size()) {
298299
largestSet = matchingSet;
299300
}
300301
}
301302

302303
// If quorum, use the newest element here
303304
if (largestSet.size() > records.size() / 2) {
304-
TreeSet<MembershipState> sortedList = new TreeSet<>(largestSet);
305-
return sortedList.first();
305+
return largestSet.first();
306306
// Otherwise, return most recent by class comparator
307307
} else if (records.size() > 0) {
308308
TreeSet<MembershipState> sortedList = new TreeSet<>(records);

hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipState.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,4 +358,23 @@ public long getDeletionMs() {
358358
public static void setDeletionMs(long time) {
359359
MembershipState.deletionMs = time;
360360
}
361+
362+
/**
363+
* First use the comparator of the BaseRecord to compare the date modified.
364+
* If they are equal, use {@link MembershipState#NAME_COMPARATOR} to continue the comparison
365+
* to ensure that MembershipStates with the same date modified but reported by different routers
366+
* will not be judged as equal.
367+
*
368+
* @param record the MembershipState object to be compared.
369+
* @return a negative integer, zero, or a positive integer as this object
370+
* is less than, equal to, or greater than the specified object.
371+
*/
372+
@Override
373+
public int compareTo(BaseRecord record) {
374+
int order = super.compareTo(record);
375+
if (order == 0) {
376+
return NAME_COMPARATOR.compare(this, (MembershipState) record);
377+
}
378+
return order;
379+
}
361380
}

0 commit comments

Comments
 (0)