Author: enis
Date: Tue Apr  8 15:52:46 2014
New Revision: 1585768

URL: http://svn.apache.org/r1585768
Log:
HBASE-10859 Use HFileLink in opening region files from secondaries

Modified:
    
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
    
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
    
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
    
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileInfo.java
    
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java
    
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
    
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionReplicas.java
    
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java
    
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java

Modified: 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1585768&r1=1585767&r2=1585768&view=diff
==============================================================================
--- 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
 (original)
+++ 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
 Tue Apr  8 15:52:46 2014
@@ -637,25 +637,29 @@ public class HRegion implements HeapSize
     status.setStatus("Writing region info on filesystem");
     fs.checkRegionInfoOnFilesystem();
 
-    // Remove temporary data left over from old regions
-    status.setStatus("Cleaning up temporary data from old regions");
-    fs.cleanupTempDir();
-
     // Initialize all the HStores
     status.setStatus("Initializing all the Stores");
     long maxSeqId = initializeRegionStores(reporter, status);
 
-    status.setStatus("Cleaning up detritus from prior splits");
-    // Get rid of any splits or merges that were lost in-progress.  Clean out
-    // these directories here on open.  We may be opening a region that was
-    // being split but we crashed in the middle of it all.
-    fs.cleanupAnySplitDetritus();
-    fs.cleanupMergesDir();
-
     this.writestate.setReadOnly(ServerRegionReplicaUtil.isReadOnly(this));
     this.writestate.flushRequested = false;
     this.writestate.compacting = 0;
 
+    if (this.writestate.writesEnabled) {
+      // Remove temporary data left over from old regions
+      status.setStatus("Cleaning up temporary data from old regions");
+      fs.cleanupTempDir();
+    }
+
+    if (this.writestate.writesEnabled) {
+      status.setStatus("Cleaning up detritus from prior splits");
+      // Get rid of any splits or merges that were lost in-progress.  Clean out
+      // these directories here on open.  We may be opening a region that was
+      // being split but we crashed in the middle of it all.
+      fs.cleanupAnySplitDetritus();
+      fs.cleanupMergesDir();
+    }
+
     // Initialize split policy
     this.splitPolicy = RegionSplitPolicy.create(this, conf);
 
@@ -753,9 +757,12 @@ public class HRegion implements HeapSize
       }
     }
     mvcc.initialize(maxMemstoreTS + 1);
-    // Recover any edits if available.
-    maxSeqId = Math.max(maxSeqId, replayRecoveredEditsIfAny(
-        this.fs.getRegionDir(), maxSeqIdInStores, reporter, status));
+
+    if (ServerRegionReplicaUtil.shouldReplayRecoveredEdits(this)) {
+      // Recover any edits if available.
+      maxSeqId = Math.max(maxSeqId, replayRecoveredEditsIfAny(
+          this.fs.getRegionDir(), maxSeqIdInStores, reporter, status));
+    }
     return maxSeqId;
   }
 

Modified: 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java?rev=1585768&r1=1585767&r2=1585768&view=diff
==============================================================================
--- 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
 (original)
+++ 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
 Tue Apr  8 15:52:46 2014
@@ -192,8 +192,9 @@ public class HRegionFileSystem {
     ArrayList<StoreFileInfo> storeFiles = new 
ArrayList<StoreFileInfo>(files.length);
     for (FileStatus status: files) {
       if (!StoreFileInfo.isValid(status)) continue;
-
-      storeFiles.add(new StoreFileInfo(this.conf, this.fs, status));
+      StoreFileInfo info = ServerRegionReplicaUtil.getStoreFileInfo(conf, fs, 
regionInfo,
+        regionInfoForFs, familyName, status);
+      storeFiles.add(info);
     }
     return storeFiles;
   }

Modified: 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java?rev=1585768&r1=1585767&r2=1585768&view=diff
==============================================================================
--- 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
 (original)
+++ 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
 Tue Apr  8 15:52:46 2014
