[ https://issues.apache.org/jira/browse/FLINK-36227?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexander Fedulov updated FLINK-36227: -------------------------------------- Fix Version/s: (was: 1.19.2) > NullPointerException when starting flink with logback logger > ------------------------------------------------------------ > > Key: FLINK-36227 > URL: https://issues.apache.org/jira/browse/FLINK-36227 > Project: Flink > Issue Type: Bug > Components: API / Core > Affects Versions: 1.20.0 > Environment: The error rise when flink is staring with logback as > logger > Reporter: Szymon > Priority: Critical > Labels: pull-request-available > Fix For: 1.20.1 > > > I think that there is a bug in flink code in class MdcUtils. > > When I run job on standalone flink or unit test with MiniCluster I get > below error. This error rise only when logback is used, as logging adapter. > I use logback version 1.2.13 because in flink documentation > [https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/deployment/advanced/logging/] > is written “Logback 1.3+ requires SLF4J 2, which is currently not supported.” > > _14:33:41.111 [flink-pekko.actor.default-dispatcher-5] INFO > org.apache.flink.runtime.rpc.pekko.PekkoRpcActor - The RpcEndpoint > taskmanager_0 failed._ > _java.lang.NullPointerException: null_ > _at java.base/java.util.HashMap.putMapEntries(HashMap.java:497)_ > _at java.base/java.util.HashMap.putAll(HashMap.java:781)_ > _at > java.base/java.util.Collections$SynchronizedMap.putAll(Collections.java:2604)_ > _at > ch.qos.logback.classic.util.LogbackMDCAdapter.setContextMap(LogbackMDCAdapter.java:197)_ > _at org.slf4j.MDC.setContextMap(MDC.java:264)_ > _at > org.apache.flink.util.MdcUtils.lambda$withContext$0(MdcUtils.java:48)_ > > I checked flink code and in my opinion there should be additional check in > class MdcUtils in method > _public static MdcCloseable withContext(Map<String, String> context) {_ > _final Map<String, String> orig = MDC.getCopyOfContextMap();_ > _MDC.setContextMap(context);_ > _return () -> MDC.setContextMap(orig);_ > _}_ > > this method use MDC.getCopyOfContextMap();. Description of this method says > that returned value may be null. So when variable orig is null and is passed > to “MDC.setContextMap”. At the end this null is passed to class > LogbackMDCAdapter to method setContextMap where this null Is passed to > newMap.putAll(contextMap), and then NullPointerException rise. I checked this > for logback 1.2.13 where setContextMap is > _public void setContextMap(Map<String, String> contextMap) {_ > _lastOperation.set(WRITE_OPERATION);_ > _Map<String, String> newMap = Collections.synchronizedMap(new > HashMap<String, String>());_ > _newMap.putAll(contextMap);_ > _// the newMap replaces the old one for serialisation's sake_ > _copyOnThreadLocal.set(newMap);_ > _}_ > > This error should not appear when logback version is 1.3.3 or higher > _@SuppressWarnings("unchecked")_ > _public void setContextMap(Map contextMap) {_ > _if (contextMap != null) {_ > _readWriteThreadLocalMap.set(new HashMap<String, > String>(contextMap));_ > _} else {_ > _readWriteThreadLocalMap.set(null);_ > _}_ > _nullifyReadOnlyThreadLocalMap();_ > _}_ > > -- This message was sent by Atlassian Jira (v8.20.10#820010)