[ 
https://issues.apache.org/jira/browse/FLINK-37525?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jiaan Geng updated FLINK-37525:
-------------------------------
    Description: 
Currently, the implementation of installModules has the logic show below.

{code:java}
for (String moduleFactoryClass : config.getSecurityModuleFactories()) {
    ...
    moduleFactory = 
SecurityFactoryServiceLoader.findModuleFactory(moduleFactoryClass);
    ...
}
{code}

The implementation of findModuleFactory show below.
{code:java}
    public static SecurityModuleFactory findModuleFactory(String 
securityModuleFactoryClass)
            throws NoMatchSecurityFactoryException {
        return findFactoryInternal(
                securityModuleFactoryClass,
                SecurityModuleFactory.class,
                SecurityModuleFactory.class.getClassLoader());
    }
{code}

You can see no matter what the securityModuleFactoryClass is, the 
SecurityModuleFactory.class and SecurityModuleFactory.class.getClassLoader() 
are certain.

The implementation of findFactoryInternal show below.

{code:java}
    private static <T> T findFactoryInternal(
            String factoryClassCanonicalName, Class<T> factoryClass, 
ClassLoader classLoader)
            throws NoMatchSecurityFactoryException {

        Preconditions.checkNotNull(factoryClassCanonicalName);

        ServiceLoader<T> serviceLoader;
        if (classLoader != null) {
            serviceLoader = ServiceLoader.load(factoryClass, classLoader);
        } else {
            serviceLoader = ServiceLoader.load(factoryClass);
        }

        List<T> matchingFactories = new ArrayList<>();
        Iterator<T> classFactoryIterator = serviceLoader.iterator();
        classFactoryIterator.forEachRemaining(
                classFactory -> {
                    if (factoryClassCanonicalName.matches(
                            classFactory.getClass().getCanonicalName())) {
                        matchingFactories.add(classFactory);
                    }
                });

        if (matchingFactories.size() != 1) {
            throw new NoMatchSecurityFactoryException(
                    "zero or more than one security factory found",
                    factoryClassCanonicalName,
                    matchingFactories);
        }
        return matchingFactories.get(0);
    }
{code}

You can see findFactoryInternal load ServiceLoader and match the classFactory.
These code lead to repeatedly loading ServiceLoader and match the classFactory.




  was:
Currently, the implementation of installModules has the logic show below.

{code:java}
for (String moduleFactoryClass : config.getSecurityModuleFactories()) {
    ...
    moduleFactory = 
SecurityFactoryServiceLoader.findModuleFactory(moduleFactoryClass);
    ...
}
{code}





> Introduce overload findModuleFactory to improve the performance of 
> installModules
> ---------------------------------------------------------------------------------
>
>                 Key: FLINK-37525
>                 URL: https://issues.apache.org/jira/browse/FLINK-37525
>             Project: Flink
>          Issue Type: Improvement
>          Components: Runtime / Configuration
>            Reporter: Jiaan Geng
>            Priority: Major
>              Labels: pull-request-available
>
> Currently, the implementation of installModules has the logic show below.
> {code:java}
> for (String moduleFactoryClass : config.getSecurityModuleFactories()) {
>     ...
>     moduleFactory = 
> SecurityFactoryServiceLoader.findModuleFactory(moduleFactoryClass);
>     ...
> }
> {code}
> The implementation of findModuleFactory show below.
> {code:java}
>     public static SecurityModuleFactory findModuleFactory(String 
> securityModuleFactoryClass)
>             throws NoMatchSecurityFactoryException {
>         return findFactoryInternal(
>                 securityModuleFactoryClass,
>                 SecurityModuleFactory.class,
>                 SecurityModuleFactory.class.getClassLoader());
>     }
> {code}
> You can see no matter what the securityModuleFactoryClass is, the 
> SecurityModuleFactory.class and SecurityModuleFactory.class.getClassLoader() 
> are certain.
> The implementation of findFactoryInternal show below.
> {code:java}
>     private static <T> T findFactoryInternal(
>             String factoryClassCanonicalName, Class<T> factoryClass, 
> ClassLoader classLoader)
>             throws NoMatchSecurityFactoryException {
>         Preconditions.checkNotNull(factoryClassCanonicalName);
>         ServiceLoader<T> serviceLoader;
>         if (classLoader != null) {
>             serviceLoader = ServiceLoader.load(factoryClass, classLoader);
>         } else {
>             serviceLoader = ServiceLoader.load(factoryClass);
>         }
>         List<T> matchingFactories = new ArrayList<>();
>         Iterator<T> classFactoryIterator = serviceLoader.iterator();
>         classFactoryIterator.forEachRemaining(
>                 classFactory -> {
>                     if (factoryClassCanonicalName.matches(
>                             classFactory.getClass().getCanonicalName())) {
>                         matchingFactories.add(classFactory);
>                     }
>                 });
>         if (matchingFactories.size() != 1) {
>             throw new NoMatchSecurityFactoryException(
>                     "zero or more than one security factory found",
>                     factoryClassCanonicalName,
>                     matchingFactories);
>         }
>         return matchingFactories.get(0);
>     }
> {code}
> You can see findFactoryInternal load ServiceLoader and match the classFactory.
> These code lead to repeatedly loading ServiceLoader and match the 
> classFactory.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to