Skip to download

Deterministic accounting / no device measurements

RAIDZ expansion: ideal retained parity overhead

Five deterministic mixtures of old and new full-width parity geometry for the same 6 TiB payload. Not measured storage capacity or ZFS space-report output.

Download CSV5 scenarios / 12 columns

JSON and provenance / Model code / Generator / Research explanation

Method

Hold payload D=6 TiB and parity P=2 fixed; old width N=4, new width M=5. Enumerate old payload fractions f=0,0.25,0.5,0.75,1. Compute raw=D*f*N/(N-P)+D*(1-f)*M/(M-P); extra=D*f*P*(M-N)/((N-P)*(M-P)). TiB means 2^40 bytes. CSV rounds numbers to nine decimal places; the in-page table uses these exact half-TiB example values. Each row is an independent hypothetical cohort mixture, not an observed time step.

Fixed 6 TiB payload, width four to five, double parity. Old fraction is a share of payload bytes, not pool fullness.
Old fractionRaw TiBAll-new raw TiBExtra TiB
010100
0.2510.5100.5
0.511101
0.7511.5101.5
112102

Reproduce

Run beside the model file with Node.js; no packages, device access or random seed are required. The output is byte-identical CSV. The generator also writes JSON and SHA-256 hashes; generatedAt is a build timestamp, not an observation period.

node --input-type=module -e 'import { toCsv } from "./raidz-expansion.mjs"; process.stdout.write(toCsv())'

For the 50% row, three TiB retain the 2:2 data-to-parity ratio and three TiB use 3:2. The resulting 11 TiB is one TiB above the all-new counterfactual. That counterfactual assumes the old allocations are freed.

Limits

Column definitions

oldWidth
Original physical width, including parity; 4 in this example.
newWidth
Final physical width, including parity; 5 in this example.
parity
Unchanged parity-fragment count per full row; 2.
payloadTiB
Total payload in TiB (2^40 bytes), excluding parity; 6.
oldFraction
Fraction of payload bytes retaining the old data-to-parity ratio, not pool occupancy.
oldPayloadTiB
Payload at the old ratio, in TiB.
newPayloadTiB
Payload at the new ratio, in TiB.
oldParityTiB
Ideal parity allocated for the old cohort, in TiB.
newParityTiB
Ideal parity allocated for the new cohort, in TiB.
rawTiB
Modeled total payload plus parity, in TiB; not zfs list or zpool list output.
allNewRawTiB
Counterfactual allocation if all payload used the new ratio and old blocks were freed, in TiB.
retainedExtraTiB
Extra allocation relative to that all-new counterfactual, in TiB; not promised reclaimable space.

Sources and license

CC0-1.0 for Hesela's original model and generated data; cited sources retain their own rights.

  1. OpenZFS 2.3: zpool-attach(8), RAID-Z expansion and space reporting (accessed 2026-10-16)
  2. OpenZFS zfs-2.3.4: zfs-rewrite(8), snapshot and clone space consequences (accessed 2026-10-16)
  3. OpenZFS zfs-2.3.0: zpoolconcepts(7), RAID-Z virtual devices (accessed 2026-10-16)

Definitions: RAIDZ and RAIDZ expansion. Compare the separate repair-placement model; it counts helper reads, not capacity.