|
@@ -25,6 +25,7 @@ import java.net.InetAddress;
|
|
import java.net.InetSocketAddress;
|
|
import java.net.InetSocketAddress;
|
|
import java.net.Socket;
|
|
import java.net.Socket;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
|
+import java.util.LinkedList;
|
|
import java.util.Arrays;
|
|
import java.util.Arrays;
|
|
import java.util.Collection;
|
|
import java.util.Collection;
|
|
import java.util.Date;
|
|
import java.util.Date;
|
|
@@ -173,6 +174,14 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|
*/
|
|
*/
|
|
private boolean doDelete = false;
|
|
private boolean doDelete = false;
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * True if the user specified the -replicate option.
|
|
|
|
+ *
|
|
|
|
+ * When this option is in effect, we will initiate replication work to make
|
|
|
|
+ * mis-replicated blocks confirm the block placement policy.
|
|
|
|
+ */
|
|
|
|
+ private boolean doReplicate = false;
|
|
|
|
+
|
|
String path = "/";
|
|
String path = "/";
|
|
|
|
|
|
private String blockIds = null;
|
|
private String blockIds = null;
|
|
@@ -249,6 +258,8 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|
this.snapshottableDirs = new ArrayList<String>();
|
|
this.snapshottableDirs = new ArrayList<String>();
|
|
} else if (key.equals("blockId")) {
|
|
} else if (key.equals("blockId")) {
|
|
this.blockIds = pmap.get("blockId")[0];
|
|
this.blockIds = pmap.get("blockId")[0];
|
|
|
|
+ } else if (key.equals("replicate")) {
|
|
|
|
+ this.doReplicate = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -683,6 +694,7 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|
StringBuilder report = new StringBuilder();
|
|
StringBuilder report = new StringBuilder();
|
|
int blockNumber = 0;
|
|
int blockNumber = 0;
|
|
final LocatedBlock lastBlock = blocks.getLastLocatedBlock();
|
|
final LocatedBlock lastBlock = blocks.getLastLocatedBlock();
|
|
|
|
+ List<BlockInfo> misReplicatedBlocks = new LinkedList<>();
|
|
for (LocatedBlock lBlk : blocks.getLocatedBlocks()) {
|
|
for (LocatedBlock lBlk : blocks.getLocatedBlocks()) {
|
|
ExtendedBlock block = lBlk.getBlock();
|
|
ExtendedBlock block = lBlk.getBlock();
|
|
if (!blocks.isLastBlockComplete() && lastBlock != null &&
|
|
if (!blocks.isLastBlockComplete() && lastBlock != null &&
|
|
@@ -791,6 +803,9 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|
}
|
|
}
|
|
out.println(" Replica placement policy is violated for " +
|
|
out.println(" Replica placement policy is violated for " +
|
|
block + ". " + blockPlacementStatus.getErrorDescription());
|
|
block + ". " + blockPlacementStatus.getErrorDescription());
|
|
|
|
+ if (doReplicate) {
|
|
|
|
+ misReplicatedBlocks.add(storedBlock);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// count storage summary
|
|
// count storage summary
|
|
@@ -888,6 +903,19 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|
out.print(report + "\n");
|
|
out.print(report + "\n");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (doReplicate && !misReplicatedBlocks.isEmpty()) {
|
|
|
|
+ int processedBlocks = this.blockManager.processMisReplicatedBlocks(
|
|
|
|
+ misReplicatedBlocks);
|
|
|
|
+ if (processedBlocks < misReplicatedBlocks.size()) {
|
|
|
|
+ LOG.warn("Fsck: Block manager is able to process only " +
|
|
|
|
+ processedBlocks +
|
|
|
|
+ " mis-replicated blocks (Total count : " +
|
|
|
|
+ misReplicatedBlocks.size() +
|
|
|
|
+ " ) for path " + path);
|
|
|
|
+ }
|
|
|
|
+ res.numBlocksQueuedForReplication += processedBlocks;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
private void countStorageTypeSummary(HdfsFileStatus file, LocatedBlock lBlk) {
|
|
private void countStorageTypeSummary(HdfsFileStatus file, LocatedBlock lBlk) {
|
|
@@ -1167,6 +1195,7 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|
long totalSize = 0L;
|
|
long totalSize = 0L;
|
|
long totalOpenFilesSize = 0L;
|
|
long totalOpenFilesSize = 0L;
|
|
long totalReplicas = 0L;
|
|
long totalReplicas = 0L;
|
|
|
|
+ long numBlocksQueuedForReplication = 0L;
|
|
|
|
|
|
/**
|
|
/**
|
|
* DFS is considered healthy if there are no missing blocks.
|
|
* DFS is considered healthy if there are no missing blocks.
|
|
@@ -1310,6 +1339,8 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|
res.append("\n InMaintenanceReplicas:\t").append(
|
|
res.append("\n InMaintenanceReplicas:\t").append(
|
|
inMaintenanceReplicas);
|
|
inMaintenanceReplicas);
|
|
}
|
|
}
|
|
|
|
+ res.append("\n Blocks queued for replication:\t").append(
|
|
|
|
+ numBlocksQueuedForReplication);
|
|
return res.toString();
|
|
return res.toString();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1420,6 +1451,8 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|
res.append("\n InMaintenanceReplicas:\t").append(
|
|
res.append("\n InMaintenanceReplicas:\t").append(
|
|
inMaintenanceReplicas);
|
|
inMaintenanceReplicas);
|
|
}
|
|
}
|
|
|
|
+ res.append("\n Blocks queued for replication:\t").append(
|
|
|
|
+ numBlocksQueuedForReplication);
|
|
return res.toString();
|
|
return res.toString();
|
|
}
|
|
}
|
|
}
|
|
}
|