diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java index f3977c5..9b55684 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java @@ -60,6 +60,7 @@ import org.apache.hadoop.hbase.KeyValueUtil; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Get; +import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.io.compress.Compression; import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding; import org.apache.hadoop.hbase.io.hfile.CacheConfig; @@ -79,6 +80,7 @@ import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper; import org.apache.hadoop.hbase.util.FSUtils; import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge; import org.apache.hadoop.hbase.util.ManualEnvironmentEdge; +import org.apache.hadoop.hbase.util.Threads; import org.apache.hadoop.util.Progressable; import org.junit.After; import org.junit.Assert; @@ -190,6 +192,38 @@ public class TestStore { return store; } + @Test + public void testChangedReaderObserver() throws IOException, InterruptedException { + HColumnDescriptor hcd = new HColumnDescriptor(family); + init(name.getMethodName(), TEST_UTIL.getConfiguration(), hcd); + final int count = 1000000; + Scan scan = new Scan(); + ScanInfo info = new ScanInfo(this.store.getFamily(), -1, -1, null); + final StoreScanner [] scanners = new StoreScanner[count]; + for (int i = 0; i < count; i++) { + scanners[i] = new StoreScanner(this.store, info, scan, null, -1); + } + long start = System.currentTimeMillis(); + Thread [] threads = new Thread[10]; + for (int i = 0; i < 10; i++) { + threads[i] = new Thread() { + @Override + public void run() { + for (int i = 0; i < count; i++) { + store.addChangedReaderObserver(scanners[i]); + } + } + }; + } + for (int i = 0; i < 10; i++) { + threads[i].start(); + } + for (int i = 0; i < 10; i++) { + threads[i].join(); + } + System.out.println(System.currentTimeMillis() - start); + } + /** * Test we do not lose data if we fail a flush and then close. * Part of HBase-10466