|
@@ -26,13 +26,14 @@ import org.apache.hadoop.HadoopIllegalArgumentException;
|
|
import org.apache.hadoop.hdfs.protocol.Block;
|
|
import org.apache.hadoop.hdfs.protocol.Block;
|
|
import org.apache.hadoop.hdfs.server.datanode.ReplicaInfo;
|
|
import org.apache.hadoop.hdfs.server.datanode.ReplicaInfo;
|
|
import org.apache.hadoop.hdfs.util.FoldedTreeSet;
|
|
import org.apache.hadoop.hdfs.util.FoldedTreeSet;
|
|
|
|
+import org.apache.hadoop.util.AutoCloseableLock;
|
|
|
|
|
|
/**
|
|
/**
|
|
* Maintains the replica map.
|
|
* Maintains the replica map.
|
|
*/
|
|
*/
|
|
class ReplicaMap {
|
|
class ReplicaMap {
|
|
- // Object using which this class is synchronized
|
|
|
|
- private final Object mutex;
|
|
|
|
|
|
+ // Lock object to synchronize this instance.
|
|
|
|
+ private final AutoCloseableLock lock;
|
|
|
|
|
|
// Map of block pool Id to a set of ReplicaInfo.
|
|
// Map of block pool Id to a set of ReplicaInfo.
|
|
private final Map<String, FoldedTreeSet<ReplicaInfo>> map = new HashMap<>();
|
|
private final Map<String, FoldedTreeSet<ReplicaInfo>> map = new HashMap<>();
|
|
@@ -49,16 +50,16 @@ class ReplicaMap {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
- ReplicaMap(Object mutex) {
|
|
|
|
- if (mutex == null) {
|
|
|
|
|
|
+ ReplicaMap(AutoCloseableLock lock) {
|
|
|
|
+ if (lock == null) {
|
|
throw new HadoopIllegalArgumentException(
|
|
throw new HadoopIllegalArgumentException(
|
|
- "Object to synchronize on cannot be null");
|
|
|
|
|
|
+ "Lock to synchronize on cannot be null");
|
|
}
|
|
}
|
|
- this.mutex = mutex;
|
|
|
|
|
|
+ this.lock = lock;
|
|
}
|
|
}
|
|
|
|
|
|
String[] getBlockPoolList() {
|
|
String[] getBlockPoolList() {
|
|
- synchronized(mutex) {
|
|
|
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
return map.keySet().toArray(new String[map.keySet().size()]);
|
|
return map.keySet().toArray(new String[map.keySet().size()]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -103,7 +104,7 @@ class ReplicaMap {
|
|
*/
|
|
*/
|
|
ReplicaInfo get(String bpid, long blockId) {
|
|
ReplicaInfo get(String bpid, long blockId) {
|
|
checkBlockPool(bpid);
|
|
checkBlockPool(bpid);
|
|
- synchronized(mutex) {
|
|
|
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
if (set == null) {
|
|
if (set == null) {
|
|
return null;
|
|
return null;
|
|
@@ -123,7 +124,7 @@ class ReplicaMap {
|
|
ReplicaInfo add(String bpid, ReplicaInfo replicaInfo) {
|
|
ReplicaInfo add(String bpid, ReplicaInfo replicaInfo) {
|
|
checkBlockPool(bpid);
|
|
checkBlockPool(bpid);
|
|
checkBlock(replicaInfo);
|
|
checkBlock(replicaInfo);
|
|
- synchronized(mutex) {
|
|
|
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
if (set == null) {
|
|
if (set == null) {
|
|
// Add an entry for block pool if it does not exist already
|
|
// Add an entry for block pool if it does not exist already
|
|
@@ -152,7 +153,7 @@ class ReplicaMap {
|
|
ReplicaInfo remove(String bpid, Block block) {
|
|
ReplicaInfo remove(String bpid, Block block) {
|
|
checkBlockPool(bpid);
|
|
checkBlockPool(bpid);
|
|
checkBlock(block);
|
|
checkBlock(block);
|
|
- synchronized(mutex) {
|
|
|
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
if (set != null) {
|
|
if (set != null) {
|
|
ReplicaInfo replicaInfo =
|
|
ReplicaInfo replicaInfo =
|
|
@@ -175,7 +176,7 @@ class ReplicaMap {
|
|
*/
|
|
*/
|
|
ReplicaInfo remove(String bpid, long blockId) {
|
|
ReplicaInfo remove(String bpid, long blockId) {
|
|
checkBlockPool(bpid);
|
|
checkBlockPool(bpid);
|
|
- synchronized(mutex) {
|
|
|
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
if (set != null) {
|
|
if (set != null) {
|
|
return set.removeAndGet(blockId, LONG_AND_BLOCK_COMPARATOR);
|
|
return set.removeAndGet(blockId, LONG_AND_BLOCK_COMPARATOR);
|
|
@@ -190,7 +191,7 @@ class ReplicaMap {
|
|
* @return the number of replicas in the map
|
|
* @return the number of replicas in the map
|
|
*/
|
|
*/
|
|
int size(String bpid) {
|
|
int size(String bpid) {
|
|
- synchronized(mutex) {
|
|
|
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
return set != null ? set.size() : 0;
|
|
return set != null ? set.size() : 0;
|
|
}
|
|
}
|
|
@@ -199,9 +200,9 @@ class ReplicaMap {
|
|
/**
|
|
/**
|
|
* Get a collection of the replicas for given block pool
|
|
* Get a collection of the replicas for given block pool
|
|
* This method is <b>not synchronized</b>. It needs to be synchronized
|
|
* This method is <b>not synchronized</b>. It needs to be synchronized
|
|
- * externally using the mutex, both for getting the replicas
|
|
|
|
|
|
+ * externally using the lock, both for getting the replicas
|
|
* values from the map and iterating over it. Mutex can be accessed using
|
|
* values from the map and iterating over it. Mutex can be accessed using
|
|
- * {@link #getMutext()} method.
|
|
|
|
|
|
+ * {@link #getLock()} method.
|
|
*
|
|
*
|
|
* @param bpid block pool id
|
|
* @param bpid block pool id
|
|
* @return a collection of the replicas belonging to the block pool
|
|
* @return a collection of the replicas belonging to the block pool
|
|
@@ -212,7 +213,7 @@ class ReplicaMap {
|
|
|
|
|
|
void initBlockPool(String bpid) {
|
|
void initBlockPool(String bpid) {
|
|
checkBlockPool(bpid);
|
|
checkBlockPool(bpid);
|
|
- synchronized(mutex) {
|
|
|
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
FoldedTreeSet<ReplicaInfo> set = map.get(bpid);
|
|
if (set == null) {
|
|
if (set == null) {
|
|
// Add an entry for block pool if it does not exist already
|
|
// Add an entry for block pool if it does not exist already
|
|
@@ -224,16 +225,16 @@ class ReplicaMap {
|
|
|
|
|
|
void cleanUpBlockPool(String bpid) {
|
|
void cleanUpBlockPool(String bpid) {
|
|
checkBlockPool(bpid);
|
|
checkBlockPool(bpid);
|
|
- synchronized(mutex) {
|
|
|
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
map.remove(bpid);
|
|
map.remove(bpid);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Give access to mutex used for synchronizing ReplicasMap
|
|
|
|
- * @return object used as lock
|
|
|
|
|
|
+ * Get the lock object used for synchronizing ReplicasMap
|
|
|
|
+ * @return lock object
|
|
*/
|
|
*/
|
|
- Object getMutex() {
|
|
|
|
- return mutex;
|
|
|
|
|
|
+ AutoCloseableLock getLock() {
|
|
|
|
+ return lock;
|
|
}
|
|
}
|
|
}
|
|
}
|