You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by az...@apache.org on 2009/07/24 08:08:53 UTC

svn commit: r797332 - /synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java

Author: azeez
Date: Fri Jul 24 06:08:53 2009
New Revision: 797332

URL: http://svn.apache.org/viewvc?rev=797332&view=rev
Log:
Synchronizing on the algorithmContext. Otherwise, we observed that the algorithm does not behave in a true RR fashion, and the requests are not evenly distributed

Modified:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java?rev=797332&r1=797331&r2=797332&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java Fri Jul 24 06:08:53 2009
@@ -66,31 +66,32 @@
      * @param  algorithmContext The context in which holds run time states related to the algorithm
      * @return endpoint to send the next message
      */
-    public Endpoint getNextEndpoint(MessageContext synCtx,
-        AlgorithmContext algorithmContext) {
+    public Endpoint getNextEndpoint(MessageContext synCtx, AlgorithmContext algorithmContext) {
 
         Endpoint nextEndpoint;
         int attempts = 0;
-        int currentEPR = algorithmContext.getCurrentEndpointIndex();
-        do {
-            // two successive clients could get the same endpoint if not synchronized.
-            synchronized (this) {
-                nextEndpoint = (Endpoint) endpoints.get(currentEPR);
-
-                if (currentEPR == endpoints.size() - 1) {
-                    currentEPR = 0;
-                } else {
-                    currentEPR++;
+        synchronized (algorithmContext) {
+            int currentEPR = algorithmContext.getCurrentEndpointIndex();
+            do {
+                // two successive clients could get the same endpoint if not synchronized.
+                synchronized (this) {
+                    nextEndpoint = (Endpoint) endpoints.get(currentEPR);
+
+                    if (currentEPR == endpoints.size() - 1) {
+                        currentEPR = 0;
+                    } else {
+                        currentEPR++;
+                    }
+                    algorithmContext.setCurrentEndpointIndex(currentEPR);
                 }
-                algorithmContext.setCurrentEndpointIndex(currentEPR);
-            }
 
-            attempts++;
-            if (attempts > endpoints.size()) {
-                return null;
-            }
+                attempts++;
+                if (attempts > endpoints.size()) {
+                    return null;
+                }
 
-        } while (!nextEndpoint.readyToSend());
+            } while (!nextEndpoint.readyToSend());
+        }
 
         return nextEndpoint;
     }
@@ -99,20 +100,23 @@
         if (members.size() == 0) {
             return null;
         }
-        int currentMemberIndex = algorithmContext.getCurrentEndpointIndex();
-        if (currentMemberIndex >= members.size()) {
-            currentMemberIndex = 0;
-        }
-        Member current = members.get(currentMemberIndex);
-        if (currentMemberIndex == members.size() - 1) {
-            currentMemberIndex = 0;
-        } else {
-            currentMemberIndex++;
-        }
-        algorithmContext.setCurrentEndpointIndex(currentMemberIndex);
-        if(log.isDebugEnabled()) {
-            log.debug("Members       : " + members.size());
-            log.debug("Current member: " + current);
+        Member current;
+        synchronized (algorithmContext) {
+            int currentMemberIndex = algorithmContext.getCurrentEndpointIndex();
+            if (currentMemberIndex >= members.size()) {
+                currentMemberIndex = 0;
+            }
+            current = members.get(currentMemberIndex);
+            if (currentMemberIndex == members.size() - 1) {
+                currentMemberIndex = 0;
+            } else {
+                currentMemberIndex++;
+            }
+            algorithmContext.setCurrentEndpointIndex(currentMemberIndex);
+            if(log.isDebugEnabled()) {
+                log.debug("Members       : " + members.size());
+                log.debug("Current member: " + current);
+            }
         }
         return current;
     }
@@ -121,7 +125,9 @@
         if (log.isDebugEnabled()) {
             log.debug("Resetting the Round Robin loadbalancing algorithm ...");
         }
-        algorithmContext.setCurrentEndpointIndex(0);
+        synchronized (algorithmContext) {
+            algorithmContext.setCurrentEndpointIndex(0);
+        }
     }
 
     public String getName() {