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 2010/05/07 21:17:55 UTC

svn commit: r942184 [10/15] - in /hadoop/hbase/branches/0.20: ./ src/java/org/apache/hadoop/hbase/ src/java/org/apache/hadoop/hbase/client/ src/java/org/apache/hadoop/hbase/filter/ src/java/org/apache/hadoop/hbase/io/ src/java/org/apache/hadoop/hbase/i...

Modified: hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HLog.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HLog.java?rev=942184&r1=942183&r2=942184&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HLog.java (original)
+++ hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HLog.java Fri May  7 19:17:48 2010
@@ -75,7 +75,7 @@ import org.apache.hadoop.io.SequenceFile
 import org.apache.hadoop.io.compress.DefaultCodec;
 
 /**
- * HLog stores all the edits to the HStore. Its the hbase write-ahead-log   
+ * HLog stores all the edits to the HStore. Its the hbase write-ahead-log
  * implementation.
  *
  * It performs logfile-rolling, so external callers are not aware that the
@@ -128,7 +128,7 @@ public class HLog implements HConstants,
   private int initialReplication;    // initial replication factor of SequenceFile.writer
   private Method getNumCurrentReplicas; // refers to DFSOutputStream.getNumCurrentReplicas
   private final static Object [] NO_ARGS = new Object []{};
-  
+
   // used to indirectly tell syncFs to force the sync
   private boolean forceSync = false;
 
@@ -138,7 +138,7 @@ public class HLog implements HConstants,
   SequenceFile.Writer writer;
 
   /*
-   * Map of all log files but the current one. 
+   * Map of all log files but the current one.
    */
   final SortedMap<Long, Path> outputfiles =
     Collections.synchronizedSortedMap(new TreeMap<Long, Path>());
@@ -156,11 +156,11 @@ public class HLog implements HConstants,
 
   // The timestamp (in ms) when the log file was created.
   private volatile long filenum = -1;
-  
+
   //number of transactions in the current Hlog.
   private final AtomicInteger numEntries = new AtomicInteger(0);
 
-  // If > than this size, roll the log. This is typically 0.95 times the size 
+  // If > than this size, roll the log. This is typically 0.95 times the size
   // of the default Hdfs block size.
   private final long logrollsize;
 
@@ -173,7 +173,7 @@ public class HLog implements HConstants,
   private final Object updateLock = new Object();
 
   private final boolean enabled;
-   
+
   /*
    * If more than this many logs, force flush of oldest region to oldest edit
    * goes to disk.  If too many and we crash, then will take forever replaying.
@@ -274,8 +274,8 @@ public class HLog implements HConstants,
     this.getNumCurrentReplicas = null;
     if(this.hdfs_out != null) {
       try {
-        this.getNumCurrentReplicas = 
-          this.hdfs_out.getClass().getMethod("getNumCurrentReplicas", 
+        this.getNumCurrentReplicas =
+          this.hdfs_out.getClass().getMethod("getNumCurrentReplicas",
                                              new Class<?> []{});
         this.getNumCurrentReplicas.setAccessible(true);
       } catch (NoSuchMethodException e) {
@@ -290,7 +290,7 @@ public class HLog implements HConstants,
     } else {
       LOG.info("getNumCurrentReplicas--HDFS-826 not available" );
     }
-    
+
     // Test if syncfs is available.
     Method m = null;
     if (isAppend(conf)) {
@@ -306,7 +306,7 @@ public class HLog implements HConstants,
       }
     }
     this.syncfs = m;
-  
+
     logSyncerThread = new LogSyncer(this.optionalFlushInterval);
     Threads.setDaemonThreadRunning(logSyncerThread,
         Thread.currentThread().getName() + ".logSyncer");
@@ -328,7 +328,7 @@ public class HLog implements HConstants,
     // Compression makes no sense for commit log.  Always return NONE.
     return CompressionType.NONE;
   }
-  
+
   /**
    * Called by HRegionServer when it opens a new region to ensure that log
    * sequence numbers are always greater than the latest sequence number of the
@@ -345,7 +345,7 @@ public class HLog implements HConstants,
       LOG.debug("Change sequence number from " + logSeqNum + " to " + newvalue);
     }
   }
-  
+
   /**
    * @return log sequence number
    */
@@ -398,7 +398,7 @@ public class HLog implements HConstants,
           final Field field = writer.getClass().getDeclaredField("out");
           field.setAccessible(true);
           // get variable: writer.out
-          FSDataOutputStream writer_out = 
+          FSDataOutputStream writer_out =
             (FSDataOutputStream)field.get(writer);
           // writer's OutputStream: writer.out.getWrappedStream()
           // important: only valid for the lifetime of this.writer
@@ -409,7 +409,7 @@ public class HLog implements HConstants,
           LOG.error("Problem obtaining hdfs_out: " + ex);
           this.hdfs_out = null;
         }
-        
+
         LOG.info((oldFile != null?
             "Roll " + FSUtils.getPath(oldFile) + ", entries=" +
             this.numEntries.get() +
@@ -442,7 +442,7 @@ public class HLog implements HConstants,
   protected SequenceFile.Writer createWriter(Path path) throws IOException {
     return createWriter(path, HLogKey.class, WALEdit.class);
   }
-  
+
   // usage: see TestLogRolling.java
   OutputStream getOutputStream() {
     return this.hdfs_out;
@@ -457,7 +457,7 @@ public class HLog implements HConstants,
         SequenceFile.CompressionType.NONE, new DefaultCodec(), null,
         new Metadata());
   }
-  
+
   /*
    * Clean up old commit logs.
    * @return If lots of logs, flush the returned region so next time through
@@ -566,7 +566,7 @@ public class HLog implements HConstants,
         FailedLogCloseException flce =
           new FailedLogCloseException("#" + currentfilenum);
         flce.initCause(e);
-        throw e; 
+        throw e;
       }
       if (currentfilenum >= 0) {
         oldFile = computeFilename(currentfilenum);
@@ -632,7 +632,7 @@ public class HLog implements HConstants,
   }
 
    /** Append an entry to the log.
-   * 
+   *
    * @param regionInfo
    * @param logEdit
    * @param now Time of this edit write.
@@ -656,11 +656,11 @@ public class HLog implements HConstants,
   protected HLogKey makeKey(byte[] regionName, byte[] tableName, long seqnum, long now) {
     return new HLogKey(regionName, tableName, seqnum, now);
   }
-  
-  
-  
+
+
+
   /** Append an entry to the log.
-   * 
+   *
    * @param regionInfo
    * @param logEdit
    * @param logKey
@@ -749,13 +749,13 @@ public class HLog implements HConstants,
     * it happens.
     */
    class LogSyncer extends Thread {
- 
+
      // Using fairness to make sure locks are given in order
      private final ReentrantLock lock = new ReentrantLock(true);
 
      // Condition used to wait until we have something to sync
      private final Condition queueEmpty = lock.newCondition();
- 
+
     // Condition used to signal that the sync is done
     private final Condition syncDone = lock.newCondition();
 
@@ -774,7 +774,7 @@ public class HLog implements HConstants,
          // awaiting with a timeout doesn't always
          // throw exceptions on interrupt
          while(!this.isInterrupted()) {
- 
+
            // Wait until something has to be hflushed or do it if we waited
            // enough time (useful if something appends but does not hflush).
            // 0 or less means that it timed out and maybe waited a bit more.
@@ -782,12 +782,12 @@ public class HLog implements HConstants,
                    this.optionalFlushInterval*1000000) <= 0)) {
              forceSync = true;
            }
- 
+
            // We got the signal, let's hflush. We currently own the lock so new
            // writes are waiting to acquire it in addToSyncQueue while the ones
            // we hflush are waiting on await()
            hflush();
- 
+
            // Release all the clients waiting on the hflush. Notice that we still
            // own the lock until we get back to await at which point all the
            // other threads waiting will first acquire and release locks
@@ -805,13 +805,13 @@ public class HLog implements HConstants,
          LOG.info(getName() + " exiting");
        }
      }
- 
+
      /**
       * This method first signals the thread that there's a sync needed
       * and then waits for it to happen before returning.
       */
      public void addToSyncQueue(boolean force) {
- 
+
        // Don't bother if somehow our append was already hflush
        if (unflushedEntries.get() == 0) {
          return;
@@ -827,7 +827,7 @@ public class HLog implements HConstants,
          }
          // Wake the thread
          queueEmpty.signal();
- 
+
          // Wait for it to hflush
          syncDone.await();
        } catch (InterruptedException e) {
@@ -851,7 +851,7 @@ public class HLog implements HConstants,
   public void sync(boolean force) {
     logSyncerThread.addToSyncQueue(force);
   }
-  
+
   protected void hflush() throws IOException {
     synchronized (this.updateLock) {
       if (this.closed) {
@@ -867,7 +867,7 @@ public class HLog implements HConstants,
           this.writer.sync();
           if (this.syncfs != null) {
             try {
-             this.syncfs.invoke(this.writer, NO_ARGS); 
+             this.syncfs.invoke(this.writer, NO_ARGS);
             } catch (Exception e) {
               throw new IOException("Reflection", e);
             }
@@ -876,23 +876,23 @@ public class HLog implements HConstants,
           this.syncOps++;
           this.forceSync = false;
           this.unflushedEntries.set(0);
-            
-          // if the number of replicas in HDFS has fallen below the initial   
-          // value, then roll logs.   
+
+          // if the number of replicas in HDFS has fallen below the initial
+          // value, then roll logs.
           try {
             int numCurrentReplicas = getLogReplication();
-            if (numCurrentReplicas != 0 &&  
-                numCurrentReplicas < this.initialReplication) {  
-              LOG.warn("HDFS pipeline error detected. " +   
+            if (numCurrentReplicas != 0 &&
+                numCurrentReplicas < this.initialReplication) {
+              LOG.warn("HDFS pipeline error detected. " +
                   "Found " + numCurrentReplicas + " replicas but expecting " +
-                  this.initialReplication + " replicas. " +  
-                  " Requesting close of hlog.");  
+                  this.initialReplication + " replicas. " +
+                  " Requesting close of hlog.");
               requestLogRoll();
               logRollRequested = true;
-            } 
-          } catch (Exception e) {   
+            }
+          } catch (Exception e) {
               LOG.warn("Unable to invoke DFSOutputStream.getNumCurrentReplicas" + e +
-                       " still proceeding ahead...");  
+                       " still proceeding ahead...");
           }
         } catch (IOException e) {
           LOG.fatal("Could not append. Requesting close of hlog", e);
@@ -906,26 +906,26 @@ public class HLog implements HConstants,
       }
     }
   }
-  
+
   /**
    * This method gets the datanode replication count for the current HLog.
    *
-   * If the pipeline isn't started yet or is empty, you will get the default 
-   * replication factor.  Therefore, if this function returns 0, it means you 
+   * If the pipeline isn't started yet or is empty, you will get the default
+   * replication factor.  Therefore, if this function returns 0, it means you
    * are not properly running with the HDFS-826 patch.
-   * 
+   *
    * @throws Exception
    */
   int getLogReplication() throws Exception {
     if(this.getNumCurrentReplicas != null && this.hdfs_out != null) {
       Object repl = this.getNumCurrentReplicas.invoke(this.hdfs_out, NO_ARGS);
-      if (repl instanceof Integer) {  
-        return ((Integer)repl).intValue();  
+      if (repl instanceof Integer) {
+        return ((Integer)repl).intValue();
       }
     }
     return 0;
   }
-  
+
   boolean canGetCurReplicas() {
     return this.getNumCurrentReplicas != null;
   }
@@ -935,7 +935,7 @@ public class HLog implements HConstants,
       this.listener.logRollRequested();
     }
   }
