What does HRESULT 0xC03A0020 (ERROR_CTLOG_TRACKING_NOT_INITIALIZED) mean?

 
Could be also:
ConstantTypeOS
STATUS_CTLOG_TRACKING_NOT_INITIALIZEDNTSTATUSWindows
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 fieldValue
Owning objectresilient change-tracking baseline and sidecar metadata for the virtual disk
Rejected invariantresilient change tracking has no active baseline and therefore cannot answer a query for changed ranges
Identity and generationvirtual-disk identifier, ChangeTrackingId, RCT state, VHDX generation, sidecar path and size, offline maintenance history and queried byte range
Narrow experimentcreate a fresh RCT baseline on a copy of the virtual disk and replay only the requested start, query, reset or stop transition
Closest comparisonERROR_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

  1. 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.
  2. 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.
  3. During the result comparison, keep image bytes, unrelated disks, provider policy and cluster topology fixed.
  4. 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_STATE path 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


Looking for a different code? Search another status or error code.