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 columnsJSON 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.
| Old fraction | Raw TiB | All-new raw TiB | Extra TiB |
|---|---|---|---|
| 0 | 10 | 10 | 0 |
| 0.25 | 10.5 | 10 | 0.5 |
| 0.5 | 11 | 10 | 1 |
| 0.75 | 11.5 | 10 | 1.5 |
| 1 | 12 | 10 | 2 |
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
- This is deterministic algebra, not a hardware benchmark, field dataset or replication of FastScale; no observation period, sampling interval or statistical confidence interval applies.
- Assumes full-width equal-size fragments, fixed payload and unchanged parity. Real RAIDZ blocks can use variable widths and incur allocation padding.
- Excludes metadata, compression, deduplication, snapshots, clones, reservations, free-space headroom and filesystem accounting conventions.
- The all-new counterfactual assumes old blocks are freed. Retained snapshot or clone references can make a rewrite consume additional space.
- Multiple historical expansion widths require separate cohort accounting; this export contains only one old and one new geometry.
- No prediction of rewrite duration, error rate, recoverability, actual usable capacity or reported AVAIL.
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.
- OpenZFS 2.3: zpool-attach(8), RAID-Z expansion and space reporting (accessed 2026-10-16)
- OpenZFS zfs-2.3.4: zfs-rewrite(8), snapshot and clone space consequences (accessed 2026-10-16)
- 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.