|
@@ -24,12 +24,16 @@ import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_C
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_ENABLED_KEY;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_ENABLED_KEY;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_MAX_SIZE_DEFAULT;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_MAX_SIZE_DEFAULT;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_MAX_SIZE_KEY;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_MAX_SIZE_KEY;
|
|
|
|
+import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_SEPARATOR_DEFAULT;
|
|
|
|
+import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_SEPARATOR_KEY;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_SIGNATURE_MAX_SIZE_DEFAULT;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_SIGNATURE_MAX_SIZE_DEFAULT;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_SIGNATURE_MAX_SIZE_KEY;
|
|
import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_CALLER_CONTEXT_SIGNATURE_MAX_SIZE_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.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_NAMENODE_AUDIT_LOG_WITH_REMOTE_PORT_DEFAULT;
|
|
|
|
+import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_AUDIT_LOG_WITH_REMOTE_PORT_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_ENABLED_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_ENABLED_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_PERMISSIONS_SUPERUSER_ONLY_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_PERMISSIONS_SUPERUSER_ONLY_DEFAULT;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_PERMISSIONS_SUPERUSER_ONLY_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_PERMISSIONS_SUPERUSER_ONLY_KEY;
|
|
@@ -397,6 +401,9 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
@Metric final MutableRatesWithAggregation detailedLockHoldTimeMetrics =
|
|
@Metric final MutableRatesWithAggregation detailedLockHoldTimeMetrics =
|
|
registry.newRatesWithAggregation("detailedLockHoldTimeMetrics");
|
|
registry.newRatesWithAggregation("detailedLockHoldTimeMetrics");
|
|
|
|
|
|
|
|
+ private static final String CLIENT_PORT_STR = "clientPort";
|
|
|
|
+ private final String contextFieldSeparator;
|
|
|
|
+
|
|
boolean isAuditEnabled() {
|
|
boolean isAuditEnabled() {
|
|
return (!isDefaultAuditLogger || auditLog.isInfoEnabled())
|
|
return (!isDefaultAuditLogger || auditLog.isInfoEnabled())
|
|
&& !auditLoggers.isEmpty();
|
|
&& !auditLoggers.isEmpty();
|
|
@@ -411,7 +418,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
String dst, FileStatus stat) throws IOException {
|
|
String dst, FileStatus stat) throws IOException {
|
|
if (isAuditEnabled() && isExternalInvocation()) {
|
|
if (isAuditEnabled() && isExternalInvocation()) {
|
|
logAuditEvent(succeeded, Server.getRemoteUser(), Server.getRemoteIp(),
|
|
logAuditEvent(succeeded, Server.getRemoteUser(), Server.getRemoteIp(),
|
|
- cmd, src, dst, stat);
|
|
|
|
|
|
+ cmd, src, dst, stat);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -442,6 +449,9 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
for (AuditLogger logger : auditLoggers) {
|
|
for (AuditLogger logger : auditLoggers) {
|
|
if (logger instanceof HdfsAuditLogger) {
|
|
if (logger instanceof HdfsAuditLogger) {
|
|
HdfsAuditLogger hdfsLogger = (HdfsAuditLogger) logger;
|
|
HdfsAuditLogger hdfsLogger = (HdfsAuditLogger) logger;
|
|
|
|
+ if (auditLogWithRemotePort) {
|
|
|
|
+ appendClientPortToCallerContextIfAbsent();
|
|
|
|
+ }
|
|
hdfsLogger.logAuditEvent(succeeded, ugiStr, addr, cmd, src, dst,
|
|
hdfsLogger.logAuditEvent(succeeded, ugiStr, addr, cmd, src, dst,
|
|
status, CallerContext.getCurrent(), ugi, dtSecretManager);
|
|
status, CallerContext.getCurrent(), ugi, dtSecretManager);
|
|
} else {
|
|
} else {
|
|
@@ -450,6 +460,25 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void appendClientPortToCallerContextIfAbsent() {
|
|
|
|
+ final CallerContext ctx = CallerContext.getCurrent();
|
|
|
|
+ if (isClientPortInfoAbsent(CLIENT_PORT_STR + ":" + Server.getRemotePort(),
|
|
|
|
+ ctx)) {
|
|
|
|
+ String origContext = ctx == null ? null : ctx.getContext();
|
|
|
|
+ byte[] origSignature = ctx == null ? null : ctx.getSignature();
|
|
|
|
+ CallerContext.setCurrent(
|
|
|
|
+ new CallerContext.Builder(origContext, contextFieldSeparator)
|
|
|
|
+ .append(CLIENT_PORT_STR, String.valueOf(Server.getRemotePort()))
|
|
|
|
+ .setSignature(origSignature)
|
|
|
|
+ .build());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private boolean isClientPortInfoAbsent(String clientPortInfo, CallerContext ctx){
|
|
|
|
+ return ctx == null || ctx.getContext() == null
|
|
|
|
+ || !ctx.getContext().contains(clientPortInfo);
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Logger for audit events, noting successful FSNamesystem operations. Emits
|
|
* Logger for audit events, noting successful FSNamesystem operations. Emits
|
|
* to FSNamesystem.audit at INFO. Each event causes a set of tab-separated
|
|
* to FSNamesystem.audit at INFO. Each event causes a set of tab-separated
|
|
@@ -501,6 +530,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
// underlying logger is disabled, and avoid some unnecessary work.
|
|
// underlying logger is disabled, and avoid some unnecessary work.
|
|
private final boolean isDefaultAuditLogger;
|
|
private final boolean isDefaultAuditLogger;
|
|
private final List<AuditLogger> auditLoggers;
|
|
private final List<AuditLogger> auditLoggers;
|
|
|
|
+ private final boolean auditLogWithRemotePort;
|
|
|
|
|
|
/** The namespace tree. */
|
|
/** The namespace tree. */
|
|
FSDirectory dir;
|
|
FSDirectory dir;
|
|
@@ -833,6 +863,12 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
LOG.info("Enabling async auditlog");
|
|
LOG.info("Enabling async auditlog");
|
|
enableAsyncAuditLog(conf);
|
|
enableAsyncAuditLog(conf);
|
|
}
|
|
}
|
|
|
|
+ auditLogWithRemotePort =
|
|
|
|
+ conf.getBoolean(DFS_NAMENODE_AUDIT_LOG_WITH_REMOTE_PORT_KEY,
|
|
|
|
+ DFS_NAMENODE_AUDIT_LOG_WITH_REMOTE_PORT_DEFAULT);
|
|
|
|
+ this.contextFieldSeparator =
|
|
|
|
+ conf.get(HADOOP_CALLER_CONTEXT_SEPARATOR_KEY,
|
|
|
|
+ HADOOP_CALLER_CONTEXT_SEPARATOR_DEFAULT);
|
|
fsLock = new FSNamesystemLock(conf, detailedLockHoldTimeMetrics);
|
|
fsLock = new FSNamesystemLock(conf, detailedLockHoldTimeMetrics);
|
|
cond = fsLock.newWriteLockCondition();
|
|
cond = fsLock.newWriteLockCondition();
|
|
cpLock = new ReentrantLock();
|
|
cpLock = new ReentrantLock();
|