[ https://issues.apache.org/jira/browse/HADOOP-14807?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
hu xiaodong updated HADOOP-14807: --------------------------------- Status: Patch Available (was: In Progress) > 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-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-issues-h...@hadoop.apache.org