-  
+
   private void doWrite(HLogKey logKey, WALEdit logEdit)
   throws IOException {
     if (!this.enabled) {
@@ -1029,7 +1029,7 @@ public class HLog implements HConstants,
         KeyValue edit = completeCacheFlushLogEdit();
         WALEdit edits = new WALEdit();
         edits.add(edit);
-        this.writer.append(makeKey(regionName, tableName, logSeqId, System.currentTimeMillis()), 
+        this.writer.append(makeKey(regionName, tableName, logSeqId, System.currentTimeMillis()),
           edits);
         writeTime += System.currentTimeMillis() - now;
         writeOps++;
@@ -1069,7 +1069,7 @@ public class HLog implements HConstants,
   public static boolean isMetaFamily(byte [] family) {
     return Bytes.equals(METAFAMILY, family);
   }
-  
+
   /**
    * Split up a bunch of regionserver commit log files that are no longer
    * being written to, into new files, one per region for region to replay on
@@ -1122,13 +1122,13 @@ public class HLog implements HConstants,
       this.w = w;
     }
   }
-  
+
   @SuppressWarnings("unchecked")
   public static Class<? extends HLogKey> getKeyClass(HBaseConfiguration conf) {
-    return (Class<? extends HLogKey>) 
+    return (Class<? extends HLogKey>)
        conf.getClass("hbase.regionserver.hlog.keyclass", HLogKey.class);
   }
-  
+
   public static HLogKey newKey(HBaseConfiguration conf) throws IOException {
     Class<? extends HLogKey> keyClass = getKeyClass(conf);
     try {
@@ -1139,7 +1139,7 @@ public class HLog implements HConstants,
       throw new IOException("cannot create hlog key");
     }
   }
-  
+
   /*
    * @param rootDir
    * @param logfiles
@@ -1156,13 +1156,13 @@ public class HLog implements HConstants,
       Collections.synchronizedMap(
         new TreeMap<byte [], WriterAndPath>(Bytes.BYTES_COMPARATOR));
     List<Path> splits = null;
-    
+
     // Number of threads to use when log splitting to rewrite the logs.
     // More means faster but bigger mem consumption.
     int logWriterThreads =
       conf.getInt("hbase.regionserver.hlog.splitlog.writer.threads", 3);
-    
-    // Number of logs to read into memory before writing to their appropriate 
+
+    // Number of logs to read into memory before writing to their appropriate
     // regions when log splitting.  More means faster but bigger mem consumption
     int logFilesPerStep =
       conf.getInt("hbase.regionserver.hlog.splitlog.reader.threads", 3);
@@ -1172,21 +1172,21 @@ public class HLog implements HConstants,
     final boolean appendSupport = isAppend(conf);
 
     // store corrupt logs for post-mortem analysis (empty string = discard)
-    final String corruptDir = 
+    final String corruptDir =
       conf.get("hbase.regionserver.hlog.splitlog.corrupt.dir", ".corrupt");
 
     List<Path> finishedFiles = new LinkedList<Path>();
     List<Path> corruptFiles = new LinkedList<Path>();
 
     try {
-      int maxSteps = Double.valueOf(Math.ceil((logfiles.length * 1.0) / 
+      int maxSteps = Double.valueOf(Math.ceil((logfiles.length * 1.0) /
           logFilesPerStep)).intValue();
       for (int step = 0; step < maxSteps; step++) {
-        
+
         // Step 1: read N log files into memory
-        final Map<byte[], LinkedList<HLogEntry>> logEntries = 
+        final Map<byte[], LinkedList<HLogEntry>> logEntries =
           new TreeMap<byte[], LinkedList<HLogEntry>>(Bytes.BYTES_COMPARATOR);
-        int endIndex = step == maxSteps - 1? logfiles.length: 
+        int endIndex = step == maxSteps - 1? logfiles.length:
           step * logFilesPerStep + logFilesPerStep;
         for (int i = (step * logFilesPerStep); i < endIndex; i++) {
           Path curLogFile = logfiles[i].getPath();
@@ -1229,7 +1229,7 @@ public class HLog implements HConstants,
               LOG.debug("IOE Pushed=" + count + " entries from " + curLogFile);
               e = RemoteExceptionHandler.checkIOException(e);
               if (!(e instanceof EOFException)) {
-                String msg = "Exception processing " + curLogFile + 
+                String msg = "Exception processing " + curLogFile +
                              " -- continuing. Possible DATA LOSS!";
                 if (corruptDir.length() > 0) {
                   msg += "  Storing in hlog corruption directory.";
@@ -1262,13 +1262,13 @@ public class HLog implements HConstants,
           }
         }
 
-        // Step 2: Some regionserver log files have been read into memory.  
+        // Step 2: Some regionserver log files have been read into memory.
         //         Assign them to the appropriate region directory.
         class ThreadWithException extends Thread {
           ThreadWithException(String name) { super(name); }
           public IOException exception = null;
         }
-        List<ThreadWithException> threadList = 
+        List<ThreadWithException> threadList =
           new ArrayList<ThreadWithException>(logEntries.size());
         ExecutorService threadPool =
           Executors.newFixedThreadPool(logWriterThreads);
@@ -1278,7 +1278,7 @@ public class HLog implements HConstants,
             public void run() {
               LinkedList<HLogEntry> entries = logEntries.get(region);
               LOG.debug("Thread got " + entries.size() + " to process");
-              if(entries.size() <= 0) { 
+              if(entries.size() <= 0) {
                 LOG.warn("Got a region with no entries to process.");
                 return;
               }
@@ -1292,20 +1292,20 @@ public class HLog implements HConstants,
                   // first write to this region, make new logfile
                   assert entries.size() > 0;
                   Path logfile = new Path(HRegion.getRegionDir(HTableDescriptor
-                      .getTableDir(rootDir, 
+                      .getTableDir(rootDir,
                                    entries.getFirst().getKey().getTablename()),
                       HRegionInfo.encodeRegionName(region)),
                       HREGION_OLDLOGFILE_NAME);
 
-                  // If splitLog() was running when the user restarted his 
-                  // cluster, then we could already have a 'logfile'. 
-                  // Since we don't delete logs until everything is written to 
+                  // If splitLog() was running when the user restarted his
+                  // cluster, then we could already have a 'logfile'.
+                  // Since we don't delete logs until everything is written to
                   // their respective regions, we can safely remove this tmp.
                   if (fs.exists(logfile)) {
-                    LOG.warn("Deleting old hlog file: " + logfile); 
+                    LOG.warn("Deleting old hlog file: " + logfile);
                     fs.delete(logfile, true);
                   }
-                  
+
                   // associate an OutputStream with this logfile
                   SequenceFile.Writer w =
                     SequenceFile.createWriter(fs, conf, logfile,
@@ -1317,7 +1317,7 @@ public class HLog implements HConstants,
                         + logfile + " and region " + Bytes.toStringBinary(region));
                   }
                 }
-                
+
                 // Items were added to the linkedlist oldest first. Pull them
                 // out in that order.
                 for (ListIterator<HLogEntry> i =
@@ -1327,7 +1327,7 @@ public class HLog implements HConstants,
                   wap.w.append(logEntry.getKey(), logEntry.getEdit());
                   count++;
                 }
-                
+
                 if (LOG.isDebugEnabled()) {
                   LOG.debug("Applied " + count + " total edits to "
                       + Bytes.toStringBinary(region) + " in "
@@ -1335,7 +1335,7 @@ public class HLog implements HConstants,
                 }
               } catch (IOException e) {
                 e = RemoteExceptionHandler.checkIOException(e);
-                LOG.warn("Got while writing region " 
+                LOG.warn("Got while writing region "
                     + Bytes.toStringBinary(region) + " log " + e);
                 e.printStackTrace();
                 exception = e;
@@ -1357,14 +1357,14 @@ public class HLog implements HConstants,
               +"Retaining log files to avoid data loss.");
           throw new IOException(ex.getMessage(), ex.getCause());
         }
-        
+
         // throw an exception if one of the threads reported one
         for (ThreadWithException t : threadList) {
           if (t.exception != null) {
             throw t.exception;
           }
         }
-        
+
         // End of for loop. Rinse and repeat
       }
     } finally {
@@ -1398,14 +1398,14 @@ public class HLog implements HConstants,
           fs.mkdirs(cp);
         }
         Path newp = new Path(cp, p.getName());
-        if (!fs.exists(newp)) { 
+        if (!fs.exists(newp)) {
           if (!fs.rename(p, newp)) {
             LOG.warn("Rename of " + p + " to " + newp + " failed.");
           } else {
             LOG.warn("Corrupt Hlog (" + p + ") moved to " + newp);
           }
         } else {
-          LOG.warn("Corrupt Hlog (" + p + ") already moved to " + newp + 
+          LOG.warn("Corrupt Hlog (" + p + ") already moved to " + newp +
                    ".  Ignoring");
         }
       } else {
@@ -1427,7 +1427,7 @@ public class HLog implements HConstants,
     return splits;
   }
 
- /*  
+ /*
   * @param conf
   * @return True if append enabled and we have the syncFs in our path.
   */
@@ -1444,7 +1444,7 @@ public class HLog implements HConstants,
     }
     return append;
   }
-  
+
   /**
    * Utility class that lets us keep track of the edit with it's key
    * Only used when splitting logs
@@ -1540,20 +1540,20 @@ public class HLog implements HConstants,
     }
     LOG.info("Past out lease recovery");
   }
-  
+
   /**
    * Construct the HLog directory name
-   * 
+   *
    * @param info HServerInfo for server
    * @return the HLog directory name
    */
   public static String getHLogDirectoryName(HServerInfo info) {
     return getHLogDirectoryName(info.getServerName());
   }
-  
+
   /**
    * Construct the HLog directory name
-   * 
+   *
    * @param serverAddress
    * @param startCode
    * @return the HLog directory name
@@ -1566,10 +1566,10 @@ public class HLog implements HConstants,
     return getHLogDirectoryName(
         HServerInfo.getServerName(serverAddress, startCode));
   }
-  
+
   /**
    * Construct the HLog directory name
-   * 
+   *
    * @param serverName
    * @return the HLog directory name
    */
@@ -1641,5 +1641,5 @@ public class HLog implements HConstants,
   public static final long FIXED_OVERHEAD = ClassSize.align(
       ClassSize.OBJECT + (5 * ClassSize.REFERENCE) +
       ClassSize.ATOMIC_INTEGER + Bytes.SIZEOF_INT + (3 * Bytes.SIZEOF_LONG));
-  
+
 }