@@ -497,7 +497,7 @@ public class HStore implements Store {
       completionService.submit(new Callable<StoreFile>() {
         @Override
         public StoreFile call() throws IOException {
-          StoreFile storeFile = 
createStoreFileAndReader(storeFileInfo.getPath());
+          StoreFile storeFile = createStoreFileAndReader(storeFileInfo);
           return storeFile;
         }
       });
@@ -592,6 +592,10 @@ public class HStore implements Store {
 
   private StoreFile createStoreFileAndReader(final Path p) throws IOException {
     StoreFileInfo info = new StoreFileInfo(conf, this.getFileSystem(), p);
+    return createStoreFileAndReader(info);
+  }
+
+  private StoreFile createStoreFileAndReader(final StoreFileInfo info) throws 
IOException {
     info.setRegionCoprocessorHost(this.region.getCoprocessorHost());
     StoreFile storeFile = new StoreFile(this.getFileSystem(), info, this.conf, 
this.cacheConf,
       this.family.getBloomFilterType());

Modified: 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileInfo.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileInfo.java?rev=1585768&r1=1585767&r2=1585768&view=diff
==============================================================================
--- 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileInfo.java
 (original)
+++ 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileInfo.java
 Tue Apr  8 15:52:46 2014
@@ -19,6 +19,7 @@
 
 package org.apache.hadoop.hbase.regionserver;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -35,7 +36,6 @@ import org.apache.hadoop.hbase.io.FSData
 import org.apache.hadoop.hbase.io.HFileLink;
 import org.apache.hadoop.hbase.io.HalfStoreFileReader;
 import org.apache.hadoop.hbase.io.Reference;
-import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;
 import org.apache.hadoop.hbase.io.hfile.CacheConfig;
 import org.apache.hadoop.hbase.util.FSUtils;
 
@@ -133,6 +133,22 @@ public class StoreFileInfo implements Co
   }
 
   /**
+   * Create a Store File Info from an HFileLink
+   * @param conf the {@link Configuration} to use
+   * @param fs The current file system to use.
+   * @param fileStatus The {@link FileStatus} of the file
+   */
+  public StoreFileInfo(final Configuration conf, final FileSystem fs, final 
FileStatus fileStatus,
+      final HFileLink link)
+      throws IOException {
+    this.conf = conf;
+    this.fileStatus = fileStatus;
+      // HFileLink
+    this.reference = null;
+    this.link = link;
+  }
+
+  /**
    * Sets the region coprocessor env.
    * @param coprocessorHost
    */
@@ -195,6 +211,8 @@ public class StoreFileInfo implements Co
     long length = status.getLen();
     if (this.reference != null) {
       hdfsBlocksDistribution = computeRefFileHDFSBlockDistribution(fs, 
reference, status);
+    } else if (this.link != null) {
+      hdfsBlocksDistribution = computeHDFSBlocksDistribution(fs);
     } else {
       hdfsBlocksDistribution = FSUtils.computeHDFSBlocksDistribution(fs, 
status, 0, length);
     }
@@ -226,8 +244,18 @@ public class StoreFileInfo implements Co
     FileStatus status;
     if (this.reference != null) {
       if (this.link != null) {
-        // HFileLink Reference
-        status = link.getFileStatus(fs);
+        FileNotFoundException exToThrow = null;
+        for (int i = 0; i < this.link.getLocations().length; i++) {
+          // HFileLink Reference
+          try {
+            status = link.getFileStatus(fs);
+            return computeRefFileHDFSBlockDistribution(fs, reference, status);
+          } catch (FileNotFoundException ex) {
+            // try the other location
+            exToThrow = ex;
+          }
+        }
+        throw exToThrow;
       } else {
         // HFile Reference
         Path referencePath = getReferredToFile(this.getPath());
@@ -236,8 +264,18 @@ public class StoreFileInfo implements Co
       return computeRefFileHDFSBlockDistribution(fs, reference, status);
     } else {
       if (this.link != null) {
-        // HFileLink
-        status = link.getFileStatus(fs);
+        FileNotFoundException exToThrow = null;
+        for (int i = 0; i < this.link.getLocations().length; i++) {
+          // HFileLink
+          try {
+            status = link.getFileStatus(fs);
+            return FSUtils.computeHDFSBlocksDistribution(fs, status, 0, 
status.getLen());
+          } catch (FileNotFoundException ex) {
+            // try the other location
+            exToThrow = ex;
+          }
+        }
+        throw exToThrow;
       } else {
         status = this.fileStatus;
       }

Modified: 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java?rev=1585768&r1=1585767&r2=1585768&view=diff
==============================================================================
--- 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java
 (original)
+++ 
hbase/branches/hbase-10070/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java
 Tue Apr  8 15:52:46 2014
@@ -18,9 +18,16 @@
 
 package org.apache.hadoop.hbase.util;
 
+import java.io.IOException;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.client.RegionReplicaUtil;
+import org.apache.hadoop.hbase.io.HFileLink;
 import org.apache.hadoop.hbase.regionserver.HRegion;
+import org.apache.hadoop.hbase.regionserver.StoreFileInfo;
 
 /**
  * Similar to {@link RegionReplicaUtil} but for the server side
@@ -48,5 +55,39 @@ public class ServerRegionReplicaUtil ext
       || !isDefaultReplica(region.getRegionInfo());
   }
 
+  /**
+   * Returns whether to replay the recovered edits to flush the results.
+   * Currently secondary region replicas do not replay the edits, since it 
would
+   * cause flushes which might affect the primary region. Primary regions even 
opened
+   * in read only mode should replay the edits.
+   * @param region the HRegion object
+   * @return whether recovered edits should be replayed.
+   */
+  public static boolean shouldReplayRecoveredEdits(HRegion region) {
+    return isDefaultReplica(region.getRegionInfo());
+  }
+
+  /**
+   * Returns a StoreFileInfo from the given FileStatus. Secondary replicas 
refer to the
+   * files of the primary region, so an HFileLink is used to construct the 
StoreFileInfo. This
+   * way ensures that the secondary will be able to continue reading the store 
files even if
+   * they are moved to archive after compaction
+   * @throws IOException
+   */
+  public static StoreFileInfo getStoreFileInfo(Configuration conf, FileSystem 
fs,
+      HRegionInfo regionInfo, HRegionInfo regionInfoForFs, String familyName, 
FileStatus status)
+      throws IOException {
+
+    // if this is a primary region, just return the StoreFileInfo constructed 
from path
+    if (regionInfo.equals(regionInfoForFs)) {
+      return new StoreFileInfo(conf, fs, status);
+    }
+
+    // else create a store file link. The link file does not exists on 
filesystem though.
+    HFileLink link = new HFileLink(conf,
+      HFileLink.createPath(regionInfoForFs.getTable(), 
regionInfoForFs.getEncodedName()
+        , familyName, status.getPath().getName()));
+    return new StoreFileInfo(conf, fs, status, link);
+  }
 
 }

Modified: 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java?rev=1585768&r1=1585767&r2=1585768&view=diff
==============================================================================
--- 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
 (original)
+++ 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
 Tue Apr  8 15:52:46 2014
@@ -3928,6 +3928,7 @@ public class TestHRegion {
     // create a primary region, load some data and flush
     // create a secondary region, and do a get against that
     Path rootDir = new Path(DIR + "testRegionReplicaSecondary");
+    TEST_UTIL.getConfiguration().set(HConstants.HBASE_DIR, rootDir.toString());
 
     byte[][] families = new byte[][] {
         Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")
@@ -3977,6 +3978,7 @@ public class TestHRegion {
     // create a primary region, load some data and flush
     // create a secondary region, and do a put against that
     Path rootDir = new Path(DIR + "testRegionReplicaSecondary");
+    TEST_UTIL.getConfiguration().set(HConstants.HBASE_DIR, rootDir.toString());
 
     byte[][] families = new byte[][] {
         Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")
@@ -4024,7 +4026,60 @@ public class TestHRegion {
         HRegion.closeHRegion(secondaryRegion);
       }
     }
+  }
+
+  @Test
+  public void testCompactionFromPrimary() throws IOException {
+    Path rootDir = new Path(DIR + "testRegionReplicaSecondary");
+    TEST_UTIL.getConfiguration().set(HConstants.HBASE_DIR, rootDir.toString());
+
+    byte[][] families = new byte[][] {
+        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")
+    };
+    byte[] cq = Bytes.toBytes("cq");
+    HTableDescriptor htd = new 
HTableDescriptor(TableName.valueOf("testRegionReplicaSecondary"));
+    for (byte[] family : families) {
+      htd.addFamily(new HColumnDescriptor(family));
+    }
+
+    long time = System.currentTimeMillis();
+    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),
+      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,
+      false, time, 0);
+    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),
+      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,
+      false, time, 1);
+
+    HRegion primaryRegion = null, secondaryRegion = null;
 
+    try {
+      primaryRegion = HRegion.createHRegion(primaryHri,
+        rootDir, TEST_UTIL.getConfiguration(), htd);
+
+      // load some data
+      putData(primaryRegion, 0, 1000, cq, families);
+
+      // flush region
+      primaryRegion.flushcache();
+
+      // open secondary region
+      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, 
conf);
+
+      // move the file of the primary region to the archive, simulating a 
compaction
+      Collection<StoreFile> storeFiles = 
primaryRegion.getStore(families[0]).getStorefiles();
+      
primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]),
 storeFiles);
