hashicorp/nomad · error

error getting plugin: %s, %v

Error message

error getting plugin: %s, %v

What it means

clientIDsForController calls snap.CSIPluginByID(ws, pluginID); if the state store lookup returns a non-nil error it is wrapped as 'error getting plugin: <id>, <v>'. This indicates a state-store failure while reading the CSI plugin registry, not merely an absent plugin (that yields 'plugin missing').

Source

Thrown at nomad/client_csi_endpoint.go:303

func (a *ClientCSI) clientIDsForController(pluginID string) ([]string, error) {

	snap, err := a.srv.State().Snapshot()
	if err != nil {
		return nil, err
	}

	if pluginID == "" {
		return nil, fmt.Errorf("missing plugin ID")
	}

	ws := memdb.NewWatchSet()

	// note: plugin IDs are not scoped to region but volumes are. so any Nomad
	// client we get for a controller is already in the same region for the
	// volume.
	plugin, err := snap.CSIPluginByID(ws, pluginID)
	if err != nil {
		return nil, fmt.Errorf("error getting plugin: %s, %v", pluginID, err)
	}
	if plugin == nil {
		return nil, fmt.Errorf("plugin missing: %s", pluginID)
	}

	clientIDs := []string{}

	if len(plugin.Controllers) == 0 {
		return nil, fmt.Errorf("failed to find instances of controller plugin %q", pluginID)
	}

	var merr error
	for clientID, controller := range plugin.Controllers {
		if !controller.IsController() {
			// we don't have separate types for CSIInfo depending on whether
			// it's a controller or node. this error should never make it to
			// production
			merr = errors.Join(merr, fmt.Errorf(

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Check Nomad server logs and raft/leader health (`nomad server members`, leader election state).
  2. Retry the operation after the cluster stabilizes.
  3. If errors persist, investigate state store integrity (server data dir, restore from backup per HashiCorp guidance).

Example fix

// operator check before retrying
nomad server members   # ensure a stable leader
# after leader stabilizes
nomad volume snapshots -plugin aws-ebs-controller
Defensive patterns

Strategy: retry

Validate before calling

// preflight: check server reachability/leader before state-store reads
leader, _, err := client.Status().Leader()
if err != nil || leader == "" { return fmt.Errorf("no stable leader; defer RPCs") }

Type guard

func clusterReady(leader string) bool { return leader != "" }

Try / catch

err := csi.ControllerListVolumes(args, reply)
if err != nil && strings.Contains(err.Error(), "error getting plugin:") {
    // transient state-store issue: backoff and retry
    time.Sleep(backoff)
}

Prevention

When it happens

Trigger: sendCSIControllerRPC → clientIDsForController when the state snapshot's CSIPluginByID query errors — e.g. state store backend failure, snapshot inconsistency, or memdb error during server startup/shutdown.

Common situations: Nomad server state store degraded (raft issues, shutdown in progress); corrupted or migrating state store; transient errors during leader failover.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/31b4d17a13b09569. Report an issue: GitHub.