Modified: hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HLogKey.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HLogKey.java?rev=942184&r1=942183&r2=942184&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HLogKey.java (original)
+++ hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HLogKey.java Fri May  7 19:17:48 2010
@@ -29,11 +29,11 @@ import java.io.*;
 
 /**
  * A Key for an entry in the change log.
- * 
- * The log intermingles edits to many tables and rows, so each log entry 
- * identifies the appropriate table and row.  Within a table and row, they're 
+ *
+ * The log intermingles edits to many tables and rows, so each log entry
+ * identifies the appropriate table and row.  Within a table and row, they're
  * also sorted.
- * 
+ *
  * <p>Some Transactional edits (START, COMMIT, ABORT) will not have an
  * associated row.
  */
@@ -50,7 +50,7 @@ public class HLogKey implements Writable
   public HLogKey() {
     this(null, null, 0L, HConstants.LATEST_TIMESTAMP);
   }
-  
+
   /**
    * Create the log key!
    * We maintain the tablename mainly for debugging purposes.
@@ -77,7 +77,7 @@ public class HLogKey implements Writable
   public byte [] getRegionName() {
     return regionName;
   }
-  
+
   /** @return table name */
   public byte [] getTablename() {
     return tablename;
@@ -87,7 +87,7 @@ public class HLogKey implements Writable
   public long getLogSeqNum() {
     return logSeqNum;
   }
-  
+
   void setLogSeqNum(long logSeqNum) {
     this.logSeqNum = logSeqNum;
   }
@@ -104,7 +104,7 @@ public class HLogKey implements Writable
     return Bytes.toString(tablename) + "/" + Bytes.toString(regionName) + "/" +
       logSeqNum;
   }
-  
+
   @Override
   public boolean equals(Object obj) {
     if (this == obj) {
@@ -115,7 +115,7 @@ public class HLogKey implements Writable
     }
     return compareTo((HLogKey)obj) == 0;
   }
-  
+
   @Override
   public int hashCode() {
     int result = Bytes.hashCode(this.regionName);
@@ -149,7 +149,7 @@ public class HLogKey implements Writable
     out.writeLong(logSeqNum);
     out.writeLong(this.writeTime);
   }
