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

1 view
Skip to first unread message

svanoort@cloudbees.com (JIRA)

unread,
Oct 10, 2016, 10:48:06 AM10/10/16
to jenkinsc...@googlegroups.com
Sam Van Oort created an issue
 
Jenkins / Improvement JENKINS-38867
Major Optimization: Create and Use FlowNode.getAction w/o TransientActionFactories
Issue Type: Improvement Improvement
Assignee: Sam Van Oort
Components: pipeline-graph-analysis-plugin, pipeline-stage-view-plugin, workflow-api-plugin
Created: 2016/Oct/10 2:47 PM
Priority: Major Major
Reporter: Sam Van Oort

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

Add Comment Add Comment
 
This message was sent by Atlassian JIRA (v7.1.7#71011-sha1:2526d7c)
Atlassian logo

svanoort@cloudbees.com (JIRA)

unread,
Oct 10, 2016, 10:48:06 AM10/10/16
to jenkinsc...@googlegroups.com
Sam Van Oort started work on Improvement JENKINS-38867
 
Change By: Sam Van Oort
Status: Open In Progress

jglick@cloudbees.com (JIRA)

unread,
Oct 10, 2016, 11:43:01 AM10/10/16
to jenkinsc...@googlegroups.com

svanoort@cloudbees.com (JIRA)

unread,
Oct 10, 2016, 12:34:01 PM10/10/16
to jenkinsc...@googlegroups.com

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

svanoort@cloudbees.com (JIRA)

unread,
Oct 12, 2016, 5:45:04 PM10/12/16
to jenkinsc...@googlegroups.com

svanoort@cloudbees.com (JIRA)

unread,
Oct 12, 2016, 5:46:01 PM10/12/16
to jenkinsc...@googlegroups.com
Sam Van Oort updated an issue
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: *50% improvement in stage view performance, which should carry through to a large extent anywhere we use flow analysis.*

svanoort@cloudbees.com (JIRA)

unread,
Oct 18, 2016, 11:58:01 AM10/18/16
to jenkinsc...@googlegroups.com
Sam Van Oort updated an issue
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: * 50% improvement in Doubles stage view performance, which should carry through to a large extent anywhere we use flow analysis.*

svanoort@cloudbees.com (JIRA)

unread,
Oct 18, 2016, 11:58:01 AM10/18/16
to jenkinsc...@googlegroups.com
Sam Van Oort updated an issue
Change By: Sam Van Oort
Component/s: pipeline-graph-analysis-plugin
Component/s: pipeline-stage-view-plugin

svanoort@cloudbees.com (JIRA)

unread,
Oct 19, 2016, 5:41:05 PM10/19/16
to jenkinsc...@googlegroups.com
Sam Van Oort updated Improvement JENKINS-38867
 

Released as workflow-api plugin v 2.5

Change By: Sam Van Oort
Status: In Review Closed
Resolution: Done

o.v.nenashev@gmail.com (JIRA)

unread,
Nov 27, 2016, 5:23:02 AM11/27/16
to jenkinsc...@googlegroups.com

o.v.nenashev@gmail.com (JIRA)

unread,
Nov 27, 2016, 5:24:01 AM11/27/16
to jenkinsc...@googlegroups.com
Oleg Nenashev commented on Improvement JENKINS-38867
 
Re: Major Optimization: Create and Use FlowNode.getAction w/o TransientActionFactories

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

scm_issue_link@java.net (JIRA)

unread,
Nov 28, 2016, 12:31:02 AM11/28/16
to jenkinsc...@googlegroups.com

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_issue_link@java.net (JIRA)

unread,
Nov 29, 2016, 10:08:02 AM11/29/16
to jenkinsc...@googlegroups.com

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.

Reply all
Reply to author
Forward
0 new messages