You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2015/11/07 01:47:47 UTC
hbase git commit: HBASE-14759 Avoid using Math.abs when selecting
SyncRunner in FSHLog
Repository: hbase
Updated Branches:
refs/heads/master 263a0adf7 -> 9cce912de
HBASE-14759 Avoid using Math.abs when selecting SyncRunner in FSHLog
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/9cce912d
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/9cce912d
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/9cce912d
Branch: refs/heads/master
Commit: 9cce912de01b7f2c6e968b0c9fdaccd93e44bebf
Parents: 263a0ad
Author: zhangduo <zh...@apache.org>
Authored: Wed Nov 4 19:08:26 2015 +0800
Committer: zhangduo <zh...@wandoujia.com>
Committed: Sat Nov 7 08:44:25 2015 +0800
----------------------------------------------------------------------
.../hadoop/hbase/regionserver/wal/FSHLog.java | 5 ++--
.../hbase/regionserver/wal/TestFSHLog.java | 29 ++++++++++++++++++++
2 files changed, 32 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/9cce912d/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSHLog.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSHLog.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSHLog.java
index 928f4b6..17e3a94 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSHLog.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSHLog.java
@@ -1767,9 +1767,10 @@ public class FSHLog implements WAL {
if (this.exception == null) {
// Below expects that the offer 'transfers' responsibility for the outstanding syncs to
// the syncRunner. We should never get an exception in here.
- int index = Math.abs(this.syncRunnerIndex++) % this.syncRunners.length;
+ this.syncRunnerIndex = (this.syncRunnerIndex + 1) % this.syncRunners.length;
try {
- this.syncRunners[index].offer(sequence, this.syncFutures, this.syncFuturesCount);
+ this.syncRunners[this.syncRunnerIndex].offer(sequence, this.syncFutures,
+ this.syncFuturesCount);
} catch (Exception e) {
// Should NEVER get here.
requestLogRoll();
http://git-wip-us.apache.org/repos/asf/hbase/blob/9cce912d/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestFSHLog.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestFSHLog.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestFSHLog.java
index f86bdd5..af47465 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestFSHLog.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestFSHLog.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
@@ -420,4 +421,32 @@ public class TestFSHLog {
}
}
+ @Test
+ public void testSyncRunnerIndexOverflow() throws IOException, NoSuchFieldException,
+ SecurityException, IllegalArgumentException, IllegalAccessException {
+ final String name = "testSyncRunnerIndexOverflow";
+ FSHLog log =
+ new FSHLog(fs, FSUtils.getRootDir(conf), name, HConstants.HREGION_OLDLOGDIR_NAME, conf,
+ null, true, null, null);
+ try {
+ Field ringBufferEventHandlerField = FSHLog.class.getDeclaredField("ringBufferEventHandler");
+ ringBufferEventHandlerField.setAccessible(true);
+ FSHLog.RingBufferEventHandler ringBufferEventHandler =
+ (FSHLog.RingBufferEventHandler) ringBufferEventHandlerField.get(log);
+ Field syncRunnerIndexField =
+ FSHLog.RingBufferEventHandler.class.getDeclaredField("syncRunnerIndex");
+ syncRunnerIndexField.setAccessible(true);
+ syncRunnerIndexField.set(ringBufferEventHandler, Integer.MAX_VALUE - 1);
+ HTableDescriptor htd =
+ new HTableDescriptor(TableName.valueOf("t1")).addFamily(new HColumnDescriptor("row"));
+ HRegionInfo hri =
+ new HRegionInfo(htd.getTableName(), HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW);
+ MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();
+ for (int i = 0; i < 10; i++) {
+ addEdits(log, hri, htd, 1, mvcc);
+ }
+ } finally {
+ log.close();
+ }
+ }
}