hashicorp/nomad · critical

failed to initialize client: %v

Error message

failed to initialize client: %v

What it means

NewClient returns this when c.init() fails — the bootstrap phase that creates state/alloc directories, sets up the RPC handler and local state database. The inner error tells which sub-step failed (e.g. state dir, alloc dir, state DB).

Source

Thrown at client/client.go:433

	}

	c.batchNodeUpdates = newBatchNodeUpdates(
		c.logger,
		c.updateNodeFromDriver,
		c.updateNodeFromDevices,
		c.updateNodeFromCSI,
		c.updateNodeFromHostVol,
	)

	// Initialize the server manager
	c.servers = servers.New(c.logger, c.shutdownCh, c)

	// Start server manager rebalancing go routine
	go c.servers.Start()

	// initialize the client
	if err := c.init(); err != nil {
		return nil, fmt.Errorf("failed to initialize client: %v", err)
	}

	// initialize the dynamic registry (needs to happen after init)
	c.dynamicRegistry =
		dynamicplugins.NewRegistry(c.stateDB, map[string]dynamicplugins.PluginDispenser{
			dynamicplugins.PluginTypeCSIController: func(info *dynamicplugins.PluginInfo) (any, error) {
				return csi.NewClient(info.ConnectionInfo.SocketPath, logger.Named("csi_client").With("plugin.name", info.Name, "plugin.type", "controller")), nil
			},
			dynamicplugins.PluginTypeCSINode: func(info *dynamicplugins.PluginInfo) (any, error) {
				return csi.NewClient(info.ConnectionInfo.SocketPath, logger.Named("csi_client").With("plugin.name", info.Name, "plugin.type", "client")), nil
			},
		})

	// Setup the clients RPC server
	c.setupClientRpc(rpcs)

	// Initialize the ACL state
	c.clientACLResolver.init()

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Read the wrapped inner error in the message to identify the failing sub-step.
  2. Fix state_dir/alloc_dir paths in the client config: ensure they exist or are creatable and writable by the nomad user.
  3. If the inner error indicates a corrupt state DB, back up and remove the state/alloc directories (Nomad logs the same guidance) — lost allocs will be rescheduled.
  4. Check filesystem mounts are writable and not full before restarting the client agent.

Example fix

// before
client {
  state_dir = "/mnt/ro-volume/nomad/state"
}
// after
client {
  state_dir = "/var/lib/nomad/state"  # writable by nomad user
}
Defensive patterns

Strategy: validation

Validate before calling

// before starting the client, validate the data paths
for _, d := range []string{cfg.StateDir, cfg.AllocDir} {
    if d == "" { continue }
    if fi, err := os.Stat(d); err == nil && !fi.IsDir() {
        return fmt.Errorf("%s exists but is not a directory", d)
    }
    if err := os.MkdirAll(d, 0o700); err != nil {
        return fmt.Errorf("cannot create %s: %w", d, err)
    }
}

Prevention

When it happens

Trigger: Calling client.NewClient with a config whose state_dir/alloc_dir cannot be created (bad path, permissions), whose state database cannot be opened (e.g. corrupt boltdb), or any other init sub-step failure.

Common situations: Misconfigured client block paths pointing at non-existent/non-writable mounts; leftover corrupt state_db from a crashed client; running Nomad as a user without access to data_dir; Kubernetes/Docker volumes mounted read-only.

Related errors


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