diff --git src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 8974f49..e4edf19 100644 --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -67,6 +67,7 @@ import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Increment; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.client.Row; import org.apache.hadoop.hbase.client.RowLock; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.filter.Filter; @@ -1520,7 +1521,11 @@ public class HRegion implements HeapSize { // , Writable{ checkResources(); boolean isPut = w instanceof Put; if (!isPut && !(w instanceof Delete)) - throw new IOException("Action must be Put or Delete"); + throw new DoNotRetryIOException("Action must be Put or Delete"); + Row r = (Row)w; + if (Bytes.compareTo(row, r.getRow()) != 0) { + throw new DoNotRetryIOException("Action's getRow must match the passed row"); + } startRegionOperation(); try { diff --git src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java index 48a7011..f897b59 100644 --- src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java +++ src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java @@ -34,6 +34,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HBaseTestCase; import org.apache.hadoop.hbase.HBaseTestingUtility; @@ -96,6 +97,8 @@ public class TestHRegion extends HBaseTestCase { protected final byte[] value1 = Bytes.toBytes("value1"); protected final byte[] value2 = Bytes.toBytes("value2"); protected final byte [] row = Bytes.toBytes("rowA"); + protected final byte [] row2 = Bytes.toBytes("rowB"); + /** * @see org.apache.hadoop.hbase.HBaseTestCase#setUp() @@ -605,6 +608,20 @@ public class TestHRegion extends HBaseTestCase { } + public void testCheckAndPut_wrongRowInPut() throws IOException { + initHRegion(tableName, this.getName(), COLUMNS); + + Put put = new Put(row2); + put.add(fam1, qual1, value1); + try { + boolean res = region.checkAndMutate(row, + fam1, qual1, value2, put, null, false); + fail(); + } catch (DoNotRetryIOException expected) { + // expected exception. + } + } + public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException{ byte [] tableName = Bytes.toBytes("testtable"); byte [] row1 = Bytes.toBytes("row1");