Repository: hbase Updated Branches: refs/heads/0.98 309e124a5 -> 6c16f9445
HBASE-13134 mutateRow and checkAndMutate apis don't throw region level exceptions (Francis Liu) Conflicts: hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java Amending-Author: Andrew Purtell <apurt...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/6c16f944 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/6c16f944 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/6c16f944 Branch: refs/heads/0.98 Commit: 6c16f94454f5b0136538bf0a2f994009ab4806ab Parents: 309e124 Author: tedyu <yuzhih...@gmail.com> Authored: Mon Mar 2 17:06:57 2015 -0800 Committer: Andrew Purtell <apurt...@apache.org> Committed: Mon Mar 2 17:06:57 2015 -0800 ---------------------------------------------------------------------- .../org/apache/hadoop/hbase/client/HTable.java | 23 +++++++++++++++++--- .../hadoop/hbase/client/TestCheckAndMutate.java | 16 +++++++++++++- .../hadoop/hbase/client/TestFromClientSide.java | 11 ++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/6c16f944/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java index 83c2071..a190237 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java @@ -1046,9 +1046,17 @@ public class HTable implements HTableInterface { regionMutationBuilder.setAtomic(true); MultiRequest request = MultiRequest.newBuilder().addRegionAction(regionMutationBuilder.build()).build(); - PayloadCarryingRpcController pcrc = rpcControllerFactory.newController(); - pcrc.setPriority(tableName); - getStub().multi(pcrc, request); + PayloadCarryingRpcController controller = rpcControllerFactory.newController(); + controller.setPriority(tableName); + ClientProtos.MultiResponse response = getStub().multi(controller, request); + ClientProtos.RegionActionResult res = response.getRegionActionResultList().get(0); + if (res.hasException()) { + Throwable ex = ProtobufUtil.toException(res.getException()); + if(ex instanceof IOException) { + throw (IOException)ex; + } + throw new IOException("Failed to mutate row: "+Bytes.toStringBinary(rm.getRow()), ex); + } } catch (ServiceException se) { throw ProtobufUtil.getRemoteException(se); } @@ -1257,6 +1265,15 @@ public class HTable implements HTableInterface { getLocation().getRegionInfo().getRegionName(), row, family, qualifier, new BinaryComparator(value), compareType, rm); ClientProtos.MultiResponse response = getStub().multi(controller, request); + ClientProtos.RegionActionResult res = response.getRegionActionResultList().get(0); + if (res.hasException()) { + Throwable ex = ProtobufUtil.toException(res.getException()); + if(ex instanceof IOException) { + throw (IOException)ex; + } + throw new IOException("Failed to checkAndMutate row: "+ + Bytes.toStringBinary(rm.getRow()), ex); + } return Boolean.valueOf(response.getProcessed()); } catch (ServiceException se) { throw ProtobufUtil.getRemoteException(se); http://git-wip-us.apache.org/repos/asf/hbase/blob/6c16f944/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCheckAndMutate.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCheckAndMutate.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCheckAndMutate.java index 2e48aba..e22f072 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCheckAndMutate.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCheckAndMutate.java @@ -22,6 +22,7 @@ import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.filter.CompareFilter; +import org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException; import org.apache.hadoop.hbase.util.Bytes; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -29,6 +30,7 @@ import org.junit.Test; import org.junit.experimental.categories.Category; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; @Category(MediumTests.class) public class TestCheckAndMutate { @@ -96,8 +98,20 @@ public class TestCheckAndMutate { Bytes.toString(result.getValue(family, Bytes.toBytes("B"))).equals("b")); assertTrue("Column C should not exist", result.getValue(family, Bytes.toBytes("C")) == null); + + //Test that we get a region level exception + try { + Put p = new Put(rowKey); + p.add(new byte[]{'b', 'o', 'g', 'u', 's'}, new byte[]{'A'}, new byte[0]); + rm = new RowMutations(rowKey); + rm.add(p); + table.checkAndMutate(rowKey, family, Bytes.toBytes("A"), CompareFilter.CompareOp.EQUAL, + Bytes.toBytes("a"), rm); + fail("Expected NoSuchColumnFamilyException"); + } catch(NoSuchColumnFamilyException e) { + } } finally { table.close(); } } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/hbase/blob/6c16f944/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java index 7eae85a..fb935b4 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java @@ -4515,6 +4515,17 @@ public class TestFromClientSide { r = t.get(g); assertEquals(0, Bytes.compareTo(VALUE, r.getValue(FAMILY, QUALIFIERS[1]))); assertNull(r.getValue(FAMILY, QUALIFIERS[0])); + + //Test that we get a region level exception + try { + arm = new RowMutations(ROW); + p = new Put(ROW); + p.add(new byte[]{'b', 'o', 'g', 'u', 's'}, QUALIFIERS[0], VALUE); + arm.add(p); + t.mutateRow(arm); + fail("Expected NoSuchColumnFamilyException"); + } catch(NoSuchColumnFamilyException e) { + } } @Test