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

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

    XMLWordPrintable

    Details

    • Similar Issues:

      Description

      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.

        Attachments

          Issue Links

            Activity

            Hide
            jglick Jesse Glick added a comment -

            As noted in the PR I think this cannot happen.

            Show
            jglick Jesse Glick added a comment - As noted in the PR I think this cannot happen.
            Hide
            svanoort Sam Van Oort added a comment -

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

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

            Released as workflow-api plugin v 2.5

            Show
            svanoort Sam Van Oort added a comment - Released as workflow-api plugin v 2.5
            Hide
            oleg_nenashev 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

            Show
            oleg_nenashev 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
            Hide
            scm_issue_link 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.
            Show
            scm_issue_link 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.
            Hide
            scm_issue_link 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.

            Show
            scm_issue_link 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.

              People

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

                Dates

                • Created:
                  Updated:
                  Resolved: