Author: tedyu
Date: Wed Jul 20 12:15:03 2011
New Revision: 1148715

URL: http://svn.apache.org/viewvc?rev=1148715&view=rev
Log:
HBASE-4095 revert, wait for further investigation

Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java
    
hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java

Modified: hbase/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1148715&r1=1148714&r2=1148715&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Wed Jul 20 12:15:03 2011
@@ -164,8 +164,6 @@ Release 0.91.0 - Unreleased
    HBASE-4052  Enabling a table after master switch does not allow table scan,
                throwing NotServingRegionException (ramkrishna via Ted Yu)
    HBASE-4112  Creating table may throw NullPointerException (Jinchao via Ted 
Yu)
-   HBASE-4095  Hlog may not be rolled in a long time if checkLowReplication's
-               request of LogRoll is blocked (Jieshan via Ted Yu)
    HBASE-4093  When verifyAndAssignRoot throws exception, the deadServers state
                cannot be changed (fulin wang via Ted Yu)
 

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java?rev=1148715&r1=1148714&r2=1148715&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java 
(original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java 
Wed Jul 20 12:15:03 2011
@@ -39,7 +39,6 @@ import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Lock;
@@ -196,10 +195,6 @@ public class HLog implements Syncable {
   // synchronized is insufficient because a cache flush spans two method calls.
   private final Lock cacheFlushLock = new ReentrantLock();
 
-  // The waiting time for log-roller trying to get the lock of cacheFlushLock.
-  // If the actual waiting time is longer than it, skip the current log roll.
-  private final long cacheFlushLockWaitTime;
-  
   // We synchronize on updateLock to prevent updates and to prevent a log roll
   // during an update
   // locked during appends
@@ -345,8 +340,6 @@ public class HLog implements Syncable {
     this.logrollsize = (long)(this.blocksize * multi);
     this.optionalFlushInterval =
       conf.getLong("hbase.regionserver.optionallogflushinterval", 1 * 1000);
-    this.cacheFlushLockWaitTime = 
-        conf.getLong("hbase.regionserver.cacheFlushLock.waittime", 25000);
     if (failIfLogDirExists && fs.exists(dir)) {
       throw new IOException("Target HLog directory already exists: " + dir);
     }
@@ -487,82 +480,66 @@ public class HLog implements Syncable {
       return null;
     }
     byte [][] regionsToFlush = null;
+    this.cacheFlushLock.lock();
     try {
-      if (this.cacheFlushLock.tryLock(this.cacheFlushLockWaitTime, 
-        TimeUnit.MILLISECONDS)) {
-        try {
-          if (closed) {
-            return regionsToFlush;
-          }
-          this.logRollRequested = true;
-          // Do all the preparation outside of the updateLock to block
-          // as less as possible the incoming writes
-          long currentFilenum = this.filenum;
-          this.filenum = System.currentTimeMillis();
-          Path newPath = computeFilename();
-          HLog.Writer nextWriter = this.createWriterInstance(fs, newPath, 
conf);
-          int nextInitialReplication = 
fs.getFileStatus(newPath).getReplication();
-
-          //This method get expect but not the actual replicas of the Hlog file
-          int nextExpectReplicas = fs.getFileStatus(newPath).getReplication();
-          
-          //Get the current replicas of the Hlog file
-          int nextActualReplicas = -1;
-          // Can we get at the dfsclient outputstream?  If an instance of
-          // SFLW, it'll have done the necessary reflection to get at the
-          // protected field name.
-          FSDataOutputStream nextHdfsOut = null;
-          if (nextWriter instanceof SequenceFileLogWriter) {
-            nextHdfsOut = 
((SequenceFileLogWriter)nextWriter).getWriterFSDataOutputStream();
-          }
-          // Tell our listeners that a new log was created
-          if (!this.listeners.isEmpty()) {
-            for (WALObserver i : this.listeners) {
-              i.logRolled(newPath);
-            }
-          }
-    
-          synchronized (updateLock) {
-            // Clean up current writer.
-            Path oldFile = cleanupCurrentWriter(currentFilenum);
-            this.writer = nextWriter;
-            this.hdfs_out = nextHdfsOut;
-            this.initialReplication = nextInitialReplication;
-    
-            LOG.info((oldFile != null?
-                "Roll " + FSUtils.getPath(oldFile) + ", entries=" +
-                this.numEntries.get() +
-                ", filesize=" +
-                this.fs.getFileStatus(oldFile).getLen() + ". ": "") +
-              "New hlog " + FSUtils.getPath(newPath));
-            this.numEntries.set(0);
-            this.logRollRequested = false;
-          }
-          // Can we delete any of the old log files?
-          if (this.outputfiles.size() > 0) {
-            if (this.lastSeqWritten.isEmpty()) {
-              LOG.debug("Last sequenceid written is empty. Deleting all old 
hlogs");
-              // If so, then no new writes have come in since all regions were
-              // flushed (and removed from the lastSeqWritten map). Means can
-              // remove all but currently open log file.
-              for (Map.Entry<Long, Path> e : this.outputfiles.entrySet()) {
-                archiveLogFile(e.getValue(), e.getKey());
-              }
-              this.outputfiles.clear();
-            } else {
-              regionsToFlush = cleanOldLogs();
-            }
+      if (closed) {
+        return regionsToFlush;
+      }
+      // Do all the preparation outside of the updateLock to block
+      // as less as possible the incoming writes
+      long currentFilenum = this.filenum;
+      this.filenum = System.currentTimeMillis();
+      Path newPath = computeFilename();
+      HLog.Writer nextWriter = this.createWriterInstance(fs, newPath, conf);
+      int nextInitialReplication = fs.getFileStatus(newPath).getReplication();
+      // Can we get at the dfsclient outputstream?  If an instance of
+      // SFLW, it'll have done the necessary reflection to get at the
+      // protected field name.
+      FSDataOutputStream nextHdfsOut = null;
+      if (nextWriter instanceof SequenceFileLogWriter) {
+        nextHdfsOut = 
((SequenceFileLogWriter)nextWriter).getWriterFSDataOutputStream();
+      }
+      // Tell our listeners that a new log was created
+      if (!this.listeners.isEmpty()) {
+        for (WALObserver i : this.listeners) {
+          i.logRolled(newPath);
+        }
+      }
+
+      synchronized (updateLock) {
+        // Clean up current writer.
+        Path oldFile = cleanupCurrentWriter(currentFilenum);
+        this.writer = nextWriter;
+        this.initialReplication = nextInitialReplication;
+        this.hdfs_out = nextHdfsOut;
+
+        LOG.info((oldFile != null?
+            "Roll " + FSUtils.getPath(oldFile) + ", entries=" +
+            this.numEntries.get() +
+            ", filesize=" +
+            this.fs.getFileStatus(oldFile).getLen() + ". ": "") +
+          "New hlog " + FSUtils.getPath(newPath));
+        this.numEntries.set(0);
+        this.logRollRequested = false;
+      }
+      // Can we delete any of the old log files?
+      if (this.outputfiles.size() > 0) {
+        if (this.lastSeqWritten.isEmpty()) {
+          LOG.debug("Last sequenceid written is empty. Deleting all old 
hlogs");
+          // If so, then no new writes have come in since all regions were
+          // flushed (and removed from the lastSeqWritten map). Means can
+          // remove all but currently open log file.
+          for (Map.Entry<Long, Path> e : this.outputfiles.entrySet()) {
+            archiveLogFile(e.getValue(), e.getKey());
           }
-        } finally {
-          this.cacheFlushLock.unlock();
+          this.outputfiles.clear();
+        } else {
+          regionsToFlush = cleanOldLogs();
         }
-      } else {
-          LOG.debug("Didn't obtain cacheFlushLock in time");
       }
-    } catch (InterruptedException e) {
-      LOG.warn("Interrupted rollWriter", e);
-      Thread.currentThread().interrupt();
-    }  
+    } finally {
+      this.cacheFlushLock.unlock();
+    }
     return regionsToFlush;
   }
 
@@ -1027,6 +1004,7 @@ public class HLog implements Syncable {
             this.initialReplication + " replicas. " +
             " Requesting close of hlog.");
         requestLogRoll();
+        logRollRequested = true;
       }
     } catch (Exception e) {
       LOG.warn("Unable to invoke DFSOutputStream.getNumCurrentReplicas" + e +

Modified: 
hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java?rev=1148715&r1=1148714&r2=1148715&view=diff
==============================================================================
--- 
hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java
 (original)
+++ 
hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java
 Wed Jul 20 12:15:03 2011
@@ -314,8 +314,7 @@ public class TestLogRolling  {
     writeData(table, 2);
     long newFilenum = log.getFilenum();
 
-    assertTrue("Missing datanode should've triggered a log roll: " + newFilenum
-                    + " " + oldFilenum + " " + curTime,
+    assertTrue("Missing datanode should've triggered a log roll",
         newFilenum > oldFilenum && newFilenum > curTime);
 
     // write some more log data (this should use a new hdfs_out)


Reply via email to