You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by en...@apache.org on 2015/11/25 05:33:00 UTC
[3/6] hbase git commit: HBASE-14689 Addendum and unit test for
HBASE-13471
HBASE-14689 Addendum and unit test for HBASE-13471
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/1862b584
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/1862b584
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/1862b584
Branch: refs/heads/branch-1.2
Commit: 1862b58425ba639e1969e0e4aca1f2a8c53dadfe
Parents: a4613f0
Author: Enis Soztutar <en...@apache.org>
Authored: Tue Nov 24 19:15:09 2015 -0800
Committer: Enis Soztutar <en...@apache.org>
Committed: Tue Nov 24 19:17:58 2015 -0800
----------------------------------------------------------------------
.../hadoop/hbase/regionserver/HRegion.java | 1 -
.../hadoop/hbase/regionserver/TestHRegion.java | 72 +++++++++++++++++++-
2 files changed, 70 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/1862b584/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
index d851904..f86b3cc 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
@@ -3003,7 +3003,6 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
}
if (rowLock == null) {
// We failed to grab another lock
- assert false: "Should never fail to get lock when blocking";
break; // stop acquiring more rows for this batch
} else {
acquiredRowLocks.add(rowLock);
http://git-wip-us.apache.org/repos/asf/hbase/blob/1862b584/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
index e755590..072eff2 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
@@ -56,7 +56,12 @@ import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;
import java.util.UUID;
+import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
@@ -100,6 +105,7 @@ import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Increment;
+import org.apache.hadoop.hbase.client.Mutation;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.RowMutations;
@@ -6075,7 +6081,7 @@ public class TestHRegion {
key.setWriteEntry(we);
return 1L;
}
-
+
});
return wal;
}
@@ -6098,7 +6104,7 @@ public class TestHRegion {
// capture append() calls
WAL wal = mockWAL();
when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);
-
+
// open a region first so that it can be closed later
region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),
@@ -6405,6 +6411,68 @@ public class TestHRegion {
qual2, 0, qual2.length));
}
+ @Test(timeout = 60000)
+ public void testBatchMutateWithWrongRegionException() throws Exception {
+ final byte[] a = Bytes.toBytes("a");
+ final byte[] b = Bytes.toBytes("b");
+ final byte[] c = Bytes.toBytes("c"); // exclusive
+
+ int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);
+ CONF.setInt("hbase.rowlock.wait.duration", 1000);
+ final HRegion region = initHRegion(tableName, a, c, name.getMethodName(), CONF, false, fam1);
+
+ Mutation[] mutations = new Mutation[] {
+ new Put(a).addImmutable(fam1, null, null),
+ new Put(c).addImmutable(fam1, null, null), // this is outside the region boundary
+ new Put(b).addImmutable(fam1, null, null),
+ };
+
+ OperationStatus[] status = region.batchMutate(mutations);
+ assertEquals(status[0].getOperationStatusCode(), OperationStatusCode.SUCCESS);
+ assertEquals(status[1].getOperationStatusCode(), OperationStatusCode.SANITY_CHECK_FAILURE);
+ assertEquals(status[2].getOperationStatusCode(), OperationStatusCode.SUCCESS);
+
+
+ // test with a row lock held for a long time
+ final CountDownLatch obtainedRowLock = new CountDownLatch(1);
+ ExecutorService exec = Executors.newFixedThreadPool(2);
+ Future<Void> f1 = exec.submit(new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ LOG.info("Acquiring row lock");
+ RowLock rl = region.getRowLock(b);
+ obtainedRowLock.countDown();
+ LOG.info("Waiting for 5 seconds before releasing lock");
+ Threads.sleep(5000);
+ LOG.info("Releasing row lock");
+ rl.release();
+ return null;
+ }
+ });
+ obtainedRowLock.await(30, TimeUnit.SECONDS);
+
+ Future<Void> f2 = exec.submit(new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ Mutation[] mutations = new Mutation[] {
+ new Put(a).addImmutable(fam1, null, null),
+ new Put(b).addImmutable(fam1, null, null),
+ };
+
+ // this will wait for the row lock, and it will eventually succeed
+ OperationStatus[] status = region.batchMutate(mutations);
+ assertEquals(status[0].getOperationStatusCode(), OperationStatusCode.SUCCESS);
+ assertEquals(status[1].getOperationStatusCode(), OperationStatusCode.SUCCESS);
+ return null;
+ }
+ });
+
+ f1.get();
+ f2.get();
+
+ CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);
+ }
+
@Test
public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {
HRegion region = initHRegion(tableName, name.getMethodName(), CONF, fam1);