-  
+
   public void readFields(DataInput in) throws IOException {
     this.regionName = Bytes.readByteArray(in);
     this.tablename = Bytes.readByteArray(in);

Modified: hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=942184&r1=942183&r2=942184&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java Fri May  7 19:17:48 2010
@@ -78,9 +78,9 @@ package org.apache.hadoop.hbase.regionse
  * for each row. A given table consists of one or more HRegions.
  *
  * <p>We maintain multiple HStores for a single HRegion.
- * 
+ *
  * <p>An Store is a set of rows with some column data; together,
- * they make up all the data for the rows.  
+ * they make up all the data for the rows.
  *
  * <p>Each HRegion has a 'startKey' and 'endKey'.
  * <p>The first is inclusive, the second is exclusive (except for
@@ -96,15 +96,15 @@ package org.apache.hadoop.hbase.regionse
  * constructed, it holds a read lock until it is closed. A close takes out a
  * write lock and consequently will block for ongoing operations and will block
  * new operations from starting while the close is in progress.
- * 
+ *
  * <p>An HRegion is defined by its table and its key extent.
- * 
+ *
  * <p>It consists of at least one Store.  The number of Stores should be
  * configurable, so that data which is accessed together is stored in the same
- * Store.  Right now, we approximate that by building a single Store for 
- * each column family.  (This config info will be communicated via the 
+ * Store.  Right now, we approximate that by building a single Store for
+ * each column family.  (This config info will be communicated via the
  * tabledesc.)
- * 
+ *
  * <p>The HTableDescriptor contains metainfo about the HRegion's table.
  * regionName is a unique identifier for this HRegion. (startKey, endKey]
  * defines the keyspace for this HRegion.
@@ -114,8 +114,8 @@ public class HRegion implements HConstan
   static final String SPLITDIR = "splits";
   static final String MERGEDIR = "merges";
   final AtomicBoolean closed = new AtomicBoolean(false);
-  /* Closing can take some time; use the closing flag if there is stuff we don't 
-   * want to do while in closing state; e.g. like offer this region up to the 
+  /* Closing can take some time; use the closing flag if there is stuff we don't
+   * want to do while in closing state; e.g. like offer this region up to the
    * master as a region to close if the carrying regionserver is overloaded.
    * Once set, it is never cleared.
    */
@@ -134,13 +134,13 @@ public class HRegion implements HConstan
 
   protected final Map<byte [], Store> stores =
     new ConcurrentSkipListMap<byte [], Store>(Bytes.BYTES_RAWCOMPARATOR);
-  
+
   //These variable are just used for getting data out of the region, to test on
   //client side
   // private int numStores = 0;
   // private int [] storeSize = null;
   // private byte [] name = null;
-  
+
   final AtomicLong memstoreSize = new AtomicLong(0);
 
   // This is the table subdirectory.
@@ -184,7 +184,7 @@ public class HRegion implements HConstan
       this.writesEnabled = !onOff;
       this.readOnly = onOff;
     }
-    
+
     boolean isReadOnly() {
       return this.readOnly;
     }
@@ -204,7 +204,7 @@ public class HRegion implements HConstan
   // Used to guard splits and closes
   private final ReentrantReadWriteLock splitsAndClosesLock =
     new ReentrantReadWriteLock();
-  private final ReentrantReadWriteLock newScannerLock = 
+  private final ReentrantReadWriteLock newScannerLock =
     new ReentrantReadWriteLock();
 
   // Stop updates lock
@@ -244,7 +244,7 @@ public class HRegion implements HConstan
     this.regionInfo = null;
     this.threadWakeFrequency = 0L;
   }
-  
+
   /**
    * HRegion constructor.  This constructor should only be used for testing and
    * extensions.  Instances of HRegion should be instantiated with the
@@ -259,7 +259,7 @@ public class HRegion implements HConstan
    * appropriate log info for this HRegion. If there is a previous log file
    * (implying that the HRegion has been written-to before), then read it from
    * the supplied path.
-   * @param fs is the filesystem.  
+   * @param fs is the filesystem.
    * @param conf is global configuration settings.
    * @param regionInfo - HRegionInfo that describes the region
    * is new), then read them from the supplied path.
@@ -301,7 +301,7 @@ public class HRegion implements HConstan
   /**
    * Initialize this region and get it ready to roll.
    * Called after construction.
-   * 
+   *
    * @param initialFiles path
    * @param reporter progressable
    * @throws IOException e
@@ -318,7 +318,7 @@ public class HRegion implements HConstan
     // Load in all the HStores.
     long maxSeqId = -1;
     long minSeqIdToRecover = Integer.MAX_VALUE;
-    
+
     for (HColumnDescriptor c : this.regionInfo.getTableDesc().getFamilies()) {
       Store store = instantiateHStore(this.basedir, c, oldLogFile, reporter);
       this.stores.put(c.getName(), store);
@@ -326,7 +326,7 @@ public class HRegion implements HConstan
       if (storeSeqId > maxSeqId) {
         maxSeqId = storeSeqId;
       }
-      
+
       long storeSeqIdBeforeRecovery = store.getMaxSeqIdBeforeLogRecovery();
       if (storeSeqIdBeforeRecovery < minSeqIdToRecover) {
         minSeqIdToRecover = storeSeqIdBeforeRecovery;
@@ -341,7 +341,7 @@ public class HRegion implements HConstan
       }
       fs.delete(oldLogFile, false);
     }
-    
+
     // Add one to the current maximum sequence id so new edits are beyond.
     this.minSequenceId = maxSeqId + 1;
 
@@ -400,7 +400,7 @@ public class HRegion implements HConstan
     // Name of this file has two leading and trailing underscores so it doesn't
     // clash w/ a store/family name.  There is possibility, but assumption is
     // that its slim (don't want to use control character in filename because
-    // 
+    //
     Path regioninfo = new Path(this.regiondir, REGIONINFO_FILE);
     if (this.fs.exists(regioninfo) &&
         this.fs.getFileStatus(regioninfo).getLen() > 0) {
@@ -424,7 +424,7 @@ public class HRegion implements HConstan
   long getMinSequenceId() {
     return this.minSequenceId;
   }
-  
+
   /** @return a HRegionInfo object for this region */
   public HRegionInfo getRegionInfo() {
     return this.regionInfo;
@@ -434,7 +434,7 @@ public class HRegion implements HConstan
   public boolean isClosed() {
     return this.closed.get();
   }
-  
+
   /**
    * @return True if closing process has started.
    */
@@ -445,18 +445,18 @@ public class HRegion implements HConstan
    public ReadWriteConsistencyControl getRWCC() {
      return rwcc;
    }
-   
+
   /**
-   * Close down this HRegion.  Flush the cache, shut down each HStore, don't 
+   * Close down this HRegion.  Flush the cache, shut down each HStore, don't
    * service any more calls.
    *
-   * <p>This method could take some time to execute, so don't call it from a 
+   * <p>This method could take some time to execute, so don't call it from a
    * time-sensitive thread.
-   * 
-   * @return Vector of all the storage files that the HRegion's component 
+   *
+   * @return Vector of all the storage files that the HRegion's component
    * HStores make use of.  It's a list of all HStoreFile objects. Returns empty
    * vector if already closed and null if judged that it should not close.
-   * 
+   *
    * @throws IOException e
    */
   public List<StoreFile> close() throws IOException {
@@ -467,14 +467,14 @@ public class HRegion implements HConstan
    * Close down this HRegion.  Flush the cache unless abort parameter is true,
    * Shut down each HStore, don't service any more calls.
    *
-   * This method could take some time to execute, so don't call it from a 
+   * This method could take some time to execute, so don't call it from a
    * time-sensitive thread.
-   * 
+   *
    * @param abort true if server is aborting (only during testing)
-   * @return Vector of all the storage files that the HRegion's component 
+   * @return Vector of all the storage files that the HRegion's component
    * HStores make use of.  It's a list of HStoreFile objects.  Can be null if
    * we are not to close at this time or we are already closed.
-   * 
+   *
    * @throws IOException e
    */
   public List<StoreFile> close(final boolean abort) throws IOException {
@@ -522,12 +522,12 @@ public class HRegion implements HConstan
           // outstanding updates.
           waitOnRowLocks();
           LOG.debug("No more row locks outstanding on region " + this);
-  
+
           // Don't flush the cache if we are aborting
           if (!abort) {
             internalFlushcache();
           }
-  
+
           List<StoreFile> result = new ArrayList<StoreFile>();
           for (Store store: stores.values()) {
             result.addAll(store.close());
@@ -611,11 +611,11 @@ public class HRegion implements HConstan
   public long getLastFlushTime() {
     return this.lastFlushTime;
   }
-  
+
   //////////////////////////////////////////////////////////////////////////////
-  // HRegion maintenance.  
+  // HRegion maintenance.
   //
-  // These methods are meant to be called periodically by the HRegionServer for 
+  // These methods are meant to be called periodically by the HRegionServer for
   // upkeep.
   //////////////////////////////////////////////////////////////////////////////
 
@@ -737,7 +737,7 @@ public class HRegion implements HConstan
   protected void prepareToSplit() {
     // nothing
   }
-  
+
   /*
    * @param dir
    * @return compaction directory for the passed in <code>dir</code>
@@ -754,7 +754,7 @@ public class HRegion implements HConstan
   private void doRegionCompactionPrep() throws IOException {
     doRegionCompactionCleanup();
   }
-  
+
   /*
    * Removes the compaction directory for this Store.
    * @throws IOException
@@ -775,13 +775,13 @@ public class HRegion implements HConstan
    * Called by compaction thread and after region is opened to compact the
    * HStores if necessary.
    *
-   * <p>This operation could block for a long time, so don't call it from a 
+   * <p>This operation could block for a long time, so don't call it from a
    * time-sensitive thread.
    *
    * Note that no locking is necessary at this level because compaction only
    * conflicts with a region split, and that cannot happen because the region
    * server does them sequentially and not in parallel.
-   * 
+   *
    * @return mid key if split is needed
    * @throws IOException e
    */
@@ -795,13 +795,13 @@ public class HRegion implements HConstan
    * Called by compaction thread and after region is opened to compact the
    * HStores if necessary.
    *
-   * <p>This operation could block for a long time, so don't call it from a 
+   * <p>This operation could block for a long time, so don't call it from a
    * time-sensitive thread.
    *
    * Note that no locking is necessary at this level because compaction only
    * conflicts with a region split, and that cannot happen because the region
    * server does them sequentially and not in parallel.
-   * 
+   *
    * @param majorCompaction True to force a major compaction regardless of thresholds
    * @return split row if split is needed
    * @throws IOException e
@@ -829,7 +829,7 @@ public class HRegion implements HConstan
               return splitRow;
           }
         }
-        LOG.info("Starting" + (majorCompaction? " major " : " ") + 
+        LOG.info("Starting" + (majorCompaction? " major " : " ") +
             "compaction on region " + this);
         long startTime = System.currentTimeMillis();
         doRegionCompactionPrep();
@@ -842,7 +842,7 @@ public class HRegion implements HConstan
           }
         }
         doRegionCompactionCleanup();
-        String timeTaken = StringUtils.formatTimeDiff(System.currentTimeMillis(), 
+        String timeTaken = StringUtils.formatTimeDiff(System.currentTimeMillis(),
             startTime);
         LOG.info("compaction completed on region " + this + " in " + timeTaken);
       } finally {
@@ -859,7 +859,7 @@ public class HRegion implements HConstan
 
   /**
    * Flush the cache.
-   * 
+   *
    * When this method is called the cache will be flushed unless:
    * <ol>
    *   <li>the cache is empty</li>
@@ -868,11 +868,11 @@ public class HRegion implements HConstan
    *   <li>writes are disabled</li>
    * </ol>
    *
-   * <p>This method may block for some time, so it should not be called from a 
+   * <p>This method may block for some time, so it should not be called from a
    * time-sensitive thread.
-   * 
+   *
    * @return true if cache was flushed
-   * 
+   *
    * @throws IOException general io exceptions
    * @throws DroppedSnapshotException Thrown when replay of hlog is required
    * because a Snapshot was not properly persisted.
@@ -891,7 +891,7 @@ public class HRegion implements HConstan
               writestate.flushing + ", writesEnabled=" +
               writestate.writesEnabled);
         }
-        return false;  
+        return false;
       }
     }
     try {
@@ -920,25 +920,25 @@ public class HRegion implements HConstan
    * flushed. (That way, during recovery, we know when we can rely on the
    * on-disk flushed structures and when we have to recover the memstore from
    * the log.)
-   * 
+   *
    * <p>So, we have a three-step process:
-   * 
+   *
    * <ul><li>A. Flush the memstore to the on-disk stores, noting the current
    * sequence ID for the log.<li>
-   * 
+   *
    * <li>B. Write a FLUSHCACHE-COMPLETE message to the log, using the sequence
    * ID that was current at the time of memstore-flush.</li>
-   * 
+   *
    * <li>C. Get rid of the memstore structures that are now redundant, as
    * they've been flushed to the on-disk HStores.</li>
    * </ul>
    * <p>This method is protected, but can be accessed via several public
    * routes.
-   * 
+   *
    * <p> This method may block for some time.
-   * 
+   *
    * @return true if the region needs compacting
-   * 
+   *
    * @throws IOException general io exceptions
    * @throws DroppedSnapshotException Thrown when replay of hlog is required
    * because a Snapshot was not properly persisted.
@@ -1068,7 +1068,7 @@ public class HRegion implements HConstan
 
     // B.  Write a FLUSHCACHE-COMPLETE message to the log.
     //     This tells future readers that the HStores were emitted correctly,
-    //     and that all updates to the log for this regionName that have lower 
+    //     and that all updates to the log for this regionName that have lower
     //     log-sequence-ids can be safely ignored.
     this.log.completeCacheFlush(getRegionName(),
         regionInfo.getTableDesc().getName(), completeSequenceId,
@@ -1079,7 +1079,7 @@ public class HRegion implements HConstan
     synchronized (this) {
       notifyAll();
     }
-    
+
     if (LOG.isDebugEnabled()) {
       long now = System.currentTimeMillis();
       LOG.debug("Finished memstore flush of ~" +
@@ -1108,23 +1108,23 @@ public class HRegion implements HConstan
    /**
    * Get the sequence number to be associated with this cache flush. Used by
    * TransactionalRegion to not complete pending transactions.
-   * 
-   * 
+   *
+   *
    * @param currentSequenceId
    * @return sequence id to complete the cache flush with
-   */ 
+   */
   protected long getCompleteCacheFlushSequenceId(long currentSequenceId) {
     return currentSequenceId;
   }
-  
+
   //////////////////////////////////////////////////////////////////////////////
   // get() methods for client use.
   //////////////////////////////////////////////////////////////////////////////
   /**
-   * Return all the data for the row that matches <i>row</i> exactly, 
-   * or the one that immediately preceeds it, at or immediately before 
+   * Return all the data for the row that matches <i>row</i> exactly,
+   * or the one that immediately preceeds it, at or immediately before
    * <i>ts</i>.
-   * 
+   *
    * @param row row key
    * @return map of values
    * @throws IOException
@@ -1135,10 +1135,10 @@ public class HRegion implements HConstan
   }
 
   /**
-   * Return all the data for the row that matches <i>row</i> exactly, 
-   * or the one that immediately preceeds it, at or immediately before 
+   * Return all the data for the row that matches <i>row</i> exactly,
+   * or the one that immediately preceeds it, at or immediately before
    * <i>ts</i>.
-   * 
+   *
    * @param row row key
    * @param family column family to find on
    * @return map of values
@@ -1168,7 +1168,7 @@ public class HRegion implements HConstan
   }
 
   /**
-   * Return an iterator that scans over the HRegion, returning the indicated 
+   * Return an iterator that scans over the HRegion, returning the indicated
    * columns and rows specified by the {@link Scan}.
    * <p>
    * This Iterator must be closed by the caller.
@@ -1252,8 +1252,8 @@ public class HRegion implements HConstan
       splitsAndClosesLock.readLock().unlock();
     }
   }
-  
-  
+
+
   /**
    * @param familyMap map of family to edits for the given family.
    * @param writeToWAL
@@ -1272,10 +1272,10 @@ public class HRegion implements HConstan
 
       for (Map.Entry<byte[], List<KeyValue>> e : familyMap.entrySet()) {
 
-        byte[] family = e.getKey(); 
+        byte[] family = e.getKey();
         List<KeyValue> kvs = e.getValue();
         Map<byte[], Integer> kvCount = new TreeMap<byte[], Integer>(Bytes.BYTES_COMPARATOR);
- 
+
         Store store = getStore(family);
         for (KeyValue kv: kvs) {
           //  Check if time is LATEST, change to time of most recent addition if so
@@ -1349,9 +1349,9 @@ public class HRegion implements HConstan
 
       for (Map.Entry<byte[], List<KeyValue>> e : familyMap.entrySet()) {
 
-        byte[] family = e.getKey(); 
+        byte[] family = e.getKey();
         List<KeyValue> kvs = e.getValue();
-        
+
         Store store = getStore(family);
         for (KeyValue kv: kvs) {
           kv.setMemstoreTS(w.getWriteNumber());
@@ -1370,7 +1370,7 @@ public class HRegion implements HConstan
       requestFlush();
     }
   }
-  
+
   /**
    * @param put
    * @throws IOException
@@ -1378,7 +1378,7 @@ public class HRegion implements HConstan
   public void put(Put put) throws IOException {
     this.put(put, null, put.getWriteToWAL());
   }
-  
+
   /**
    * @param put
    * @param writeToWAL
@@ -1408,7 +1408,7 @@ public class HRegion implements HConstan
     checkReadOnly();
 
     // Do a rough check that we have resources to accept a write.  The check is
-    // 'rough' in that between the resource check and the call to obtain a 
+    // 'rough' in that between the resource check and the call to obtain a
     // read lock, resources may run out.  For now, the thought is that this
     // will be extremely rare; we'll deal with it when it happens.
     checkResources();
@@ -1436,13 +1436,13 @@ public class HRegion implements HConstan
     }
   }
 
-  
-  //TODO, Think that gets/puts and deletes should be refactored a bit so that 
+
+  //TODO, Think that gets/puts and deletes should be refactored a bit so that
   //the getting of the lock happens before, so that you would just pass it into
-  //the methods. So in the case of checkAndPut you could just do lockRow, 
+  //the methods. So in the case of checkAndPut you could just do lockRow,
   //get, put, unlockRow or something
   /**
-   * 
+   *
    * @param row
    * @param family
    * @param qualifier
@@ -1454,10 +1454,10 @@ public class HRegion implements HConstan
    * @return true if the new put was execute, false otherwise
    */
   public boolean checkAndPut(byte [] row, byte [] family, byte [] qualifier,
-      byte [] expectedValue, Put put, Integer lockId, boolean writeToWAL) 
+      byte [] expectedValue, Put put, Integer lockId, boolean writeToWAL)
   throws IOException{
     checkReadOnly();
-    //TODO, add check for value length or maybe even better move this to the 
+    //TODO, add check for value length or maybe even better move this to the
     //client if this becomes a global setting
     checkResources();
     splitsAndClosesLock.readLock().lock();
@@ -1469,7 +1469,7 @@ public class HRegion implements HConstan
       byte [] now = Bytes.toBytes(System.currentTimeMillis());
 
       // Lock row
-      Integer lid = getLock(lockId, get.getRow()); 
+      Integer lid = getLock(lockId, get.getRow());
       List<KeyValue> result = new ArrayList<KeyValue>();
       try {
         result = get(get);
@@ -1486,7 +1486,7 @@ public class HRegion implements HConstan
         if (matches) {
           // All edits for the given row (across all column families) must happen atomically.
           put(put.getFamilyMap(), writeToWAL);
-          return true;  
+          return true;
         }
         return false;
       } finally {
@@ -1494,10 +1494,10 @@ public class HRegion implements HConstan
       }
     } finally {
       splitsAndClosesLock.readLock().unlock();
-    }    
+    }
   }
