Index: log4j-core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java (revision ) @@ -21,6 +21,7 @@ import java.io.InputStream; import java.io.Serializable; import java.util.Map; +import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -234,8 +235,8 @@ assertThat(map, hasSize(greaterThan(0))); assertThat("Wrong configuration", map, hasKey("List")); - Thread.sleep(500); assertTrue("setLastModified should have succeeded.", file.setLastModified(System.currentTimeMillis())); + TimeUnit.SECONDS.sleep(FileConfigurationMonitor.MIN_INTERVAL + 1); for (int i = 0; i < 17; ++i) { logger.debug("Test message " + i); } Index: log4j-core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java (revision ) @@ -20,6 +20,7 @@ import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -197,12 +198,12 @@ @Test public void testReconfiguration() throws Exception { final Configuration oldConfig = context.getConfiguration(); - final int MONITOR_INTERVAL_SECONDS = 1; + final int MONITOR_INTERVAL_SECONDS = 5; final File file = new File("target/test-classes/" + CONFIG); final long orig = file.lastModified(); final long newTime = orig + 10000; - file.setLastModified(newTime); - Thread.sleep((MONITOR_INTERVAL_SECONDS + 1) * 1000); + assertTrue("setLastModified should have succeeded.", file.setLastModified(newTime)); + TimeUnit.SECONDS.sleep(MONITOR_INTERVAL_SECONDS + 1); for (int i = 0; i < 17; ++i) { logger.debug("Reconfigure"); } Index: log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/MtPerfTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/MtPerfTest.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/MtPerfTest.java (revision ) @@ -17,6 +17,7 @@ package org.apache.logging.log4j.core.async.perftest; import java.io.File; +import java.util.concurrent.TimeUnit; import com.lmax.disruptor.collections.Histogram; @@ -37,14 +38,14 @@ // warmup at least 2 rounds and at most 1 minute final Histogram warmupHist = PerfTest.createHistogram(); - final long stop = System.currentTimeMillis() + (60 * 1000); + final long stop = System.nanoTime() + TimeUnit.MINUTES.toNanos(1); final Runnable run1 = new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { final int LINES = PerfTest.throughput ? 50000 : 200000; runTest(runner, LINES, null, warmupHist, 2); - if (i > 0 && System.currentTimeMillis() >= stop) { + if (i > 0 && System.nanoTime() - stop >= 0) { return; } } \ No newline at end of file Index: log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java (revision ) @@ -516,13 +516,14 @@ @Override public void run() { LOGGER.trace("WriterThread started - batch size = " + batchSize + ", delayMillis = " + manager.delayMillis); - long nextBatchMillis = System.currentTimeMillis() + manager.delayMillis; + final long delayNanos = TimeUnit.MILLISECONDS.toNanos(manager.delayMillis); + long nextBatchNanos = System.nanoTime() + delayNanos; while (!shutdown) { - final long nowMillis = System.currentTimeMillis(); + final long nowNanos = System.nanoTime(); final long dbCount = database.count(); dbCounter.set(dbCount); - if (dbCount >= batchSize || dbCount > 0 && nextBatchMillis <= nowMillis) { - nextBatchMillis = nowMillis + manager.delayMillis; + if (dbCount >= batchSize || dbCount > 0 && nowNanos - nextBatchNanos >= 0) { + nextBatchNanos = nowNanos + delayNanos; try { boolean errors = false; final DatabaseEntry key = new DatabaseEntry(); @@ -628,11 +629,11 @@ LOGGER.warn("WriterThread encountered an exception. Continuing.", ex); } } else { - if (nextBatchMillis <= nowMillis) { - nextBatchMillis = nowMillis + manager.delayMillis; + if (nowNanos - nextBatchNanos >= 0) { + nextBatchNanos = nowNanos + delayNanos; } try { - final long interval = nextBatchMillis - nowMillis; + final long interval = TimeUnit.NANOSECONDS.toMillis(nextBatchNanos - nowNanos); gate.waitForOpen(interval); } catch (final InterruptedException ie) { LOGGER.warn("WriterThread interrupted, continuing"); Index: log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/PerfTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/PerfTest.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/PerfTest.java (revision ) @@ -20,6 +20,7 @@ import java.io.IOException; import java.nio.charset.Charset; import java.util.Arrays; +import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.core.util.Loader; @@ -108,11 +109,11 @@ // warmup at least 10 seconds final int LINES = 50000; int iterations = 0; - final long stop = System.currentTimeMillis() + (10 * 1000); // 10 seconds + final long stop = System.nanoTime() + TimeUnit.SECONDS.toNanos(10); do { runTest(runner, LINES, null, warmupHist, 1); iterations++; - } while (System.currentTimeMillis() < stop); + } while (System.nanoTime() - stop < 0); printf("Warmup complete in %.1f seconds (%d iterations)%n", (System.nanoTime() - t1) / (1000.0 * 1000.0 * 1000.0), iterations); Index: log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentPerf.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentPerf.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentPerf.java (revision ) @@ -125,14 +125,14 @@ @Test public void testPerformance() throws Exception { - final long start = System.currentTimeMillis(); + final long start = System.nanoTime(); final int count = 10000; for (int i = 0; i < count; ++i) { final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Primary " + i, "Test"); msg.put("counter", Integer.toString(i)); EventLogger.logEvent(msg); } - final long elapsed = System.currentTimeMillis() - start; + final long elapsed = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start); System.out.println("Time to log " + count + " events " + elapsed + "ms"); } \ No newline at end of file Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/DefaultErrorHandler.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/DefaultErrorHandler.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/DefaultErrorHandler.java (revision ) @@ -17,6 +17,7 @@ package org.apache.logging.log4j.core.appender; import java.io.Serializable; +import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.Appender; @@ -35,11 +36,11 @@ private static final int MAX_EXCEPTIONS = 3; - private static final int EXCEPTION_INTERVAL = 300000; + private static final long EXCEPTION_INTERVAL = TimeUnit.MINUTES.toNanos(5); private int exceptionCount = 0; - private long lastException; + private long lastException = System.nanoTime() - EXCEPTION_INTERVAL - 1; private final Appender appender; @@ -54,8 +55,8 @@ */ @Override public void error(final String msg) { - final long current = System.currentTimeMillis(); - if (lastException + EXCEPTION_INTERVAL < current || exceptionCount++ < MAX_EXCEPTIONS) { + final long current = System.nanoTime(); + if (current - lastException > EXCEPTION_INTERVAL || exceptionCount++ < MAX_EXCEPTIONS) { LOGGER.error(msg); } lastException = current; @@ -68,8 +69,8 @@ */ @Override public void error(final String msg, final Throwable t) { - final long current = System.currentTimeMillis(); - if (lastException + EXCEPTION_INTERVAL < current || exceptionCount++ < MAX_EXCEPTIONS) { + final long current = System.nanoTime(); + if (current - lastException > EXCEPTION_INTERVAL || exceptionCount++ < MAX_EXCEPTIONS) { LOGGER.error(msg, t); } lastException = current; @@ -86,8 +87,8 @@ */ @Override public void error(final String msg, final LogEvent event, final Throwable t) { - final long current = System.currentTimeMillis(); - if (lastException + EXCEPTION_INTERVAL < current || exceptionCount++ < MAX_EXCEPTIONS) { + final long current = System.nanoTime(); + if (current - lastException > EXCEPTION_INTERVAL || exceptionCount++ < MAX_EXCEPTIONS) { LOGGER.error(msg, t); } lastException = current; Index: log4j-core/src/main/java/org/apache/logging/log4j/core/config/FileConfigurationMonitor.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/main/java/org/apache/logging/log4j/core/config/FileConfigurationMonitor.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-core/src/main/java/org/apache/logging/log4j/core/config/FileConfigurationMonitor.java (revision ) @@ -18,6 +18,7 @@ import java.io.File; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -30,19 +31,17 @@ private static final int MASK = 0x0f; - private static final int MIN_INTERVAL = 5; + static final int MIN_INTERVAL = 5; - private static final int MILLIS_PER_SECOND = 1000; - private final File file; - private long lastModified; + private volatile long lastModified; private final List listeners; - private final int interval; + private final long interval; - private long nextCheck; + private volatile long nextCheck; private final AtomicInteger counter = new AtomicInteger(0); @@ -64,8 +63,8 @@ this.file = file; this.lastModified = file.lastModified(); this.listeners = listeners; - this.interval = (interval < MIN_INTERVAL ? MIN_INTERVAL : interval) * MILLIS_PER_SECOND; - this.nextCheck = System.currentTimeMillis() + interval; + this.interval = TimeUnit.SECONDS.toNanos(Math.max(interval, MIN_INTERVAL)); + this.nextCheck = System.nanoTime() + this.interval; } /** @@ -73,13 +72,14 @@ */ @Override public void checkConfiguration() { - final long current = System.currentTimeMillis(); - if (((counter.incrementAndGet() & MASK) == 0) && (current >= nextCheck)) { + final long current = System.nanoTime(); + if (((counter.incrementAndGet() & MASK) == 0) && (current - nextCheck >= 0)) { LOCK.lock(); try { nextCheck = current + interval; - if (file.lastModified() > lastModified) { - lastModified = file.lastModified(); + final long currentLastModified = file.lastModified(); + if (currentLastModified > lastModified) { + lastModified = currentLastModified; for (final ConfigurationListener listener : listeners) { final Thread thread = new Thread(new ReconfigurationWorker(listener, reconfigurable)); thread.setDaemon(true); Index: log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAppenderTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAppenderTest.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAppenderTest.java (revision ) @@ -209,14 +209,14 @@ /* @Test */ public void testPerformance() throws Exception { - final long start = System.currentTimeMillis(); + final long start = System.nanoTime(); final int count = 10000; for (int i = 0; i < count; ++i) { final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Primary " + i, "Test"); msg.put("counter", Integer.toString(i)); EventLogger.logEvent(msg); } - final long elapsed = System.currentTimeMillis() - start; + final long elapsed = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start); System.out.println("Time to log " + count + " events " + elapsed + "ms"); } Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java (revision ) @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.LoggingException; import org.apache.logging.log4j.core.Appender; @@ -57,9 +58,9 @@ private final List failoverAppenders = new ArrayList(); - private final long intervalMillis; + private final long intervalNanos; - private volatile long nextCheckMillis = 0; + private volatile long nextCheckNanos = 0; private FailoverAppender(final String name, final Filter filter, final String primary, final String[] failovers, final int intervalMillis, final Configuration config, final boolean ignoreExceptions) { @@ -67,7 +68,7 @@ this.primaryRef = primary; this.failovers = failovers; this.config = config; - this.intervalMillis = intervalMillis; + this.intervalNanos = TimeUnit.MILLISECONDS.toNanos(intervalMillis); } @@ -107,8 +108,8 @@ error("FailoverAppender " + getName() + " did not start successfully"); return; } - final long localCheckMillis = nextCheckMillis; - if (localCheckMillis == 0 || System.currentTimeMillis() > localCheckMillis) { + final long localCheckNanos = nextCheckNanos; + if (localCheckNanos == 0 || System.nanoTime() - localCheckNanos > 0) { callAppender(event); } else { failover(event, null); @@ -118,9 +119,9 @@ private void callAppender(final LogEvent event) { try { primary.callAppender(event); - nextCheckMillis = 0; + nextCheckNanos = 0; } catch (final Exception ex) { - nextCheckMillis = System.currentTimeMillis() + intervalMillis; + nextCheckNanos = System.nanoTime() + intervalNanos; failover(event, ex); } } Index: log4j-core/src/test/java/org/apache/logging/log4j/core/FileConfigTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- log4j-core/src/test/java/org/apache/logging/log4j/core/FileConfigTest.java (revision 97ebed83bfc3ebf313e8979525a15e86b9911a3f) +++ log4j-core/src/test/java/org/apache/logging/log4j/core/FileConfigTest.java (revision ) @@ -17,8 +17,10 @@ package org.apache.logging.log4j.core; import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertTrue; import java.io.File; +import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.junit.InitialLoggerContext; @@ -46,17 +48,16 @@ @Test public void testReconfiguration() throws Exception { final Configuration oldConfig = context.getConfiguration(); - final int MONITOR_INTERVAL_SECONDS = 1; + final int MONITOR_INTERVAL_SECONDS = 5; final File file = new File(CONFIG); final long orig = file.lastModified(); final long newTime = orig + 10000; - file.setLastModified(newTime); - int sleepMillis = (MONITOR_INTERVAL_SECONDS + 1) * 1000; - Thread.sleep(sleepMillis); + assertTrue("setLastModified should have succeeded.", file.setLastModified(newTime)); + TimeUnit.SECONDS.sleep(MONITOR_INTERVAL_SECONDS + 1); for (int i = 0; i < 17; ++i) { logger.debug("Reconfigure"); } - Thread.sleep(sleepMillis); + Thread.sleep(100); final Configuration newConfig = context.getConfiguration(); assertNotSame("Reconfiguration failed", newConfig, oldConfig); }