Skip to main content

Chris Engelbert Chris Engelbert

Zero-Downtime Storage Upgrades: What 'Live Upgrade' Actually Requires

May 12, 2026  |  9 min read

Last edited: Jun 8, 2026

Zero-Downtime Storage Upgrades: What 'Live Upgrade' Actually Requires

Storage vendors frequently claim live upgrade support. The claim is almost always true in the narrow sense: the upgrade process doesn’t require a full cluster shutdown. What the claim often obscures is the difference between an upgrade procedure that minimizes downtime and one that has been tested to produce zero I/O errors throughout, verified by running a concurrent workload during the entire upgrade process.

For teams in healthcare, fintech, and other environments where maintenance windows are expensive or contractually limited, the distinction is the entire question.

This post covers what live upgrade technically requires, what the graceful shutdown sequence looks like for a single storage node, what can go wrong at each step, and how to verify that a storage system’s live upgrade claim is backed by real test evidence.

Why Storage Upgrades Are Uniquely Risky

Upgrading a web application involves restarting containers with a new image. The application layer is stateless or nearly so; a brief restart produces a brief error for in-flight requests, and everything recovers. The risk is contained.

Storage upgrades are different. The storage layer holds persistent state, and the upgrade process has to move that state safely while applications continue writing to it. A rolling upgrade of a distributed storage system involves, for each node:

  1. Migrating all active volumes off the node
  2. Shutting down the storage process
  3. Upgrading the storage software
  4. Restarting the storage process with the new version
  5. Allowing the cluster to rebalance volumes back to the node

Each of these steps has failure modes. A migration that completes partially before the storage process stops leaves volumes without their expected redundancy for the duration of the upgrade. A version mismatch between upgraded and non-upgraded nodes can cause replication protocol failures if the upgrade changes the wire protocol. A restart that fails silently reduces cluster capacity without triggering alerts.

The Graceful Shutdown Sequence

simplyblock’s graceful shutdown sequence is the mechanism behind the graceful_shutdown test in the chaos engineering suite. The sequence for a single node upgrade looks like this:

Step 1: Suspend new LVOL placements on the node. The scheduler stops placing new volumes on the node being upgraded. Existing volumes remain in place for now.

Step 2: Migrate active LVOLs to secondary nodes. The cluster moves each LVOL’s primary replica to another node that already holds a secondary copy. This is a metadata update that changes which node is the Optimized path for each volume. Hosts connected via NVMe multi-path complete an ANA path transition: the host’s NVMe driver sees the path change and switches I/O to the newly Optimized path on the secondary node.

During this step, every application writing to any LVOL on this node goes through an NVMe path switch. The same mechanism as an unplanned failure, but controlled and announced in advance. Any I/O error during this migration is a bug.

Step 3: Verify all LVOLs have migrated. The cluster confirms no LVOLs remain with this node as their Optimized path before proceeding. This gate prevents proceeding with an upgrade while volumes are still being actively served from the node.

Step 4: Shut down the storage process. The SPDK process stops. No LVOLs are active on this node, so there are no in-flight writes to protect. The node goes offline cleanly.

Step 5: Upgrade the software and restart. The storage software is updated and restarted. On Kubernetes, this is a DaemonSet update: the new pod image is pulled and the pod restarts. The cluster registers the node as healthy once the SPDK target is back online and passes its health checks.

Step 6: Allow rebalancing. The scheduler begins placing new LVOLs on the upgraded node and migrating replicas back if the cluster prefers a balanced distribution. This step happens in the background and doesn’t affect ongoing I/O.

Zero-downtime storage upgrade sequence: pre-upgrade state, migration steps, and post-upgrade result
Figure 1: The six-step graceful shutdown and upgrade sequence with FIO running continuously throughout.

What Can Go Wrong

Migration stalls under high I/O load. If the cluster is under heavy write load during step 2, migration completion may take longer than expected. The migration algorithm must wait for write quorum to re-establish through the new primary before declaring the migration complete. Long migration windows increase the time applications spend in NVMe path-switch state, which increases P99 write latency during the window.

Protocol version mismatch during mixed-version operation. Between steps 4 and 5, the cluster is temporarily running one version on the upgraded node and the previous version on remaining nodes. If the upgrade changes any replication protocol or metadata format, mixed-version operation can cause replication failures. simplyblock manages this through strict compatibility constraints: protocol-breaking changes require a two-phase upgrade with an intermediate version that both old and new nodes understand.

Node doesn’t rejoin after restart. If the storage process fails to start on the upgraded version (incompatible kernel modules, missing dependencies, configuration format change), the node stays offline. The cluster continues operating with reduced capacity, but the upgrade is now blocked. Monitoring node health post-upgrade before proceeding to the next node is the safeguard against cascading capacity reduction.

Snapshot operations during migration. Snapshots that start during step 2 (while an LVOL is mid-migration) create a consistency challenge: the snapshot must capture state at a moment when the volume’s primary is changing. A storage system without explicit handling for this case can produce a snapshot that’s inconsistent across the migration boundary.

Monitoring blind spots. The upgrade process reduces redundancy for each node during its upgrade window. If two nodes are upgraded simultaneously, or if a hardware failure occurs while another node is mid-upgrade, the cluster may be in a degraded state without sufficient replicas. Sequencing upgrades one node at a time and confirming full replication before proceeding to the next node is the conservative path.

What the graceful_shutdown Test Actually Validates

