[
https://issues.apache.org/jira/browse/HBASE-17096?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15666193#comment-15666193
]
Andrew Purtell commented on HBASE-17096:
----------------------------------------
My first attempt at a reproduction using a new unit in HRegion tests did not
reproduce the behavior.
{code}
@Test
public void testCheckAndMutate_HBASE17096() throws IOException {
byte[] row = Bytes.toBytes("ROW");
byte[] qualifier = Bytes.toBytes("QUALIFIER");
byte[] oldValue = null;
byte[] newValue = Bytes.toBytes("VALUE");
// Setting up region
String method = this.getName();
this.region = initHRegion(tableName, method, CONF, fam1);
try {
Put put = new Put(row);
put.add(fam1, qualifier, newValue);
assertTrue(region.checkAndMutate(row, fam1, qualifier, CompareOp.EQUAL,
new BinaryComparator(oldValue), put, true));
Delete delete = new Delete(row);
assertTrue(region.checkAndMutate(row, fam1, qualifier, CompareOp.EQUAL,
new BinaryComparator(newValue), delete, true));
assertFalse(region.checkAndMutate(row, fam1, qualifier, CompareOp.EQUAL,
new BinaryComparator(newValue), delete, true));
} finally {
HRegion.closeHRegion(this.region);
this.region = null;
}
}
{code}
This bypasses the client side, RPC processing, and does not specify a TTL in
the schema. I'll try again now with a closer approximation as a new unit for
client side tests.
> checkAndMutateApi doesn't work correctly on 0.98.19+
> ----------------------------------------------------
>
> Key: HBASE-17096
> URL: https://issues.apache.org/jira/browse/HBASE-17096
> Project: HBase
> Issue Type: Bug
> Reporter: Samarth Jain
>
> Below is the test case. It uses some Phoenix APIs for getting hold of admin
> and HConnection but should be easily adopted for an HBase IT test. The second
> checkAndMutate should return false but it is returning true. This test fails
> with HBase-0.98.23 and works fine with HBase-0.98.17
> {code}
> @Test
> public void testCheckAndMutateApi() throws Exception {
> byte[] row = Bytes.toBytes("ROW");
> byte[] tableNameBytes = Bytes.toBytes(generateUniqueName());
> byte[] family = Bytes.toBytes(generateUniqueName());
> byte[] qualifier = Bytes.toBytes("QUALIFIER");
> byte[] oldValue = null;
> byte[] newValue = Bytes.toBytes("VALUE");
> Put put = new Put(row);
> put.add(family, qualifier, newValue);
> try (Connection conn = DriverManager.getConnection(getUrl())) {
> PhoenixConnection phxConn = conn.unwrap(PhoenixConnection.class);
> try (HBaseAdmin admin = phxConn.getQueryServices().getAdmin()) {
> HTableDescriptor tableDesc = new HTableDescriptor(
> TableName.valueOf(tableNameBytes));
> HColumnDescriptor columnDesc = new HColumnDescriptor(family);
> columnDesc.setTimeToLive(120);
> tableDesc.addFamily(columnDesc);
> admin.createTable(tableDesc);
> HTableInterface tableDescriptor =
> admin.getConnection().getTable(tableNameBytes);
> assertTrue(tableDescriptor.checkAndPut(row, family,
> qualifier, oldValue, put));
> Delete delete = new Delete(row);
> RowMutations mutations = new RowMutations(row);
> mutations.add(delete);
> assertTrue(tableDescriptor.checkAndMutate(row, family,
> qualifier, CompareOp.EQUAL, newValue, mutations));
> assertFalse(tableDescriptor.checkAndMutate(row, family,
> qualifier, CompareOp.EQUAL, newValue, mutations));
> }
> }
> }
> {code}
> FYI, [~apurtell], [~jamestaylor], [~lhofhansl].
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)