This is an automated email from the ASF dual-hosted git repository.

snagel pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nutch.git

commit a6f533dfecd688a6c43212b0e826be9a2da5b4ce
Author: Sebastian Nagel <sna...@apache.org>
AuthorDate: Tue Jul 24 16:19:04 2018 +0200

    NUTCH-2625 ProtocolFactory.getProtocol(url) may create multiple plugin 
instances
    - lock critical block (conditional creation of plugin instance)
      on object cache object
---
 .../org/apache/nutch/protocol/ProtocolFactory.java | 26 ++++++++++++----------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/java/org/apache/nutch/protocol/ProtocolFactory.java 
b/src/java/org/apache/nutch/protocol/ProtocolFactory.java
index 87944a8..2d20ecd 100644
--- a/src/java/org/apache/nutch/protocol/ProtocolFactory.java
+++ b/src/java/org/apache/nutch/protocol/ProtocolFactory.java
@@ -81,7 +81,7 @@ public class ProtocolFactory {
    * @throws ProtocolNotFound
    *           when Protocol can not be found for url
    */
-  public synchronized Protocol getProtocol(URL url)
+  public Protocol getProtocol(URL url)
       throws ProtocolNotFound {
     ObjectCache objectCache = ObjectCache.get(conf);
     try {
@@ -91,19 +91,21 @@ public class ProtocolFactory {
       }
 
       String cacheId = Protocol.X_POINT_ID + protocolName;
-      Protocol protocol = (Protocol) objectCache.getObject(cacheId);
-      if (protocol != null) {
+      synchronized (objectCache) {
+        Protocol protocol = (Protocol) objectCache.getObject(cacheId);
+        if (protocol != null) {
+          return protocol;
+        }
+
+        Extension extension = findExtension(protocolName);
+        if (extension == null) {
+          throw new ProtocolNotFound(protocolName);
+        }
+
+        protocol = (Protocol) extension.getExtensionInstance();
+        objectCache.setObject(cacheId, protocol);
         return protocol;
       }
-
-      Extension extension = findExtension(protocolName);
-      if (extension == null) {
-        throw new ProtocolNotFound(protocolName);
-      }
-
-      protocol = (Protocol) extension.getExtensionInstance();
-      objectCache.setObject(cacheId, protocol);
-      return protocol;
     } catch (PluginRuntimeException e) {
       throw new ProtocolNotFound(url.toString(), e.toString());
     }

Reply via email to