Browse Source

HADOOP-3509. Fix NPE in FSNamesystem.close. Contributed by Tsz Wo (Nicholas), SZE.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/core/trunk@664202 13f79535-47bb-0310-9956-ffa450edef68
Konstantin Shvachko 17 years ago
parent
commit
cbfda2f890

+ 2 - 0
CHANGES.txt

@@ -526,6 +526,8 @@ Trunk (unreleased changes)
 
     HADOOP-3489. Fix NPE in SafeModeMonitor. (Lohit Vijayarenu via shv)
 
+    HADOOP-3509. Fix NPE in FSNamesystem.close. (Tsz Wo (Nicholas), SZE via shv)
+
 Release 0.17.0 - 2008-05-18
 
   INCOMPATIBLE CHANGES

+ 1 - 1
src/java/org/apache/hadoop/dfs/FSDirectory.java

@@ -38,7 +38,7 @@ import org.apache.hadoop.dfs.BlocksMap.BlockInfo;
  * and logged to disk.
  * 
  *************************************************/
-class FSDirectory implements FSConstants {
+class FSDirectory implements FSConstants, Closeable {
 
   FSNamesystem namesystem = null;
   final INodeDirectoryWithQuota rootDir;

+ 3 - 5
src/java/org/apache/hadoop/dfs/FSNamesystem.java

@@ -38,6 +38,7 @@ import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.permission.*;
 import org.apache.hadoop.ipc.Server;
+import org.apache.hadoop.io.IOUtils;
 
 import java.io.BufferedWriter;
 import java.io.File;
@@ -250,6 +251,7 @@ class FSNamesystem implements FSConstants, FSNamesystemMBean {
     try {
       initialize(nn, conf);
     } catch(IOException e) {
+      LOG.error(getClass().getSimpleName() + " initialization failed.", e);
       close();
       throw e;
     }
@@ -461,11 +463,7 @@ class FSNamesystem implements FSConstants, FSNamesystemMBean {
         }
       } catch (InterruptedException ie) {
       } finally {
-        try {
-          dir.close();
-        } catch (IOException ex) {
-          // do nothing
-        }
+        IOUtils.close(LOG, dir);
       }
     }
   }

+ 22 - 7
src/java/org/apache/hadoop/io/IOUtils.java

@@ -21,6 +21,8 @@ package org.apache.hadoop.io;
 import java.io.*;
 import java.net.Socket;
 
+import org.apache.commons.logging.Log;
+
 import org.apache.hadoop.conf.Configuration;
 
 /**
@@ -120,18 +122,31 @@ public class IOUtils {
     }
   }
   
+  /**
+   * Close the Closeable objects.
+   * Log {@link IOException} if there is any. 
+   * @param closeables the objects to close
+   */
+  public static void close(Log log, java.io.Closeable... closeables) {
+    for(java.io.Closeable c : closeables) {
+      if (c != null) {
+        try {
+          c.close();
+        } catch(IOException e) {
+          if (log != null && log.isDebugEnabled()) {
+            log.debug("Exception in closing " + c, e);
+          }
+        }
+      }
+    }
+  }
+
   /**
    * Closes the stream ignoring {@link IOException} 
    * @param stream the Stream to close
    */
   public static void closeStream( java.io.Closeable stream ) {
-    // avoids try { close() } dance
-    if ( stream != null ) {
-      try {
-        stream.close();
-      } catch ( IOException ignored ) {
-      }
-    }
+    close(null, stream);
   }
   
   /**