The chaos engineering graceful_shutdown test runs the full sequence above while FIO operates on all 20 test volumes. The pass criterion is zero I/O errors throughout, including during every NVMe path switch in step 2.

This test is not run once before a release. It’s run as part of the 100-hour stress loop, where simplyblock’s continuous test alternates between the four failure types. graceful_shutdown is exercised hundreds of times per stress run. The reason is timing: a bug in the migration-while-snapshot scenario described above has a narrow timing window. It won’t appear in the first five graceful shutdowns. It may appear at the 200th, when a snapshot happens to start at exactly the wrong moment during migration.

The upgrade test in Gate 5 of the release pipeline goes further: it runs a major version upgrade on an active cluster with FIO running, not just a graceful shutdown of a single node. This is the test that validates protocol compatibility handling and the full upgrade sequence across all nodes, not just the single-node drain behavior.

Full test coverage by gate:

GateTestPass Criterion
Gate 1Full E2E functional suiteAll API operations pass, including snapshot and encryption
Gates 2–3100+ hour Docker and Kubernetes stress loopsZero data errors, zero I/O errors throughout
Gate 420+ hour LVOL continuous operationsNo resource leaks, no capacity accounting errors
Gate 5Configuration matrix + live upgradeAll NDCS/NPCS configurations pass; FIO shows zero errors during full version upgrade

Total test time before each release: approximately 220+ hours on dedicated NVMe lab hardware.

Verifying a Live Upgrade Claim

If a storage vendor claims live upgrade support, these questions distinguish a real claim from a marketing assertion:

  • Is the upgrade tested with a running application workload, or is the cluster idle during the test?
  • What is the pass criterion: “no downtime” (meaning the cluster stayed up) or “zero I/O errors” (meaning the application saw no errors)?
  • How is the pass criterion verified: manual observation, automated test, or checksum-verified data integrity?
  • Does the test cover protocol-version transitions between old and new node versions?
  • How many times has the upgrade test been run, and on what Kubernetes platforms?

For healthcare environments running HIPAA-covered workloads and fintech systems where maintenance windows have business continuity implications, “we’ve done live upgrades” and “we run 100+ hours of chaos testing that includes graceful shutdown hundreds of times before each release” are not equivalent claims.

Running storage upgrades on a regulated workload? The simplyblock engineering team can walk through the upgrade sequence and test evidence for your specific platform and compliance requirements. Talk to a storage architect

Questions and Answers

How long does a single-node upgrade take with simplyblock?

Migration time in step 2 depends on the number of LVOLs on the node and the current I/O load. Under light load, migration completes within minutes. Under heavy write load, migration may take longer. The upgrade process doesn’t proceed to step 4 until all migrations are confirmed complete, so the total time scales with the actual migration workload. Scheduling upgrades during low-traffic periods reduces the migration window.

Does simplyblock support rolling upgrades without any maintenance window?

Yes. The graceful shutdown sequence migrates all active volumes before the node goes offline, and the NVMe multi-path mechanism handles the resulting path switches transparently. Applications don’t require a maintenance window for node-by-node rolling upgrades. The Gate 5 upgrade test verifies this before each release ships.

What happens if a node fails during an upgrade before migration completes?

If a node fails before completing step 3 (migration verification), the cluster handles it as a standard unplanned failure: the volumes that were migrating are reconstructed from their replicas on surviving nodes. The upgrade process pauses until the unplanned failure is resolved. This is the conservative path: it doesn’t proceed through the upgrade with a failed node.

Can we upgrade simplyblock without Kubernetes operator involvement?

No. The upgrade process on Kubernetes is driven by a DaemonSet update through the simplyblock operator. This is by design: the operator coordinates the migration sequence, health checks, and gate verification that make live upgrade safe. Manual node upgrades outside the operator’s control bypass those gates.

How does upgrade sequencing interact with erasure coding configurations?

Erasure coding configurations with parity (NDCS=2, NPCS=1 or NPCS=2) require a minimum number of available nodes to maintain fault tolerance. Upgrading one node at a time ensures the remaining nodes can maintain the required parity during the upgrade window. simplyblock’s release testing covers all four standard NDCS/NPCS configurations in Gate 5 to validate that upgrade sequencing preserves fault tolerance across all configurations.

You may also like:

We Break Our Storage So You Never Have To
We Break Our Storage So You Never Have To

Simplyblock runs 100+ hours of automated chaos engineering before every release: real NVMe hardware, real FIO workloads, four failure types injected under live load. This is what we test, why it is necessary, and what it means for your infrastructure.

NVMe/TCP vs NVMe/RoCE for Kubernetes Storage: Choosing the Right Fabric
NVMe/TCP vs NVMe/RoCE for Kubernetes Storage: Choosing the Right Fabric

NVMe over Fabrics gives Kubernetes clusters low-latency block storage over the network. The transport you pick, TCP or RoCE, determines your latency floor, infrastructure cost, and operational complexity. Here is how to choose.

NVMe Storage Cost Optimization in 2026: Erasure Coding, Thin Provisioning, and Compute Efficiency
NVMe Storage Cost Optimization in 2026: Erasure Coding, Thin Provisioning, and Compute Efficiency

NVMe drives deliver the performance Kubernetes stateful workloads need, but triple replication and thick provisioning multiply their cost fast. Here is a practical breakdown of erasure coding economics, thin provisioning, and how sub-millisecond latency reduces compute waste.