Repository: hbase
Updated Branches:
  refs/heads/branch-1.0 f92c2fbc0 -> ca8846eee


HBASE-12339 WALPerformanceEvaluation should have a log roller.


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/ca8846ee
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/ca8846ee
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/ca8846ee

Branch: refs/heads/branch-1.0
Commit: ca8846eeef1cc980194924038f831817eca67a0e
Parents: f92c2fb
Author: Sean Busbey <bus...@apache.org>
Authored: Sun Oct 26 23:53:45 2014 -0500
Committer: Enis Soztutar <e...@apache.org>
Committed: Tue Jan 6 11:24:38 2015 -0800

----------------------------------------------------------------------
 .../hadoop/hbase/regionserver/LogRoller.java    |  5 +++-
 .../hadoop/hbase/MockRegionServerServices.java  | 28 +++++++++++++++-----
 .../hbase/wal/WALPerformanceEvaluation.java     | 20 ++++++++++----
 3 files changed, 40 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/ca8846ee/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java
index aa5998b..3dcc69e 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java
@@ -40,6 +40,8 @@ import java.io.IOException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.ReentrantLock;
 
+import com.google.common.annotations.VisibleForTesting;
+
 /**
  * Runs periodically to determine if the WAL should be rolled.
  *
@@ -50,7 +52,8 @@ import java.util.concurrent.locks.ReentrantLock;
  * TODO: change to a pool of threads
  */
 @InterfaceAudience.Private
