HDFS-15717. Improve fsck logging. Contributed by Kihwal Lee and Ahmed Hussein (#2620)

(cherry picked from commit be35fa186c)
This commit is contained in:
Akira Ajisaka 2021-01-15 10:28:11 +09:00 committed by GitHub
parent 4ddd41bd47
commit db5b804238
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 17 deletions

View File

@ -5461,13 +5461,19 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
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);
} }

View File

@ -59,15 +59,22 @@ public class FsckServlet extends DfsServlet {
@Override @Override
public Object run() throws Exception { public Object run() throws Exception {
NameNode nn = NameNodeHttpServer.getNameNodeFromContext(context); NameNode nn = NameNodeHttpServer.getNameNodeFromContext(context);
final FSNamesystem namesystem = nn.getNamesystem(); final FSNamesystem namesystem = nn.getNamesystem();
final BlockManager bm = namesystem.getBlockManager(); final BlockManager bm = namesystem.getBlockManager();
final int totalDatanodes = final int totalDatanodes =
namesystem.getNumberOfDatanodes(DatanodeReportType.LIVE); namesystem.getNumberOfDatanodes(DatanodeReportType.LIVE);
new NamenodeFsck(conf, nn, NamenodeFsck fsck = new NamenodeFsck(conf, nn,
bm.getDatanodeManager().getNetworkTopology(), pmap, out, bm.getDatanodeManager().getNetworkTopology(), pmap, out,
totalDatanodes, remoteAddress).fsck(); totalDatanodes, remoteAddress);
String auditSource = fsck.getAuditSource();
boolean success = false;
try {
fsck.fsck();
success = true;
} finally {
namesystem.logFsckEvent(success, auditSource, remoteAddress);
}
return null; return null;
} }
}); });

View File

@ -144,6 +144,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
@ -167,7 +168,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
@ -237,9 +238,15 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
} 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(" ");
} }
} }
this.auditSource = (blockIds != null)
? "blocksIds=" + Arrays.asList(blockIds) : path;
}
public String getAuditSource() {
return auditSource;
} }
/** /**
@ -324,18 +331,18 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
/** /**
* 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;
@ -345,7 +352,6 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
sb.append(blk + "\n"); sb.append(blk + "\n");
} }
LOG.info(sb); LOG.info(sb);
namenode.getNamesystem().logFsckEvent("/", remoteAddress);
out.flush(); out.flush();
return; return;
} }
@ -354,7 +360,6 @@ public class NamenodeFsck implements DataEncryptionKeyFactory {
+ " 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 =

View File

@ -237,6 +237,7 @@ public class TestFsck {
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 =