[
https://issues.apache.org/jira/browse/HDFS-17876?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ConfX updated HDFS-17876:
-------------------------
Description:
The NameNode.stop() method acks a null check for the tracer field before
calling tracer.close().
This is inconsistent with how all other resources are handled in the same
method and can lead to a NPE during shutdown if the NameNode is stopped before
fully initializing.
{code:java}
public void stop() {
synchronized(this) {
if (stopRequested)
return;
stopRequested = true;
}
try {
if (state != null) { // NULL CHECK
state.exitState(haContext);
}
} catch (ServiceFailedException e) {
LOG.warn("Encountered exception while exiting state", e);
} finally {
stopMetricsLogger();
stopCommonServices();
if (metrics != null) { // NULL CHECK
metrics.shutdown();
}
if (namesystem != null) { // NULL CHECK
namesystem.shutdown();
}
if (nameNodeStatusBeanName != null) { // NULL CHECK
MBeans.unregister(nameNodeStatusBeanName);
nameNodeStatusBeanName = null;
}
if (levelDBAliasMapServer != null) { // NULL CHECK
levelDBAliasMapServer.close();
}
}
tracer.close(); // NO NULL CHECK
} {code}
h2. How tracer Can Be Null
1. Exception in parent constructor: If super(conf) at line 1007 throws before
tracer is initialized at line 1008, tracer remains null.
2. Early shutdown during initialization: The stopAtException() method (line
1048) calls this.stop() when exceptions occur during initialization. If
initialization fails early, tracer may not be set.
3. Subclass or future refactoring: A subclass could override initialization
behavior or future code changes could introduce paths where tracer isn't
initialized before stop() is called.
{code:java}
java.lang.NullPointerException
at
org.apache.hadoop.hdfs.server.namenode.NameNode.stop(NameNode.java:1116)
at
org.apache.hadoop.hdfs.server.namenode.NameNode.stopAtException(NameNode.java:1050)
at
org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:1036){code}
h2. Proposed Fix
Add a null check for tracer consistent with the other resources in the method:
{code:java}
if (tracer != null) {
tracer.close();
} {code}
was:
The NameNode.stop() method acks a null check for the tracer field before
calling tracer.close().
This is inconsistent with how all other resources are handled in the same
method and can lead to a NPE during shutdown if the NameNode is stopped before
fully initializing.
{code:java}
public void stop() {
synchronized(this) {
if (stopRequested)
return;
stopRequested = true;
}
try {
if (state != null) { // NULL CHECK
state.exitState(haContext);
}
} catch (ServiceFailedException e) {
LOG.warn("Encountered exception while exiting state", e);
} finally {
stopMetricsLogger();
stopCommonServices();
if (metrics != null) { // NULL CHECK
metrics.shutdown();
}
if (namesystem != null) { // NULL CHECK
namesystem.shutdown();
}
if (nameNodeStatusBeanName != null) { // NULL CHECK
MBeans.unregister(nameNodeStatusBeanName);
nameNodeStatusBeanName = null;
}
if (levelDBAliasMapServer != null) { // NULL CHECK
levelDBAliasMapServer.close();
}
}
tracer.close(); // NO NULL CHECK
} {code}
How tracer Can Be Null
1. Exception in parent constructor: If super(conf) at line 1007 throws before
tracer is initialized at line 1008, tracer remains null.
2. Early shutdown during initialization: The stopAtException() method (line
1048) calls this.stop() when exceptions occur during initialization. If
initialization fails early, tracer may not be set.
3. Subclass or future refactoring: A subclass could override initialization
behavior or future code changes could introduce paths where tracer isn't
initialized before stop() is called.
{code:java}
java.lang.NullPointerException
at
org.apache.hadoop.hdfs.server.namenode.NameNode.stop(NameNode.java:1116)
at
org.apache.hadoop.hdfs.server.namenode.NameNode.stopAtException(NameNode.java:1050)
at
org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:1036){code}
Proposed Fix
Add a null check for tracer consistent with the other resources in the method:
{code:java}
if (tracer != null) {
tracer.close();
} {code}
> NameNode.stop() missing null check for tracer.close() can cause NPE during
> shutdown
> -----------------------------------------------------------------------------------
>
> Key: HDFS-17876
> URL: https://issues.apache.org/jira/browse/HDFS-17876
> Project: Hadoop HDFS
> Issue Type: Bug
> Components: namenode
> Affects Versions: 3.3.5, 3.3.6
> Reporter: ConfX
> Priority: Major
>
> The NameNode.stop() method acks a null check for the tracer field before
> calling tracer.close().
> This is inconsistent with how all other resources are handled in the same
> method and can lead to a NPE during shutdown if the NameNode is stopped
> before fully initializing.
>
> {code:java}
> public void stop() {
> synchronized(this) {
> if (stopRequested)
> return;
> stopRequested = true;
> }
> try {
> if (state != null) { // NULL CHECK
> state.exitState(haContext);
> }
> } catch (ServiceFailedException e) {
> LOG.warn("Encountered exception while exiting state", e);
> } finally {
> stopMetricsLogger();
> stopCommonServices();
> if (metrics != null) { // NULL CHECK
> metrics.shutdown();
> }
> if (namesystem != null) { // NULL CHECK
> namesystem.shutdown();
> }
> if (nameNodeStatusBeanName != null) { // NULL CHECK
> MBeans.unregister(nameNodeStatusBeanName);
> nameNodeStatusBeanName = null;
> }
> if (levelDBAliasMapServer != null) { // NULL CHECK
> levelDBAliasMapServer.close();
> }
> }
> tracer.close(); // NO NULL CHECK
> } {code}
> h2. How tracer Can Be Null
> 1. Exception in parent constructor: If super(conf) at line 1007 throws
> before tracer is initialized at line 1008, tracer remains null.
>
> 2. Early shutdown during initialization: The stopAtException() method (line
> 1048) calls this.stop() when exceptions occur during initialization. If
> initialization fails early, tracer may not be set.
> 3. Subclass or future refactoring: A subclass could override initialization
> behavior or future code changes could introduce paths where tracer isn't
> initialized before stop() is called.
> {code:java}
> java.lang.NullPointerException
> at
> org.apache.hadoop.hdfs.server.namenode.NameNode.stop(NameNode.java:1116)
> at
> org.apache.hadoop.hdfs.server.namenode.NameNode.stopAtException(NameNode.java:1050)
> at
> org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:1036){code}
> h2. Proposed Fix
> Add a null check for tracer consistent with the other resources in the
> method:
> {code:java}
> if (tracer != null) {
> tracer.close();
> } {code}
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]