{"record":{"id":"46701367579fca98","repo":"jenkinsci/jenkins","slug":"0-seems-to-be-offline","errorCode":null,"errorMessage":"{0} seems to be offline","messagePattern":"(.+?) seems to be offline","errorType":"exception","errorClass":"AbortException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/hudson/model/AbstractBuild.java","lineNumber":453,"sourceCode":"\n        public BuildListener getListener() {\n            return listener;\n        }\n\n        /**\n         * Allocates the workspace from {@link WorkspaceList}.\n         *\n         * @param n\n         *      Passed in for the convenience. The node where the build is running.\n         * @param wsl\n         *      Passed in for the convenience. The returned path must be registered to this object.\n         */\n        protected Lease decideWorkspace(@NonNull Node n, WorkspaceList wsl) throws InterruptedException, IOException {\n            String customWorkspace = getProject().getCustomWorkspace();\n            if (customWorkspace != null) {\n                FilePath rootPath = n.getRootPath();\n                if (rootPath == null) {\n                    throw new AbortException(n.getDisplayName() + \" seems to be offline\");\n                }\n                // we allow custom workspaces to be concurrently used between jobs.\n                return Lease.createDummyLease(rootPath.child(getEnvironment(listener).expand(customWorkspace)));\n            }\n            // TODO: this cast is indicative of abstraction problem\n            FilePath ws = n.getWorkspaceFor((TopLevelItem) getProject());\n            if (ws == null) {\n                throw new AbortException(n.getDisplayName() + \" seems to be offline\");\n            }\n            return wsl.allocate(ws, getBuild());\n        }\n\n        @NonNull\n        @Override\n        public Result run(@NonNull BuildListener listener) throws Exception {\n            final Node node = getCurrentNode();\n\n            assert builtOn == null;","sourceCodeStart":435,"sourceCodeEnd":471,"githubUrl":"https://github.com/jenkinsci/jenkins/blob/2e228ff40b14dbc8b14ffbc6edf0e4383cf744fc/core/src/main/java/hudson/model/AbstractBuild.java#L435-L471","documentation":"Thrown by decideWorkspace() when a custom workspace is configured and n.getRootPath() returns null. A null root path means Jenkins cannot resolve the agent's root filesystem path — the agent channel is dead or the node is effectively offline. The AbortException surfaces the node's display name so the operator knows which node failed.","triggerScenarios":"decideWorkspace(n, wsl) is called with getProject().getCustomWorkspace() != null; n.getRootPath() returns null (agent channel disconnected or node root path not configured).","commonSituations":"Agent went offline between allocation and workspace setup; agent root directory is misconfigured or points to an inaccessible path; the agent JVM crashed or the network channel dropped after the executor was assigned.","solutions":["Check the agent's connectivity status in the Jenkins UI and reconnect if offline","Verify the agent's 'Root Directory' (remote FS) setting is valid and writable","Ensure the agent channel is stable before the build starts (increase channel timeouts for flaky networks)","If using custom workspaces, confirm the agent can actually resolve and access its root path"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"FilePath root = node.getRootPath();\nif (root == null) {\n    throw new AbortException(node.getDisplayName() + \" root path unavailable; node likely offline\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    // workspace allocation / build run\n} catch (AbortException e) {\n    if (e.getMessage().endsWith(\"seems to be offline\")) {\n        // retry or reassign to another node\n    }\n    throw e;\n}","preventionTips":["Verify agents are online before queueing builds on them","Validate the agent remote root directory is set and accessible","Monitor agent channel health and reconnect stale channels"],"tags":["build","workspace","agent","offline","channel"],"backgroundTag":null,"analyzedSha":"2e228ff40b14dbc8b14ffbc6edf0e4383cf744fc","analyzedAt":"2026-08-14T07:07:15.274Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}