-      
-  
+
+
   /**
    * Checks if any stamps is Long.MAX_VALUE.  If so, sets them to now.
    * <p>
@@ -1517,10 +1517,10 @@ public class HRegion implements HConstan
     }
     return true;
   }
-  
+
 
 //  /*
-//   * Utility method to verify values length. 
+//   * Utility method to verify values length.
 //   * @param batchUpdate The update to verify
 //   * @throws IOException Thrown if a value is too long
 //   */
@@ -1528,7 +1528,7 @@ public class HRegion implements HConstan
 //  throws IOException {
 //    Map<byte[], List<KeyValue>> families = put.getFamilyMap();
 //    for(Map.Entry<byte[], List<KeyValue>> entry : families.entrySet()) {
-//      HColumnDescriptor hcd = 
+//      HColumnDescriptor hcd =
 //        this.regionInfo.getTableDesc().getFamily(entry.getKey());
 //      int maxLen = hcd.getMaxValueLength();
 //      for(KeyValue kv : entry.getValue()) {
@@ -1543,7 +1543,7 @@ public class HRegion implements HConstan
 
   /*
    * Check if resources to support an update.
-   * 
+   *
    * Here we synchronize on HRegion, a broad scoped lock.  Its appropriate
    * given we're figuring in here whether this region is able to take on
    * writes.  This is only method with a synchronize (at time of writing),
@@ -1590,7 +1590,7 @@ public class HRegion implements HConstan
     }
   }
 
-  /** 
+  /**
    * Add updates first to the hlog and then add values to memstore.
    * Warning: Assumption is caller has lock on passed in row.
    * @param family
@@ -1605,7 +1605,7 @@ public class HRegion implements HConstan
     this.put(familyMap, true);
   }
 
-  /** 
+  /**
    * Add updates first to the hlog (if writeToWal) and then add values to memstore.
    * Warning: Assumption is caller has lock on passed in row.
    * @param familyMap map of family to edits for the given family.
@@ -1622,7 +1622,7 @@ public class HRegion implements HConstan
     try {
 
       WALEdit walEdit = new WALEdit();
-      
+
       // check if column families are valid;
       // check if any timestampupdates are needed;
       // and if writeToWAL is set, then also collapse edits into a single list.
@@ -1636,7 +1636,7 @@ public class HRegion implements HConstan
         // update timestamp on keys if required.
         if (updateKeys(edits, byteNow)) {
           if (writeToWAL) {
-            // bunch up all edits across all column families into a 
+            // bunch up all edits across all column families into a
             // single WALEdit.
             for (KeyValue kv : edits) {
               walEdit.add(kv);
@@ -1659,14 +1659,14 @@ public class HRegion implements HConstan
             walEdit, now,
             this.getRegionInfo().isMetaRegion());
       }
-      
+
       long size = 0;
 
       w = rwcc.beginMemstoreInsert();
 
       // now make changes to the memstore
       for (Map.Entry<byte[], List<KeyValue>> e : familyMap.entrySet()) {
-        byte[] family = e.getKey(); 
+        byte[] family = e.getKey();
         List<KeyValue> edits = e.getValue();
 
         Store store = getStore(family);
@@ -1720,7 +1720,7 @@ public class HRegion implements HConstan
     // Used by subclasses; e.g. THBase.
   }
 
-  protected Store instantiateHStore(Path baseDir, 
+  protected Store instantiateHStore(Path baseDir,
     HColumnDescriptor c, Path oldLogFile, Progressable reporter)
   throws IOException {
     return new Store(baseDir, this, c, this.fs, oldLogFile,
@@ -1735,7 +1735,7 @@ public class HRegion implements HConstan
    * TODO: Make this lookup faster.
    */
   public Store getStore(final byte [] column) {
-    return this.stores.get(column); 
+    return this.stores.get(column);
   }
 
   //////////////////////////////////////////////////////////////////////////////
@@ -1768,10 +1768,10 @@ public class HRegion implements HConstan
    * But it acts as a guard on the client; a miswritten client just can't
    * submit the name of a row and start writing to it; it must know the correct
    * lockid, which matches the lock list in memory.
-   * 
-   * <p>It would be more memory-efficient to assume a correctly-written client, 
+   *
+   * <p>It would be more memory-efficient to assume a correctly-written client,
    * which maybe we'll do in the future.
-   * 
+   *
    * @param row Name of row to lock.
    * @throws IOException
    * @return The id of the held lock.
@@ -1794,7 +1794,7 @@ public class HRegion implements HConstan
         // generate a new lockid. Attempt to insert the new [lockid, row].
         // if this lockid already exists in the map then revert and retry
         // We could have first done a lockIds.get, and if it does not exist only
-        // then do a lockIds.put, but the hope is that the lockIds.put will 
+        // then do a lockIds.put, but the hope is that the lockIds.put will
         // mostly return null the first time itself because there won't be
         // too many lockId collisions.
         byte [] prev = null;
@@ -1816,7 +1816,7 @@ public class HRegion implements HConstan
       splitsAndClosesLock.readLock().unlock();
     }
   }
-  
+
   /**
    * Used by unit tests.
    * @param lockid
@@ -1827,8 +1827,8 @@ public class HRegion implements HConstan
       return lockIds.get(lockid);
     }
   }
-  
-  /** 
+
+  /**
    * Release the row lock!
    * @param lockid  The lock ID to release.
    */
@@ -1839,7 +1839,7 @@ public class HRegion implements HConstan
       lockedRows.notifyAll();
     }
   }
-  
+
   /**
    * See if row is currently locked.
    * @param lockid
@@ -1853,14 +1853,14 @@ public class HRegion implements HConstan
       return false;
     }
   }
-  
+
   /**
    * Returns existing row lock if found, otherwise
    * obtains a new row lock and returns it.
    * @param lockid
    * @return lockid
    */
-  private Integer getLock(Integer lockid, byte [] row) 
+  private Integer getLock(Integer lockid, byte [] row)
   throws IOException {
     Integer lid = null;
     if (lockid == null) {
@@ -1873,13 +1873,13 @@ public class HRegion implements HConstan
     }
     return lid;
   }
-  
+
   private void waitOnRowLocks() {
     synchronized (lockedRows) {
       while (!this.lockedRows.isEmpty()) {
         if (LOG.isDebugEnabled()) {
           LOG.debug("Waiting on " + this.lockedRows.size() + " row locks");
-        } 
+        }
         try {
           this.lockedRows.wait();
         } catch (InterruptedException e) {
@@ -1888,17 +1888,17 @@ public class HRegion implements HConstan
       }
     }
   }
-  
+
   @Override
   public boolean equals(Object o) {
     return this.hashCode() == ((HRegion)o).hashCode();
   }
-  
+
   @Override
   public int hashCode() {
     return this.regionInfo.getRegionName().hashCode();
   }
-  
+
   @Override
   public String toString() {
     return this.regionInfo.getRegionNameAsString();
@@ -2096,7 +2096,7 @@ public class HRegion implements HConstan
     }
 
     /**
-     * 
+     *
      * @param scanner to be closed
      */
     public void close(KeyValueScanner scanner) {
@@ -2105,12 +2105,12 @@ public class HRegion implements HConstan
       } catch(NullPointerException npe) {}
     }
   }
-  
+
   // Utility methods
   /**
    * A utility method to create new instances of HRegion based on the
    * {@link org.apache.hadoop.hbase.HConstants#REGION_IMPL} configuration
-   * property. 
+   * property.
    * @param basedir qualified path of directory where region should be located,
    * usually the table directory.
    * @param log The HLog is the outbound log for any updates to the HRegion
@@ -2157,7 +2157,7 @@ public class HRegion implements HConstan
    * @param rootDir Root directory for HBase instance
    * @param conf
    * @return new HRegion
-   * 
+   *
    * @throws IOException
    */
   public static HRegion createHRegion(final HRegionInfo info, final Path rootDir,
@@ -2174,7 +2174,7 @@ public class HRegion implements HConstan
     region.initialize(null, null);
     return region;
   }
-  
+
   /**
    * Convenience method to open a HRegion outside of an HRegionServer context.
    * @param info Info for region to be opened.
@@ -2185,7 +2185,7 @@ public class HRegion implements HConstan
    * up.  HRegionStore does this every time it opens a new region.
    * @param conf
    * @return new HRegion
-   * 
+   *
    * @throws IOException
    */
   public static HRegion openHRegion(final HRegionInfo info, final Path rootDir,
@@ -2206,18 +2206,18 @@ public class HRegion implements HConstan
     }
     return r;
   }
-  
+
   /**
    * Inserts a new region's meta information into the passed
    * <code>meta</code> region. Used by the HMaster bootstrap code adding
    * new table to ROOT table.
-   * 
+   *
    * @param meta META HRegion to be updated
    * @param r HRegion to add to <code>meta</code>
    *
    * @throws IOException
    */
-  public static void addRegionToMETA(HRegion meta, HRegion r) 
+  public static void addRegionToMETA(HRegion meta, HRegion r)
   throws IOException {
     meta.checkResources();
     // The row key is the region name
@@ -2237,7 +2237,7 @@ public class HRegion implements HConstan
    * Delete a region's meta information from the passed
    * <code>meta</code> region.  Removes content in the 'info' column family.
    * Does not remove region historian info.
-   * 
+   *
    * @param srvr META server to be updated
    * @param metaRegionName Meta region name
    * @param regionName HRegion to remove from <code>meta</code>
@@ -2273,7 +2273,7 @@ public class HRegion implements HConstan
     srvr.put(metaRegionName, put);
     cleanRegionInMETA(srvr, metaRegionName, info);
   }
