jenkinsci/jenkins · error · IOException

unimplemented

Error message

unimplemented

What it means

The Default FileSystemProvisioner.snapshot() method is a stub that always throws IOException("unimplemented"). The Default implementation provides no-ops for prepareWorkspace and discardWorkspace but explicitly refuses workspace snapshotting. This signals that workspace snapshotting requires a real FileSystemProvisioner implementation (typically provided by a cloud agent plugin).

Source

Thrown at core/src/main/java/hudson/FileSystemProvisioner.java:64

    @Override
    public Descriptor getDescriptor() {
        return Jenkins.get().getDescriptorOrDie(getClass());
    }

    public static final FileSystemProvisioner DEFAULT = new Default();

    public static final class Default extends FileSystemProvisioner {
        @Override
        public void prepareWorkspace(AbstractBuild<?, ?> build, FilePath ws, TaskListener listener) throws IOException, InterruptedException {
        }

        @Override
        public void discardWorkspace(AbstractProject<?, ?> project, FilePath ws) throws IOException, InterruptedException {
        }

        @Override
        public WorkspaceSnapshot snapshot(AbstractBuild<?, ?> build, FilePath ws, String glob, TaskListener listener) throws IOException, InterruptedException {
            throw new IOException("unimplemented");
        }

    }
}

View on GitHub (pinned to 2e228ff40b)

Solutions

  1. Install or configure a FileSystemProvisioner implementation that supports snapshots (e.g., a cloud agent plugin that overrides snapshot).
  2. If you wrote the calling code, check FileSystemProvisioner capabilities before invoking snapshot().
  3. Avoid the snapshot code path entirely for local/default provisioner setups.

Example fix

// before
provisioner.snapshot(build, ws, glob, listener);

// after — guard against the unimplemented default
if (provisioner instanceof FileSystemProvisioner.Default) {
    listener.getLogger().println("Workspace snapshots not supported by this provisioner.");
} else {
    provisioner.snapshot(build, ws, glob, listener);
}
Defensive patterns

Strategy: validation

Validate before calling

if (provisioner instanceof FileSystemProvisioner.Default) {
    throw new UnsupportedOperationException("Workspace snapshots are not supported by the default FileSystemProvisioner.");
}

Type guard

public static boolean supportsSnapshot(FileSystemProvisioner p) {
    return !(p instanceof FileSystemProvisioner.Default);
}

Try / catch

try {
    provisioner.snapshot(build, ws, glob, listener);
} catch (IOException e) {
    if ("unimplemented".equals(e.getMessage())) {
        listener.getLogger().println("Snapshot not supported; skipping.");
    } else {
        throw e;
    }
}

Prevention

When it happens

Trigger: Calling FileSystemProvisioner.Default.snapshot() — i.e., Jenkins is using the built-in default provisioner and something (a plugin, a build wrapper, or an API consumer) requests a workspace snapshot via FilePath or AbstractBuild APIs.

Common situations: A plugin that relies on workspace snapshotting (e.g., for artifact caching, workspace reuse, or pre-build checkpointing) running against a Jenkins instance without a cloud/agent plugin that provides a real FileSystemProvisioner.

Related errors


AI-assisted analysis of jenkinsci/jenkins@2e228ff40b (2026-08-14). Data as JSON: /api/errors/aff1afad68913186. Report an issue: GitHub.