You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2012/12/14 03:11:38 UTC

git commit: fix some RPC problem

Updated Branches:
  refs/heads/javelin e72417a1e -> e998ee59f


fix some RPC problem


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/e998ee59
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/e998ee59
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/e998ee59

Branch: refs/heads/javelin
Commit: e998ee59f637b7e4fceb42e3e700ef6f254b8d0c
Parents: e72417a
Author: Kelven Yang <ke...@gmail.com>
Authored: Thu Dec 13 18:10:02 2012 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Dec 13 18:10:02 2012 -0800

----------------------------------------------------------------------
 .../messaging/AsyncCallbackDispatcher.java         |   29 ++++++++++++---
 .../framework/messaging/RpcCallbackDispatcher.java |   25 +++++++++++--
 .../framework/messaging/RpcProviderImpl.java       |    2 +-
 .../framework/messaging/RpcServiceDispatcher.java  |   27 +++++++++++---
 .../messaging/server/SampleManagerComponent2.java  |    1 +
 5 files changed, 68 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/e998ee59/framework/ipc/src/org/apache/cloudstack/framework/messaging/AsyncCallbackDispatcher.java
----------------------------------------------------------------------
diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/AsyncCallbackDispatcher.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/AsyncCallbackDispatcher.java
index 958a765..089a5d8 100644
--- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/AsyncCallbackDispatcher.java
+++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/AsyncCallbackDispatcher.java
@@ -26,7 +26,7 @@ import java.util.Map;
 
 @SuppressWarnings("rawtypes")
 public class AsyncCallbackDispatcher implements AsyncCompletionCallback {
-	private static Map<Class<?>, Method> s_handlerCache = new HashMap<Class<?>, Method>();
+	private static Map<Class<?>, Map<String, Method>> s_handlerCache = new HashMap<Class<?>, Map<String, Method>>();
 	
 	private Map<String, Object> _contextMap = new HashMap<String, Object>();
 	private String _operationName;
@@ -100,17 +100,20 @@ public class AsyncCallbackDispatcher implements AsyncCompletionCallback {
 		return true;
 	}
 	
-	public static Method resolveHandler(Class<?> handlerClz, String operationName) {
+	public static Method resolveHandler(Class<?> handlerClz, String command) {
 		synchronized(s_handlerCache) {
-			Method handler = s_handlerCache.get(handlerClz);
+			Map<String, Method> handlerMap = getAndSetHandlerMap(handlerClz);
+				
+			Method handler = handlerMap.get(command);
 			if(handler != null)
 				return handler;
 			
-			for(Method method : handlerClz.getMethods()) {
+			for(Method method : handlerClz.getDeclaredMethods()) {
 				AsyncCallbackHandler annotation = method.getAnnotation(AsyncCallbackHandler.class);
 				if(annotation != null) {
-					if(annotation.operationName().equals(operationName)) {
-						s_handlerCache.put(handlerClz, method);
+					if(annotation.operationName().equals(command)) {
+						handlerMap.put(command, method);
+						method.setAccessible(true);
 						return method;
 					}
 				}
@@ -119,4 +122,18 @@ public class AsyncCallbackDispatcher implements AsyncCompletionCallback {
 		
 		return null;
 	}
+	
+	private static Map<String, Method> getAndSetHandlerMap(Class<?> handlerClz) {
+		Map<String, Method> handlerMap;
+		synchronized(s_handlerCache) {
+			handlerMap = s_handlerCache.get(handlerClz);
+			
+			if(handlerMap == null) {
+				handlerMap = new HashMap<String, Method>();
+				s_handlerCache.put(handlerClz, handlerMap);
+			}
+		}
+		
+		return handlerMap;
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/e998ee59/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java
----------------------------------------------------------------------
diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java
index 8fbe38f..16f6822 100644
--- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java
+++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java
@@ -25,7 +25,7 @@ import java.util.Map;
 
 public class RpcCallbackDispatcher {
 
-	private static Map<Class<?>, Method> s_handlerCache = new HashMap<Class<?>, Method>();
+	private static Map<Class<?>, Map<String, Method>> s_handlerCache = new HashMap<Class<?>, Map<String, Method>>();
 	
 	public static boolean dispatch(Object target, RpcClientCall clientCall) {
 		assert(clientCall != null);
@@ -50,15 +50,18 @@ public class RpcCallbackDispatcher {
 	
 	public static Method resolveHandler(Class<?> handlerClz, String command) {
 		synchronized(s_handlerCache) {
-			Method handler = s_handlerCache.get(handlerClz);
+			Map<String, Method> handlerMap = getAndSetHandlerMap(handlerClz);
+				
+			Method handler = handlerMap.get(command);
 			if(handler != null)
 				return handler;
 			
-			for(Method method : handlerClz.getMethods()) {
+			for(Method method : handlerClz.getDeclaredMethods()) {
 				RpcCallbackHandler annotation = method.getAnnotation(RpcCallbackHandler.class);
 				if(annotation != null) {
 					if(annotation.command().equals(command)) {
-						s_handlerCache.put(handlerClz, method);
+						method.setAccessible(true);
+						handlerMap.put(command, method);
 						return method;
 					}
 				}
@@ -67,4 +70,18 @@ public class RpcCallbackDispatcher {
 		
 		return null;
 	}
+	
+	private static Map<String, Method> getAndSetHandlerMap(Class<?> handlerClz) {
+		Map<String, Method> handlerMap;
+		synchronized(s_handlerCache) {
+			handlerMap = s_handlerCache.get(handlerClz);
+			
+			if(handlerMap == null) {
+				handlerMap = new HashMap<String, Method>();
+				s_handlerCache.put(handlerClz, handlerMap);
+			}
+		}
+		
+		return handlerMap;
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/e998ee59/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java
----------------------------------------------------------------------
diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java
index d8bf886..9e23a2a 100644
--- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java
+++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java
@@ -167,7 +167,7 @@ public class RpcProviderImpl implements RpcProvider {
 			}
 			
 			for(RpcServiceEndpoint endpoint : endpoints) {
-				if(RpcServiceDispatcher.dispatch(endpoint, call))
+				if(endpoint.onCallReceive(call))
 					return;
 			}
 			

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/e998ee59/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java
----------------------------------------------------------------------
diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java
index 207fb06..84d979a 100644
--- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java
+++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java
@@ -25,7 +25,7 @@ import java.util.Map;
 
 public class RpcServiceDispatcher implements RpcServiceEndpoint {
 
-	private static Map<Class<?>, Method> s_handlerCache = new HashMap<Class<?>, Method>();
+	private static Map<Class<?>, Map<String, Method>> s_handlerCache = new HashMap<Class<?>, Map<String, Method>>();
 
 	private static Map<Object, RpcServiceDispatcher> s_targetMap = new HashMap<Object, RpcServiceDispatcher>();
 	private Object _targetObject;
@@ -75,15 +75,18 @@ public class RpcServiceDispatcher implements RpcServiceEndpoint {
 	
 	public static Method resolveHandler(Class<?> handlerClz, String command) {
 		synchronized(s_handlerCache) {
-			Method handler = s_handlerCache.get(handlerClz);
+			Map<String, Method> handlerMap = getAndSetHandlerMap(handlerClz);
+				
+			Method handler = handlerMap.get(command);
 			if(handler != null)
 				return handler;
 			
-			for(Method method : handlerClz.getMethods()) {
+			for(Method method : handlerClz.getDeclaredMethods()) {
 				RpcServiceHandler annotation = method.getAnnotation(RpcServiceHandler.class);
 				if(annotation != null) {
 					if(annotation.command().equals(command)) {
-						s_handlerCache.put(handlerClz, method);
+						method.setAccessible(true);
+						handlerMap.put(command, method);
 						return method;
 					}
 				}
@@ -92,7 +95,21 @@ public class RpcServiceDispatcher implements RpcServiceEndpoint {
 		
 		return null;
 	}
-
+	
+	private static Map<String, Method> getAndSetHandlerMap(Class<?> handlerClz) {
+		Map<String, Method> handlerMap;
+		synchronized(s_handlerCache) {
+			handlerMap = s_handlerCache.get(handlerClz);
+			
+			if(handlerMap == null) {
+				handlerMap = new HashMap<String, Method>();
+				s_handlerCache.put(handlerClz, handlerMap);
+			}
+		}
+		
+		return handlerMap;
+	}
+	
 	@Override
 	public boolean onCallReceive(RpcServerCall call) {
 		return dispatch(_targetObject, call);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/e998ee59/framework/ipc/test/org/apache/cloudstack/framework/messaging/server/SampleManagerComponent2.java
----------------------------------------------------------------------
diff --git a/framework/ipc/test/org/apache/cloudstack/framework/messaging/server/SampleManagerComponent2.java b/framework/ipc/test/org/apache/cloudstack/framework/messaging/server/SampleManagerComponent2.java
index 9a439b4..e2259d3 100644
--- a/framework/ipc/test/org/apache/cloudstack/framework/messaging/server/SampleManagerComponent2.java
+++ b/framework/ipc/test/org/apache/cloudstack/framework/messaging/server/SampleManagerComponent2.java
@@ -61,6 +61,7 @@ public class SampleManagerComponent2 {
 		
 		s_logger.info("StoragePrepare command arg. pool: " + cmd.getStoragePool() + ", vol: " + cmd.getVolumeId());
 		SampleStoragePrepareAnswer answer = new SampleStoragePrepareAnswer();
+		answer.setResult("Successfully executed StoragePrepare command");
 		
 		call.completeCall(answer);
 	}