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
|
// Iterate the input columns and update existing values if they were
|
||||||
// found, otherwise add new column initialized to the increment amount
|
// found, otherwise add new column initialized to the increment amount
|
||||||
int idx = 0;
|
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));
|
long amount = Bytes.toLong(CellUtil.cloneValue(cell));
|
||||||
boolean noWriteBack = (amount == 0);
|
boolean noWriteBack = (amount == 0);
|
||||||
List<Tag> newTags = new ArrayList<Tag>();
|
List<Tag> newTags = new ArrayList<Tag>();
|
||||||
|
|
||||||
// Carry forward any tags that might have been added by a coprocessor
|
// Carry forward any tags that might have been added by a coprocessor
|
||||||
if (cell.getTagsLength() > 0) {
|
if (cell.getTagsLength() > 0) {
|
||||||
Iterator<Tag> i = CellUtil.tagsIterator(cell.getTagsArray(),
|
Iterator<Tag> itr = CellUtil.tagsIterator(cell.getTagsArray(),
|
||||||
cell.getTagsOffset(), cell.getTagsLength());
|
cell.getTagsOffset(), cell.getTagsLength());
|
||||||
while (i.hasNext()) {
|
while (itr.hasNext()) {
|
||||||
newTags.add(i.next());
|
newTags.add(itr.next());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6689,12 +6691,13 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver { //
|
||||||
}
|
}
|
||||||
// Carry tags forward from previous version
|
// Carry tags forward from previous version
|
||||||
if (c.getTagsLength() > 0) {
|
if (c.getTagsLength() > 0) {
|
||||||
Iterator<Tag> i = CellUtil.tagsIterator(c.getTagsArray(),
|
Iterator<Tag> itr = CellUtil.tagsIterator(c.getTagsArray(),
|
||||||
c.getTagsOffset(), c.getTagsLength());
|
c.getTagsOffset(), c.getTagsLength());
|
||||||
while (i.hasNext()) {
|
while (itr.hasNext()) {
|
||||||
newTags.add(i.next());
|
newTags.add(itr.next());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (i < ( edits.size() - 1) && !CellUtil.matchingQualifier(cell, edits.get(i + 1)))
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4606,6 +4606,49 @@ public class TestFromClientSide {
|
||||||
assertIncrementKey(kvs[2], ROW, FAMILY, QUALIFIERS[2], 2);
|
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
|
@Test
|
||||||
public void testIncrement() throws Exception {
|
public void testIncrement() throws Exception {
|
||||||
LOG.info("Starting testIncrement");
|
LOG.info("Starting testIncrement");
|
||||||
|
|
Loading…
Reference in New Issue