HBASE-12948 Calling Increment#addColumn on the same column multiple times produces wrong result (hongyu bi)

This commit is contained in:
tedyu 2015-02-17 12:41:18 -08:00
parent ea0bdd3df1
commit d10639dcc2
2 changed files with 55 additions and 9 deletions

View File

@ -6661,17 +6661,19 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver { //
// Iterate the input columns and update existing values if they were
// found, otherwise add new column initialized to the increment amount
int idx = 0;
for (Cell cell: family.getValue()) {
List<Cell> edits = family.getValue();
for (int i = 0; i < edits.size(); i++) {
Cell cell = edits.get(i);
long amount = Bytes.toLong(CellUtil.cloneValue(cell));
boolean noWriteBack = (amount == 0);
List<Tag> newTags = new ArrayList<Tag>();
// Carry forward any tags that might have been added by a coprocessor
if (cell.getTagsLength() > 0) {
Iterator<Tag> i = CellUtil.tagsIterator(cell.getTagsArray(),
Iterator<Tag> itr = CellUtil.tagsIterator(cell.getTagsArray(),
cell.getTagsOffset(), cell.getTagsLength());
while (i.hasNext()) {
newTags.add(i.next());
while (itr.hasNext()) {
newTags.add(itr.next());
}
}
@ -6689,12 +6691,13 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver { //
}
// Carry tags forward from previous version
if (c.getTagsLength() > 0) {
Iterator<Tag> i = CellUtil.tagsIterator(c.getTagsArray(),
Iterator<Tag> itr = CellUtil.tagsIterator(c.getTagsArray(),
c.getTagsOffset(), c.getTagsLength());
while (i.hasNext()) {
newTags.add(i.next());
while (itr.hasNext()) {
newTags.add(itr.next());
}
}
if (i < ( edits.size() - 1) && !CellUtil.matchingQualifier(cell, edits.get(i + 1)))
idx++;
}

View File

@ -4606,6 +4606,49 @@ public class TestFromClientSide {
assertIncrementKey(kvs[2], ROW, FAMILY, QUALIFIERS[2], 2);
}
@Test
public void testIncrementOnSameColumn() throws Exception {
LOG.info("Starting testIncrementOnSameColumn");
final byte[] TABLENAME = Bytes.toBytes("testIncrementOnSameColumn");
HTable ht = TEST_UTIL.createTable(TABLENAME, FAMILY);
byte[][] QUALIFIERS =
new byte[][] { Bytes.toBytes("A"), Bytes.toBytes("B"), Bytes.toBytes("C") };
Increment inc = new Increment(ROW);
for (int i = 0; i < QUALIFIERS.length; i++) {
inc.addColumn(FAMILY, QUALIFIERS[i], 1);
inc.addColumn(FAMILY, QUALIFIERS[i], 1);
}
ht.increment(inc);
// Verify expected results
Result r = ht.get(new Get(ROW));
Cell[] kvs = r.rawCells();
assertEquals(3, kvs.length);
assertIncrementKey(kvs[0], ROW, FAMILY, QUALIFIERS[0], 1);
assertIncrementKey(kvs[1], ROW, FAMILY, QUALIFIERS[1], 1);
assertIncrementKey(kvs[2], ROW, FAMILY, QUALIFIERS[2], 1);
// Now try multiple columns again
inc = new Increment(ROW);
for (int i = 0; i < QUALIFIERS.length; i++) {
inc.addColumn(FAMILY, QUALIFIERS[i], 1);
inc.addColumn(FAMILY, QUALIFIERS[i], 1);
}
ht.increment(inc);
// Verify
r = ht.get(new Get(ROW));
kvs = r.rawCells();
assertEquals(3, kvs.length);
assertIncrementKey(kvs[0], ROW, FAMILY, QUALIFIERS[0], 2);
assertIncrementKey(kvs[1], ROW, FAMILY, QUALIFIERS[1], 2);
assertIncrementKey(kvs[2], ROW, FAMILY, QUALIFIERS[2], 2);
ht.close();
}
@Test
public void testIncrement() throws Exception {
LOG.info("Starting testIncrement");