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 <[email protected]> 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()); }
