Author: orudyy
Date: Tue Oct 23 20:05:55 2012
New Revision: 1401426

URL: http://svn.apache.org/viewvc?rev=1401426&view=rev
Log:
QPID-4385: perf test ClientRegistry timeout now only applies to each 
registration, not to the whole registration sequence, thus allowing large 
number of clients to register without false timeouts.

Applied patch from Philip Harvey <[email protected]>

Modified:
    
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java
    
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java

Modified: 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java?rev=1401426&r1=1401425&r2=1401426&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java
 Tue Oct 23 20:05:55 2012
@@ -57,34 +57,54 @@ public class ClientRegistry
         return Collections.unmodifiableSet(_registeredClientNames);
     }
 
-    public int awaitClients(int numberOfClientsToAwait, long timeout)
+    /**
+     * @return the number of clients that are still absent.
+     */
+    public int awaitClients(final int numberOfClientsToAwait, final long 
idleTimeout)
     {
-        final long endTime = System.currentTimeMillis() + timeout;
+        long deadlineForNextRegistration = deadline(idleTimeout);
 
-        int numberOfClientsAbsent = numberOfClientsToAwait - 
_registeredClientNames.size();
-        long remainingTimeout = endTime - System.currentTimeMillis();
+        int numberOfClientsAbsent = numberAbsent(numberOfClientsToAwait);
 
-        while(numberOfClientsAbsent > 0 && remainingTimeout > 0)
+        while(numberOfClientsAbsent > 0 && System.currentTimeMillis() < 
deadlineForNextRegistration)
         {
             synchronized (_lock)
             {
                 try
                 {
-                    _lock.wait(remainingTimeout);
+                    _lock.wait(idleTimeout);
                 }
                 catch (InterruptedException e)
                 {
                    Thread.currentThread().interrupt();
+                   return numberOfClientsAbsent;
                 }
             }
 
-            numberOfClientsAbsent = numberOfClientsToAwait - 
_registeredClientNames.size();
-            remainingTimeout = endTime - System.currentTimeMillis();
+            int newNumberAbsent = numberAbsent(numberOfClientsToAwait);
+            if(newNumberAbsent < numberOfClientsAbsent)
+            {
+                // a registration was received since the last loop, so reset 
the timeout
+                deadlineForNextRegistration = deadline(idleTimeout);
+            }
+
+            numberOfClientsAbsent = newNumberAbsent;
         }
 
         return numberOfClientsAbsent < 0 ? 0 : numberOfClientsAbsent;
     }
 
+
+    private long deadline(final long idleTimeout)
+    {
+        return System.currentTimeMillis() + idleTimeout;
+    }
+
+    private int numberAbsent(int numberOfClientsToAwait)
+    {
+        return numberOfClientsToAwait - _registeredClientNames.size();
+    }
+
     private void notifyAllWaiters()
     {
         synchronized (_lock)

Modified: 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java?rev=1401426&r1=1401425&r2=1401426&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java
 (original)
+++ 
qpid/trunk/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java
 Tue Oct 23 20:05:55 2012
@@ -29,6 +29,8 @@ public class ClientRegistryTest extends 
 {
     private static final String CLIENT1_REGISTERED_NAME = 
"CLIENT1_REGISTERED_NAME";
     private static final String CLIENT2_REGISTERED_NAME = 
"CLIENT2_REGISTERED_NAME";
+    private static final String CLIENT3_REGISTERED_NAME = 
"CLIENT3_REGISTERED_NAME";
+
     private static final int AWAIT_DELAY = 100;
 
     private ClientRegistry _clientRegistry = new ClientRegistry();
@@ -70,7 +72,7 @@ public class ClientRegistryTest extends 
         assertEquals(0, numberOfClientsAbsent);
     }
 
-    public void testAwaitTwoClientWhenClientRegistersWhilstWaiting()
+    public void testAwaitTwoClientsWhenClientRegistersWhilstWaiting()
     {
         _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
         registerClientLater(CLIENT2_REGISTERED_NAME, 50);
@@ -79,6 +81,41 @@ public class ClientRegistryTest extends 
         assertEquals(0, numberOfClientsAbsent);
     }
 
+    public void testAwaitTimeoutForPromptRegistrations()
+    {
+        registerClientsLaterAndAssertResult("Clients registering every 100ms 
should be within 600ms timeout",
+                new int[] {300, 400, 500},
+                600,
+                0);
+    }
+
+    public void testAwaitTimeoutForWhenThirdRegistrationIsLate()
+    {
+        registerClientsLaterAndAssertResult("Third client registering tardily 
should exceed timeout",
+                new int[] {300, 400, 1500},
+                600,
+                1);
+    }
+
+    public void testAwaitTimeoutWhenSecondAndThirdRegistrationsAreLate()
+    {
+        registerClientsLaterAndAssertResult("Second and third clients 
registering tardily should exceed timeout",
+                new int[] {300, 1500, 1500},
+                600,
+                2);
+    }
+
+    private void registerClientsLaterAndAssertResult(String message, int[] 
registrationDelays, int timeout, int expectedNumberOfAbsentees)
+    {
+        registerClientLater(CLIENT1_REGISTERED_NAME, registrationDelays[0]);
+        registerClientLater(CLIENT2_REGISTERED_NAME, registrationDelays[1]);
+        registerClientLater(CLIENT3_REGISTERED_NAME, registrationDelays[2]);
+
+        int numberOfClientsAbsent = _clientRegistry.awaitClients(3, timeout);
+
+        assertEquals(message, expectedNumberOfAbsentees, 
numberOfClientsAbsent);
+    }
+
     private void registerClientLater(final String clientName, long 
delayInMillis)
     {
         doLater(new TimerTask()



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to