hashicorp/terraform · error

failed to delete file %v: %v

Error message

failed to delete file %v: %v

What it means

Raised by deleteObject() when cosClient.Object.Delete returns a nil response, meaning no HTTP response was received for the DELETE request. The wrapped error is the underlying transport failure. This is the 'request never reached the server / no response' branch.

Source

Thrown at internal/backend/remote-state/cos/client.go:264

		log.Printf("[DEBUG] putObject %s: error: %v", cosFile, err)
		return fmt.Errorf("failed to save file to %v: %v", cosFile, err)
	}
	defer rsp.Body.Close()

	log.Printf("[DEBUG] putObject %s: code: %d, error: %v", cosFile, rsp.StatusCode, err)
	if err != nil {
		return fmt.Errorf("failed to save file to %v: %v", cosFile, err)
	}

	return nil
}

// deleteObject delete remote object
func (c *remoteClient) deleteObject(cosFile string) error {
	rsp, err := c.cosClient.Object.Delete(c.cosContext, cosFile)
	if rsp == nil {
		log.Printf("[DEBUG] deleteObject %s: error: %v", cosFile, err)
		return fmt.Errorf("failed to delete file %v: %v", cosFile, err)
	}
	defer rsp.Body.Close()

	log.Printf("[DEBUG] deleteObject %s: code: %d, error: %v", cosFile, rsp.StatusCode, err)
	if rsp.StatusCode == 404 {
		return nil
	}

	if err != nil {
		return fmt.Errorf("failed to delete file %v: %v", cosFile, err)
	}

	return nil
}

// getBucket list bucket by prefix
func (c *remoteClient) getBucket(prefix string) (obs []cos.Object, err error) {
	fs, rsp, err := c.cosClient.Bucket.Get(c.cosContext, &cos.BucketGetOptions{Prefix: prefix})

View on GitHub (pinned to c9def3e214)

Solutions

  1. Verify connectivity to the COS endpoint and retry the operation.
  2. Confirm the bucket region/endpoint in the backend block.
  3. If deleting a lock file during unlock, retry the unlock after confirming credentials are valid.
  4. Check TF_LOG=DEBUG for the underlying transport error to distinguish DNS/auth/network.

Example fix

# retry the destroy/refresh once connectivity is confirmed
terraform init
terraform destroy
Defensive patterns

Strategy: retry

Validate before calling

// Preflight: confirm connectivity to the endpoint.
// (No object-level validation for a delete beyond reachability.)

Try / catch

if err := c.deleteObject(c.stateFile); err != nil {
    if strings.Contains(err.Error(), "failed to delete file") {
        // nil-response branch: safe to retry
    }
}

Prevention

When it happens

Trigger: At client.go:261-264: rsp == nil. Occurs on network failure, DNS error, TLS failure, connection refused, or context cancellation before the DELETE completed.

Common situations: Network outage during 'terraform destroy' or 'terraform state rm'; backend misconfigured region/endpoint; VPN or firewall blocking egress; terraform interrupted while deleting state or lock files.

Related errors


AI-assisted analysis of hashicorp/terraform@c9def3e214 (2026-08-07). Data as JSON: /api/errors/6845f9d67714df63. Report an issue: GitHub.