-  
+
   /**
    * Clean COL_SERVER and COL_STARTCODE for passed <code>info</code> in
    * <code>.META.</code>
@@ -2293,7 +2293,7 @@ public class HRegion implements HConstan
 
   /**
    * Deletes all the files for a HRegion
-   * 
+   *
    * @param fs the file system object
    * @param rootdir qualified path of HBase root directory
    * @param info HRegionInfo for region to be deleted
@@ -2316,7 +2316,7 @@ public class HRegion implements HConstan
 
   /**
    * Computes the Path of the HRegion
-   * 
+   *
    * @param tabledir qualified path for table
    * @param name ENCODED region name
    * @return Path of HRegion directory
@@ -2324,10 +2324,10 @@ public class HRegion implements HConstan
   public static Path getRegionDir(final Path tabledir, final int name) {
     return new Path(tabledir, Integer.toString(name));
   }
-  
+
   /**
    * Computes the Path of the HRegion
-   * 
+   *
    * @param rootdir qualified path of HBase root directory
    * @param info HRegionInfo for the region
    * @return qualified path of region directory
@@ -2341,7 +2341,7 @@ public class HRegion implements HConstan
   /**
    * Determines if the specified row is within the row range specified by the
    * specified HRegionInfo
-   *  
+   *
    * @param info HRegionInfo that specifies the row range
    * @param row row to be checked
    * @return true if the row is within the range specified by the HRegionInfo
@@ -2355,7 +2355,7 @@ public class HRegion implements HConstan
 
   /**
    * Make the directories for a specific column family
-   * 
+   *
    * @param fs the file system
    * @param tabledir base directory where region will live (usually the table dir)
    * @param hri
@@ -2373,7 +2373,7 @@ public class HRegion implements HConstan
 
   /**
    * Merge two HRegions.  The regions must be adjacent and must not overlap.
-   * 
+   *
    * @param srcA
    * @param srcB
    * @return new merged HRegion
@@ -2405,7 +2405,7 @@ public class HRegion implements HConstan
 
   /**
    * Merge two regions whether they are adjacent or not.
-   * 
+   *
    * @param a region a
    * @param b region b
    * @return new merged region
@@ -2420,12 +2420,12 @@ public class HRegion implements HConstan
     FileSystem fs = a.getFilesystem();
 
     // Make sure each region's cache is empty
-    
+
     a.flushcache();
     b.flushcache();
-    
+
     // Compact each region so we only have one store file per family
-    
+
     a.compactStores(true);
     if (LOG.isDebugEnabled()) {
       LOG.debug("Files for region: " + a);
@@ -2436,12 +2436,12 @@ public class HRegion implements HConstan
       LOG.debug("Files for region: " + b);
       listPaths(fs, b.getRegionDir());
     }
-    
+
     HBaseConfiguration conf = a.getConf();
     HTableDescriptor tabledesc = a.getTableDesc();
     HLog log = a.getLog();
     Path basedir = a.getBaseDir();
-    // Presume both are of same region type -- i.e. both user or catalog 
+    // Presume both are of same region type -- i.e. both user or catalog
     // table regions.  This way can use comparator.
     final byte [] startKey = a.comparator.matchingRows(a.getStartKey(), 0,
           a.getStartKey().length,
@@ -2449,7 +2449,7 @@ public class HRegion implements HConstan
       b.comparator.matchingRows(b.getStartKey(), 0, b.getStartKey().length,
         EMPTY_BYTE_ARRAY, 0, EMPTY_BYTE_ARRAY.length)?
         EMPTY_BYTE_ARRAY:
-          a.comparator.compareRows(a.getStartKey(), 0, a.getStartKey().length, 
+          a.comparator.compareRows(a.getStartKey(), 0, a.getStartKey().length,
           b.getStartKey(), 0, b.getStartKey().length) <= 0?
         a.getStartKey(): b.getStartKey();
     final byte [] endKey = a.comparator.matchingRows(a.getEndKey(), 0,
@@ -2463,7 +2463,7 @@ public class HRegion implements HConstan
 
     HRegionInfo newRegionInfo = new HRegionInfo(tabledesc, startKey, endKey);
     LOG.info("Creating new region " + newRegionInfo.toString());
-    int encodedName = newRegionInfo.getEncodedName(); 
+    int encodedName = newRegionInfo.getEncodedName();
     Path newRegionDir = HRegion.getRegionDir(a.getBaseDir(), encodedName);
     if(fs.exists(newRegionDir)) {
       throw new IOException("Cannot merge; target file collision at " +
@@ -2523,7 +2523,7 @@ public class HRegion implements HConstan
   }
 
   /*
-   * Fills a map with a vector of store files keyed by column family. 
+   * Fills a map with a vector of store files keyed by column family.
    * @param byFamily Map to fill.
    * @param storeFiles Store files to process.
    * @param family
@@ -2545,7 +2545,7 @@ public class HRegion implements HConstan
 
   /**
    * @return True if needs a mojor compaction.
-   * @throws IOException 
+   * @throws IOException
    */
   boolean isMajorCompaction() throws IOException {
     for (Store store: this.stores.values()) {
@@ -2558,7 +2558,7 @@ public class HRegion implements HConstan
 
   /*
    * List the files under the specified directory
-   * 
+   *
    * @param fs
    * @param dir
    * @throws IOException
@@ -2581,7 +2581,7 @@ public class HRegion implements HConstan
     }
   }
 
-  
+
   //
   // HBASE-880
   //
@@ -2627,7 +2627,7 @@ public class HRegion implements HConstan
   }
 
   /**
-   * 
+   *
    * @param row
    * @param family
    * @param qualifier
@@ -2696,13 +2696,13 @@ public class HRegion implements HConstan
 
     return result;
   }
-    
-  
+
+
   //
   // New HBASE-880 Helpers
   //
-  
-  private void checkFamily(final byte [] family) 
+
+  private void checkFamily(final byte [] family)
   throws NoSuchColumnFamilyException {
     if(!regionInfo.getTableDesc().hasFamily(family)) {
       throw new NoSuchColumnFamilyException("Column family " +
@@ -2714,9 +2714,9 @@ public class HRegion implements HConstan
   public static final long FIXED_OVERHEAD = ClassSize.align(
       (5 * Bytes.SIZEOF_LONG) + Bytes.SIZEOF_BOOLEAN +
       (21 * ClassSize.REFERENCE) + ClassSize.OBJECT + Bytes.SIZEOF_INT);
-  
+
   public static final long DEEP_OVERHEAD = ClassSize.align(FIXED_OVERHEAD +
-      ClassSize.OBJECT + (2 * ClassSize.ATOMIC_BOOLEAN) + 
+      ClassSize.OBJECT + (2 * ClassSize.ATOMIC_BOOLEAN) +
       ClassSize.ATOMIC_LONG + ClassSize.ATOMIC_INTEGER +
 
       // Using TreeMap for TreeSet
@@ -2729,7 +2729,7 @@ public class HRegion implements HConstan
       ClassSize.align(ClassSize.OBJECT +
         (5 * Bytes.SIZEOF_BOOLEAN)) +
         (3 * ClassSize.REENTRANT_LOCK));
-  
+
   public long heapSize() {
     long heapSize = DEEP_OVERHEAD;
     for(Store store : this.stores.values()) {
@@ -2838,7 +2838,7 @@ public class HRegion implements HConstan
    *   ./bin/hbase org.apache.hadoop.hbase.regionserver.HRegion
    * </pre>
    * @param args
-   * @throws IOException 
+   * @throws IOException
    */
   public static void main(String[] args) throws IOException {
     if (args.length < 1) {

Modified: hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=942184&r1=942183&r2=942184&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Fri May  7 19:17:48 2010
@@ -126,7 +126,7 @@ public class HRegionServer implements HC
   // plain boolean so we can pass a reference to Chore threads.  Otherwise,
   // Chore threads need to know about the hosting class.
   protected final AtomicBoolean stopRequested = new AtomicBoolean(false);
-  
+
   protected final AtomicBoolean quiesced = new AtomicBoolean(false);
 
   protected final AtomicBoolean safeMode = new AtomicBoolean(true);
@@ -137,7 +137,7 @@ public class HRegionServer implements HC
 
   // If false, the file system has become unavailable
   protected volatile boolean fsOk;
-  
+
   protected HServerInfo serverInfo;
   protected final HBaseConfiguration conf;
 
@@ -165,7 +165,7 @@ public class HRegionServer implements HC
   protected final int numRegionsToReport;
 
   private final long maxScannerResultSize;
-  
+
   // Remote HMaster
   private HMasterRegionInterface hbaseMaster;
 
@@ -175,7 +175,7 @@ public class HRegionServer implements HC
 
   // Leases
   private Leases leases;
-  
+
   // Request counter
   private volatile AtomicInteger requestCount = new AtomicInteger();
 
@@ -183,25 +183,25 @@ public class HRegionServer implements HC
   // is name of the webapp and the attribute name used stuffing this instance
   // into web context.
   InfoServer infoServer;
-  
+
   /** region server process name */
   public static final String REGIONSERVER = "regionserver";
-  
+
   /*
    * Space is reserved in HRS constructor and then released when aborting
    * to recover from an OOME. See HBASE-706.  TODO: Make this percentage of the
    * heap or a minimum.
    */
   private final LinkedList<byte[]> reservedSpace = new LinkedList<byte []>();
-  
+
   private RegionServerMetrics metrics;
 
   // Compactions
   CompactSplitThread compactSplitThread;
 
-  // Cache flushing  
+  // Cache flushing
   MemStoreFlusher cacheFlusher;
-  
+
   /* Check for major compactions.
    */
   Chore majorCompactionChecker;
@@ -210,7 +210,7 @@ public class HRegionServer implements HC
   // eclipse warning when accessed by inner classes
   protected volatile HLog hlog;
   LogRoller hlogRoller;
-  
+
   // flag set after we're done setting up server threads (used for testing)
   protected volatile boolean isOnline;
 
@@ -247,7 +247,7 @@ public class HRegionServer implements HC
     machineName = DNS.getDefaultHost(
         conf.get("hbase.regionserver.dns.interface","default"),
         conf.get("hbase.regionserver.dns.nameserver","default"));
-    String addressStr = machineName + ":" + 
+    String addressStr = machineName + ":" +
       conf.get(REGIONSERVER_PORT, Integer.toString(DEFAULT_REGIONSERVER_PORT));
     // This is not necessarily the address we will run with.  The address we
     // use will be in #serverInfo data member.  For example, we may have been
@@ -260,9 +260,9 @@ public class HRegionServer implements HC
     this.fsOk = true;
     this.conf = conf;
     this.connection = ServerConnectionManager.getConnection(conf);
-    
+
     this.isOnline = false;
-    
+
     // Config'ed params
     this.numRetries =  conf.getInt("hbase.client.retries.number", 2);
     this.threadWakeFrequency = conf.getInt(THREAD_WAKE_FREQUENCY, 10 * 1000);
@@ -273,14 +273,14 @@ public class HRegionServer implements HC
     sleeper = new Sleeper(this.msgInterval, this.stopRequested);
 
     this.maxScannerResultSize = conf.getLong(
-            HConstants.HBASE_CLIENT_SCANNER_MAX_RESULT_SIZE_KEY, 
+            HConstants.HBASE_CLIENT_SCANNER_MAX_RESULT_SIZE_KEY,
             HConstants.DEFAULT_HBASE_CLIENT_SCANNER_MAX_RESULT_SIZE);
-              
+
     // Task thread to process requests from Master
     this.worker = new Worker();
 
-    this.numRegionsToReport =                                        
-      conf.getInt("hbase.regionserver.numregionstoreport", 10);      
+    this.numRegionsToReport =
+      conf.getInt("hbase.regionserver.numregionstoreport", 10);
 
     this.rpcTimeout = conf.getLong("hbase.regionserver.lease.period", 60000);
 
@@ -299,7 +299,7 @@ public class HRegionServer implements HC
     this.shutdownHDFS.set(true);
 
     // Server to handle client requests
-    this.server = HBaseRPC.getServer(this, address.getBindAddress(), 
+    this.server = HBaseRPC.getServer(this, address.getBindAddress(),
       address.getPort(), conf.getInt("hbase.regionserver.handler.count", 10),
       false, conf);
     this.server.setErrorHandler(this);
@@ -331,13 +331,13 @@ public class HRegionServer implements HC
 
     // Cache flushing thread.
     this.cacheFlusher = new MemStoreFlusher(conf, this);
-    
+
     // Compaction thread
     this.compactSplitThread = new CompactSplitThread(this);
-    
+
     // Log rolling thread
     this.hlogRoller = new LogRoller(this);
-    
+
     // Background thread to check for major compactions; needed if region
     // has not gotten updates in a while.  Make it run at a lesser frequency.
     int multiplier = this.conf.getInt(THREAD_WAKE_FREQUENCY +
@@ -422,7 +422,7 @@ public class HRegionServer implements HC
 
   /**
    * The HRegionServer sticks in this loop until closed. It repeatedly checks
-   * in with the HMaster, sending heartbeats & reports, and receiving HRegion 
+   * in with the HMaster, sending heartbeats & reports, and receiving HRegion
    * load/unload instructions.
    */
   public void run() {
@@ -528,7 +528,7 @@ public class HRegionServer implements HC
                   } catch (IOException e) {
                     this.abortRequested = true;
                     this.stopRequested.set(true);
-                    e = RemoteExceptionHandler.checkIOException(e); 
+                    e = RemoteExceptionHandler.checkIOException(e);
                     LOG.fatal("error restarting server", e);
                     break;
                   }
@@ -595,7 +595,7 @@ public class HRegionServer implements HC
           }
         }
         now = System.currentTimeMillis();
-        HMsg msg = this.outboundMsgs.poll((msgInterval - (now - lastMsg)), 
+        HMsg msg = this.outboundMsgs.poll((msgInterval - (now - lastMsg)),
           TimeUnit.MILLISECONDS);
         // If we got something, add it to list of things to send.
         if (msg != null) outboundMessages.add(msg);
@@ -682,7 +682,7 @@ public class HRegionServer implements HC
       HBaseRPC.stopProxy(this.hbaseMaster);
       this.hbaseMaster = null;
     }
-    
+
     join();
     this.zooKeeperWrapper.close();
     if (this.shutdownHDFS.get()) {
@@ -827,16 +827,16 @@ public class HRegionServer implements HC
       stores += r.stores.size();
       for (Store store: r.stores.values()) {
         storefiles += store.getStorefilesCount();
-        storefileSizeMB += 
+        storefileSizeMB +=
           (int)(store.getStorefilesSize()/1024/1024);
-        storefileIndexSizeMB += 
+        storefileIndexSizeMB +=
           (int)(store.getStorefilesIndexSize()/1024/1024);
       }
     }
     return new HServerLoad.RegionLoad(name, stores, storefiles,
       storefileSizeMB, memstoreSizeMB, storefileIndexSizeMB);
   }
- 
+
   /**
    * @param regionName
    * @return An instance of RegionLoad.
@@ -911,12 +911,12 @@ public class HRegionServer implements HC
     }
     return stop;
   }
-  
-  
+
+
   /**
    * Checks to see if the file system is still accessible.
    * If not, sets abortRequested and stopRequested
-   * 
+   *
    * @return false if file system is not available
    */
   protected boolean checkFileSystem() {
@@ -940,7 +940,7 @@ public class HRegionServer implements HC
   private static class ShutdownThread extends Thread {
     private final HRegionServer instance;
     private final Thread mainThread;
-    
+
     /**
      * @param instance
      * @param mainThread
@@ -953,7 +953,7 @@ public class HRegionServer implements HC
     @Override
     public void run() {
       LOG.info("Starting shutdown thread.");
-      
+
       // tell the region server to stop
       instance.stop();
 
@@ -961,7 +961,7 @@ public class HRegionServer implements HC
       Threads.shutdown(mainThread);
 
       LOG.info("Shutdown thread complete");
-    }    
+    }
   }
 
   // We need to call HDFS shutdown when we are done shutting down
@@ -998,7 +998,7 @@ public class HRegionServer implements HC
       }
     }
   }
-  
+
   /**
    * So, HDFS caches FileSystems so when you call FileSystem.get it's fast. In
    * order to make sure things are cleaned up, it also creates a shutdown hook
@@ -1026,7 +1026,7 @@ public class HRegionServer implements HC
       }
       Runtime.getRuntime().removeShutdownHook(hdfsClientFinalizer);
       return hdfsClientFinalizer;
-      
+
     } catch (NoSuchFieldException nsfe) {
       LOG.fatal("Couldn't find field 'clientFinalizer' in FileSystem!", nsfe);
       throw new RuntimeException("Failed to suppress HDFS shutdown hook");
@@ -1037,7 +1037,7 @@ public class HRegionServer implements HC
   }
 
   /**
-   * Report the status of the server. A server is online once all the startup 
+   * Report the status of the server. A server is online once all the startup
    * is completed (setting up filesystem, starting service threads, etc.). This
    * method is designed mostly to be useful in tests.
    * @return true if online, false if not.
@@ -1045,10 +1045,10 @@ public class HRegionServer implements HC
   public boolean isOnline() {
     return isOnline;
   }
-    
+
   private HLog setupHLog() throws RegionServerRunningException,
     IOException {
-    
+
     Path logdir = new Path(rootDir, HLog.getHLogDirectoryName(this.serverInfo));
     if (LOG.isDebugEnabled()) {
       LOG.debug("Log dir " + logdir);
@@ -1062,17 +1062,17 @@ public class HRegionServer implements HC
     return newlog;
   }
 
-  // instantiate 
+  // instantiate
   protected HLog instantiateHLog(Path logdir) throws IOException {
     HLog newlog = new HLog(fs, logdir, conf, hlogRoller);
     return newlog;
   }
 
-  
+
   protected LogRoller getLogRoller() {
     return hlogRoller;
-  }  
-  
+  }
+
   /*
    * @param interval Interval since last time metrics were called.
    */
@@ -1101,7 +1101,7 @@ public class HRegionServer implements HC
         synchronized (r.stores) {
           stores += r.stores.size();
           for(Map.Entry<byte [], Store> ee: r.stores.entrySet()) {
-            Store store = ee.getValue(); 
+            Store store = ee.getValue();
             storefiles += store.getStorefilesCount();
             storefileIndexSize += store.getStorefilesIndexSize();
           }
@@ -1160,7 +1160,7 @@ public class HRegionServer implements HC
     Threads.setDaemonThreadRunning(this.workerThread, n + ".worker", handler);
     Threads.setDaemonThreadRunning(this.majorCompactionChecker,
         n + ".majorCompactionChecker", handler);
-    
+
     // Leases is not a Thread. Internally it runs a daemon thread.  If it gets
     // an unhandled exception, it will just exit.
     this.leases.setName(n + ".leaseChecker");
@@ -1190,7 +1190,7 @@ public class HRegionServer implements HC
           // update HRS server info
           this.serverInfo.setInfoPort(port);
         }
-      } 
+      }
     }
 
     // Start Server.  This service is like leases in that it internally runs
@@ -1276,7 +1276,7 @@ public class HRegionServer implements HC
     stop();
   }
 
-  /** 
+  /**
    * Wait on all threads to finish.
    * Presumption is that all closes and stops have already been called.
    */
@@ -1344,7 +1344,7 @@ public class HRegionServer implements HC
         if (LOG.isDebugEnabled())
           LOG.debug("sending initial server load: " + hsl);
         lastMsg = System.currentTimeMillis();
-        boolean startCodeOk = false; 
+        boolean startCodeOk = false;
         while(!startCodeOk) {
           serverInfo.setStartCode(System.currentTimeMillis());
           startCodeOk = zooKeeperWrapper.writeRSLocation(this.serverInfo);
@@ -1383,13 +1383,13 @@ public class HRegionServer implements HC
   private void reportClose(final HRegionInfo region, final byte[] message) {
     this.outboundMsgs.add(new HMsg(HMsg.Type.MSG_REPORT_CLOSE, region, message));
   }
-  
+
   /**
    * Add to the outbound message buffer
-   * 
-   * When a region splits, we need to tell the master that there are two new 
+   *
+   * When a region splits, we need to tell the master that there are two new
    * regions that need to be assigned.
-   * 
+   *
    * We do not need to inform the master about the old region, because we've
    * updated the meta or root regions, and the master will pick that up on its
    * next rescan of the root or meta tables.
@@ -1422,7 +1422,7 @@ public class HRegionServer implements HC
   final BlockingQueue<ToDoEntry> toDo = new LinkedBlockingQueue<ToDoEntry>();
   private Worker worker;
   private Thread workerThread;
-  
+
   /** Thread that performs long running requests from the master */
   class Worker implements Runnable {
     void stop() {
@@ -1430,7 +1430,7 @@ public class HRegionServer implements HC
         toDo.notifyAll();
       }
     }
-    
+
     public void run() {
       try {
         while(!stopRequested.get()) {
@@ -1492,12 +1492,12 @@ public class HRegionServer implements HC
                 e.msg.isType(Type.MSG_REGION_MAJOR_COMPACT),
                 e.msg.getType().name());
               break;
-              
+
             case MSG_REGION_FLUSH:
               region = getRegion(info.getRegionName());
               region.flushcache();
               break;
-              
+
             case TESTING_MSG_BLOCK_RS:
               while (!stopRequested.get()) {
                 Threads.sleep(1000);
@@ -1575,9 +1575,9 @@ public class HRegionServer implements HC
         this.lock.writeLock().unlock();
       }
     }
-    reportOpen(regionInfo); 
+    reportOpen(regionInfo);
   }
-  
+
   protected HRegion instantiateRegion(final HRegionInfo regionInfo)
       throws IOException {
     HRegion r = HRegion.newHRegion(HTableDescriptor.getTableDir(rootDir, regionInfo
@@ -1588,9 +1588,9 @@ public class HRegionServer implements HC
         addProcessingMessage(regionInfo);
       }
     });
-    return r; 
+    return r;
   }
-  
+
   /**
    * Add a MSG_REPORT_PROCESS_OPEN to the outbound queue.
    * This method is called while region is in the queue of regions to process
@@ -1644,7 +1644,7 @@ public class HRegionServer implements HC
     }
     return regionsToClose;
   }
-  
+
   /*
    * Thread to run close of a region.
    */
@@ -1655,7 +1655,7 @@ public class HRegionServer implements HC
       super(Thread.currentThread().getName() + ".regionCloser." + r.toString());
       this.r = r;
     }
