Updated Branches: refs/heads/trunk ea688dc8d -> 32adf24ee
bug fix : don't send premature idle events Project: http://git-wip-us.apache.org/repos/asf/mina/repo Commit: http://git-wip-us.apache.org/repos/asf/mina/commit/32adf24e Tree: http://git-wip-us.apache.org/repos/asf/mina/tree/32adf24e Diff: http://git-wip-us.apache.org/repos/asf/mina/diff/32adf24e Branch: refs/heads/trunk Commit: 32adf24ee3057d9b8b73bbc0d617d173cca73517 Parents: ea688dc Author: jvermillard <[email protected]> Authored: Sun May 19 15:56:17 2013 +0200 Committer: jvermillard <[email protected]> Committed: Sun May 19 15:56:17 2013 +0200 ---------------------------------------------------------------------- .../service/idlechecker/IndexedIdleChecker.java | 13 +++++-- .../service/idlecheker/IndexedIdleChekerTest.java | 26 ++++++++++++-- .../mina/transport/tcp/IdleTcpServerTest.java | 8 +++-- 3 files changed, 36 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina/blob/32adf24e/core/src/main/java/org/apache/mina/service/idlechecker/IndexedIdleChecker.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/mina/service/idlechecker/IndexedIdleChecker.java b/core/src/main/java/org/apache/mina/service/idlechecker/IndexedIdleChecker.java index f4ec870..51ebaee 100644 --- a/core/src/main/java/org/apache/mina/service/idlechecker/IndexedIdleChecker.java +++ b/core/src/main/java/org/apache/mina/service/idlechecker/IndexedIdleChecker.java @@ -70,7 +70,7 @@ public class IndexedIdleChecker implements IdleChecker { private static final AttributeKey<Integer> WRITE_IDLE_INDEX = AttributeKey.createKey(Integer.class, "idle.write.index"); - private long lastCheckTimeMs = 0L; + private long lastCheckTimeMs = System.currentTimeMillis(); @SuppressWarnings("unchecked") private final Set<AbstractIoSession>[] readIdleSessionIndex = new Set[MAX_IDLE_TIME_IN_SEC]; @@ -128,8 +128,9 @@ public class IndexedIdleChecker implements IdleChecker { if (idleTimeInMs <= 0L) { LOG.debug("no read idle configuration"); } else { - final int nextIdleTimeInSeconds = (int) ((timeInMs + idleTimeInMs) / 1000L) + 1; + final int nextIdleTimeInSeconds = (int) ((timeInMs + idleTimeInMs) / 1000L); final int index = nextIdleTimeInSeconds % MAX_IDLE_TIME_IN_SEC; + LOG.debug("computed index : {}", index); if (readIdleSessionIndex[index] == null) { readIdleSessionIndex[index] = Collections .newSetFromMap(new ConcurrentHashMap<AbstractIoSession, Boolean>()); @@ -160,7 +161,7 @@ public class IndexedIdleChecker implements IdleChecker { if (idleTimeInMs <= 0L) { LOG.debug("no write idle configuration"); } else { - final int nextIdleTimeInSeconds = (int) ((timeInMs + idleTimeInMs) / 1000L) + 1; + final int nextIdleTimeInSeconds = (int) ((timeInMs + idleTimeInMs) / 1000L); final int index = nextIdleTimeInSeconds % MAX_IDLE_TIME_IN_SEC; if (writeIdleSessionIndex[index] == null) { writeIdleSessionIndex[index] = Collections @@ -182,7 +183,7 @@ public class IndexedIdleChecker implements IdleChecker { if (LOG.isDebugEnabled()) { LOG.debug("checking idle time, last = {}, now = {}, delta = {}", new Object[] { lastCheckTimeMs, timeMs, - delta }); + delta }); } if (delta < 1000) { @@ -190,6 +191,10 @@ public class IndexedIdleChecker implements IdleChecker { return 0; } + // if (lastCheckTimeMs == 0) { + // LOG.debug("first check, we start now"); + // lastCheckTimeMs = System.currentTimeMillis() - 1000; + // } final int startIdx = ((int) (Math.max(lastCheckTimeMs, timeMs - MAX_IDLE_TIME_IN_MS + 1) / 1000L)) % MAX_IDLE_TIME_IN_SEC; final int endIdx = ((int) (timeMs / 1000L)) % MAX_IDLE_TIME_IN_SEC; http://git-wip-us.apache.org/repos/asf/mina/blob/32adf24e/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java b/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java index 7cffd92..7095443 100644 --- a/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java +++ b/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java @@ -55,6 +55,23 @@ public class IndexedIdleChekerTest { } @Test + public void dont_send_premature_events() { + IoService service = mock(IoService.class); + DummySession session = new DummySession(service, idleChecker); + + session.getConfig().setIdleTimeInMillis(IdleStatus.READ_IDLE, 2000L); + + idleChecker.sessionRead(session, now); + + // should be idle in 2 second + assertEquals(0, idleChecker.processIdleSession(now)); + assertEquals(0, session.readIdleCount); + assertEquals(0, session.writeIdleCount); + assertEquals(1, idleChecker.processIdleSession(now + 3001)); + + } + + @Test public void read_event() { IoService service = mock(IoService.class); DummySession session = new DummySession(service, idleChecker); @@ -64,10 +81,11 @@ public class IndexedIdleChekerTest { idleChecker.sessionRead(session, now); // should be idle in 1 second - assertEquals(1, idleChecker.processIdleSession(now)); - assertEquals(1, session.readIdleCount); + assertEquals(0, idleChecker.processIdleSession(now)); + assertEquals(0, session.readIdleCount); assertEquals(0, session.writeIdleCount); - assertEquals(0, idleChecker.processIdleSession(now + 2000)); + assertEquals(1, idleChecker.processIdleSession(now + 2000)); + assertEquals(1, session.readIdleCount); } @@ -81,7 +99,7 @@ public class IndexedIdleChekerTest { idleChecker.sessionWritten(session, now); // should be idle in 1 second - assertEquals(1, idleChecker.processIdleSession(now + 1000)); + assertEquals(1, idleChecker.processIdleSession(now + 12000)); assertEquals(0, session.readIdleCount); assertEquals(1, session.writeIdleCount); } http://git-wip-us.apache.org/repos/asf/mina/blob/32adf24e/core/src/test/java/org/apache/mina/transport/tcp/IdleTcpServerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/mina/transport/tcp/IdleTcpServerTest.java b/core/src/test/java/org/apache/mina/transport/tcp/IdleTcpServerTest.java index 366db52..27c7786 100644 --- a/core/src/test/java/org/apache/mina/transport/tcp/IdleTcpServerTest.java +++ b/core/src/test/java/org/apache/mina/transport/tcp/IdleTcpServerTest.java @@ -19,8 +19,7 @@ */ package org.apache.mina.transport.tcp; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.Assert.*; import java.io.IOException; import java.net.InetSocketAddress; @@ -56,7 +55,7 @@ public class IdleTcpServerTest { final CountDownLatch idleLatch = new CountDownLatch(CLIENT_COUNT); // 3 seconds idle time - server.getSessionConfig().setIdleTimeInMillis(IdleStatus.READ_IDLE, 3000); + server.getSessionConfig().setIdleTimeInMillis(IdleStatus.READ_IDLE, 2000); // start the server server.bind(new InetSocketAddress(0)); @@ -71,8 +70,11 @@ public class IdleTcpServerTest { clients[i] = new Socket("127.0.0.1", boundPort); } + long start = System.currentTimeMillis(); try { assertTrue("idle event missing ! ", idleLatch.await(4, TimeUnit.SECONDS)); + System.err.println((System.currentTimeMillis() - start)); + assertTrue(2000 <= (System.currentTimeMillis() - start)); } catch (final InterruptedException e) { fail(e.getMessage()); }
