| Previous | Next |
| ERROR_VIRTDISK_DISK_ONLINE_AND_WRITABLE | ERROR_CTLOG_LOGFILE_SIZE_EXCEEDED_MAXSIZE |
ERROR_CTLOG_TRACKING_NOT_INITIALIZED
Identify the owner before touching the layout: ctlog tracking not initialized
The practical meaning of ERROR_CTLOG_TRACKING_NOT_INITIALIZED (0xC03A0020) is tied to resilient change-tracking baseline and sidecar metadata for the virtual disk: resilient change tracking has no active baseline and therefore cannot answer a query for changed ranges. The result does not, by itself, prove file-system corruption or physical-media failure.
Resilient change tracking answers which virtual-disk byte ranges changed after a named baseline. The tracking identifier, virtual-disk generation and sidecar metadata must remain consistent across every query and backup checkpoint. This object model determines which identifiers, counts and ownership state are meaningful for it.
A useful record contains more than the final UI symptom: retain the first failing call, target identity, topology and state transition before management software rescans the disks.
Minimum diagnostic set
| Storage diagnostic field | Value |
|---|---|
| Owning object | resilient change-tracking baseline and sidecar metadata for the virtual disk |
| Rejected invariant | resilient change tracking has no active baseline and therefore cannot answer a query for changed ranges |
| Identity and generation | virtual-disk identifier, ChangeTrackingId, RCT state, VHDX generation, sidecar path and size, offline maintenance history and queried byte range |
| Narrow experiment | create a fresh RCT baseline on a copy of the virtual disk and replay only the requested start, query, reset or stop transition |
| Closest comparison | ERROR_CTLOG_INVALID_TRACKING_STATE |
Keep this HRESULT as the primary result if rollback or cleanup reports another code; those later values describe recovery, not the first rejected invariant.
Reproduce without destructive cleanup
- Before changing state for it, freeze the failing generation and save virtual-disk identifier, ChangeTrackingId, RCT state, VHDX generation, sidecar path and size, offline maintenance history and queried byte range.
- Exercise this exact comparison for it: create a fresh RCT baseline on a copy of the virtual disk and replay only the requested start, query, reset or stop transition.
- During the result comparison, keep image bytes, unrelated disks, provider policy and cluster topology fixed.
- After the test, record the next return value and the durable object state; crossing the boundary should expose a later result rather than silently retrying.
The distinction from ERROR_CTLOG_INVALID_TRACKING_STATE is operational. The decisive condition is resilient change tracking has no active baseline and therefore cannot answer a query for changed ranges; log the neighboring code separately so capability, identity and state are not conflated.
Mechanism-specific note
There is no sealed baseline from which changed ranges can be measured. A backup application must create and persist a baseline identifier before requesting deltas. Returning all blocks as changed is an application policy choice, not a valid interpretation of this HRESULT by the tracking API itself for it.
Restore the contract
Create a new trustworthy change-tracking baseline after validating the VHDX and tracking metadata; never merge ranges from an invalidated generation into backup state for it. Apply the change through the supported storage API, then close and reacquire affected objects before retrying.
- the first retry uses newly enumerated identifiers rather than cached handles.
- The durable metadata or provider state agrees with the success returned after this result.
- A second run after close/reopen does not recreate the rejected the condition.
- the nearby
ERROR_CTLOG_INVALID_TRACKING_STATEpath remains separately testable and separately logged.
Avoid broad rescans, forced failovers and metadata deletion until identities and generations are captured. Those actions can make a stale request appear to heal without fixing its caller.
Technical references
- Microsoft: QueryChangesVirtualDisk — use this source to verify ctlog state and parameters for it.
- Microsoft: Virtual Disk API — documents the supported management path relevant to this result.
- Microsoft: GetVirtualDiskInformation — defines the ctlog objects used to interpret this result.
- Microsoft: COM error codes for VHD and change tracking — primary API or object-model reference for the boundary.
Looking for a different code? Search another status or error code.