Skip to content

Add Storage TSG: repair jobs restart and never complete on a failing high-latency disk#327

Open
1008covingtonlane wants to merge 4 commits into
Azure:mainfrom
1008covingtonlane:tsg-storage-repair-jobs-failing-disk
Open

Add Storage TSG: repair jobs restart and never complete on a failing high-latency disk#327
1008covingtonlane wants to merge 4 commits into
Azure:mainfrom
1008covingtonlane:tsg-storage-repair-jobs-failing-disk

Conversation

@1008covingtonlane

Copy link
Copy Markdown
Collaborator

What

Adds a new Storage troubleshooting guide, TSG/Storage/Troubleshoot-Storage-RepairJobsRestartOnFailingDisk.md, and links it from the Storage index.

Why

There is no existing TSG for the common Storage Spaces Direct failure mode where *-Repair / *-Regeneration storage jobs reset toward 0% and never complete, with a volume stuck at OperationalStatus = No Redundancy. The usual cause is a single physical disk failing with very high latency and a high IO error rate while still reporting HealthStatus = Healthy (OperationalStatus = "OK, Abnormal Latency"). The same disk can also trip a DPC_WATCHDOG_VIOLATION (bugcheck 0x133) on its host node under write load, so a node crash and the stuck repair often share one cause. The condition is frequently misread as a pool-capacity problem.

What the guide covers

  • Symptoms and the health-fault IDs involved (PhysicalDisk.HighLatency.Outlier.AverageIO, PhysicalDisk.HighErrorCount.Outlier.AverageIO, VirtualDisks.NoRedundancy, VirtualDisks.LastCopy).
  • Where the failing disk shows up: PowerShell, Windows event log (disk 153; Storage Spaces 203/205/207/209/302/304/305/312), cluster log, Azure portal, Failover Cluster Manager and Windows Admin Center.
  • How to confirm there is enough free reserve to retire (failing-disk used capacity vs pool free; S2D rebuilds into reserve capacity, so no hot spare is required).
  • Resolution: Set-PhysicalDisk -Usage Retired, monitor the rebuild jobs, then Remove-PhysicalDisk, with risk labels and a last-copy caveat.
  • Pre-retire pre-checks and gotchas, plus prevention.

All commands, fault strings, and event IDs are from an observed case and are scrubbed of environment-specific identifiers.

New troubleshooting guide for S2D storage repair/regeneration jobs that reset and never complete when a single disk is failing with high latency and IO errors. Covers detection surfaces (PowerShell, event logs, cluster log, Azure portal, FCM/WAC), the free-space and reserve check before retiring, the retire-and-rebuild resolution, pre-retire gotchas, and prevention. Adds the guide to the Storage index.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 4e9c61e6-56c5-46a0-9ddb-8698443047bd
Copilot AI review requested due to automatic review settings July 10, 2026 23:31

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a Storage TSG for diagnosing and resolving repair jobs blocked by a failing high-latency disk.

Changes:

  • Documents symptoms, diagnostics, capacity checks, and disk replacement.
  • Adds the guide to the Storage index.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
TSG/Storage/Troubleshoot-Storage-RepairJobsRestartOnFailingDisk.md Adds the troubleshooting procedure.
TSG/Storage/README.md Links the new guide.

Comment thread TSG/Storage/Troubleshoot-Storage-RepairJobsRestartOnFailingDisk.md Outdated
Comment thread TSG/Storage/Troubleshoot-Storage-RepairJobsRestartOnFailingDisk.md Outdated
Comment thread TSG/Storage/Troubleshoot-Storage-RepairJobsRestartOnFailingDisk.md Outdated
Comment thread TSG/Storage/Troubleshoot-Storage-RepairJobsRestartOnFailingDisk.md Outdated
Resolves the four Copilot PR-review findings: (1) the pre-retire one-fault-domain check now also filters OperationalStatus (Abnormal Latency / Lost Communication) and surfaces the node, so a second stale-Healthy failing disk is not missed; (2) the Step 3 free-space query excludes the retiring disk, shows per-node free capacity, and no longer truncates to five rows; (3) the worked example now distinguishes sufficient evacuation headroom from full reserve (not restored until the replacement drive is added); (4) Step 6 uses Remove-PhysicalDisk -PhysicalDisks (Get-PhysicalDisk -UniqueId ...) because -UniqueId is not a valid parameter. Also adds usability sections from a persona review: a TL;DR fastest-path, an Impact and ownership summary, a Glossary, a Scope note distinguishing RDMA/network issues, an explicit workload-impact note, a When to escalate section, and OEM/hardware framing for the physical swap.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 4e9c61e6-56c5-46a0-9ddb-8698443047bd
@1008covingtonlane

Copy link
Copy Markdown
Collaborator Author

Thanks for the review. Addressed all four findings in 9d63f9c:

  1. The pre-retire "one fault domain" check now filters OperationalStatus (Abnormal Latency / Lost Communication) and surfaces the node, so a second disk that is still Healthy but stale is not missed.
  2. The Step 3 free-capacity query now excludes the disk being retired, reports per-node free capacity, and no longer truncates to five rows.
  3. The worked example now distinguishes sufficient evacuation headroom from full reserve (the reserve target is not restored until the replacement drive is added).
  4. Step 6 now uses Remove-PhysicalDisk -PhysicalDisks (Get-PhysicalDisk -UniqueId ...) -StoragePoolFriendlyName ... because -UniqueId is not a valid parameter.

1008covingtonlane and others added 2 commits July 10, 2026 21:11
Replace the "TL;DR" callout with an "## Overview" section that leads with
plain-language what, why, and impact and keeps the fast at-a-glance path.

Correct the resiliency description: name the Azure Local default (three-way
mirror on three or more nodes, two-way mirror on two-node) and cover the other
Storage Spaces Direct schemes (parity, dual parity, nested resiliency, and
mirror-accelerated parity), plus Simple with no redundancy. Explain that a
slow, high-latency but SMART-healthy disk is not auto-failed under any scheme,
and that retire then rebuild restores redundancy on any resilient volume while
a Simple volume must be restored from backup. Confirm ResiliencySettingName
before acting. Update the Glossary and a Symptoms bullet to match.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 4e9c61e6-56c5-46a0-9ddb-8698443047bd
Reviewer consistency nit: Step 6 named the sibling by description while
Related Issues uses exact paths. Point Step 6 at
TSG/Storage/HowTo-Storage-AddPhysicalDisksToS2DPool.md the same way.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 4e9c61e6-56c5-46a0-9ddb-8698443047bd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants