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() {