![]() |
|
|
Change By:
|
Jesse Glick
(03/Apr/13 7:55 PM)
|
Description:
|
FingerprintAction has the following field:
{code}private final AbstractBuild build;{code}
This field links to an AbstractBuild, which in turn has the following field:
{code}protected transient final JobT project;{code}
Once Jenkin persists a run to a file, the build from the FingerprintAction will be saved, but the project itself will not get saved. An example fragment from one of the build files looks like this:
{code
:xml
} <hudson.tasks.Fingerprinter_-FingerprintAction> <build class="build"> <actions> <hudson.model.ParametersAction reference="../../../../hudson.model.ParametersAction"/> <hudson.model.CauseAction reference="../../../../hudson.model.CauseAction"/> <hudson.plugins.copyartifact.CopyArtifact_-EnvAction reference="../../../../hudson.plugins.copyartifact.CopyArtifact_-EnvAction"/> <hudson.tasks.Fingerprinter_-FingerprintAction reference="../../.."/> </actions> <number>17</number> <startTime>1358250655935</startTime> <result>SUCCESS</result> <duration>4488</duration> <charset>UTF-8</charset> <keepLog>false</keepLog> <builtOn></builtOn> <workspace>/opt/hudson/files/jobs/Deploy/workspace</workspace> <hudsonVersion>1.494</hudsonVersion> <scm class="hudson.scm.NullChangeLogParser"/> <culprits class="com.google.common.collect.EmptyImmutableSortedSet"/> </build> ... {code}
When the files are read and the objects are created, the project field remains empty. During intialization, the onLoad() method is called:
{code} @Override protected R retrieve(File d) throws IOException { if(new File(d,"build.xml").exists()) { // if the build result file isn't in the directory, ignore it. try { R b = cons.create(d); b.onLoad(); if (LOGGER.isLoggable(FINE)) LOGGER.log(FINE,"Loaded " + b.getFullDisplayName(),new ThisIsHowItsLoaded()); return b; } catch (IOException e) { LOGGER.log(Level.WARNING, "could not load " + d, e); } catch (InstantiationError e) { LOGGER.log(Level.WARNING, "could not load " + d, e); } } return null; } {code}
This method invokes onLoad() on all actions that implement RunAction:
{code} for (Action a : getActions()) if (a instanceof RunAction) ((RunAction) a).onLoad(); {code}
The FingerprintAction does implement the RunAction interface, and the method is implemented as follows:
{code} public void onLoad() { // share data structure with nearby builds, but to keep lazy loading efficient, // don't go back the history forever. if (rand.nextInt(2)!=0) { Run pb = build.getPreviousBuild(); if (pb!=null) { FingerprintAction a = pb.getAction(FingerprintAction.class); if (a!=null) compact(a); } } } {code}
Build is set, so getPreviousBuild() can be called, this will however fail because the project is null (due to the transient field) and will throw a NullPointerException.
This causes very strange behavior as sometimes pages are working, sometimes they are not. There are a lot of stack traces around that actually look like as if they were caused by the same problem, for example: https://issues.jenkins-ci.org/browse/JENKINS-16845
Stack Trace looks like this:
{code} Caused by: java.lang.NullPointerException at hudson.model.AbstractBuild.getPreviousBuild(AbstractBuild.java:207) at hudson.tasks.Fingerprinter$FingerprintAction.onLoad(Fingerprinter.java:349) at hudson.model.Run.onLoad(Run.java:315) at hudson.model.RunMap.retrieve(RunMap.java:221) at hudson.model.RunMap.retrieve(RunMap.java:59) at jenkins.model.lazy.AbstractLazyLoadRunMap.load(AbstractLazyLoadRunMap.java:638) at jenkins.model.lazy.AbstractLazyLoadRunMap.load(AbstractLazyLoadRunMap.java:601) at jenkins.model.lazy.AbstractLazyLoadRunMap.search(AbstractLazyLoadRunMap.java:344) at hudson.model.AbstractBuild.getPreviousBuild(AbstractBuild.java:207) at hudson.model.AbstractBuild.getPreviousBuild(AbstractBuild.java:100) at hudson.model.RunMap$1.next(RunMap.java:107) at hudson.model.RunMap$1.next(RunMap.java:96) at hudson.widgets.HistoryWidget.getRenderList(HistoryWidget.java:133) ... 122 more {code}
|
|
|
|
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators.
For more information on JIRA, see: http://www.atlassian.com/software/jira
|
--
You received this message because you are subscribed to the Google Groups "Jenkins Issues" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-issues+unsubscr...@googlegroups.com.
For more options, visit
https://groups.google.com/groups/opt_out.