You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2008/05/27 23:42:14 UTC

svn commit: r660727 - in /hadoop/hbase/trunk: CHANGES.txt src/java/org/apache/hadoop/hbase/regionserver/HStore.java src/java/org/apache/hadoop/hbase/regionserver/HStoreFile.java

Author: stack
Date: Tue May 27 14:42:14 2008
New Revision: 660727

URL: http://svn.apache.org/viewvc?rev=660727&view=rev
Log:
HBASE-645 and HBASE-642 Splitting log in a hostile environment -- bad hdfs -- we drop write-ahead-log edits

Modified:
    hadoop/hbase/trunk/CHANGES.txt
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HStore.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HStoreFile.java

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=660727&r1=660726&r2=660727&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Tue May 27 14:42:14 2008
@@ -24,6 +24,8 @@
    HBASE-638   Purge \r from src
    HBASE-644   DroppedSnapshotException but RegionServer doesn't restart
    HBASE-641   Improve master split logging
+   HBASE-642   Splitting log in a hostile environment -- bad hdfs -- we drop
+               write-ahead-log edits
 
   IMPROVEMENTS
    HBASE-559   MR example job to count table rows

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HStore.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HStore.java?rev=660727&r1=660726&r2=660727&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HStore.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HStore.java Tue May 27 14:42:14 2008
@@ -19,6 +19,7 @@
  */
 package org.apache.hadoop.hbase.regionserver;
 
+import java.io.EOFException;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
@@ -240,30 +241,53 @@
     
     try {
       doReconstructionLog(reconstructionLog, maxSeqId, reporter);
+    } catch (EOFException e) {
+      // Presume we got here because of lack of HADOOP-1700; for now keep going
+      // but this is probably not what we want long term.  If we got here there
+      // has been data-loss
+      LOG.warn("Exception processing reconstruction log " + reconstructionLog +
+        " opening " + this.storeName +
+        " -- continuing.  Probably lack-of-HADOOP-1700 causing DATA LOSS!", e);
     } catch (IOException e) {
-      // Presume we got here because of some HDFS issue or because of a lack of
-      // HADOOP-1700; for now keep going but this is probably not what we want
-      // long term.  If we got here there has been data-loss
+      // Presume we got here because of some HDFS issue. Don't just keep going.
+      // Fail to open the HStore.  Probably means we'll fail over and over
+      // again until human intervention but alternative has us skipping logs
+      // and losing edits: HBASE-642.
       LOG.warn("Exception processing reconstruction log " + reconstructionLog +
-        " opening " + Bytes.toString(this.storeName) +
-        " -- continuing.  Probably DATA LOSS!", e);
+        " opening " + this.storeName, e);
+      throw e;
     }
 
     // Finally, start up all the map readers! (There could be more than one
     // since we haven't compacted yet.)
     boolean first = true;
     for(Map.Entry<Long, HStoreFile> e: this.storefiles.entrySet()) {
-      if (first) {
-        // Use a block cache (if configured) for the first reader only
-        // so as to control memory usage.
-        this.readers.put(e.getKey(),
-            e.getValue().getReader(this.fs, this.bloomFilter,
-                family.isBlockCacheEnabled()));
-        first = false;
-      } else {
-        this.readers.put(e.getKey(),
-            e.getValue().getReader(this.fs, this.bloomFilter));
+      MapFile.Reader r = null;
+      try {
+        if (first) {
+          // Use a block cache (if configured) for the first reader only
+          // so as to control memory usage.
+          r = e.getValue().getReader(this.fs, this.bloomFilter,
+            family.isBlockCacheEnabled());
+          first = false;
+        } else {
+          r = e.getValue().getReader(this.fs, this.bloomFilter);
+        }
+      } catch (EOFException eofe) {
+        LOG.warn("Failed open of reader " + e.toString() + "; attempting fix",
+          eofe);
+        try {
+          // Try fixing this file.. if we can.  
+          MapFile.fix(this.fs, e.getValue().getMapFilePath(),
+            HStoreFile.HbaseMapFile.KEY_CLASS,
+            HStoreFile.HbaseMapFile.VALUE_CLASS, false, this.conf);
+        } catch (Exception fixe) {
+          LOG.warn("Failed fix of " + e.toString() +
+            "...continuing; Probable DATA LOSS!!!", fixe);
+          continue;
+        }
       }
+      this.readers.put(e.getKey(), r);
     }
   }
 
@@ -407,7 +431,7 @@
       if (!fs.exists(mapfile)) {
         fs.delete(curfile.getInfoFilePath(), false);
         LOG.warn("Mapfile " + mapfile.toString() + " does not exist. " +
-          "Cleaned up info file.  Continuing...");
+          "Cleaned up info file.  Continuing...Probable DATA LOSS!!!");
         continue;
       }
       

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HStoreFile.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HStoreFile.java?rev=660727&r1=660726&r2=660727&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HStoreFile.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HStoreFile.java Tue May 27 14:42:14 2008
@@ -401,7 +401,6 @@
   public synchronized MapFile.Reader getReader(final FileSystem fs,
       final Filter bloomFilter)
   throws IOException {
-    
     if (isReference()) {
       return new HStoreFile.HalfMapFileReader(fs,
           getMapFilePath(reference).toString(), conf, 
@@ -452,8 +451,7 @@
         "HStoreFile reference");
     }
     return new BloomFilterMapFile.Writer(conf, fs,
-      getMapFilePath().toString(), HStoreKey.class,
-      ImmutableBytesWritable.class, compression, bloomFilter);
+      getMapFilePath().toString(), compression, bloomFilter);
   }
 
   /**
@@ -624,6 +622,8 @@
    * Hbase customizations of MapFile.
    */
   static class HbaseMapFile extends MapFile {
+    static final Class KEY_CLASS = HStoreKey.class;
+    static final Class VALUE_CLASS = ImmutableBytesWritable.class;
 
     /**
      * A reader capable of reading and caching blocks of the data file.
@@ -702,10 +702,9 @@
        * @throws IOException
        */
       public HbaseWriter(Configuration conf, FileSystem fs, String dirName,
-          Class<Writable> keyClass, Class<Writable> valClass,
           SequenceFile.CompressionType compression)
       throws IOException {
-        super(conf, fs, dirName, keyClass, valClass, compression);
+        super(conf, fs, dirName, KEY_CLASS, VALUE_CLASS, compression);
         // Default for mapfiles is 128.  Makes random reads faster if we
         // have more keys indexed and we're not 'next'-ing around in the
         // mapfile.
@@ -807,10 +806,9 @@
        */
       @SuppressWarnings("unchecked")
       public Writer(Configuration conf, FileSystem fs, String dirName,
-          Class keyClass, Class valClass,
-          SequenceFile.CompressionType compression, final Filter filter)
+        SequenceFile.CompressionType compression, final Filter filter)
       throws IOException {
-        super(conf, fs, dirName, keyClass, valClass, compression);
+        super(conf, fs, dirName, compression);
         bloomFilter = filter;
       }