瀏覽代碼

[SCRIPTS] GetIndexedScript call can deadlock

GetIndexedScript can deadlock since they perform blocking operation
on the network thread. This commit moves the blocking to an async operation
Simon Willnauer 11 年之前
父節點
當前提交
bf1aed14db

+ 13 - 3
src/main/java/org/elasticsearch/action/indexedscripts/get/TransportGetIndexedScriptAction.java

@@ -49,8 +49,18 @@ public class TransportGetIndexedScriptAction extends HandledTransportAction<GetI
     }
 
     @Override
-    public void doExecute(GetIndexedScriptRequest request, ActionListener<GetIndexedScriptResponse> listener){
-        GetResponse scriptResponse = scriptService.queryScriptIndex(request);
-        listener.onResponse(new GetIndexedScriptResponse(scriptResponse));
+    public void doExecute(GetIndexedScriptRequest request, final ActionListener<GetIndexedScriptResponse> listener){
+        // forward the handling to the script service we are running on a network thread here...
+        scriptService.queryScriptIndex(request,new ActionListener<GetResponse>() {
+            @Override
+            public void onResponse(GetResponse getFields) {
+                listener.onResponse(new GetIndexedScriptResponse(getFields));
+            }
+
+            @Override
+            public void onFailure(Throwable e) {
+                listener.onFailure(e);
+            }
+        });
     }
 }

+ 2 - 2
src/main/java/org/elasticsearch/script/ScriptService.java

@@ -354,12 +354,12 @@ public class ScriptService extends AbstractComponent {
         }
     }
 
-    public GetResponse queryScriptIndex(GetIndexedScriptRequest request) {
+    public void queryScriptIndex(GetIndexedScriptRequest request, final ActionListener<GetResponse> listener) {
         String scriptLang = validateScriptLanguage(request.scriptLang());
         GetRequest getRequest = new GetRequest(request, SCRIPT_INDEX).type(scriptLang).id(request.id())
                 .version(request.version()).versionType(request.versionType())
                 .operationThreaded(false).preference("_local"); //Set preference for no forking
-        return client.get(getRequest).actionGet();
+        client.get(getRequest, listener);
     }
 
     private String validateScriptLanguage(String scriptLang) {