From f6f71529958e2d2aa579046a1b7d7bdf263b584c Mon Sep 17 00:00:00 2001 From: Aaron Myers Date: Thu, 13 Dec 2012 22:09:02 +0000 Subject: [PATCH] HDFS-4307. SocketCache should use monotonic time. Contributed by Colin Patrick McCabe. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1421572 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../main/java/org/apache/hadoop/hdfs/SocketCache.java | 11 ++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 2baff53efe7..74a583bf6ee 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -610,6 +610,9 @@ Release 2.0.3-alpha - Unreleased HDFS-2264. NamenodeProtocol has the wrong value for clientPrincipal in KerberosInfo annotation. (atm) + HDFS-4307. SocketCache should use monotonic time. (Colin Patrick McCabe + via atm) + BREAKDOWN OF HDFS-3077 SUBTASKS HDFS-3077. Quorum-based protocol for reading and writing edit logs. diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/SocketCache.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/SocketCache.java index 06d2a2baeb5..596b0176c40 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/SocketCache.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/SocketCache.java @@ -37,6 +37,7 @@ import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.util.Daemon; import org.apache.hadoop.util.StringUtils; +import org.apache.hadoop.util.Time; /** * A cache of input stream sockets to Data Node. @@ -53,7 +54,7 @@ static class SocketAndStreams implements Closeable { public SocketAndStreams(Socket s, IOStreamPair ioStreams) { this.sock = s; this.ioStreams = ioStreams; - this.createTime = System.currentTimeMillis(); + this.createTime = Time.monotonicNow(); } @Override @@ -205,7 +206,7 @@ private synchronized void evictExpired(long expiryPeriod) { Entry entry = iter.next(); // if oldest socket expired, remove it if (entry == null || - System.currentTimeMillis() - entry.getValue().getCreateTime() < + Time.monotonicNow() - entry.getValue().getCreateTime() < expiryPeriod) { break; } @@ -236,13 +237,13 @@ private synchronized void evictOldest() { * older than expiryPeriod minutes */ private void run() throws InterruptedException { - for(long lastExpiryTime = System.currentTimeMillis(); + for(long lastExpiryTime = Time.monotonicNow(); !Thread.interrupted(); Thread.sleep(expiryPeriod)) { - final long elapsed = System.currentTimeMillis() - lastExpiryTime; + final long elapsed = Time.monotonicNow() - lastExpiryTime; if (elapsed >= expiryPeriod) { evictExpired(expiryPeriod); - lastExpiryTime = System.currentTimeMillis(); + lastExpiryTime = Time.monotonicNow(); } } clear();