HBASE-12948 Calling Increment#addColumn on the same column multiple times produces wrong result (hongyu bi)
This commit is contained in:
parent
ea0bdd3df1
commit
d10639dcc2
|
@ -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++;
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue