From 9dd90a0a836e9ae2cb1b7474347fc0923bef717d Mon Sep 17 00:00:00 2001 From: Sean Busbey Date: Thu, 30 Oct 2014 16:25:17 -0500 Subject: [PATCH] HBASE-12388 Document behavior wrt coprocessors when wal gets empty waledits. --- .../hadoop/hbase/coprocessor/WALObserver.java | 3 ++ .../hbase/coprocessor/SampleRegionWALObserver.java | 4 ++- .../hadoop/hbase/coprocessor/TestWALObserver.java | 30 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/WALObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/WALObserver.java index 70c416a..49d84ed 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/WALObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/WALObserver.java @@ -33,6 +33,9 @@ import java.io.IOException; * It's provided to have a way for coprocessors to observe, rewrite, * or skip WALEdits as they are being written to the WAL. * + * Note that implementers of WALObserver will not see WALEdits that report themselves + * as empty via {@link WALEdit#isEmpty()}. + * * {@link org.apache.hadoop.hbase.coprocessor.RegionObserver} provides * hooks for adding logic for WALEdits in the region context during reconstruction, * diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/SampleRegionWALObserver.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/SampleRegionWALObserver.java index 599accf..3f983ed 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/SampleRegionWALObserver.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/SampleRegionWALObserver.java @@ -112,7 +112,9 @@ implements WALObserver { cell.getValueArray()[cell.getValueOffset()] += 1; } } - cells.add(new KeyValue(row, addedFamily, addedQualifier)); + if (null != row) { + cells.add(new KeyValue(row, addedFamily, addedQualifier)); + } if (deletedCell != null) { LOG.debug("About to delete a KeyValue from WALEdit."); cells.remove(deletedCell); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestWALObserver.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestWALObserver.java index 75fe6d2..2bb56b5 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestWALObserver.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestWALObserver.java @@ -230,6 +230,36 @@ public class TestWALObserver { } /** + * Coprocessors shouldn't get notice of empty waledits. + */ + @Test + public void testEmptyWALEditAreNotSeen() throws Exception { + final HRegionInfo hri = createBasic3FamilyHRegionInfo(Bytes.toString(TEST_TABLE)); + final HTableDescriptor htd = createBasic3FamilyHTD(Bytes.toString(TEST_TABLE)); + final AtomicLong sequenceId = new AtomicLong(0); + + HLog log = HLogFactory.createHLog(this.fs, hbaseRootDir, + TestWALObserver.class.getName(), this.conf); + try { + SampleRegionWALObserver cp = getCoprocessor(log); + + cp.setTestValues(TEST_TABLE, null, null, null, null, null, null, null); + + assertFalse(cp.isPreWALWriteCalled()); + assertFalse(cp.isPostWALWriteCalled()); + + final long now = EnvironmentEdgeManager.currentTime(); + log.append(hri, hri.getTable(), new WALEdit(), now, htd, sequenceId); + log.sync(); + + assertFalse("Empty WALEdit should skip coprocessor evaluation.", cp.isPreWALWriteCalled()); + assertFalse("Empty WALEdit should skip coprocessor evaluation.", cp.isPostWALWriteCalled()); + } finally { + log.closeAndDelete(); + } + } + + /** * Test WAL replay behavior with WALObserver. */ @Test -- 1.7.10.2 (Apple Git-33)