Skip to content

Commit 3e217f5

Browse files
authored
HDDS-7544. Cache replica set in ContainerEntry (#8990)
1 parent d4570c5 commit 3e217f5

1 file changed

Lines changed: 13 additions & 4 deletions

File tree

  • hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/states

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/states/ContainerEntry.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717

1818
package org.apache.hadoop.hdds.scm.container.states;
1919

20+
import java.util.Collections;
2021
import java.util.HashMap;
2122
import java.util.HashSet;
2223
import java.util.Map;
2324
import java.util.Set;
25+
import java.util.function.Function;
2426
import org.apache.hadoop.hdds.protocol.DatanodeID;
2527
import org.apache.hadoop.hdds.scm.container.ContainerInfo;
2628
import org.apache.hadoop.hdds.scm.container.ContainerReplica;
@@ -31,7 +33,8 @@
3133
*/
3234
public class ContainerEntry {
3335
private final ContainerInfo info;
34-
private final Map<DatanodeID, ContainerReplica> replicas = new HashMap<>();
36+
private final Map<DatanodeID, ContainerReplica> replicasMap = new HashMap<>();
37+
private Set<ContainerReplica> replicas = Collections.emptySet();
3538

3639
ContainerEntry(ContainerInfo info) {
3740
this.info = info;
@@ -42,14 +45,20 @@ public ContainerInfo getInfo() {
4245
}
4346

4447
public Set<ContainerReplica> getReplicas() {
45-
return new HashSet<>(replicas.values());
48+
return replicas;
4649
}
4750

4851
public ContainerReplica put(ContainerReplica r) {
49-
return replicas.put(r.getDatanodeDetails().getID(), r);
52+
return copyAndUpdate(map -> map.put(r.getDatanodeDetails().getID(), r));
5053
}
5154

5255
public ContainerReplica removeReplica(DatanodeID datanodeID) {
53-
return replicas.remove(datanodeID);
56+
return copyAndUpdate(map -> map.remove(datanodeID));
57+
}
58+
59+
private <T> T copyAndUpdate(Function<Map<DatanodeID, ContainerReplica>, T> update) {
60+
T result = update.apply(replicasMap);
61+
replicas = Collections.unmodifiableSet(new HashSet<>(replicasMap.values()));
62+
return result;
5463
}
5564
}

0 commit comments

Comments
 (0)