Browse Source

HDFS-2703. removedStorageDirs is not updated everywhere we remove a storage dir. Contributed by Eli Collins

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1@1221099 13f79535-47bb-0310-9956-ffa450edef68
Eli Collins 13 years ago
parent
commit
efbd35ee1c

+ 3 - 0
CHANGES.txt

@@ -68,6 +68,9 @@ Release 1.1.0 - unreleased
     HDFS-2653. DFSClient should cache whether addrs are non-local when
     short-circuiting is enabled. (eli)
 
+    HDFS-2703. removedStorageDirs is not updated everywhere we remove
+    a storage dir. (eli)
+
   IMPROVEMENTS
 
     MAPREDUCE-3008. [Gridmix] Improve cumulative CPU usage emulation for

+ 6 - 4
src/hdfs/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java

@@ -340,7 +340,7 @@ public class FSEditLog {
         EditLogOutputStream eStream = new EditLogFileOutputStream(eFile);
         editStreams.add(eStream);
       } catch (IOException ioe) {
-        FSNamesystem.LOG.warn("Unable to open edit log file " + eFile);
+        fsimage.updateRemovedDirs(sd, ioe);
         it.remove();
       }
     }
@@ -1248,6 +1248,7 @@ public class FSEditLog {
         editStreams.add(eStream);
       } catch (IOException ioe) {
         removeEditsForStorageDir(sd);
+        fsimage.updateRemovedDirs(sd, ioe);
         it.remove();
       }
     }
@@ -1270,8 +1271,8 @@ public class FSEditLog {
     //
     // Delete edits and rename edits.new to edits.
     //
-    for (Iterator<StorageDirectory> it = 
-           fsimage.dirIterator(NameNodeDirType.EDITS); it.hasNext();) {
+    Iterator<StorageDirectory> it = fsimage.dirIterator(NameNodeDirType.EDITS);
+    while (it.hasNext()) {
       StorageDirectory sd = it.next();
       if (!getEditNewFile(sd).renameTo(getEditFile(sd))) {
         //
@@ -1281,7 +1282,8 @@ public class FSEditLog {
         getEditFile(sd).delete();
         if (!getEditNewFile(sd).renameTo(getEditFile(sd))) {
           // Should we also remove from edits
-          it.remove(); 
+          fsimage.updateRemovedDirs(sd, null);
+          it.remove();
         }
       }
     }

+ 12 - 8
src/hdfs/org/apache/hadoop/hdfs/server/namenode/FSImage.java

@@ -116,9 +116,10 @@ public class FSImage extends Storage {
   private boolean isUpgradeFinalized = false;
   
   /**
-   * list of failed (and thus removed) storages
+   * List of failed (and thus removed) storages
    */
-  protected List<StorageDirectory> removedStorageDirs = new ArrayList<StorageDirectory>();
+  private List<StorageDirectory> removedStorageDirs 
+    = new ArrayList<StorageDirectory>();
   
   /**
    * Directories for importing an image from a checkpoint.
@@ -209,6 +210,11 @@ public class FSImage extends Storage {
 	  return removedStorageDirs;
   }
 
+  void updateRemovedDirs(StorageDirectory sd, IOException ioe) {
+    LOG.warn("Removing storage dir " + sd.getRoot().getPath(), ioe);
+    removedStorageDirs.add(sd);
+  }
+
   File getEditFile(StorageDirectory sd) {
     return getImageFile(sd, NameNodeFile.EDITS);
   }
@@ -618,7 +624,7 @@ public class FSImage extends Storage {
         writeCheckpointTime(sd);
       } catch (IOException ioe) {
         editLog.removeEditsForStorageDir(sd);
-        removedStorageDirs.add(sd);
+        updateRemovedDirs(sd, ioe);
         it.remove();
       }
     }
@@ -632,8 +638,7 @@ public class FSImage extends Storage {
     while (it.hasNext()) {
       StorageDirectory sd = it.next();
       if (sd.getRoot().getPath().equals(dir.getPath())) {
-        LOG.info("Removing " + dir.getPath());
-        removedStorageDirs.add(sd);
+        updateRemovedDirs(sd, null);
         it.remove();
       }
     }
@@ -1449,7 +1454,7 @@ public class FSImage extends Storage {
         curFile.delete();
         if (!ckpt.renameTo(curFile)) {
           editLog.removeEditsForStorageDir(sd);
-          removedStorageDirs.add(sd);
+          updateRemovedDirs(sd, null);
           it.remove();
         }
       }
@@ -1477,9 +1482,8 @@ public class FSImage extends Storage {
       try {
         sd.write();
       } catch (IOException ioe) {
-        LOG.error("Cannot write file " + sd.getRoot(), ioe);
         editLog.removeEditsForStorageDir(sd);
-        removedStorageDirs.add(sd);
+        updateRemovedDirs(sd, ioe);
         it.remove();
       }
     }