+      Collection<StoreFileInfo> storeFileInfos = 
primaryRegion.getRegionFileSystem().getStoreFiles(families[0]);
+      Assert.assertTrue(storeFileInfos == null || storeFileInfos.size() == 0);
+
+      verifyData(secondaryRegion, 0, 1000, cq, families);
+    } finally {
+      if (primaryRegion != null) {
+        HRegion.closeHRegion(primaryRegion);
+      }
+      if (secondaryRegion != null) {
+        HRegion.closeHRegion(secondaryRegion);
+      }
+    }
   }
 
   private void putData(int startRow, int numRows, byte[] qf, byte[]... 
families) throws IOException {

Modified: 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionReplicas.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionReplicas.java?rev=1585768&r1=1585767&r2=1585768&view=diff
==============================================================================
--- 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionReplicas.java
 (original)
+++ 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionReplicas.java
 Tue Apr  8 15:52:46 2014
@@ -19,6 +19,12 @@
 package org.apache.hadoop.hbase.regionserver;
 
 import java.io.IOException;
+import java.util.Random;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
@@ -29,6 +35,7 @@ import org.apache.hadoop.hbase.TableName
 import org.apache.hadoop.hbase.catalog.TestMetaReaderEditor;
 import org.apache.hadoop.hbase.client.Get;
 import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.protobuf.RequestConverter;
@@ -37,12 +44,14 @@ import org.apache.hadoop.hbase.protobuf.
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Threads;
 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
+import org.apache.hadoop.util.StringUtils;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
+import org.mortbay.log.Log;
 
 import com.google.protobuf.ServiceException;
 
@@ -296,4 +305,126 @@ public class TestRegionReplicas {
       closeRegion(hriSecondary);
     }
   }
