hashicorp/nomad · error

unexpectedly did not forward CSIVolume.List to region %q

Error message

unexpectedly did not forward CSIVolume.List to region %q

What it means

namespaceNoAssociatedVolumesInRegion forwards CSIVolume.List to a remote region to ensure no CSI volumes remain in the namespace before deletion. When the forward helper returns done=false (request not dispatched to the remote server), this internal error is returned with the region name and the namespace delete aborts.

Source

Thrown at nomad/namespace_endpoint.go:387

	return true, nil
}

// namespaceNoAssociatedVolumesInRegion returns true if there are no volumes
// associated with the namespace in the given region.
func (n *Namespace) namespaceNoAssociatedVolumesInRegion(authToken, namespace, region string) (bool, error) {
	volumesReq := &structs.CSIVolumeListRequest{
		QueryOptions: structs.QueryOptions{
			Region:     region,
			Namespace:  namespace,
			AllowStale: false,
			AuthToken:  authToken,
		},
	}

	var volumesResp structs.CSIVolumeListResponse
	done, err := n.srv.forward("CSIVolume.List", volumesReq, volumesReq, &volumesResp)
	if !done {
		return false, fmt.Errorf("unexpectedly did not forward CSIVolume.List to region %q", region)
	} else if err != nil {
		return false, err
	}

	for _, volume := range volumesResp.Volumes {
		if volume.Namespace == namespace {
			return false, nil
		}
	}
	return true, nil
}

// namespaceNoAssociatedVarsInRegion returns true if there are no variables
// associated with the namespace in the given region.
func (n *Namespace) namespaceNoAssociatedVarsInRegion(authToken, namespace, region string) (bool, error) {
	varReq := &structs.VariablesListRequest{
		QueryOptions: structs.QueryOptions{
			Region:     region,

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Check connectivity/federation health to the target region before deleting.
  2. Inspect CSI volume state per region (nomad volume status) once reachable.
  3. Fix server region configuration and retry the deletion.
Defensive patterns

Strategy: retry

Validate before calling

for _, region := range regions {
    if _, _, err := client.Agent().MembersOpts(&api.QueryOptions{Region: region}); err != nil {
        return fmt.Errorf("region %s unreachable before CSI volume check: %w", region, err)
    }
}

Try / catch

if err != nil && strings.Contains(err.Error(), "did not forward CSIVolume.List") {
    // restore region federation/connectivity, verify volume state, retry
}

Prevention

When it happens

Trigger: Deleting a namespace whose CSI volumes must be checked in another region where forwarding fails; peer region unreachable; routing failure producing done=false.

Common situations: Multi-region clusters using CSI storage plugins with an offline region; federation misconfiguration; stale region entries after decommissioning a datacenter.

Related errors


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