You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-issues@hadoop.apache.org by "hu xiaodong (JIRA)" <ji...@apache.org> on 2017/09/14 03:28:00 UTC

[jira] [Updated] (HADOOP-14807) should prevent the possibility of NPE about ReconfigurableBase.java

     [ https://issues.apache.org/jira/browse/HADOOP-14807?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

hu xiaodong updated HADOOP-14807:
---------------------------------
    Status: In Progress  (was: Patch Available)

> should prevent the possibility of  NPE about ReconfigurableBase.java
> --------------------------------------------------------------------
>
>                 Key: HADOOP-14807
>                 URL: https://issues.apache.org/jira/browse/HADOOP-14807
>             Project: Hadoop Common
>          Issue Type: Improvement
>    Affects Versions: 3.0.0-alpha3
>            Reporter: hu xiaodong
>            Assignee: hu xiaodong
>            Priority: Minor
>         Attachments: HADOOP-14807.001.patch
>
>
> 1.NameNode.java may throw a ReconfigurationException which getCause() is null
> {code:title=NameNode.java|borderStyle=solid}  
>   protected String reconfigurePropertyImpl(String property, String newVal)
>       throws ReconfigurationException {
>     final DatanodeManager datanodeManager = namesystem.getBlockManager()
>         .getDatanodeManager();
>     if (property.equals(DFS_HEARTBEAT_INTERVAL_KEY)) {
>       return reconfHeartbeatInterval(datanodeManager, property, newVal);
>     } else if (property.equals(DFS_NAMENODE_HEARTBEAT_RECHECK_INTERVAL_KEY)) {
>       return reconfHeartbeatRecheckInterval(datanodeManager, property, newVal);
>     } else if (property.equals(FS_PROTECTED_DIRECTORIES)) {
>       return reconfProtectedDirectories(newVal);
>     } else if (property.equals(HADOOP_CALLER_CONTEXT_ENABLED_KEY)) {
>       return reconfCallerContextEnabled(newVal);
>     } else if (property.equals(ipcClientRPCBackoffEnable)) {
>       return reconfigureIPCBackoffEnabled(newVal);
>     } 
>    //=======================================================
>    //here may throw a ReconfigurationException which getCause() is null
>    //=======================================================
>    else {
>       throw new ReconfigurationException(property, newVal, getConf().get(
>           property));
>     }
>   }
> {code}
> 2.  ReconfigurationThread.java will call ReconfigurationException.getCause().getMessage() which will cause NPE.
> {code:title=ReconfigurationThread.java|borderStyle=solid}  
> private static class ReconfigurationThread extends Thread {
>     private ReconfigurableBase parent;
>     ReconfigurationThread(ReconfigurableBase base) {
>       this.parent = base;
>     }
>     // See {@link ReconfigurationServlet#applyChanges}
>     public void run() {
>       LOG.info("Starting reconfiguration task.");
>       final Configuration oldConf = parent.getConf();
>       final Configuration newConf = parent.getNewConf();
>       final Collection<PropertyChange> changes =
>           parent.getChangedProperties(newConf, oldConf);
>       Map<PropertyChange, Optional<String>> results = Maps.newHashMap();
>       ConfigRedactor oldRedactor = new ConfigRedactor(oldConf);
>       ConfigRedactor newRedactor = new ConfigRedactor(newConf);
>       for (PropertyChange change : changes) {
>         String errorMessage = null;
>         String oldValRedacted = oldRedactor.redact(change.prop, change.oldVal);
>         String newValRedacted = newRedactor.redact(change.prop, change.newVal);
>         if (!parent.isPropertyReconfigurable(change.prop)) {
>           LOG.info(String.format(
>               "Property %s is not configurable: old value: %s, new value: %s",
>               change.prop,
>               oldValRedacted,
>               newValRedacted));
>           continue;
>         }
>         LOG.info("Change property: " + change.prop + " from \""
>             + ((change.oldVal == null) ? "<default>" : oldValRedacted)
>             + "\" to \""
>             + ((change.newVal == null) ? "<default>" : newValRedacted)
>             + "\".");
>         try {
>           String effectiveValue =
>               parent.reconfigurePropertyImpl(change.prop, change.newVal);
>           if (change.newVal != null) {
>             oldConf.set(change.prop, effectiveValue);
>           } else {
>             oldConf.unset(change.prop);
>           }
>         } catch (ReconfigurationException e) {
>           //===============================================
>           // here may occurs NPE,  because  e.getCause() may be null.
>           //===============================================
>           errorMessage = e.getCause().getMessage();
>         }
>         results.put(change, Optional.fromNullable(errorMessage));
>       }
>       synchronized (parent.reconfigLock) {
>         parent.endTime = Time.now();
>         parent.status = Collections.unmodifiableMap(results);
>         parent.reconfigThread = null;
>       }
>     }
>   }
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: common-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-issues-help@hadoop.apache.org