1717
1818package org .apache .hadoop .hdds .scm .container .states ;
1919
20+ import java .util .Collections ;
2021import java .util .HashMap ;
2122import java .util .HashSet ;
2223import java .util .Map ;
2324import java .util .Set ;
25+ import java .util .function .Function ;
2426import org .apache .hadoop .hdds .protocol .DatanodeID ;
2527import org .apache .hadoop .hdds .scm .container .ContainerInfo ;
2628import org .apache .hadoop .hdds .scm .container .ContainerReplica ;
3133 */
3234public 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