|
@@ -25,28 +25,29 @@ import org.apache.hadoop.HadoopIllegalArgumentException;
|
|
|
import org.apache.hadoop.hdfs.protocol.Block;
|
|
|
import org.apache.hadoop.hdfs.server.datanode.ReplicaInfo;
|
|
|
import org.apache.hadoop.util.LightWeightResizableGSet;
|
|
|
+import org.apache.hadoop.util.AutoCloseableLock;
|
|
|
|
|
|
/**
|
|
|
* Maintains the replica map.
|
|
|
*/
|
|
|
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 another map of block Id to ReplicaInfo.
|
|
|
private final Map<String, LightWeightResizableGSet<Block, ReplicaInfo>> map =
|
|
|
new HashMap<String, LightWeightResizableGSet<Block, ReplicaInfo>>();
|
|
|
|
|
|
- ReplicaMap(Object mutex) {
|
|
|
- if (mutex == null) {
|
|
|
+ ReplicaMap(AutoCloseableLock lock) {
|
|
|
+ if (lock == null) {
|
|
|
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() {
|
|
|
- synchronized(mutex) {
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
|
return map.keySet().toArray(new String[map.keySet().size()]);
|
|
|
}
|
|
|
}
|
|
@@ -91,7 +92,7 @@ class ReplicaMap {
|
|
|
*/
|
|
|
ReplicaInfo get(String bpid, long blockId) {
|
|
|
checkBlockPool(bpid);
|
|
|
- synchronized(mutex) {
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
|
LightWeightResizableGSet<Block, ReplicaInfo> m = map.get(bpid);
|
|
|
return m != null ? m.get(new Block(blockId)) : null;
|
|
|
}
|
|
@@ -108,7 +109,7 @@ class ReplicaMap {
|
|
|
ReplicaInfo add(String bpid, ReplicaInfo replicaInfo) {
|
|
|
checkBlockPool(bpid);
|
|
|
checkBlock(replicaInfo);
|
|
|
- synchronized(mutex) {
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
|
LightWeightResizableGSet<Block, ReplicaInfo> m = map.get(bpid);
|
|
|
if (m == null) {
|
|
|
// Add an entry for block pool if it does not exist already
|
|
@@ -137,7 +138,7 @@ class ReplicaMap {
|
|
|
ReplicaInfo remove(String bpid, Block block) {
|
|
|
checkBlockPool(bpid);
|
|
|
checkBlock(block);
|
|
|
- synchronized(mutex) {
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
|
LightWeightResizableGSet<Block, ReplicaInfo> m = map.get(bpid);
|
|
|
if (m != null) {
|
|
|
ReplicaInfo replicaInfo = m.get(block);
|
|
@@ -159,7 +160,7 @@ class ReplicaMap {
|
|
|
*/
|
|
|
ReplicaInfo remove(String bpid, long blockId) {
|
|
|
checkBlockPool(bpid);
|
|
|
- synchronized(mutex) {
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
|
LightWeightResizableGSet<Block, ReplicaInfo> m = map.get(bpid);
|
|
|
if (m != null) {
|
|
|
return m.remove(new Block(blockId));
|
|
@@ -175,7 +176,7 @@ class ReplicaMap {
|
|
|
*/
|
|
|
int size(String bpid) {
|
|
|
LightWeightResizableGSet<Block, ReplicaInfo> m = null;
|
|
|
- synchronized(mutex) {
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
|
m = map.get(bpid);
|
|
|
return m != null ? m.size() : 0;
|
|
|
}
|
|
@@ -184,9 +185,9 @@ class ReplicaMap {
|
|
|
/**
|
|
|
* Get a collection of the replicas for given block pool
|
|
|
* 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
|
|
|
- * {@link #getMutext()} method.
|
|
|
+ * {@link #getLock()} method.
|
|
|
*
|
|
|
* @param bpid block pool id
|
|
|
* @return a collection of the replicas belonging to the block pool
|
|
@@ -199,7 +200,7 @@ class ReplicaMap {
|
|
|
|
|
|
void initBlockPool(String bpid) {
|
|
|
checkBlockPool(bpid);
|
|
|
- synchronized(mutex) {
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
|
LightWeightResizableGSet<Block, ReplicaInfo> m = map.get(bpid);
|
|
|
if (m == null) {
|
|
|
// Add an entry for block pool if it does not exist already
|
|
@@ -211,16 +212,16 @@ class ReplicaMap {
|
|
|
|
|
|
void cleanUpBlockPool(String bpid) {
|
|
|
checkBlockPool(bpid);
|
|
|
- synchronized(mutex) {
|
|
|
+ try (AutoCloseableLock l = lock.acquire()) {
|
|
|
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;
|
|
|
}
|
|
|
}
|