summaryrefslogtreecommitdiffstats
path: root/messagebus
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-05-28 20:35:45 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-05-28 20:35:45 +0200
commit8203f3361a8c711fd83e077a50f2b2ad6edaa3e9 (patch)
tree46677683f670a3f27a6620e006bd142812307959 /messagebus
parent566e6fece1717a03af4f03eeadb50abff3d13031 (diff)
Keep the spec final.
Create the address when needed in the async connect thread. Implement hash/equal/compareTo for Spec to avoid toString. Use Spec as key and avoid creating it every time.
Diffstat (limited to 'messagebus')
-rw-r--r--messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCService.java5
-rwxr-xr-xmessagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCServiceAddress.java17
-rwxr-xr-xmessagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTargetPool.java15
-rw-r--r--messagebus/src/test/java/com/yahoo/messagebus/network/rpc/SlobrokTestCase.java6
4 files changed, 22 insertions, 21 deletions
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCService.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCService.java
index 7c404207737..fb3c4cf9971 100644
--- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCService.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCService.java
@@ -53,7 +53,10 @@ public class RPCService {
addressList = mirror.lookup(pattern);
}
if (addressList != null && !addressList.isEmpty()) {
- addressIdx = ++addressIdx % addressList.size();
+ ++addressIdx;
+ if (addressIdx >= addressList.size()) {
+ addressIdx = 0;
+ }
Mirror.Entry entry = addressList.get(addressIdx);
return new RPCServiceAddress(entry.getName(), entry.getSpec());
}
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCServiceAddress.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCServiceAddress.java
index 8a1b99073e7..0a6a58d4e89 100755
--- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCServiceAddress.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCServiceAddress.java
@@ -23,15 +23,16 @@ public class RPCServiceAddress implements ServiceAddress {
* @param serviceName The full service name of the address.
* @param connectionSpec The connection specification.
*/
- public RPCServiceAddress(String serviceName, String connectionSpec) {
+ public RPCServiceAddress(String serviceName, Spec connectionSpec) {
this.serviceName = serviceName;
int pos = serviceName.lastIndexOf('/');
- if (pos > 0 && pos < serviceName.length() - 1) {
- sessionName = serviceName.substring(pos + 1);
- } else {
- sessionName = null;
- }
- this.connectionSpec = new Spec(connectionSpec);
+ sessionName = (pos > 0 && pos < serviceName.length() - 1)
+ ? serviceName.substring(pos + 1)
+ : null;
+ this.connectionSpec = connectionSpec;
+ }
+ public RPCServiceAddress(String serviceName, String connectionSpec) {
+ this(serviceName, new Spec(connectionSpec));
}
@Override
@@ -97,7 +98,7 @@ public class RPCServiceAddress implements ServiceAddress {
}
/**
- * Sets the RPC target to be used when communicating with the remove service.
+ * Sets the RPC target to be used when communicating with the remote service.
*
* @param target The target to set.
*/
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTargetPool.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTargetPool.java
index 04d9f4ade68..7f5721ee2bf 100755
--- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTargetPool.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTargetPool.java
@@ -18,7 +18,7 @@ import java.util.Map;
*/
public class RPCTargetPool {
- private final Map<String, Entry> targets = new HashMap<>();
+ private final Map<Spec, Entry> targets = new HashMap<>();
private final Timer timer;
private final long expireMillis;
private final int numTargetsPerSpec;
@@ -86,33 +86,32 @@ public class RPCTargetPool {
*/
public RPCTarget getTarget(Supervisor orb, RPCServiceAddress address) {
Spec spec = address.getConnectionSpec();
- String key = spec.toString();
long now = timer.milliTime();
synchronized (this) {
- Entry entry = targets.get(key);
+ Entry entry = targets.get(spec);
if (entry != null) {
RPCTarget target = entry.getTarget(now);
if (target != null) {
return target;
}
- dropTarget(entry, key);
+ dropTarget(entry, spec);
}
- return createAndAddTarget(orb, spec, key, now);
+ return createAndAddTarget(orb, spec, now);
}
}
- private void dropTarget(Entry entry, String key) {
+ private void dropTarget(Entry entry, Spec key) {
entry.close();
targets.remove(key);
}
- private RPCTarget createAndAddTarget(Supervisor orb, Spec spec, String key, long now) {
+ private RPCTarget createAndAddTarget(Supervisor orb, Spec spec, long now) {
RPCTarget [] tmpTargets = new RPCTarget[numTargetsPerSpec];
for (int i=0; i < tmpTargets.length; i++) {
tmpTargets[i] = new RPCTarget(spec, orb);
}
Entry entry = new Entry(tmpTargets, now);
- targets.put(key, entry);
+ targets.put(spec, entry);
return entry.getTarget(now);
}
diff --git a/messagebus/src/test/java/com/yahoo/messagebus/network/rpc/SlobrokTestCase.java b/messagebus/src/test/java/com/yahoo/messagebus/network/rpc/SlobrokTestCase.java
index dd779fd84c0..886833b8b14 100644
--- a/messagebus/src/test/java/com/yahoo/messagebus/network/rpc/SlobrokTestCase.java
+++ b/messagebus/src/test/java/com/yahoo/messagebus/network/rpc/SlobrokTestCase.java
@@ -11,9 +11,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import java.net.UnknownHostException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
@@ -69,7 +67,7 @@ public class SlobrokTestCase {
System.out.printf(" { EMPTY }\n");
} else {
for (Mirror.Entry entry : actual) {
- System.out.printf(" { %s, %s }\n", entry.getName(), entry.getSpec());
+ System.out.printf(" { %s, %s }\n", entry.getName(), entry.getSpecString());
}
}
System.out.printf("expected values:\n");
@@ -77,7 +75,7 @@ public class SlobrokTestCase {
System.out.printf(" { EMPTY }\n");
} else {
for (Mirror.Entry entry : expect) {
- System.out.printf(" { %s, %s }\n", entry.getName(), entry.getSpec());
+ System.out.printf(" { %s, %s }\n", entry.getName(), entry.getSpecString());
}
}
assertTrue(false);