Skip to content

Split blob-hydration and directory-enumeration failure telemetry by cause#2071

Draft
tyrielv wants to merge 1 commit into
microsoft:masterfrom
tyrielv:tyrielv/split-hydration-enum-telemetry
Draft

Split blob-hydration and directory-enumeration failure telemetry by cause#2071
tyrielv wants to merge 1 commit into
microsoft:masterfrom
tyrielv:tyrielv/split-hydration-enum-telemetry

Conversation

@tyrielv

@tyrielv tyrielv commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

What

The GVFS release-readiness telemetry has two error buckets that mix causes outside gvfs.exe's control (network, local disk/IO, ProjFS) with actionable ones (a missing object on the server, a size mismatch, or GVFS's own stale-enumeration eviction), so a release manager can't tell whether a spike is fixable:

  • Blob hydration failureTryCopyBlobContentStream can't serve file contents to ProjFS
  • Directory enumeration failureFailed to find active enumeration ID

This stamps a cause tag on the failure telemetry so the dashboard can split each bucket. No behavior changes — metadata only.

Changes

  • BlobHydrationFailureCategory (new enum) on the terminal blob-hydration errors:
    • Not gvfs-fixable: NetworkUnavailable, LocalIO, ProjFSWriteFailed
    • Actionable: ObjectNotOnServer, LocalCopyFailed, SizeMismatch, Unexpected
    • The root cause was previously collapsed into GVFSGitObjects.TryCopyBlobContentStream's bool return before the error was logged; it's now captured. The size-mismatch / IOException / WriteFileData failure sites were logged with a message the dashboard didn't match — they now carry the tag so they're counted.
  • EnumerationFailureReason on Failed to find active enumeration ID:
    • Evicted — GVFS's stale-enumeration eviction (gvfs.max-active-enumerations, off by default) removed a live enumeration (self-inflicted).
    • Unknown — ProjFS delivered an id GVFS never held or already ended.

Testing

  • Full unit suite: 888 passed, 0 failed (11 pre-existing skips).
  • New/extended tests assert the tags: TerminalBlobHydrationFailureIsTaggedWithCategory, GetDirectoryEnumerationTagsEvictedVersusUnknownId, OnGetFileStreamHandlesWriteFailure.

Target branch

master — observability enrichment for the shippable line, no behavior change; the enumeration-eviction feature this diagnoses already lives on master.

Companion

The dashboard-side split (KQL) that consumes these tags is a separate PR in devprod.git.telemetry (Azure DevOps): EngSys PR 16223444.

…ause

The GVFS telemetry "Blob hydration failure" and "Directory enumeration
failure" buckets conflate causes outside gvfs.exe's control (network,
local disk/IO, ProjFS) with actionable ones (a missing object on the
server, a size mismatch, or GVFS's own stale-enumeration eviction).

Stamp a cause tag on the failure telemetry so the release-readiness
dashboard can bucket them apart. No behavior changes:

- BlobHydrationFailureCategory (nested in GVFSGitObjects) is now returned
  from TryCopyBlobContentStream via an out parameter as well as stamped on
  the terminal telemetry, so the virtualizer's own terminal event is tagged
  with the same cause rather than left uncategorized. Categories:
  NetworkUnavailable / DownloadFailed / LocalIO / ProjFSWriteFailed (not
  gvfs-fixable) vs ObjectNotOnServer / LocalCopyFailed / SizeMismatch /
  Unexpected (actionable). The size-mismatch, IOException, and WriteFileData
  failure sites were previously logged with a message the dashboard did not
  match; they now carry the tag so they are counted.

- EnumerationFailureReason (nested enum) on "Failed to find active
  enumeration ID": Evicted (GVFS eviction removed a live enumeration;
  self-inflicted) vs Unknown (ProjFS delivered an id GVFS never held or
  already ended). The eviction-tracking map is populated before the entry
  is removed from the active set (closing a mislabel race) and pruned on
  every sweep so it cannot outlive its window.

Unit tests assert each cause value deterministically.

Assisted-by: Claude Opus 4.8
Signed-off-by: Tyrie Vella <tyrielv@gmail.com>
@tyrielv
tyrielv force-pushed the tyrielv/split-hydration-enum-telemetry branch from a667a05 to 46c694f Compare July 20, 2026 19:12
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.

1 participant