hashicorp/terraform · error

error splitting data into parts: %s

Error message

error splitting data into parts: %s

What it means

Raised in objectMultiPartSplit when SplitSizeToOffsetsAndLimits fails to compute part offsets for the given data size. This is the inner/origination error that [312] wraps at the call site. The only failure mode of SplitSizeToOffsetsAndLimits is exceeding the maximum part count, so this fires under the same condition as 312/318.

Source

Thrown at internal/backend/remote-state/oci/multipart_upload.go:172

		ObjectName:         multipartUploadResponse.Object,
		OpcClientRequestId: multipartUploadResponse.OpcClientRequestId,
		RequestMetadata:    multipartUploadRequest.RequestMetadata,
		CommitMultipartUploadDetails: objectstorage.CommitMultipartUploadDetails{
			PartsToCommit: commitMultipartUploadPartDetails,
		},
	}
	_, err = multipartUploadData.client.objectStorageClient.CommitMultipartUpload(context.Background(), commitMultipartUploadRequest)
	if err != nil {
		return fmt.Errorf("failed to commit multipart upload: %s", err)
	}

	return nil
}
func (m MultipartUploadData) objectMultiPartSplit() ([]objectStorageSourceBlock, error) {
	dataSize := int64(len(m.Data))
	offsets, partSize, err := SplitSizeToOffsetsAndLimits(dataSize)
	if err != nil {
		return nil, fmt.Errorf("error splitting data into parts: %s", err)
	}
	sourceBlocks := make([]objectStorageSourceBlock, len(offsets))
	for i := range offsets {
		start := offsets[i]
		end := start + partSize
		if end > dataSize {
			end = dataSize
		}
		sourceBlocks[i] = objectStorageSourceBlock{
			section:     io.NewSectionReader(bytes.NewReader(m.Data), start, end-start),
			blockNumber: common.Int(i + 1),
		}
	}
	return sourceBlocks, nil
}

/*
SplitSizeToOffsetsAndLimits splits a file size into chunks based on DefaultFilePartSize.

View on GitHub (pinned to c9def3e214)

Solutions

  1. Shrink the state file (split workspaces, prune deleted resources, move large blobs out of state).
  2. Increase DefaultFilePartSize so totalParts stays under MaxCount (verify the new size is within OCI per-part limits).
  3. Confirm the large size is not accidental (e.g. a binary accidentally stored in state).
Defensive patterns

Strategy: validation

Validate before calling

// Validate part count before splitting:
dataSize := int64(len(m.Data))
if (dataSize+DefaultFilePartSize-1)/DefaultFilePartSize > MaxCount {
    return nil, fmt.Errorf("data exceeds maximum part count")
}

Try / catch

offsets, partSize, err := SplitSizeToOffsetsAndLimits(dataSize)
if err != nil {
    return nil, fmt.Errorf("error splitting data into parts: %s", err)
}

Prevention

When it happens

Trigger: SplitSizeToOffsetsAndLimits(dataSize) at multipart_upload.go:170 returns an error because totalParts = ceil(dataSize / DefaultFilePartSize) exceeds MaxCount (10000). dataSize > ~1.28 TiB at the default 128MiB part size.

Common situations: Same as 312/318: a pathologically large state file (>1.28 TiB) reaching the multipart path; oversized synthetic/test state; state bloat from mismanaged resources.

Related errors


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