jenkinsci/jenkins · error · IOException
Failed to set the timestamp of
Error message
Failed to set the timestamp of ${f} to ${timestamp} What it means
Thrown by the Touch.invoke act when File.setLastModified(long) returns false, meaning the OS refused to update the file's last-modified timestamp. This wraps the raw boolean failure into an IOException propagated through FilePath.act(). Common causes: the file is read-only, on a filesystem that doesn't support mtime (e.g., some FAT variants, or the file is held open exclusively on Windows), or the timestamp value is out of the OS's supported range.
Solutions
- Ensure the Jenkins process has write permission on the file and its parent directory.
- On Windows, close any process holding the file open before calling touch().
- Validate the timestamp is within the filesystem's supported range (FAT: 1980-01-01 to 2107-12-31).
- If mtime is not needed, catch IOException and log a warning instead of failing the build.
Example fix
// before
filePath.touch(timestamp);
// after — guard against unsupported mtime
try {
filePath.touch(timestamp);
} catch (IOException e) {
listener.getLogger().println("Warning: could not set timestamp: " + e.getMessage());
} Defensive patterns
Strategy: try-catch
Validate before calling
long ts = timestamp;
// FAT supports 1980-01-01 to 2107-12-31
if (ts < 315532800000L || ts > 4133980799000L) {
LOGGER.warning("Timestamp out of filesystem-supported range; touch may fail.");
}
if (!f.canWrite()) {
LOGGER.warning("File is not writable; setLastModified will likely fail: " + f);
} Try / catch
try {
filePath.setLastModifiedIfPossible(timestamp);
} catch (IOException e) {
// Non-fatal: timestamp is cosmetic in most build contexts
LOGGER.log(Level.WARNING, "Could not set timestamp on {0}", filePath);
} Prevention
- Ensure Jenkins process owns or has write access to workspace files.
- On Windows, avoid touching files held open by other processes.
- Validate timestamp range for the target filesystem before calling touch().
When it happens
Trigger: Calling FilePath.touch(long timestamp) on a path whose target file has a last-modified time that cannot be changed — file is locked, read-only, or the timestamp is negative/out of epoch range for the filesystem.
Common situations: Windows with a file open in another process (exclusive lock), files on network-mounted shares (SMB/NFS) with restricted permissions, FAT/exFAT volumes that reject pre-1980 or far-future timestamps, or containerized builds where the file owner differs from the Jenkins process UID.
Related errors
- Failed to create a temporary directory in
- Failed to delete
- Failed to fully read
- Failed to mkdirs
- Invalid mode
AI-assisted analysis of jenkinsci/jenkins@2e228ff40b (2026-08-14).
Data as JSON: /api/errors/437d47fc8a9408fb.
Report an issue: GitHub.
Appendix: source
Thrown at core/src/main/java/hudson/FilePath.java:1830
act(new Touch(timestamp));
}
private static class Touch extends MasterToSlaveFileCallable<Void> {
private final long timestamp;
Touch(long timestamp) {
this.timestamp = timestamp;
}
private static final long serialVersionUID = -5094638816500738429L;
@Override
public Void invoke(File f, VirtualChannel channel) throws IOException {
if (!f.exists()) {
Files.newOutputStream(fileToPath(f)).close();
}
if (!f.setLastModified(timestamp))
throw new IOException("Failed to set the timestamp of " + f + " to " + timestamp);
return null;
}
}
private void setLastModifiedIfPossible(final long timestamp) throws IOException, InterruptedException {
String message = act(new SetLastModified(timestamp));
if (message != null) {
LOGGER.warning(message);
}
}
private static class SetLastModified extends MasterToSlaveFileCallable<String> {
private final long timestamp;
SetLastModified(long timestamp) {
this.timestamp = timestamp;
}View on GitHub (pinned to 2e228ff40b)