![]() |
|
|
|
|
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
[email protected].
For more options, visit
https://groups.google.com/groups/opt_out.