|
@@ -17,20 +17,20 @@
|
|
*/
|
|
*/
|
|
package org.apache.hadoop.hdfs.server.namenode;
|
|
package org.apache.hadoop.hdfs.server.namenode;
|
|
|
|
|
|
|
|
+import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.FS_TRASH_INTERVAL_DEFAULT;
|
|
|
|
+import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.FS_TRASH_INTERVAL_KEY;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.IO_FILE_BUFFER_SIZE_DEFAULT;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.IO_FILE_BUFFER_SIZE_DEFAULT;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.IO_FILE_BUFFER_SIZE_KEY;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.IO_FILE_BUFFER_SIZE_KEY;
|
|
-import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.FS_TRASH_INTERVAL_KEY;
|
|
|
|
-import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.FS_TRASH_INTERVAL_DEFAULT;
|
|
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BLOCK_SIZE_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BLOCK_SIZE_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BLOCK_SIZE_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BLOCK_SIZE_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BYTES_PER_CHECKSUM_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BYTES_PER_CHECKSUM_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BYTES_PER_CHECKSUM_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BYTES_PER_CHECKSUM_KEY;
|
|
-import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_CHECKSUM_TYPE_KEY;
|
|
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_CHECKSUM_TYPE_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_CHECKSUM_TYPE_DEFAULT;
|
|
|
|
+import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_CHECKSUM_TYPE_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_CLIENT_WRITE_PACKET_SIZE_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_CLIENT_WRITE_PACKET_SIZE_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_CLIENT_WRITE_PACKET_SIZE_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_CLIENT_WRITE_PACKET_SIZE_KEY;
|
|
-import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_ENCRYPT_DATA_TRANSFER_KEY;
|
|
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_ENCRYPT_DATA_TRANSFER_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_ENCRYPT_DATA_TRANSFER_DEFAULT;
|
|
|
|
+import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_ENCRYPT_DATA_TRANSFER_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_HA_STANDBY_CHECKPOINTS_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_HA_STANDBY_CHECKPOINTS_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_HA_STANDBY_CHECKPOINTS_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_HA_STANDBY_CHECKPOINTS_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_ACCESSTIME_PRECISION_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_ACCESSTIME_PRECISION_KEY;
|
|
@@ -166,6 +166,7 @@ import org.apache.hadoop.hdfs.server.common.Storage;
|
|
import org.apache.hadoop.hdfs.server.common.Storage.StorageDirType;
|
|
import org.apache.hadoop.hdfs.server.common.Storage.StorageDirType;
|
|
import org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory;
|
|
import org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory;
|
|
import org.apache.hadoop.hdfs.server.common.Util;
|
|
import org.apache.hadoop.hdfs.server.common.Util;
|
|
|
|
+import org.apache.hadoop.hdfs.server.namenode.INode.BlocksMapUpdateInfo;
|
|
import org.apache.hadoop.hdfs.server.namenode.LeaseManager.Lease;
|
|
import org.apache.hadoop.hdfs.server.namenode.LeaseManager.Lease;
|
|
import org.apache.hadoop.hdfs.server.namenode.NameNode.OperationCategory;
|
|
import org.apache.hadoop.hdfs.server.namenode.NameNode.OperationCategory;
|
|
import org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer;
|
|
import org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer;
|
|
@@ -2749,7 +2750,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
boolean enforcePermission)
|
|
boolean enforcePermission)
|
|
throws AccessControlException, SafeModeException, UnresolvedLinkException,
|
|
throws AccessControlException, SafeModeException, UnresolvedLinkException,
|
|
IOException {
|
|
IOException {
|
|
- ArrayList<Block> collectedBlocks = new ArrayList<Block>();
|
|
|
|
|
|
+ BlocksMapUpdateInfo collectedBlocks = new BlocksMapUpdateInfo();
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
checkOperation(OperationCategory.WRITE);
|
|
checkOperation(OperationCategory.WRITE);
|
|
writeLock();
|
|
writeLock();
|
|
@@ -2781,21 +2782,26 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- /**
|
|
|
|
|
|
+ /**
|
|
* From the given list, incrementally remove the blocks from blockManager
|
|
* From the given list, incrementally remove the blocks from blockManager
|
|
* Writelock is dropped and reacquired every BLOCK_DELETION_INCREMENT to
|
|
* Writelock is dropped and reacquired every BLOCK_DELETION_INCREMENT to
|
|
* ensure that other waiters on the lock can get in. See HDFS-2938
|
|
* ensure that other waiters on the lock can get in. See HDFS-2938
|
|
|
|
+ *
|
|
|
|
+ * @param blocks
|
|
|
|
+ * An instance of {@link BlocksMapUpdateInfo} which contains a list
|
|
|
|
+ * of blocks that need to be removed from blocksMap
|
|
*/
|
|
*/
|
|
- private void removeBlocks(List<Block> blocks) {
|
|
|
|
|
|
+ private void removeBlocks(BlocksMapUpdateInfo blocks) {
|
|
int start = 0;
|
|
int start = 0;
|
|
int end = 0;
|
|
int end = 0;
|
|
- while (start < blocks.size()) {
|
|
|
|
|
|
+ List<Block> toDeleteList = blocks.getToDeleteList();
|
|
|
|
+ while (start < toDeleteList.size()) {
|
|
end = BLOCK_DELETION_INCREMENT + start;
|
|
end = BLOCK_DELETION_INCREMENT + start;
|
|
- end = end > blocks.size() ? blocks.size() : end;
|
|
|
|
|
|
+ end = end > toDeleteList.size() ? toDeleteList.size() : end;
|
|
writeLock();
|
|
writeLock();
|
|
try {
|
|
try {
|
|
for (int i = start; i < end; i++) {
|
|
for (int i = start; i < end; i++) {
|
|
- blockManager.removeBlock(blocks.get(i));
|
|
|
|
|
|
+ blockManager.removeBlock(toDeleteList.get(i));
|
|
}
|
|
}
|
|
} finally {
|
|
} finally {
|
|
writeUnlock();
|
|
writeUnlock();
|
|
@@ -2804,7 +2810,12 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- void removePathAndBlocks(String src, List<Block> blocks) {
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Remove leases and blocks related to a given path
|
|
|
|
+ * @param src The given path
|
|
|
|
+ * @param blocks Containing the list of blocks to be deleted from blocksMap
|
|
|
|
+ */
|
|
|
|
+ void removePathAndBlocks(String src, BlocksMapUpdateInfo blocks) {
|
|
assert hasWriteLock();
|
|
assert hasWriteLock();
|
|
leaseManager.removeLeaseWithPrefixPath(src);
|
|
leaseManager.removeLeaseWithPrefixPath(src);
|
|
if (blocks == null) {
|
|
if (blocks == null) {
|
|
@@ -2817,7 +2828,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
boolean trackBlockCounts = isSafeModeTrackingBlocks();
|
|
boolean trackBlockCounts = isSafeModeTrackingBlocks();
|
|
int numRemovedComplete = 0, numRemovedSafe = 0;
|
|
int numRemovedComplete = 0, numRemovedSafe = 0;
|
|
|
|
|
|
- for (Block b : blocks) {
|
|
|
|
|
|
+ for (Block b : blocks.getToDeleteList()) {
|
|
if (trackBlockCounts) {
|
|
if (trackBlockCounts) {
|
|
BlockInfo bi = blockManager.getStoredBlock(b);
|
|
BlockInfo bi = blockManager.getStoredBlock(b);
|
|
if (bi.isComplete()) {
|
|
if (bi.isComplete()) {
|