{"record":{"id":"7934f95dc8e44838","repo":"hashicorp/nomad","slug":"no-storage-node-plugins-found","errorCode":null,"errorMessage":"no storage node plugins found","messagePattern":"no storage node plugins found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"client/pluginmanager/csimanager/manager.go","lineNumber":101,"sourceCode":"func (c *csiManager) WaitForPlugin(ctx context.Context, pType, pID string) error {\n\tctx, cancel := context.WithTimeout(ctx, time.Minute)\n\tdefer cancel()\n\tp, err := c.registry.WaitForPlugin(ctx, pType, pID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%s plugin '%s' did not become ready: %w\", pType, pID, err)\n\t}\n\tc.instancesLock.Lock()\n\tdefer c.instancesLock.Unlock()\n\tc.ensureInstance(p)\n\treturn nil\n}\n\nfunc (c *csiManager) ManagerForPlugin(ctx context.Context, pluginID string) (VolumeManager, error) {\n\tc.instancesLock.RLock()\n\tdefer c.instancesLock.RUnlock()\n\tnodePlugins, hasAnyNodePlugins := c.instances[\"csi-node\"]\n\tif !hasAnyNodePlugins {\n\t\treturn nil, fmt.Errorf(\"no storage node plugins found\")\n\t}\n\n\tmgr, hasPlugin := nodePlugins[pluginID]\n\tif !hasPlugin {\n\t\treturn nil, fmt.Errorf(\"plugin %s for type csi-node not found\", pluginID)\n\t}\n\n\treturn mgr.VolumeManager(ctx)\n}\n\n// Run starts a plugin manager and should return early\nfunc (c *csiManager) Run() {\n\tgo c.runLoop()\n}\n\nfunc (c *csiManager) runLoop() {\n\ttimer := time.NewTimer(0) // ensure we sync immediately in first pass\n\tcontrollerUpdates := c.registry.PluginsUpdatedCh(c.shutdownCtx, \"csi-controller\")","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/client/pluginmanager/csimanager/manager.go#L83-L119","documentation":"ManagerForPlugin looks up an initialized CSI volume manager instance for a plugin ID among the node's registered csi-node plugins. This error is returned when the manager has no csi-node instances at all, meaning no node-type CSI plugin has ever become ready on this client.","triggerScenarios":"Requesting a volume manager (e.g. during task volume mounting or GC) before any csi-node plugin registered, or after all CSI plugins were removed from the node.","commonSituations":"Taskgroup volume references pointing at a host whose CSI plugin task never started; the CSI plugin job is stopped or its alloc failed; a volume is used on a node where the plugin is not deployed; startup ordering where the workload mounts before the plugin fingerprint completes.","solutions":["Deploy/ensure the CSI plugin job is running and healthy on the target node (nomad job status <csi-plugin-job>)","Confirm the volume's plugin_id matches a plugin registered on that node via nomad node status <id> -verbose (CSI section)","Check plugin supervisor logs on the client for registration errors","Reschedule or reschedule the workload after the plugin registers; add placement constraints so volumes only run on nodes with their plugin"],"exampleFix":"// before: mounting a volume on any node regardless of plugin placement\nconstraint missing...\n\n// after: constrain workload to nodes that run the plugin\nconstraint {\n  attribute = \"${meta.csi_plugin.<plugin_id>.healthy}\"\n  value     = \"true\"\n}","handlingStrategy":"fallback","validationCode":"node, _, _ := client.Nodes().Info(nodeID, nil)\nregistered := false\nfor _, p := range node.CSIMutexPlugins {\n\tif p.Provider == \"aws.efs\" && p.NodeID != nil {\n\t\tregistered = true\n\t}\n}\nif !registered {\n\treturn fmt.Errorf(\"no csi-node plugin registered on target node\")\n}","typeGuard":null,"tryCatchPattern":"mgr, err := manager.ManagerForPlugin(ctx, pluginID)\nif err != nil {\n\tif strings.Contains(err.Error(), \"no storage node plugins found\") {\n\t\t// fall back: wait for plugin registration, then retry\n\t\tif werr := client.WaitForPlugin(ctx, \"csi-node\", pluginID); werr != nil {\n\t\t\treturn fmt.Errorf(\"CSI plugin unavailable on node: %w\", werr)\n\t\t}\n\t\tmgr, err = manager.ManagerForPlugin(ctx, pluginID)\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n}","preventionTips":["Deploy the CSI plugin job on every node (or a dedicated pool) that mounts volumes","Use job constraints referencing plugin health metadata so workloads only land on nodes with their plugin","Confirm node plugin (not just controller) is registered before scheduling volume consumers","Monitor node CSI plugin registration as a health check"],"tags":["csi","nomad","plugin-manager","storage","node-plugins"],"backgroundTag":"csi-plugin-not-found","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}