-    
+
     @Override
     public void run() {
       try {
@@ -1727,7 +1727,7 @@ public class HRegionServer implements HC
   }
 
 
-  public Result getClosestRowBefore(final byte [] regionName, 
+  public Result getClosestRowBefore(final byte [] regionName,
     final byte [] row, final byte [] family)
   throws IOException {
     checkOpen();
@@ -1735,8 +1735,8 @@ public class HRegionServer implements HC
     try {
       // locate the region we're operating on
       HRegion region = getRegion(regionName);
-      // ask the region for all the data 
-      
+      // ask the region for all the data
+
       Result r = region.getClosestRowBefore(row, family);
       return r;
     } catch (Throwable t) {
@@ -1772,7 +1772,7 @@ public class HRegionServer implements HC
   throws IOException {
     if (put.getRow() == null)
       throw new IllegalArgumentException("update has null row");
-    
+
     checkOpen();
     this.requestCount.incrementAndGet();
     HRegion region = getRegion(regionName);
@@ -1793,7 +1793,7 @@ public class HRegionServer implements HC
     checkOpen();
     try {
       HRegion region = getRegion(regionName);
-      
+
       if (!region.getRegionInfo().isMetaTable()) {
         this.cacheFlusher.reclaimMemStoreMemory();
       }
@@ -1821,7 +1821,7 @@ public class HRegionServer implements HC
   }
 
   /**
-   * 
+   *
    * @param regionName
    * @param row
    * @param family
@@ -1832,12 +1832,12 @@ public class HRegionServer implements HC
    * @return true if the new put was execute, false otherwise
    */
   public boolean checkAndPut(final byte[] regionName, final byte [] row,
-      final byte [] family, final byte [] qualifier, final byte [] value, 
+      final byte [] family, final byte [] qualifier, final byte [] value,
       final Put put) throws IOException{
     //Getting actual value
     Get get = new Get(row);
     get.addColumn(family, qualifier);
-    
+
     checkOpen();
     this.requestCount.incrementAndGet();
     HRegion region = getRegion(regionName);
@@ -1853,7 +1853,7 @@ public class HRegionServer implements HC
       throw convertThrowableToIOE(cleanup(t));
     }
   }
-  
+
   //
   // remote scanner interface
   //
@@ -1878,7 +1878,7 @@ public class HRegionServer implements HC
       throw convertThrowableToIOE(cleanup(t, "Failed openScanner"));
     }
   }
-  
+
   protected long addScanner(InternalScanner s) throws LeaseStillHeldException {
     long scannerId = -1L;
     scannerId = rand.nextLong();
@@ -1909,7 +1909,7 @@ public class HRegionServer implements HC
       try {
         checkOpen();
       } catch (IOException e) {
-        // If checkOpen failed, server not running or filesystem gone, 
+        // If checkOpen failed, server not running or filesystem gone,
         // cancel this lease; filesystem is gone or we're closing or something.
         this.leases.cancelLease(scannerName);
         throw e;
@@ -1948,7 +1948,7 @@ public class HRegionServer implements HC
       }
       throw convertThrowableToIOE(cleanup(t));
     }
-  } 
+  }
 
   public void close(final long scannerId) throws IOException {
     try {
@@ -1968,17 +1968,17 @@ public class HRegionServer implements HC
     }
   }
 
