Site icon EfmSoft

What does HRESULT 0xC80003F5 (hrOutOfCursors) mean?

 
Previous Next
hrOutOfDatabaseSpace hrOutOfBuffers

hrOutOfCursors

Diagnostic boundary

For hrOutOfCursors, the useful clue is the engine object that rejected the operation and the state it had reached. The decisive boundary is the process exhausted table cursor resources because cursors were opened faster than they were closed.

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

The key comparison for this HRESULT is this: hrCurrencyStackOutOfMemory concerns cursor navigation state; this result is exhaustion of cursor objects. The first useful observation is to count live JET_TABLEID values by session and capture allocation stacks or request owners. This it 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 process exhausted table cursor resources because cursors were opened faster than they were closed
First corrective directionclose cursors deterministically, bound per-request fan-out, and reuse only where ownership is explicit

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.

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

Nearby results that mean something different

For this HRESULT, hrCurrencyStackOutOfMemory concerns cursor navigation state; it is exhaustion of cursor objects. The following neighboring results belong to the same broad subsystem but mark different boundaries:

hrOutOfBuffersthe database page cache could not supply another usable buffer for the requested work
hrOutOfDatabaseSpacethe database reached an engine-imposed growth ceiling rather than merely a full volume
hrDiskFullthe target volume cannot allocate space for database, log, checkpoint, or temporary growth

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, 0xC80003F5, the Jet API name, and the current instance/session ownership.
  2. Verify the code-specific precondition: count live JET_TABLEID values by session and capture allocation stacks or request owners.
  3. Apply the narrow correction: close cursors deterministically, bound per-request fan-out, and reuse only where ownership is explicit.
  4. Before retrying it, reconcile resource counts, owner cleanup, and capacity after the correction.
  5. confirm both the returned HRESULT and the resulting database, cursor, or file state; then add a regression test that forces the old boundary and proves cleanup leaves no stale handles.

Actions that can hide or worsen the problem

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 process exhausted table cursor resources because cursors were opened faster than they were closed—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.

Exit mobile version