-class LogRoller extends HasThread {
+@VisibleForTesting
+public class LogRoller extends HasThread {
   static final Log LOG = LogFactory.getLog(LogRoller.class);
   private final ReentrantLock rollLock = new ReentrantLock();
   private final AtomicBoolean rollLog = new AtomicBoolean(false);

http://git-wip-us.apache.org/repos/asf/hbase/blob/ca8846ee/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java
index 013f0ef..347279e 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java
@@ -23,7 +23,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.hbase.client.ClusterConnection;
@@ -51,28 +54,36 @@ import com.google.protobuf.Service;
 /**
  * Basic mock region server services.  Should only be instantiated by 
HBaseTestingUtility.b
  */
-class MockRegionServerServices implements RegionServerServices {
+public class MockRegionServerServices implements RegionServerServices {
+  protected static final Log LOG = 
LogFactory.getLog(MockRegionServerServices.class);
   private final Map<String, HRegion> regions = new HashMap<String, HRegion>();
-  private boolean stopping = false;
   private final ConcurrentSkipListMap<byte[], Boolean> rit =
     new ConcurrentSkipListMap<byte[], Boolean>(Bytes.BYTES_COMPARATOR);
   private HFileSystem hfs = null;
+  private final Configuration conf;
   private ZooKeeperWatcher zkw = null;
   private ServerName serverName = null;
   private RpcServerInterface rpcServer = null;
   private volatile boolean abortRequested;
+  private volatile boolean stopping = false;
+  private final AtomicBoolean running = new AtomicBoolean(true);
 
   MockRegionServerServices(ZooKeeperWatcher zkw) {
-    this.zkw = zkw;
+    this(zkw, null);
   }
 
   MockRegionServerServices(ZooKeeperWatcher zkw, ServerName serverName) {
     this.zkw = zkw;
     this.serverName = serverName;
+    this.conf = (zkw == null ? new Configuration() : zkw.getConfiguration());
   }
 
   MockRegionServerServices(){
-    this(null);
+    this(null, null);
+  }
+
+  public MockRegionServerServices(Configuration conf) {
+    this.conf = conf;
   }
 
   @Override
@@ -165,7 +176,7 @@ class MockRegionServerServices implements 
RegionServerServices {
 
   @Override
   public Configuration getConfiguration() {
-    return zkw == null ? null : zkw.getConfiguration();
+    return conf;
   }
 
   @Override
@@ -176,12 +187,15 @@ class MockRegionServerServices implements 
RegionServerServices {
 
   @Override
   public void stop(String why) {
-    //no-op
+    this.stopping = true;
+    if (running.compareAndSet(true, false)) {
+      LOG.info("Shutting down due to request '" + why + "'");
+    }
   }
 
   @Override
   public boolean isStopped() {
-    return false;
+    return !(running.get());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/hbase/blob/ca8846ee/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/WALPerformanceEvaluation.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/WALPerformanceEvaluation.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/WALPerformanceEvaluation.java
index bfc7147..bf8fba0 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/WALPerformanceEvaluation.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/WALPerformanceEvaluation.java
@@ -44,15 +44,18 @@ import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.MockRegionServerServices;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.io.crypto.KeyProviderForTesting;
 import org.apache.hadoop.hbase.regionserver.HRegion;
+import org.apache.hadoop.hbase.regionserver.LogRoller;
 import org.apache.hadoop.hbase.trace.SpanReceiverHost;
 import org.apache.hadoop.hbase.wal.WALProvider.Writer;
 import org.apache.hadoop.hbase.wal.WAL;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.FSUtils;
+import org.apache.hadoop.hbase.util.Threads;
 import org.apache.hadoop.util.Tool;
 import org.apache.hadoop.util.ToolRunner;
 import org.htrace.Sampler;
@@ -313,13 +316,16 @@ public final class WALPerformanceEvaluation extends 
Configured implements Tool {
       final WALFactory wals = new WALFactory(getConf(), null, "wals");
       final HRegion[] regions = new HRegion[numRegions];
       final Runnable[] benchmarks = new Runnable[numRegions];
+      final MockRegionServerServices mockServices = new 
MockRegionServerServices(getConf());
+      final LogRoller roller = new LogRoller(mockServices, mockServices);
+      Threads.setDaemonThreadRunning(roller.getThread(), 
"WALPerfEval.logRoller");
 
       try {
         for(int i = 0; i < numRegions; i++) {
           // Initialize Table Descriptor
           // a table per desired region means we can avoid carving up the key 
space
           final HTableDescriptor htd = createHTableDescriptor(i, numFamilies);
-          regions[i] = openRegion(fs, rootRegionDir, htd, wals, roll);
+          regions[i] = openRegion(fs, rootRegionDir, htd, wals, roll, roller);
           benchmarks[i] = Trace.wrap(new WALPutBenchmark(regions[i], htd, 
numIterations, noSync,
               syncInterval, traceFreq));
         }
@@ -335,6 +341,7 @@ public final class WALPerformanceEvaluation extends 
Configured implements Tool {
           }
         }
         if (verify) {
+          LOG.info("verifying written log entries.");
           Path dir = new Path(FSUtils.getRootDir(getConf()),
               DefaultWALProvider.getWALDirectoryName("wals"));
           long editCount = 0;
@@ -351,11 +358,16 @@ public final class WALPerformanceEvaluation extends 
Configured implements Tool {
           }
         }
       } finally {
+        mockServices.stop("test clean up.");
         for (int i = 0; i < numRegions; i++) {
           if (regions[i] != null) {
             closeRegion(regions[i]);
           }
         }
+        if (null != roller) {
+          LOG.info("shutting down log roller.");
+          Threads.shutdown(roller.getThread());
+        }
         wals.shutdown();
         // Remove the root dir for this test region
         if (cleanup) cleanRegionRootDir(fs, rootRegionDir);
@@ -465,13 +477,14 @@ public final class WALPerformanceEvaluation extends 
Configured implements Tool {
   private final Set<WAL> walsListenedTo = new HashSet<WAL>();
 
   private HRegion openRegion(final FileSystem fs, final Path dir, final 
HTableDescriptor htd,
-      final WALFactory wals, final long whenToRoll) throws IOException {
+      final WALFactory wals, final long whenToRoll, final LogRoller roller) 
throws IOException {
     // Initialize HRegion
     HRegionInfo regionInfo = new HRegionInfo(htd.getTableName());
     // Initialize WAL
     final WAL wal = wals.getWAL(regionInfo.getEncodedNameAsBytes());
     // If we haven't already, attach a listener to this wal to handle rolls 
and metrics.
     if (walsListenedTo.add(wal)) {
+      roller.addWAL(wal);
       wal.registerWALActionsListener(new WALActionsListener.Base() {
         private int appends = 0;
 
@@ -484,8 +497,6 @@ public final class WALPerformanceEvaluation extends 
Configured implements Tool {
             // We used to do explicit call to rollWriter but changed it to a 
request
             // to avoid dead lock (there are less threads going on in this 
class than
             // in the regionserver -- regionserver does not have the issue).
-            // TODO I think this means no rolling actually happens; the 
request relies on there
-            // being a LogRoller.
             DefaultWALProvider.requestLogRoll(wal);
           }
         }
@@ -502,7 +513,6 @@ public final class WALPerformanceEvaluation extends 
Configured implements Tool {
           appendMeter.mark(size);
         }
       });
-      wal.rollWriter();
     }
      
     return HRegion.createHRegion(regionInfo, dir, getConf(), htd, wal);

Reply via email to