This is an automated email from the ASF dual-hosted git repository.
sodonnell pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new ad33ac6 HDDS-6292. Ensure immutable ContainerReplica set is returned
from ContainerStateManagerImpl (#3071)
ad33ac6 is described below
commit ad33ac6dee04528258646efbfe07a6f2ce86da83
Author: Stephen O'Donnell <[email protected]>
AuthorDate: Fri Feb 18 09:15:24 2022 +0000
HDDS-6292. Ensure immutable ContainerReplica set is returned from
ContainerStateManagerImpl (#3071)
---
.../scm/container/states/ContainerStateMap.java | 27 ++++++++++++++++------
1 file changed, 20 insertions(+), 7 deletions(-)
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/states/ContainerStateMap.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/states/ContainerStateMap.java
index de507b7..d7a434b 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/states/ContainerStateMap.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/states/ContainerStateMap.java
@@ -18,6 +18,7 @@
package org.apache.hadoop.hdds.scm.container.states;
+import java.util.HashSet;
import java.util.Set;
import java.util.Collections;
import java.util.Map;
@@ -119,7 +120,7 @@ public class ContainerStateMap {
ownerMap.insert(info.getOwner(), id);
repConfigMap.insert(info.getReplicationConfig(), id);
typeMap.insert(info.getReplicationType(), id);
- replicaMap.put(id, ConcurrentHashMap.newKeySet());
+ replicaMap.put(id, Collections.emptySet());
// Flush the cache of this container type, will be added later when
// get container queries are executed.
@@ -174,8 +175,7 @@ public class ContainerStateMap {
public Set<ContainerReplica> getContainerReplicas(
final ContainerID containerID) {
Preconditions.checkNotNull(containerID);
- final Set<ContainerReplica> replicas = replicaMap.get(containerID);
- return replicas == null ? null : Collections.unmodifiableSet(replicas);
+ return replicaMap.get(containerID);
}
/**
@@ -190,9 +190,10 @@ public class ContainerStateMap {
final ContainerReplica replica) {
Preconditions.checkNotNull(containerID);
if (contains(containerID)) {
- final Set<ContainerReplica> replicas = replicaMap.get(containerID);
- replicas.remove(replica);
- replicas.add(replica);
+ final Set<ContainerReplica> newSet = createNewReplicaSet(containerID);
+ newSet.remove(replica);
+ newSet.add(replica);
+ replaceReplicaSet(containerID, newSet);
}
}
@@ -208,10 +209,22 @@ public class ContainerStateMap {
Preconditions.checkNotNull(containerID);
Preconditions.checkNotNull(replica);
if (contains(containerID)) {
- replicaMap.get(containerID).remove(replica);
+ final Set<ContainerReplica> newSet = createNewReplicaSet(containerID);
+ newSet.remove(replica);
+ replaceReplicaSet(containerID, newSet);
}
}
+ private Set<ContainerReplica> createNewReplicaSet(ContainerID containerID) {
+ Set<ContainerReplica> existingSet = replicaMap.get(containerID);
+ return existingSet == null ? new HashSet<>() : new HashSet<>(existingSet);
+ }
+
+ private void replaceReplicaSet(ContainerID containerID,
+ Set<ContainerReplica> newSet) {
+ replicaMap.put(containerID, Collections.unmodifiableSet(newSet));
+ }
+
/**
* Just update the container State.
* @param info ContainerInfo.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]