HDFS-5494. Fix findbugs warnings for HDFS-2832.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-2832@1540924 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Arpit Agarwal 2013-11-12 02:36:24 +00:00
parent ec5eebc450
commit e5b3171c3b
3 changed files with 42 additions and 29 deletions

View File

@ -97,3 +97,5 @@ IMPROVEMENTS:
HDFS-5491. Update editsStored for HDFS-2832. (Arpit Agarwal) HDFS-5491. Update editsStored for HDFS-2832. (Arpit Agarwal)
HDFS-5494. Fix findbugs warnings for HDFS-2832. (Arpit Agarwal)

View File

@ -98,7 +98,7 @@ class BPServiceActor implements Runnable {
* reported to the NN. Access should be synchronized on this object. * reported to the NN. Access should be synchronized on this object.
*/ */
private final Map<String, PerStoragePendingIncrementalBR> private final Map<String, PerStoragePendingIncrementalBR>
pendingIncrementalBRperStorage = Maps.newConcurrentMap(); pendingIncrementalBRperStorage = Maps.newHashMap();
private volatile int pendingReceivedRequests = 0; private volatile int pendingReceivedRequests = 0;
private volatile boolean shouldServiceRun = true; private volatile boolean shouldServiceRun = true;
@ -266,48 +266,59 @@ class BPServiceActor implements Runnable {
} }
/** /**
* Report received blocks and delete hints to the Namenode * Report received blocks and delete hints to the Namenode for each
* storage.
*
* @throws IOException * @throws IOException
*/ */
private void reportReceivedDeletedBlocks() throws IOException { private void reportReceivedDeletedBlocks() throws IOException {
// For each storage, check if there are newly received blocks and if
// so then send an incremental report to the NameNode. // Generate a list of the pending reports for each storage under the lock
Map<String, ReceivedDeletedBlockInfo[]> blockArrays = Maps.newHashMap();
synchronized (pendingIncrementalBRperStorage) {
for (Map.Entry<String, PerStoragePendingIncrementalBR> entry : for (Map.Entry<String, PerStoragePendingIncrementalBR> entry :
pendingIncrementalBRperStorage.entrySet()) { pendingIncrementalBRperStorage.entrySet()) {
final String storageUuid = entry.getKey(); final String storageUuid = entry.getKey();
final PerStoragePendingIncrementalBR perStorageMap = entry.getValue(); final PerStoragePendingIncrementalBR perStorageMap = entry.getValue();
ReceivedDeletedBlockInfo[] receivedAndDeletedBlockArray = null; ReceivedDeletedBlockInfo[] receivedAndDeletedBlockArray = null;
// TODO: We can probably use finer-grained synchronization now.
synchronized (pendingIncrementalBRperStorage) {
if (perStorageMap.getBlockInfoCount() > 0) { if (perStorageMap.getBlockInfoCount() > 0) {
// Send newly-received and deleted blockids to namenode // Send newly-received and deleted blockids to namenode
receivedAndDeletedBlockArray = perStorageMap.dequeueBlockInfos(); receivedAndDeletedBlockArray = perStorageMap.dequeueBlockInfos();
pendingReceivedRequests -= receivedAndDeletedBlockArray.length; pendingReceivedRequests -= receivedAndDeletedBlockArray.length;
blockArrays.put(storageUuid, receivedAndDeletedBlockArray);
}
} }
} }
if (receivedAndDeletedBlockArray != null) { // Send incremental block reports to the Namenode outside the lock
for (Map.Entry<String, ReceivedDeletedBlockInfo[]> entry :
blockArrays.entrySet()) {
final String storageUuid = entry.getKey();
final ReceivedDeletedBlockInfo[] rdbi = entry.getValue();
StorageReceivedDeletedBlocks[] report = { new StorageReceivedDeletedBlocks( StorageReceivedDeletedBlocks[] report = { new StorageReceivedDeletedBlocks(
storageUuid, receivedAndDeletedBlockArray) }; storageUuid, rdbi) };
boolean success = false; boolean success = false;
try { try {
bpNamenode.blockReceivedAndDeleted(bpRegistration, bpos.getBlockPoolId(), bpNamenode.blockReceivedAndDeleted(bpRegistration,
report); bpos.getBlockPoolId(), report);
success = true; success = true;
} finally { } finally {
synchronized (pendingIncrementalBRperStorage) {
if (!success) { if (!success) {
synchronized (pendingIncrementalBRperStorage) {
// If we didn't succeed in sending the report, put all of the // If we didn't succeed in sending the report, put all of the
// blocks back onto our queue, but only in the case where we // blocks back onto our queue, but only in the case where we
// didn't put something newer in the meantime. // didn't put something newer in the meantime.
perStorageMap.putMissingBlockInfos(receivedAndDeletedBlockArray); PerStoragePendingIncrementalBR perStorageMap =
pendingIncrementalBRperStorage.get(storageUuid);
perStorageMap.putMissingBlockInfos(rdbi);
pendingReceivedRequests += perStorageMap.getBlockInfoCount(); pendingReceivedRequests += perStorageMap.getBlockInfoCount();
} }
} }
} }
} }
} }
}
/** /**
* Retrieve the incremental BR state for a given storage UUID * Retrieve the incremental BR state for a given storage UUID

View File

@ -293,7 +293,7 @@ public class DataStorage extends Storage {
if (LayoutVersion.supports(Feature.ADD_DATANODE_AND_STORAGE_UUIDS, if (LayoutVersion.supports(Feature.ADD_DATANODE_AND_STORAGE_UUIDS,
layoutVersion) && datanodeUuid != null) { layoutVersion) && datanodeUuid != null) {
props.setProperty("datanodeUuid", datanodeUuid); props.setProperty("datanodeUuid", getDatanodeUuid());
} }
// Set NamespaceID in version before federation // Set NamespaceID in version before federation
@ -348,7 +348,7 @@ public class DataStorage extends Storage {
} else if (getDatanodeUuid().compareTo(dnUuid) != 0) { } else if (getDatanodeUuid().compareTo(dnUuid) != 0) {
throw new InconsistentFSStateException(sd.getRoot(), throw new InconsistentFSStateException(sd.getRoot(),
"Root " + sd.getRoot() + ": DatanodeUuid=" + dnUuid + "Root " + sd.getRoot() + ": DatanodeUuid=" + dnUuid +
", does not match " + datanodeUuid + " from other" + ", does not match " + getDatanodeUuid() + " from other" +
" StorageDirectory."); " StorageDirectory.");
} }
} }