[NO ISSUE][REPL] Ensure Thread Safety of ReplicaManager
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Ensure thread safety of ReplicaManager to eliminate
possible concurrent modifications between reading
and modifying current replicas.
Change-Id: Ied7549436f7d721341c6699231a202545bac6252
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2402
Reviewed-by: abdullah alamoudi <bamousaa@gmail.com>
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/ReplicaManager.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/ReplicaManager.java
index 30416a3..c821c56 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/ReplicaManager.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/ReplicaManager.java
@@ -40,9 +40,11 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.control.common.controllers.NCConfig;
import org.apache.hyracks.storage.common.LocalResource;
+import org.apache.hyracks.util.annotations.ThreadSafe;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+@ThreadSafe
public class ReplicaManager implements IReplicaManager {
private static final Logger LOGGER = LogManager.getLogger();
@@ -86,13 +88,13 @@
}
@Override
- public List<IPartitionReplica> getReplicas(int partition) {
+ public synchronized List<IPartitionReplica> getReplicas(int partition) {
return replicas.entrySet().stream().filter(e -> e.getKey().getPartition() == partition).map(Map.Entry::getValue)
.collect(Collectors.toList());
}
@Override
- public Set<Integer> getPartitions() {
+ public synchronized Set<Integer> getPartitions() {
return Collections.unmodifiableSet(partitions);
}
@@ -110,7 +112,7 @@
}
@Override
- public void release(int partition) throws HyracksDataException {
+ public synchronized void release(int partition) throws HyracksDataException {
if (!partitions.contains(partition)) {
return;
}