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());
         }

Reply via email to