-  /** 
+  /**
    * Instantiated as a scanner lease.
    * If the lease times out, the scanner is closed
    */
   private class ScannerListener implements LeaseListener {
     private final String scannerName;
-    
+
     ScannerListener(final String n) {
       this.scannerName = n;
     }
-    
+
     public void leaseExpired() {
       LOG.info("Scanner " + this.scannerName + " lease expired");
       InternalScanner s = null;
@@ -1994,7 +1994,7 @@ public class HRegionServer implements HC
       }
     }
   }
-  
+
   //
   // Methods that do the actual work for the remote API
   //
@@ -2040,7 +2040,7 @@ public class HRegionServer implements HC
     } catch (Throwable t) {
       throw convertThrowableToIOE(cleanup(t));
     }
-    
+
     // All have been processed successfully.
     return -1;
   }
@@ -2173,7 +2173,7 @@ public class HRegionServer implements HC
   public InfoServer getInfoServer() {
     return infoServer;
   }
-  
+
   /**
    * @return true if a stop has been requested.
    */
@@ -2189,7 +2189,7 @@ public class HRegionServer implements HC
   }
 
   /**
-   * 
+   *
    * @return the configuration
    */
   public HBaseConfiguration getConfiguration() {
@@ -2211,7 +2211,7 @@ public class HRegionServer implements HC
   public HRegion [] getOnlineRegionsAsArray() {
     return getOnlineRegions().toArray(new HRegion[0]);
   }
-  
+
   /**
    * @return The HRegionInfos from online regions sorted
    */
@@ -2224,10 +2224,10 @@ public class HRegionServer implements HC
     }
     return result;
   }
-  
+
   /**
-   * This method removes HRegion corresponding to hri from the Map of onlineRegions.  
-   * 
+   * This method removes HRegion corresponding to hri from the Map of onlineRegions.
+   *
    * @param hri the HRegionInfo corresponding to the HRegion to-be-removed.
    * @return the removed HRegion, or null if the HRegion was not in onlineRegions.
    */
@@ -2262,7 +2262,7 @@ public class HRegionServer implements HC
     }
     return sortedRegions;
   }
-  
+
   /**
    * @param regionName
    * @return HRegion for the passed <code>regionName</code> or null if named
@@ -2281,8 +2281,8 @@ public class HRegionServer implements HC
   public FlushRequester getFlushRequester() {
     return this.cacheFlusher;
   }
-  
-  /** 
+
+  /**
    * Protected utility method for safely obtaining an HRegion handle.
    * @param regionName Name of online {@link HRegion} to return
    * @return {@link HRegion} for <code>regionName</code>
@@ -2325,10 +2325,10 @@ public class HRegionServer implements HC
     }
     return regions.toArray(new HRegionInfo[regions.size()]);
   }
-  
-  /**  
+
+  /**
    * Called to verify that this server is up and running.
-   * 
+   *
    * @throws IOException
    */
   protected void checkOpen() throws IOException {
@@ -2340,14 +2340,14 @@ public class HRegionServer implements HC
       throw new IOException("File system not available");
     }
   }
- 
+
   /**
    * @return Returns list of non-closed regions hosted on this server.  If no
    * regions to check, returns an empty list.
    */
   protected Set<HRegion> getRegionsToCheck() {
     HashSet<HRegion> regionsToCheck = new HashSet<HRegion>();
-    //TODO: is this locking necessary? 
+    //TODO: is this locking necessary?
     lock.readLock().lock();
     try {
       regionsToCheck.addAll(this.onlineRegions.values());
@@ -2364,9 +2364,9 @@ public class HRegionServer implements HC
     return regionsToCheck;
   }
 
-  public long getProtocolVersion(final String protocol, 
+  public long getProtocolVersion(final String protocol,
       final long clientVersion)
-  throws IOException {  
+  throws IOException {
     if (protocol.equals(HRegionInterface.class.getName())) {
       return HBaseRPCProtocolVersion.versionID;
     }
@@ -2421,21 +2421,21 @@ public class HRegionServer implements HC
   public HServerInfo getServerInfo() { return this.serverInfo; }
 
   /** {@inheritDoc} */
-  public long incrementColumnValue(byte [] regionName, byte [] row, 
+  public long incrementColumnValue(byte [] regionName, byte [] row,
       byte [] family, byte [] qualifier, long amount, boolean writeToWAL)
   throws IOException {
     checkOpen();
 
     if (regionName == null) {
-      throw new IOException("Invalid arguments to incrementColumnValue " + 
+      throw new IOException("Invalid arguments to incrementColumnValue " +
       "regionName is null");
     }
     requestCount.incrementAndGet();
     try {
       HRegion region = getRegion(regionName);
-      long retval = region.incrementColumnValue(row, family, qualifier, amount, 
+      long retval = region.incrementColumnValue(row, family, qualifier, amount,
           writeToWAL);
-      
+
       return retval;
     } catch (IOException e) {
       checkFileSystem();
@@ -2452,7 +2452,7 @@ public class HRegionServer implements HC
     }
     return regions;
   }
-  
+
   /** {@inheritDoc} */
   public HServerInfo getHServerInfo() throws IOException {
     return serverInfo;
@@ -2480,7 +2480,7 @@ public class HRegionServer implements HC
   //
   // Main program and support routines
   //
-  
+
   /**
    * @param hrs
    * @return Thread the RegionServer is running in correctly named.
@@ -2506,7 +2506,7 @@ public class HRegionServer implements HC
   private static void printUsageAndExit() {
     printUsageAndExit(null);
   }
-  
+
   private static void printUsageAndExit(final String message) {
     if (message != null) {
       System.err.println(message);
@@ -2544,7 +2544,7 @@ public class HRegionServer implements HC
       printUsageAndExit();
     }
     Configuration conf = new HBaseConfiguration();
-    
+
     // Process command-line args. TODO: Better cmd-line processing
     // (but hopefully something not as painful as cli options).
     for (String cmd: args) {
@@ -2569,13 +2569,13 @@ public class HRegionServer implements HC
         }
         break;
       }
-      
+
       if (cmd.equals("stop")) {
         printUsageAndExit("To shutdown the regionserver run " +
           "bin/hbase-daemon.sh stop regionserver or send a kill signal to" +
           "the regionserver pid");
       }
-      
+
       // Print out usage if we get to here.
       printUsageAndExit();
     }

Modified: hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/InternalScanner.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/InternalScanner.java?rev=942184&r1=942183&r2=942184&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/InternalScanner.java (original)
+++ hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/InternalScanner.java Fri May  7 19:17:48 2010
@@ -27,10 +27,10 @@ import org.apache.hadoop.hbase.KeyValue;
 
 /**
  * Internal scanners differ from client-side scanners in that they operate on
- * HStoreKeys and byte[] instead of RowResults. This is because they are 
+ * HStoreKeys and byte[] instead of RowResults. This is because they are
  * actually close to how the data is physically stored, and therefore it is more
- * convenient to interact with them that way. It is also much easier to merge 
- * the results across SortedMaps than RowResults. 
+ * convenient to interact with them that way. It is also much easier to merge
+ * the results across SortedMaps than RowResults.
  *
  * <p>Additionally, we need to be able to determine if the scanner is doing
  * wildcard column matches (when only a column family is specified or if a
@@ -50,7 +50,7 @@ public interface InternalScanner extends
 
   /**
    * Grab the next row's worth of values with a limit on the number of values
-   * to return. 
+   * to return.
    * @param result
    * @param limit
    * @return true if more rows exist after this one, false if scanner is done