[ 
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]

Reply via email to