-
Bug
-
Resolution: Unresolved
-
Minor
-
None
-
Linux
hudson.XmlFile.mkdirs does not check the return value of boolean java.io.File.mkdirs(), which can fail silently; this makes debugging errors harder - see https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/XmlFile.java.
Instead, if mkdirs() returns false, an exception should be thrown.
In my case, I got the following exception at a later point in XmlFile.write (which does call XmlFile.mkdirs()):
ERROR: Failed to record fingerprints
hudson.util.IOException2: Failed to create a temporary file in /media/extra/christian/hudson/fingerprints/d2/7b
at hudson.util.AtomicFileWriter.<init>(AtomicFileWriter.java:67)
at hudson.util.AtomicFileWriter.<init>(AtomicFileWriter.java:54)
at hudson.XmlFile.write(XmlFile.java:170)
at hudson.model.Fingerprint.save(Fingerprint.java:841)
at hudson.model.Fingerprint.<init>(Fingerprint.java:588)
at hudson.model.FingerprintMap.create(FingerprintMap.java:90)
at hudson.model.FingerprintMap.create(FingerprintMap.java:45)
at hudson.util.KeyedDataStorage.get(KeyedDataStorage.java:156)
at hudson.model.FingerprintMap.get(FingerprintMap.java:79)
at hudson.model.FingerprintMap.get(FingerprintMap.java:45)
at hudson.util.KeyedDataStorage.getOrCreate(KeyedDataStorage.java:108)
at hudson.model.FingerprintMap.getOrCreate(FingerprintMap.java:65)
at hudson.tasks.Fingerprinter$1Record.addRecord(Fingerprinter.java:211)
at hudson.tasks.Fingerprinter.record(Fingerprinter.java:255)
at hudson.tasks.Fingerprinter.perform(Fingerprinter.java:134)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:19)
at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:692)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:667)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:645)
at hudson.model.Build$RunnerImpl.post2(Build.java:162)
at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:614)
at hudson.model.Run.run(Run.java:1429)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
at hudson.model.ResourceController.execute(ResourceController.java:88)
at hudson.model.Executor.run(Executor.java:230)
Caused by: java.io.IOException: No such file or directory
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.checkAndCreate(File.java:1716)
at java.io.File.createTempFile(File.java:1804)
at hudson.util.AtomicFileWriter.<init>(AtomicFileWriter.java:65)
... 24 more
Build step 'Record fingerprints of files to track usage' changed build result to FAILURE
when /media/extra/christian/hudson/fingerprints/d2 did indeed not exist. To debug this, I assumed that the directory was not being created; instead, mkdirs was being called but failed, so the error should have been recorded at that time.
After I realized that mkdirs() was being called, it became easy to realize that it failed because of a mistake of mine: I had launched previously Jenkins as root, and failed to correctly reassign file ownership when I relaunched it as an unprivileged user.