+
+  @Test(timeout = 300000)
+  public void testFlushAndCompactionsInPrimary() throws Exception {
+
+    long runtime = 30 * 1000;
+    // enable store file refreshing
+    final int refreshPeriod = 100; // 100ms refresh is a lot
+    HTU.getConfiguration().setInt("hbase.hstore.compactionThreshold", 3);
+    
HTU.getConfiguration().setInt(StorefileRefresherChore.REGIONSERVER_STOREFILE_REFRESH_PERIOD,
 refreshPeriod);
+    // restart the region server so that it starts the refresher chore
+    restartRegionServer();
+    final int startKey = 0, endKey = 1000;
+
+    try {
+      openRegion(hriSecondary);
+
+      //load some data to primary so that reader won't fail
+      HTU.loadNumericRows(table, f, startKey, endKey);
+      HTU.getHBaseAdmin().flush(table.getTableName());
+      // ensure that chore is run
+      Threads.sleep(2 * refreshPeriod);
+
+      final AtomicBoolean running = new AtomicBoolean(true);
+      @SuppressWarnings("unchecked")
+      final AtomicReference<Exception>[] exceptions = new AtomicReference[3];
+      for (int i=0; i < exceptions.length; i++) {
+        exceptions[i] = new AtomicReference<Exception>();
+      }
+
+      Runnable writer = new Runnable() {
+        int key = startKey;
+        @Override
+        public void run() {
+          try {
+            while (running.get()) {
+              byte[] data = Bytes.toBytes(String.valueOf(key));
+              Put put = new Put(data);
+              put.add(f, null, data);
+              table.put(put);
+              key++;
+              if (key == endKey) key = startKey;
+            }
+          } catch (Exception ex) {
+            Log.warn(ex);
+            exceptions[0].compareAndSet(null, ex);
+          }
+        }
+      };
+
+      Runnable flusherCompactor = new Runnable() {
+        Random random = new Random();
+        @Override
+        public void run() {
+          try {
+            while (running.get()) {
+              // flush or compact
+              if (random.nextBoolean()) {
+                HTU.getHBaseAdmin().flush(table.getTableName());
+              } else {
+                HTU.compact(table.getName(), random.nextBoolean());
+              }
+            }
+          } catch (Exception ex) {
+            Log.warn(ex);
+            exceptions[1].compareAndSet(null, ex);
+          }
+        }
+      };
+
+      Runnable reader = new Runnable() {
+        Random random = new Random();
+        @Override
+        public void run() {
+          try {
+            while (running.get()) {
+              // whether to do a close and open
+              if (random.nextInt(10) == 0) {
+                try {
+                  closeRegion(hriSecondary);
+                } catch (Exception ex) {
+                  Log.warn("Failed closing the region " + hriSecondary + " "  
+ StringUtils.stringifyException(ex));
+                  exceptions[2].compareAndSet(null, ex);
+                }
+                try {
+                  openRegion(hriSecondary);
+                } catch (Exception ex) {
+                  Log.warn("Failed opening the region " + hriSecondary + " "  
+ StringUtils.stringifyException(ex));
+                  exceptions[2].compareAndSet(null, ex);
+                }
+              }
+
+              int key = random.nextInt(endKey - startKey) + startKey;
+              assertGetRpc(hriSecondary, key, true);
+            }
+          } catch (Exception ex) {
+            Log.warn("Failed getting the value in the region " + hriSecondary 
+ " "  + StringUtils.stringifyException(ex));
+            exceptions[2].compareAndSet(null, ex);
+          }
+        }
+      };
+
+      Log.info("Starting writer and reader");
+      ExecutorService executor = Executors.newFixedThreadPool(3);
+      executor.submit(writer);
+      executor.submit(flusherCompactor);
+      executor.submit(reader);
+
+      // wait for threads
+      Threads.sleep(runtime);
+      running.set(false);
+      executor.shutdown();
+      executor.awaitTermination(30, TimeUnit.SECONDS);
+
+      for (AtomicReference<Exception> exRef : exceptions) {
+        Assert.assertNull(exRef.get());
+      }
+
+    } finally {
+      HTU.deleteNumericRows(table, HConstants.CATALOG_FAMILY, startKey, 
endKey);
+      closeRegion(hriSecondary);
+    }
+  }
 }

