diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 97c60c3c561..afa7b84b865 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -7870,8 +7870,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi /** * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not - * always the same dependent on whether to write WAL or if the amount to increment is zero (in - * this case we write back nothing, just return latest Cell value to the client). + * always the same dependent on whether to write WAL. * * @param results Fill in here what goes back to the Client if it is non-null (if null, client * doesn't want results). @@ -7913,9 +7912,8 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi * @param op Whether Increment or Append * @param mutation The encompassing Mutation object * @param deltas Changes to apply to this Store; either increment amount or data to append - * @param results In here we accumulate all the Cells we are to return to the client; this List - * can be larger than what we return in case where delta is zero; i.e. don't write - * out new values, just return current value. If null, client doesn't want results returned. + * @param results In here we accumulate all the Cells we are to return to the client. If null, + * client doesn't want results returned. * @return Resulting Cells after deltas have been applied to current * values. Side effect is our filling out of the results List. */ @@ -7943,33 +7941,25 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi for (int i = 0; i < deltas.size(); i++) { Cell delta = deltas.get(i); Cell currentValue = null; - boolean firstWrite = false; if (currentValuesIndex < currentValues.size() && CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) { currentValue = currentValues.get(currentValuesIndex); if (i < (deltas.size() - 1) && !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) { currentValuesIndex++; } - } else { - firstWrite = true; } // Switch on whether this an increment or an append building the new Cell to apply. Cell newCell = null; MutationType mutationType = null; - boolean apply = true; switch (op) { case INCREMENT: mutationType = MutationType.INCREMENT; - // If delta amount to apply is 0, don't write WAL or MemStore. long deltaAmount = getLongValue(delta); - // TODO: Does zero value mean reset Cell? For example, the ttl. - apply = deltaAmount != 0; final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount; newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -> Bytes.toBytes(newValue)); break; case APPEND: mutationType = MutationType.APPEND; - // Always apply Append. TODO: Does empty delta value mean reset Cell? It seems to. newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -> ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()]) .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength()) @@ -7985,10 +7975,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi newCell = coprocessorHost.postMutationBeforeWAL(mutationType, mutation, currentValue, newCell); } - // If apply, we need to update memstore/WAL with new value; add it toApply. - if (apply || firstWrite) { - toApply.add(newCell); - } + toApply.add(newCell); // Add to results to get returned to the Client. If null, cilent does not want results. if (results != null) { results.add(newCell); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestDurability.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestDurability.java index 4effa6de115..320bcbfc32a 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestDurability.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestDurability.java @@ -208,14 +208,13 @@ public class TestDurability { assertEquals(1, Bytes.toLong(res.getValue(FAMILY, col1))); verifyWALCount(wals, wal, 2); - // col1: amount = 0, 0 write back to WAL + // col1: amount = 0, 1 write back to WAL inc1 = new Increment(row1); inc1.addColumn(FAMILY, col1, 0); res = region.increment(inc1); assertEquals(1, res.size()); assertEquals(1, Bytes.toLong(res.getValue(FAMILY, col1))); - verifyWALCount(wals, wal, 2); - + verifyWALCount(wals, wal, 3); // col1: amount = 0, col2: amount = 0, col3: amount = 0 // 1 write back to WAL inc1 = new Increment(row1); @@ -227,7 +226,7 @@ public class TestDurability { assertEquals(1, Bytes.toLong(res.getValue(FAMILY, col1))); assertEquals(0, Bytes.toLong(res.getValue(FAMILY, col2))); assertEquals(0, Bytes.toLong(res.getValue(FAMILY, col3))); - verifyWALCount(wals, wal, 3); + verifyWALCount(wals, wal, 4); // col1: amount = 5, col2: amount = 4, col3: amount = 3 // 1 write back to WAL @@ -240,7 +239,7 @@ public class TestDurability { assertEquals(6, Bytes.toLong(res.getValue(FAMILY, col1))); assertEquals(4, Bytes.toLong(res.getValue(FAMILY, col2))); assertEquals(3, Bytes.toLong(res.getValue(FAMILY, col3))); - verifyWALCount(wals, wal, 4); + verifyWALCount(wals, wal, 5); } /**