You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by si...@apache.org on 2018/11/25 05:29:55 UTC
[bookkeeper] branch branch-4.7 updated: Remove MathUtils.now()
This is an automated email from the ASF dual-hosted git repository.
sijie pushed a commit to branch branch-4.7
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
The following commit(s) were added to refs/heads/branch-4.7 by this push:
new 8189fb0 Remove MathUtils.now()
8189fb0 is described below
commit 8189fb09db37378b74348e82ec2881fe376c417c
Author: Sijie Guo <gu...@gmail.com>
AuthorDate: Sat Nov 24 21:29:12 2018 -0800
Remove MathUtils.now()
Descriptions of the changes in this PR:
*Motivation*
`MathUtils.now()` using System.nanoTime doesn't provide accurate time. It is used
for measuring pupose. However since `nanoTime` can have numeric overflow, so when
it is used for converting into milliseconds, it is misleading and error-prone. A
lot of places using `MathUtis.now` can all replaced with `System.currentTimeMillis()`.
It leads to unknown behavior on compactions. examples is shown in the following figure.
<img width="1157" alt="wechatimg180" src="https://user-images.githubusercontent.com/1217863/48965961-d860b600-ef7c-11e8-9394-1d51cef5c68c.png">
example: this graph shows the major_compaction_count. major compaction is supposed to run every day. but in the graph, there is no major compaction occuring in 4 days.
*Changes*
Remove `MathUtils.now()` and replace it with `System.currentTimeMillis()`.
Reviewers: Jia Zhai <None>, Enrico Olivelli <eo...@gmail.com>
This closes #1837 from sijie/remove_mathutils_now
(cherry picked from commit a32e29d66162b76a8dd6f58d3eacb7b62dd07ba2)
Signed-off-by: Sijie Guo <si...@apache.org>
---
.../java/org/apache/bookkeeper/common/util/MathUtils.java | 15 ---------------
.../org/apache/bookkeeper/common/util/TestMathUtils.java | 8 --------
.../main/java/org/apache/bookkeeper/bookie/Bookie.java | 8 ++++----
.../apache/bookkeeper/bookie/GarbageCollectorThread.java | 8 ++++----
.../bookkeeper/bookie/ScanAndCompareGarbageCollector.java | 7 +++----
.../java/org/apache/bookkeeper/bookie/SyncThread.java | 7 +++----
.../apache/bookkeeper/net/StabilizeNetworkTopology.java | 7 +++----
.../java/org/apache/bookkeeper/util/LocalBookKeeper.java | 4 ++--
.../src/main/java/org/apache/bookkeeper/util/Shell.java | 4 ++--
.../java/org/apache/bookkeeper/bookie/CompactionTest.java | 7 +++----
10 files changed, 24 insertions(+), 51 deletions(-)
diff --git a/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/MathUtils.java b/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/MathUtils.java
index 94999a4..43d5d77 100644
--- a/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/MathUtils.java
+++ b/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/MathUtils.java
@@ -42,21 +42,6 @@ public class MathUtils {
/**
* Current time from some arbitrary time base in the past, counting in
- * milliseconds, and not affected by settimeofday or similar system clock
- * changes. This is appropriate to use when computing how much longer to
- * wait for an interval to expire.
- *
- * <p>NOTE: only use it for measuring.
- * http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime%28%29
- *
- * @return current time in milliseconds.
- */
- public static long now() {
- return System.nanoTime() / NANOSECONDS_PER_MILLISECOND;
- }
-
- /**
- * Current time from some arbitrary time base in the past, counting in
* nanoseconds, and not affected by settimeofday or similar system clock
* changes. This is appropriate to use when computing how much longer to
* wait for an interval to expire.
diff --git a/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestMathUtils.java b/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestMathUtils.java
index 3bd58c2..fc2318b 100644
--- a/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestMathUtils.java
+++ b/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestMathUtils.java
@@ -19,13 +19,11 @@
package org.apache.bookkeeper.common.util;
import static org.apache.bookkeeper.common.util.MathUtils.findNextPositivePowerOfTwo;
-import static org.apache.bookkeeper.common.util.MathUtils.now;
import static org.apache.bookkeeper.common.util.MathUtils.nowInNano;
import static org.apache.bookkeeper.common.util.MathUtils.signSafeMod;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import java.util.concurrent.TimeUnit;
import org.junit.Test;
/**
@@ -47,12 +45,6 @@ public class TestMathUtils {
}
@Test
- public void testNow() {
- long nowInMillis = now();
- assertTrue(TimeUnit.NANOSECONDS.toMillis(System.nanoTime()) >= nowInMillis);
- }
-
- @Test
public void testNowInNanos() {
long nowInNanos = nowInNano();
assertTrue(System.nanoTime() >= nowInNanos);
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java
index 8af7513..31077f1 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java
@@ -755,7 +755,7 @@ public class Bookie extends BookieCriticalThread {
}
void readJournal() throws IOException, BookieException {
- long startTs = MathUtils.now();
+ long startTs = System.currentTimeMillis();
JournalScanner scanner = new JournalScanner() {
@Override
public void process(int journalVersion, long offset, ByteBuffer recBuff) throws IOException {
@@ -816,7 +816,7 @@ public class Bookie extends BookieCriticalThread {
for (Journal journal : journals) {
journal.replay(scanner);
}
- long elapsedTs = MathUtils.now() - startTs;
+ long elapsedTs = System.currentTimeMillis() - startTs;
LOG.info("Finished replaying journal in {} ms.", elapsedTs);
}
@@ -1456,7 +1456,7 @@ public class Bookie extends BookieCriticalThread {
Bookie b = new Bookie(new ServerConfiguration());
b.start();
CounterCallback cb = new CounterCallback();
- long start = MathUtils.now();
+ long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
ByteBuf buff = Unpooled.buffer(1024);
buff.writeLong(1);
@@ -1465,7 +1465,7 @@ public class Bookie extends BookieCriticalThread {
b.addEntry(buff, false /* ackBeforeSync */, cb, null, new byte[0]);
}
cb.waitZero();
- long end = MathUtils.now();
+ long end = System.currentTimeMillis();
System.out.println("Took " + (end - start) + "ms");
}
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java
index 4b1c834..ad752de 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java
@@ -255,7 +255,7 @@ public class GarbageCollectorThread extends SafeRunnable {
LOG.info("Major Compaction : enabled=" + enableMajorCompaction + ", threshold="
+ majorCompactionThreshold + ", interval=" + majorCompactionInterval);
- lastMinorCompactionTime = lastMajorCompactionTime = MathUtils.now();
+ lastMinorCompactionTime = lastMajorCompactionTime = System.currentTimeMillis();
}
public void enableForceGC() {
@@ -364,13 +364,13 @@ public class GarbageCollectorThread extends SafeRunnable {
LOG.info("Disk full, suspend minor compaction to slow down filling disk.");
}
- long curTime = MathUtils.now();
+ long curTime = System.currentTimeMillis();
if (enableMajorCompaction && (!suspendMajor)
&& (force || curTime - lastMajorCompactionTime > majorCompactionInterval)) {
// enter major compaction
LOG.info("Enter major compaction, suspendMajor {}", suspendMajor);
doCompactEntryLogs(majorCompactionThreshold);
- lastMajorCompactionTime = MathUtils.now();
+ lastMajorCompactionTime = System.currentTimeMillis();
// and also move minor compaction time
lastMinorCompactionTime = lastMajorCompactionTime;
majorCompactionCounter.inc();
@@ -379,7 +379,7 @@ public class GarbageCollectorThread extends SafeRunnable {
// enter minor compaction
LOG.info("Enter minor compaction, suspendMinor {}", suspendMinor);
doCompactEntryLogs(minorCompactionThreshold);
- lastMinorCompactionTime = MathUtils.now();
+ lastMinorCompactionTime = System.currentTimeMillis();
minorCompactionCounter.inc();
}
this.gcThreadRuntime.registerSuccessfulEvent(
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java
index f5ea91c..4402544 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java
@@ -48,7 +48,6 @@ import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback;
import org.apache.bookkeeper.stats.Counter;
import org.apache.bookkeeper.stats.Gauge;
import org.apache.bookkeeper.stats.StatsLogger;
-import org.apache.bookkeeper.util.MathUtils;
import org.apache.bookkeeper.util.ZkUtils;
import org.apache.bookkeeper.zookeeper.ZooKeeperClient;
import org.apache.zookeeper.KeeperException;
@@ -99,7 +98,7 @@ public class ScanAndCompareGarbageCollector implements GarbageCollector{
this.conf = conf;
this.selfBookieAddress = Bookie.getBookieAddress(conf);
this.gcOverReplicatedLedgerIntervalMillis = conf.getGcOverreplicatedLedgerWaitTimeMillis();
- this.lastOverReplicatedLedgerGcTimeMillis = MathUtils.now();
+ this.lastOverReplicatedLedgerGcTimeMillis = System.currentTimeMillis();
if (gcOverReplicatedLedgerIntervalMillis > 0) {
this.enableGcOverReplicatedLedger = true;
}
@@ -140,7 +139,7 @@ public class ScanAndCompareGarbageCollector implements GarbageCollector{
Long.MAX_VALUE));
this.activeLedgerCounter = bkActiveLedgers.size();
- long curTime = MathUtils.now();
+ long curTime = System.currentTimeMillis();
boolean checkOverreplicatedLedgers = (enableGcOverReplicatedLedger && curTime
- lastOverReplicatedLedgerGcTimeMillis > gcOverReplicatedLedgerIntervalMillis);
if (checkOverreplicatedLedgers) {
@@ -153,7 +152,7 @@ public class ScanAndCompareGarbageCollector implements GarbageCollector{
} else {
LOG.info("Removed over-replicated ledgers: {}", overReplicatedLedgers);
}
- lastOverReplicatedLedgerGcTimeMillis = MathUtils.now();
+ lastOverReplicatedLedgerGcTimeMillis = System.currentTimeMillis();
}
// Iterate over all the ledger on the metadata store
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SyncThread.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SyncThread.java
index a7c3a7a..00288dc 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SyncThread.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SyncThread.java
@@ -36,7 +36,6 @@ import org.apache.bookkeeper.bookie.CheckpointSource.Checkpoint;
import org.apache.bookkeeper.bookie.LedgerDirsManager.LedgerDirsListener;
import org.apache.bookkeeper.bookie.LedgerDirsManager.NoWritableLedgerDirException;
import org.apache.bookkeeper.conf.ServerConfiguration;
-import org.apache.bookkeeper.util.MathUtils;
/**
* SyncThread is a background thread which help checkpointing ledger storage
@@ -205,11 +204,11 @@ class SyncThread implements Checkpointer {
requestFlush();
executor.shutdown();
- long start = MathUtils.now();
+ long start = System.currentTimeMillis();
while (!executor.awaitTermination(5, TimeUnit.MINUTES)) {
- long now = MathUtils.now();
+ long now = System.currentTimeMillis();
log.info("SyncThread taking a long time to shutdown. Has taken {}"
- + " seconds so far", now - start);
+ + " milliseconds so far", now - start);
}
}
}
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/StabilizeNetworkTopology.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/StabilizeNetworkTopology.java
index 0bac3bf..5c244f2 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/StabilizeNetworkTopology.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/StabilizeNetworkTopology.java
@@ -26,7 +26,6 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
-import org.apache.bookkeeper.util.MathUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,7 +41,7 @@ public class StabilizeNetworkTopology implements NetworkTopology {
boolean tentativeToRemove;
NodeStatus() {
- this.lastPresentTime = MathUtils.now();
+ this.lastPresentTime = System.currentTimeMillis();
}
synchronized boolean isTentativeToRemove() {
@@ -52,7 +51,7 @@ public class StabilizeNetworkTopology implements NetworkTopology {
synchronized NodeStatus updateStatus(boolean tentativeToRemove) {
this.tentativeToRemove = tentativeToRemove;
if (!this.tentativeToRemove) {
- this.lastPresentTime = MathUtils.now();
+ this.lastPresentTime = System.currentTimeMillis();
}
return this;
}
@@ -88,7 +87,7 @@ public class StabilizeNetworkTopology implements NetworkTopology {
// no status of this node, remove this node from topology
impl.remove(node);
} else if (status.isTentativeToRemove()) {
- long millisSinceLastSeen = MathUtils.now() - status.getLastPresentTime();
+ long millisSinceLastSeen = System.currentTimeMillis() - status.getLastPresentTime();
if (millisSinceLastSeen >= stabilizePeriodMillis) {
logger.info("Node {} (seen @ {}) becomes stale for {} ms, remove it from the topology.",
node, status.getLastPresentTime(), millisSinceLastSeen);
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LocalBookKeeper.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LocalBookKeeper.java
index 72ba48a..4b7d043 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LocalBookKeeper.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LocalBookKeeper.java
@@ -482,7 +482,7 @@ public class LocalBookKeeper {
}
public static boolean waitForServerUp(String hp, long timeout) {
- long start = MathUtils.now();
+ long start = System.currentTimeMillis();
String split[] = hp.split(":");
String host = split[0];
int port = Integer.parseInt(split[1]);
@@ -514,7 +514,7 @@ public class LocalBookKeeper {
LOG.info("server " + hp + " not up " + e);
}
- if (MathUtils.now() > start + timeout) {
+ if (System.currentTimeMillis() > start + timeout) {
break;
}
try {
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/Shell.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/Shell.java
index 9e37614..60c7648 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/Shell.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/Shell.java
@@ -93,7 +93,7 @@ public abstract class Shell {
* Check to see if a command needs to be executed and execute if needed.
*/
protected void run() throws IOException {
- if (lastTime + interval > MathUtils.now()) {
+ if (lastTime + interval > System.currentTimeMillis()) {
return;
}
exitCode = 0; // reset for next run
@@ -199,7 +199,7 @@ public abstract class Shell {
LOG.warn("Error while closing the error stream", ioe);
}
process.destroy();
- lastTime = MathUtils.now();
+ lastTime = System.currentTimeMillis();
}
}
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CompactionTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CompactionTest.java
index 7c5ac7b..65873f2 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CompactionTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CompactionTest.java
@@ -67,7 +67,6 @@ import org.apache.bookkeeper.test.BookKeeperClusterTestCase;
import org.apache.bookkeeper.test.TestStatsProvider;
import org.apache.bookkeeper.util.DiskChecker;
import org.apache.bookkeeper.util.HardLink;
-import org.apache.bookkeeper.util.MathUtils;
import org.apache.bookkeeper.util.TestUtils;
import org.apache.bookkeeper.versioning.Version;
import org.apache.zookeeper.AsyncCallback;
@@ -263,7 +262,7 @@ public abstract class CompactionTest extends BookKeeperClusterTestCase {
Checkpointer.NULL,
NullStatsLogger.INSTANCE);
storage.start();
- long startTime = MathUtils.now();
+ long startTime = System.currentTimeMillis();
storage.gcThread.enableForceGC();
storage.gcThread.triggerGC().get(); //major
storage.gcThread.triggerGC().get(); //minor
@@ -986,7 +985,7 @@ public abstract class CompactionTest extends BookKeeperClusterTestCase {
storage.gcThread.suspendMajorGC();
Thread.sleep(1000);
- long startTime = MathUtils.now();
+ long startTime = System.currentTimeMillis();
majorCompactions = stats.getCounter("storage.gc." + MAJOR_COMPACTION_COUNT).get().intValue();
Thread.sleep(conf.getMajorCompactionInterval() * 1000
+ conf.getGcWaitTime());
@@ -1006,7 +1005,7 @@ public abstract class CompactionTest extends BookKeeperClusterTestCase {
storage.gcThread.suspendMinorGC();
Thread.sleep(1000);
- startTime = MathUtils.now();
+ startTime = System.currentTimeMillis();
minorCompactions = stats.getCounter("storage.gc." + MINOR_COMPACTION_COUNT).get().intValue();
Thread.sleep(conf.getMajorCompactionInterval() * 1000
+ conf.getGcWaitTime());