Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-38867

Major Optimization: Create and Use FlowNode.getAction w/o TransientActionFactories

      In most cases we only care about the directly attached actions on flownodes. FlowNode.getAction has been identified as ~25% of runtime for pipeline flow analysis, and it is likely b/c this queries all TransientActionFactories for actions.

      We should:

      1. Add a FlowNode.getAction API version (name TBD) that only iterates through the directly added actions (already cached in-object)
      2. Switch the pipeline-graph-analysis plugin and stage view's REST API to use this exclusively
      3. Benchmark to see what the performance difference is

      UPDATE: Doubles stage view performance, which should carry through to a large extent anywhere we use flow analysis.

          [JENKINS-38867] Major Optimization: Create and Use FlowNode.getAction w/o TransientActionFactories

          Jesse Glick added a comment -

          As noted in the PR I think this cannot happen.

          Jesse Glick added a comment - As noted in the PR I think this cannot happen.

          Sam Van Oort added a comment -

          As noted in the PR, I think you have misunderstood the intended use case.

          Sam Van Oort added a comment - As noted in the PR, I think you have misunderstood the intended use case.

          Sam Van Oort added a comment -

          Released as workflow-api plugin v 2.5

          Sam Van Oort added a comment - Released as workflow-api plugin v 2.5

          Oleg Nenashev added a comment -

          In addition to the original fix we have also integrated https://github.com/jenkinsci/jenkins/pull/2582 towards jenkins-2.34. Same issue ID

          Oleg Nenashev added a comment - In addition to the original fix we have also integrated https://github.com/jenkinsci/jenkins/pull/2582 towards jenkins-2.34. Same issue ID

          Code changed in jenkins
          User: Jesse Glick
          Path:
          core/src/main/java/hudson/model/Actionable.java
          core/src/main/java/jenkins/model/TransientActionFactory.java
          test/src/test/java/jenkins/model/TransientActionFactoryTest.java
          http://jenkins-ci.org/commit/jenkins/6360b96464f6c2498fe91a089a21992411b2ec34
          Log:
          JENKINS-38867 Optimize performance of Actionable.getAllActions (#2582)

          • Optimize Actionable.getAllActions.
          • Also need to invalidate the cache when new plugins are installed.
          • Various improvements to TransientActionFactory caching.
            · Move the cache code to TransientActionFactory itself, for better encapsulation.
            · Optimize getAction(Class) to not need to call getAllActions; avoids copying lists, and can avoid calling TransientActionFactory at all.
            · Ensure that we maintain a separate cache per ExtensionList instance, so that static state is not leaked across Jenkins restarts.
          • Updated TransientActionFactory to specify what kinds of actions it could produce.
          • It turns out that changing type parameters for an extension, while generally binary-compatible, breaks reflective code in Jenkins and so this is not an option.
            … hudson.ExtensionFinder$GuiceFinder$SezpozModule configure
            WARNING: Failed to load com.cloudbees.hudson.plugins.folder.relocate.RelocationAction$TransientActionFactoryImpl
            java.lang.LinkageError: Failed to resolve class com.cloudbees.hudson.plugins.folder.relocate.RelocationAction$TransientActionFactoryImpl
            at hudson.ExtensionFinder$GuiceFinder$SezpozModule.resolve(ExtensionFinder.java:489)
            at hudson.ExtensionFinder$GuiceFinder$SezpozModule.configure(ExtensionFinder.java:506)
            at …
            at hudson.ExtensionFinder$GuiceFinder.<init>(ExtensionFinder.java:280)
            at …
            at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:472)
            at hudson.ExtensionList.load(ExtensionList.java:349)
            at hudson.ExtensionList.ensureLoaded(ExtensionList.java:287)
            at hudson.ExtensionList.getComponents(ExtensionList.java:167)
            at jenkins.model.Jenkins$8.onInitMilestoneAttained(Jenkins.java:1082)
            at jenkins.InitReactorRunner$1.onAttained(InitReactorRunner.java:82)
            at org.jvnet.hudson.reactor.ReactorListener$Aggregator.onAttained(ReactorListener.java:104)
            at org.jvnet.hudson.reactor.Reactor$1.run(Reactor.java:176)
            at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at java.lang.Thread.run(Thread.java:745)
            Caused by: java.lang.reflect.MalformedParameterizedTypeException
            at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:58)
            at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:51)
            at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:92)
            at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105)
            at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140)
            at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
            at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:90)
            at java.lang.Class.getGenericSuperclass(Class.java:777)
            at hudson.ExtensionFinder$GuiceFinder$SezpozModule.resolve(ExtensionFinder.java:470)
            ... 29 more
          • Remove actionType override to make for a simpler diff.
          • Strengthened test to cover accesses to unrelated context types.
          • Strengthening tests in a couple of ways.
          • Javadoc improvements suggested by @oleg-nenashev.

          SCM/JIRA link daemon added a comment - Code changed in jenkins User: Jesse Glick Path: core/src/main/java/hudson/model/Actionable.java core/src/main/java/jenkins/model/TransientActionFactory.java test/src/test/java/jenkins/model/TransientActionFactoryTest.java http://jenkins-ci.org/commit/jenkins/6360b96464f6c2498fe91a089a21992411b2ec34 Log: JENKINS-38867 Optimize performance of Actionable.getAllActions (#2582) Optimize Actionable.getAllActions. Also need to invalidate the cache when new plugins are installed. Various improvements to TransientActionFactory caching. · Move the cache code to TransientActionFactory itself, for better encapsulation. · Optimize getAction(Class) to not need to call getAllActions; avoids copying lists, and can avoid calling TransientActionFactory at all. · Ensure that we maintain a separate cache per ExtensionList instance, so that static state is not leaked across Jenkins restarts. Updated TransientActionFactory to specify what kinds of actions it could produce. It turns out that changing type parameters for an extension, while generally binary-compatible, breaks reflective code in Jenkins and so this is not an option. … hudson.ExtensionFinder$GuiceFinder$SezpozModule configure WARNING: Failed to load com.cloudbees.hudson.plugins.folder.relocate.RelocationAction$TransientActionFactoryImpl java.lang.LinkageError: Failed to resolve class com.cloudbees.hudson.plugins.folder.relocate.RelocationAction$TransientActionFactoryImpl at hudson.ExtensionFinder$GuiceFinder$SezpozModule.resolve(ExtensionFinder.java:489) at hudson.ExtensionFinder$GuiceFinder$SezpozModule.configure(ExtensionFinder.java:506) at … at hudson.ExtensionFinder$GuiceFinder.<init>(ExtensionFinder.java:280) at … at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:472) at hudson.ExtensionList.load(ExtensionList.java:349) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:287) at hudson.ExtensionList.getComponents(ExtensionList.java:167) at jenkins.model.Jenkins$8.onInitMilestoneAttained(Jenkins.java:1082) at jenkins.InitReactorRunner$1.onAttained(InitReactorRunner.java:82) at org.jvnet.hudson.reactor.ReactorListener$Aggregator.onAttained(ReactorListener.java:104) at org.jvnet.hudson.reactor.Reactor$1.run(Reactor.java:176) at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.reflect.MalformedParameterizedTypeException at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:58) at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:51) at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:92) at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105) at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140) at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:90) at java.lang.Class.getGenericSuperclass(Class.java:777) at hudson.ExtensionFinder$GuiceFinder$SezpozModule.resolve(ExtensionFinder.java:470) ... 29 more Remove actionType override to make for a simpler diff. Strengthened test to cover accesses to unrelated context types. Strengthening tests in a couple of ways. Javadoc improvements suggested by @oleg-nenashev.

          Code changed in jenkins
          User: Jesse Glick
          Path:
          core/src/main/java/jenkins/model/TransientActionFactory.java
          http://jenkins-ci.org/commit/jenkins/9ecc77b9badd65d9eabd34d2baad1742d5566894
          Log:
          JENKINS-38867 Since tag for #2582.

          SCM/JIRA link daemon added a comment - Code changed in jenkins User: Jesse Glick Path: core/src/main/java/jenkins/model/TransientActionFactory.java http://jenkins-ci.org/commit/jenkins/9ecc77b9badd65d9eabd34d2baad1742d5566894 Log: JENKINS-38867 Since tag for #2582.

            svanoort Sam Van Oort
            svanoort Sam Van Oort
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: