ソースを参照

HADOOP-10829. Iteration on CredentialProviderFactory.serviceLoader is thread-unsafe. Contributed by Benoy Antony and Rakesh R.

(cherry picked from commit b82485d6fed2194bf0dc2eedfab7e226e30a7cf0)
(cherry picked from commit c0e294ffc82d611a64b352e3962bce9399ddbe5f)
Jitendra Pandey 7 年 前
コミット
a80cd4b897

+ 10 - 0
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/alias/CredentialProviderFactory.java

@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 import java.util.ServiceLoader;
 
@@ -47,6 +48,15 @@ public abstract class CredentialProviderFactory {
   private static final ServiceLoader<CredentialProviderFactory> serviceLoader =
       ServiceLoader.load(CredentialProviderFactory.class);
 
+  // Iterate through the serviceLoader to avoid lazy loading.
+  // Lazy loading would require synchronization in concurrent use cases.
+  static {
+    Iterator<CredentialProviderFactory> iterServices = serviceLoader.iterator();
+    while (iterServices.hasNext()) {
+      iterServices.next();
+    }
+  }
+
   public static List<CredentialProvider> getProviders(Configuration conf
                                                ) throws IOException {
     List<CredentialProvider> result = new ArrayList<CredentialProvider>();