HDFS-15717. Improve fsck logging. (#2529) Contributed by Kihwal Lee and Ahmed Hussein
This commit is contained in:
parent
9bd3c9bc50
commit
be35fa186c
@ -6323,13 +6323,19 @@ boolean isExternalInvocation() {
|
|||||||
private static UserGroupInformation getRemoteUser() throws IOException {
|
private static UserGroupInformation getRemoteUser() throws IOException {
|
||||||
return NameNode.getRemoteUser();
|
return NameNode.getRemoteUser();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Log fsck event in the audit log
|
* Log fsck event in the audit log.
|
||||||
|
*
|
||||||
|
* @param succeeded Whether authorization succeeded.
|
||||||
|
* @param src Path of affected source file.
|
||||||
|
* @param remoteAddress Remote address of the request.
|
||||||
|
* @throws IOException if {@link #getRemoteUser()} fails.
|
||||||
*/
|
*/
|
||||||
void logFsckEvent(String src, InetAddress remoteAddress) throws IOException {
|
void logFsckEvent(boolean succeeded, String src, InetAddress remoteAddress)
|
||||||
|
throws IOException {
|
||||||
if (isAuditEnabled()) {
|
if (isAuditEnabled()) {
|
||||||
logAuditEvent(true, getRemoteUser(),
|
logAuditEvent(succeeded, getRemoteUser(),
|
||||||
remoteAddress,
|
remoteAddress,
|
||||||
"fsck", src, null, null);
|
"fsck", src, null, null);
|
||||||
}
|
}
|
||||||
|
@ -55,21 +55,25 @@ public void doGet(HttpServletRequest request, HttpServletResponse response
|
|||||||
|
|
||||||
final UserGroupInformation ugi = getUGI(request, conf);
|
final UserGroupInformation ugi = getUGI(request, conf);
|
||||||
try {
|
try {
|
||||||
ugi.doAs(new PrivilegedExceptionAction<Object>() {
|
ugi.doAs((PrivilegedExceptionAction<Object>) () -> {
|
||||||
@Override
|
NameNode nn = NameNodeHttpServer.getNameNodeFromContext(context);
|
||||||
public Object run() throws Exception {
|
|
||||||
NameNode nn = NameNodeHttpServer.getNameNodeFromContext(context);
|
final FSNamesystem namesystem = nn.getNamesystem();
|
||||||
|
final BlockManager bm = namesystem.getBlockManager();
|
||||||
final FSNamesystem namesystem = nn.getNamesystem();
|
final int totalDatanodes =
|
||||||
final BlockManager bm = namesystem.getBlockManager();
|
namesystem.getNumberOfDatanodes(DatanodeReportType.LIVE);
|
||||||
final int totalDatanodes =
|
NamenodeFsck fsck = new NamenodeFsck(conf, nn,
|
||||||
namesystem.getNumberOfDatanodes(DatanodeReportType.LIVE);
|
bm.getDatanodeManager().getNetworkTopology(), pmap, out,
|
||||||
new NamenodeFsck(conf, nn,
|
totalDatanodes, remoteAddress);
|
||||||
bm.getDatanodeManager().getNetworkTopology(), pmap, out,
|
String auditSource = fsck.getAuditSource();
|
||||||
totalDatanodes, remoteAddress).fsck();
|
boolean success = false;
|
||||||
|
try {
|
||||||
return null;
|
fsck.fsck();
|
||||||
|
success = true;
|
||||||
|
} finally {
|
||||||
|
namesystem.logFsckEvent(success, auditSource, remoteAddress);
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
});
|
});
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
response.sendError(400, e.getMessage());
|
response.sendError(400, e.getMessage());
|
||||||
|
@ -155,6 +155,7 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|||||||
private boolean showMaintenanceState = false;
|
private boolean showMaintenanceState = false;
|
||||||
private long staleInterval;
|
private long staleInterval;
|
||||||
private Tracer tracer;
|
private Tracer tracer;
|
||||||
|
private String auditSource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True if we encountered an internal error during FSCK, such as not being
|
* True if we encountered an internal error during FSCK, such as not being
|
||||||
@ -186,7 +187,7 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
|
|||||||
|
|
||||||
String path = "/";
|
String path = "/";
|
||||||
|
|
||||||
private String blockIds = null;
|
private String[] blockIds = null;
|
||||||
|
|
||||||
// We return back N files that are corrupt; the list of files returned is
|
// We return back N files that are corrupt; the list of files returned is
|
||||||
// ordered by block id; to allow continuation support, pass in the last block
|
// ordered by block id; to allow continuation support, pass in the last block
|
||||||
@ -262,11 +263,17 @@ else if (key.equals("replicadetails")) {
|
|||||||
} else if (key.equals("includeSnapshots")) {
|
} else if (key.equals("includeSnapshots")) {
|
||||||
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].split(" ");
|
||||||
} else if (key.equals("replicate")) {
|
} else if (key.equals("replicate")) {
|
||||||
this.doReplicate = true;
|
this.doReplicate = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.auditSource = (blockIds != null)
|
||||||
|
? "blocksIds=" + Arrays.asList(blockIds) : path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAuditSource() {
|
||||||
|
return auditSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -368,18 +375,18 @@ private void printDatanodeReplicaStatus(Block block,
|
|||||||
/**
|
/**
|
||||||
* Check files on DFS, starting from the indicated path.
|
* Check files on DFS, starting from the indicated path.
|
||||||
*/
|
*/
|
||||||
public void fsck() {
|
public void fsck() throws AccessControlException {
|
||||||
final long startTime = Time.monotonicNow();
|
final long startTime = Time.monotonicNow();
|
||||||
try {
|
try {
|
||||||
if(blockIds != null) {
|
if(blockIds != null) {
|
||||||
String[] blocks = blockIds.split(" ");
|
namenode.getNamesystem().checkSuperuserPrivilege();
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append("FSCK started by " +
|
sb.append("FSCK started by " +
|
||||||
UserGroupInformation.getCurrentUser() + " from " +
|
UserGroupInformation.getCurrentUser() + " from " +
|
||||||
remoteAddress + " at " + new Date());
|
remoteAddress + " at " + new Date());
|
||||||
out.println(sb);
|
out.println(sb);
|
||||||
sb.append(" for blockIds: \n");
|
sb.append(" for blockIds: \n");
|
||||||
for (String blk: blocks) {
|
for (String blk: blockIds) {
|
||||||
if(blk == null || !blk.contains(Block.BLOCK_FILE_PREFIX)) {
|
if(blk == null || !blk.contains(Block.BLOCK_FILE_PREFIX)) {
|
||||||
out.println("Incorrect blockId format: " + blk);
|
out.println("Incorrect blockId format: " + blk);
|
||||||
continue;
|
continue;
|
||||||
@ -389,7 +396,6 @@ public void fsck() {
|
|||||||
sb.append(blk + "\n");
|
sb.append(blk + "\n");
|
||||||
}
|
}
|
||||||
LOG.info("{}", sb.toString());
|
LOG.info("{}", sb.toString());
|
||||||
namenode.getNamesystem().logFsckEvent("/", remoteAddress);
|
|
||||||
out.flush();
|
out.flush();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -398,7 +404,6 @@ public void fsck() {
|
|||||||
+ " from " + remoteAddress + " for path " + path + " at " + new Date();
|
+ " from " + remoteAddress + " for path " + path + " at " + new Date();
|
||||||
LOG.info(msg);
|
LOG.info(msg);
|
||||||
out.println(msg);
|
out.println(msg);
|
||||||
namenode.getNamesystem().logFsckEvent(path, remoteAddress);
|
|
||||||
|
|
||||||
if (snapshottableDirs != null) {
|
if (snapshottableDirs != null) {
|
||||||
SnapshottableDirectoryStatus[] snapshotDirs =
|
SnapshottableDirectoryStatus[] snapshotDirs =
|
||||||
|
@ -254,6 +254,7 @@ private void setupAuditLogs() throws IOException {
|
|||||||
file.delete();
|
file.delete();
|
||||||
}
|
}
|
||||||
Logger logger = ((Log4JLogger) FSNamesystem.auditLog).getLogger();
|
Logger logger = ((Log4JLogger) FSNamesystem.auditLog).getLogger();
|
||||||
|
logger.removeAllAppenders();
|
||||||
logger.setLevel(Level.INFO);
|
logger.setLevel(Level.INFO);
|
||||||
PatternLayout layout = new PatternLayout("%m%n");
|
PatternLayout layout = new PatternLayout("%m%n");
|
||||||
RollingFileAppender appender =
|
RollingFileAppender appender =
|
||||||
|
Loading…
Reference in New Issue
Block a user