Modified: 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java?rev=1585768&r1=1585767&r2=1585768&view=diff
==============================================================================
--- 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java
 (original)
+++ 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java
 Tue Apr  8 15:52:46 2014
@@ -81,6 +81,7 @@ import org.apache.hadoop.hbase.util.Incr
 import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;
 import org.apache.hadoop.util.Progressable;
 import org.junit.experimental.categories.Category;
+import org.junit.Test;
 import org.mockito.Mockito;
 
 import com.google.common.collect.Lists;
@@ -917,6 +918,7 @@ public class TestStore extends TestCase 
     store.getRegionFileSystem().removeStoreFiles(store.getColumnFamilyName(), 
Lists.newArrayList(sf));
   }
 
+  @Test
   public void testRefreshStoreFiles() throws Exception {
     init(this.getName());
 
@@ -963,6 +965,7 @@ public class TestStore extends TestCase 
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testRefreshStoreFilesNotChanged() throws IOException {
     init(this.getName());
 

Modified: 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java?rev=1585768&r1=1585767&r2=1585768&view=diff
==============================================================================
--- 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java
 (original)
+++ 
hbase/branches/hbase-10070/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java
 Tue Apr  8 15:52:46 2014
@@ -46,6 +46,7 @@ import org.apache.hadoop.hbase.client.Ge
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.FSUtils;
 import org.apache.hadoop.hbase.util.StoppableImplementation;
 import org.junit.Assert;
 import org.junit.Before;
@@ -62,6 +63,7 @@ public class TestStoreFileRefresherChore
   public void setUp() {
     TEST_UTIL = new HBaseTestingUtility();
     testDir = TEST_UTIL.getDataTestDir("TestStoreFileRefresherChore");
+    TEST_UTIL.getConfiguration().set(HConstants.HBASE_DIR, testDir.toString());
   }
 
   private HTableDescriptor getTableDesc(TableName tableName, byte[]... 
families) {
@@ -92,7 +94,7 @@ public class TestStoreFileRefresherChore
 
   private HRegion initHRegion(HTableDescriptor htd, byte[] startKey, byte[] 
stopKey, int replicaId) throws IOException {
     Configuration conf = TEST_UTIL.getConfiguration();
-    Path tableDir = new Path(testDir, htd.getTableName().getNameAsString());
+    Path tableDir = FSUtils.getTableDir(testDir, htd.getTableName());
 
     HRegionInfo info = new HRegionInfo(htd.getTableName(), startKey, stopKey, 
false, 0, replicaId);
 


Reply via email to