diff --git a/common/src/java/org/apache/hadoop/hive/common/LogUtils.java b/common/src/java/org/apache/hadoop/hive/common/LogUtils.java index 874a3e1274..0361bbfb18 100644 --- a/common/src/java/org/apache/hadoop/hive/common/LogUtils.java +++ b/common/src/java/org/apache/hadoop/hive/common/LogUtils.java @@ -219,10 +219,13 @@ public static String maskIfPassword(String key, String value) { * Register logging context so that log system can print QueryId, SessionId, etc for each message */ public static void registerLoggingContext(Configuration conf) { - MDC.put(SESSIONID_LOG_KEY, HiveConf.getVar(conf, HiveConf.ConfVars.HIVESESSIONID)); - MDC.put(QUERYID_LOG_KEY, HiveConf.getVar(conf, HiveConf.ConfVars.HIVEQUERYID)); if (HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_SERVER2_LOGGING_OPERATION_ENABLED)) { + MDC.put(SESSIONID_LOG_KEY, HiveConf.getVar(conf, HiveConf.ConfVars.HIVESESSIONID)); + MDC.put(QUERYID_LOG_KEY, HiveConf.getVar(conf, HiveConf.ConfVars.HIVEQUERYID)); MDC.put(OPERATIONLOG_LEVEL_KEY, HiveConf.getVar(conf, HiveConf.ConfVars.HIVE_SERVER2_LOGGING_OPERATION_LEVEL)); + l4j.info("Thread context registration is done."); + } else { + l4j.info("Thread context registration is skipped."); } } @@ -230,7 +233,14 @@ public static void registerLoggingContext(Configuration conf) { * Unregister logging context */ public static void unregisterLoggingContext() { - MDC.clear(); + // Remove the keys added, don't use clear, as it may clear all other things which are not intended to be removed. + MDC.remove(SESSIONID_LOG_KEY); + MDC.remove(QUERYID_LOG_KEY); + MDC.remove(OPERATIONLOG_LEVEL_KEY); + l4j.info("Unregistered logging context."); + if (MDC.get(OPERATIONLOG_LEVEL_KEY) != null) { + throw new RuntimeException("Keys removal failed from thread context MDC"); + } } /** diff --git a/itests/hive-unit/src/test/java/org/apache/hive/service/cli/operation/TestOperationLoggingLayout.java b/itests/hive-unit/src/test/java/org/apache/hive/service/cli/operation/TestOperationLoggingLayout.java index 6972ddef9b..d4d53d4d2d 100644 --- a/itests/hive-unit/src/test/java/org/apache/hive/service/cli/operation/TestOperationLoggingLayout.java +++ b/itests/hive-unit/src/test/java/org/apache/hive/service/cli/operation/TestOperationLoggingLayout.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.apache.hadoop.hive.common.LogUtils; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.ql.log.HushableRandomAccessFileAppender; import org.apache.hadoop.hive.ql.log.LogDivertAppender; @@ -132,22 +133,47 @@ private void appendHushableRandomAccessFileAppender(Appender queryAppender) { } } - @Test - public void testSwitchLogLayout() throws Exception { + private void executeWithOperationLog(String query, boolean queryLogEnabled) throws Exception { // verify whether the sql operation log is generated and fetch correctly. - OperationHandle operationHandle = client.executeStatement(sessionHandle, sqlCntStar, null); + OperationHandle operationHandle = client.executeStatement(sessionHandle, query, null); RowSet rowSetLog = client.fetchResults(operationHandle, FetchOrientation.FETCH_FIRST, 1000, - FetchType.LOG); - String queryId = getQueryId(rowSetLog); - Assert.assertNotNull("Could not find query id, perhaps a logging message changed", queryId); + FetchType.LOG); + String queryId = ""; + boolean expectedStopped = true; + if (queryLogEnabled) { + queryId = getQueryId(rowSetLog); + expectedStopped = false; + Assert.assertNotNull("Could not find query id, perhaps a logging message changed", queryId); + } else { + Assert.assertEquals("Operation log is generated even if query logging is disabled", rowSetLog.numRows(), 0); + Assert.assertNull("Query id present even if logging is disabled.", getQueryId(rowSetLog)); + } - checkAppenderState("before operation close ", LogDivertAppender.QUERY_ROUTING_APPENDER, queryId, false); - checkAppenderState("before operation close ", LogDivertAppenderForTest.TEST_QUERY_ROUTING_APPENDER, queryId, false); + checkAppenderState("before operation close ", LogDivertAppender.QUERY_ROUTING_APPENDER, queryId, expectedStopped); + checkAppenderState("before operation close ", LogDivertAppenderForTest.TEST_QUERY_ROUTING_APPENDER, queryId, expectedStopped); client.closeOperation(operationHandle); checkAppenderState("after operation close ", LogDivertAppender.QUERY_ROUTING_APPENDER, queryId, true); checkAppenderState("after operation close ", LogDivertAppenderForTest.TEST_QUERY_ROUTING_APPENDER, queryId, true); } + @Test + public void testSwitchLogLayout() throws Exception { + executeWithOperationLog(sqlCntStar, true); + } + + @Test + public void testQueryLogDisabled() throws Exception { + OperationHandle operationHandle = client.executeStatement(sessionHandle, + "set hive.server2.logging.operation.enabled=false", null); + client.closeOperation(operationHandle); + + executeWithOperationLog(sqlCntStar, false); + + operationHandle = client.executeStatement(sessionHandle, + "set hive.server2.logging.operation.enabled=true", null); + client.closeOperation(operationHandle); + } + @Test /** * Test to make sure that appending log event to HushableRandomAccessFileAppender even after