What does HRESULT 0xC80003F6 (hrOutOfBuffers) mean?

 
Previous Next
hrOutOfCursors hrTooManyIndexes

hrOutOfBuffers

Diagnostic boundary

For hrOutOfBuffers, for diagnosis, start with the database-engine contract rather than broad operating-system troubleshooting. The decisive boundary is the database page cache could not supply another usable buffer for the requested work.

This result is the legacy Directory Service backup/restore HRESULT form of the ESE condition normally written as JET_errOutOfBuffers. Preserve the original value 0xC80003F6 when a wrapper also exposes a signed JET_ERR.

The key comparison for this HRESULT is this: this is not the same as general process memory exhaustion or an undersized caller output buffer. The first useful observation is to capture cache parameters, dirty-page pressure, outstanding I/O, and whether the workload is scanning or updating. This this result evidence identifies the exhausted pool so a leak, long transaction, concurrency spike, and hard capacity limit are not confused.

The ESE objects in play

Diagnostic layerbounded engine, process, and storage resources
Typical API surfaceinstance system parameters, sessions, cursors, temporary tables, database attachment, and file growth
Code-specific boundarythe database page cache could not supply another usable buffer for the requested work
First corrective directionrelieve I/O pressure, review cache sizing, and avoid multiplying concurrent scans during recovery

Resource codes should be tied to the exact exhausted pool rather than treated as generic low memory., long transactions can retain versions and indirectly amplify memory and log pressure.

Evidence that resolves the ambiguity

A useful trace for this HRESULT should preserve the first failing operation and the state of the bounded engine, process, and storage resources.

  • Code-specific observation: capture cache parameters, dirty-page pressure, outstanding I/O, and whether the workload is scanning or updating.
  • live resource counts grouped by session and request owner; associate it with this result rather than with a later generic exception.
  • relevant JET_param values and process or system capacity at first failure; associate it with this result rather than with a later generic exception.
  • the oldest transaction, longest-held cursor, or file growth operation retaining the resource; associate it with it rather than with a later generic exception.

Log lengths, hashes, IDs, flags, and redacted samples where appropriate.

Nearby results that mean something different

This is not the same as general process memory exhaustion or an undersized caller output buffer. The following neighboring results belong to the same broad subsystem but mark different boundaries:

hrDiskFullthe target volume cannot allocate space for database, log, checkpoint, or temporary growth
hrOutOfCursorsthe process exhausted table cursor resources because cursors were opened faster than they were closed
hrCurrencyStackOutOfMemorycursor navigation state exhausted the engine resource used to preserve currency

Keep it in the incident record; replacing it with “database error” hides whether the next step is handle renewal, schema correction, lock reconciliation, or file preservation.

A disciplined correction path

  1. Freeze the failing request context and record it, 0xC80003F6, the Jet API name, and the current instance/session ownership.
  2. Verify the code-specific precondition: capture cache parameters, dirty-page pressure, outstanding I/O, and whether the workload is scanning or updating.
  3. Apply the narrow correction: relieve I/O pressure, review cache sizing, and avoid multiplying concurrent scans during recovery.
  4. Before retrying it, reconcile resource counts, owner cleanup, and capacity after the correction.
  5. repeat the smallest read-only or disposable test that exercises the corrected precondition; then confirm both the returned HRESULT and the resulting database, cursor, or file state.

Actions that can hide or worsen the problem

  • do not raise limits before checking ownership and release paths.
  • do not create a retry storm while the exhausted resource remains unavailable.

Developer-facing acceptance test

Build a focused test that reproduces it at the bounded engine, process, and storage resources layer. Record the precondition, execute one API call, and assert the HRESULT plus the resulting handle and transaction state. The corrected it test should change only the decisive condition—the database page cache could not supply another usable buffer for the requested work—and should prove that cleanup is safe if the call still fails.

Technical references


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