You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Due for payment 2026-08-17] [$75 Due for payment 2026-06-30] [Onyx] Investigate null storage error #87867
Let's investigate the following Onyx storage error: null, which accounts for 90,661 (2.7%) of the 3,364,645 analysed errors during a time span of 1 month. Full details about the investigation and methodology are in #87844.
The error object was null — no useful error message was provided by the storage backend
Cross-browser, slightly Safari-leaning — may be a Safari-specific issue where the error object is not properly populated
Action Items
Investigate with Sentry, VictoriaLogs and Fullstory to understand user scenarios — what operations trigger a null error?
Improve error capturing in OnyxUtils.retryOperation — when the error message is null, try to capture additional context (e.g., stringify the full error object, capture error type/code/name even when message is null) to help diagnose these cases
The log **[Onyx]** Failed to save to storage. Error: null originates on web only, in the IDBKeyValProvider path. It is most likely related to aborted database transactions and how idb-keyval handles them
Disclaimer: the error is null so we cannot exclude that there are multiple causes for this. Described solution can be confirmed with transaction.abort() call in code
This may be related to QuotaExceededError. Look into example logs:
{"_msg":"[App] 2026-04-21T12:49:45.113Z - [info] [Onyx] Failed to save to storage. Error: UnknownError: Connection is closing because of: IO error: ...\\https_new.expensify.com_0.indexeddb.leveldb/000030.log: FILE_ERROR_NO_SPACE (ChromeMethodBFE: 3::WritableFileAppend:│
{"_msg":"[App] 2026-04-21T12:49:45.218Z - [info] [Onyx] Failed to save to storage. Error: null. onyxMethod: setWithRetry. retryAttempt: 2/5 ~~ parameters: \u0027\u0027 userAgent: \u0027Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chr│
{"_msg":"[App] 2026-04-21T12:51:00.913Z - [info] [Onyx] Failed to save to storage. Error: AbortError: The transaction was aborted, so the request cannot be fulfilled.. onyxMethod: mergeCollectionWithPatches. retryAttempt: 2/5 ~~ parameters: \u0027\u0027 userAgent: \u00┤
For set we have null and for merge there is AbortError which confirms the case.
Prepared draft PR Expensify/react-native-onyx#796. It unifies the way set and merge works and we want AbortError to be surfaced in case of transaciton.abort().
Previously IDB.set() was used and it surfaced transaction.error instead of request.error which was null.
Additionally I provided tests that confirms if transaction abort is surfaced via AbortError
changed the title [-][Due for payment 2026-06-30] [Onyx] Investigate `null` storage error[/-][+][$75 Due for payment 2026-06-30] [Onyx] Investigate `null` storage error[/+]on Jul 28, 2026
changed the title [-][$75 Due for payment 2026-06-30] [Onyx] Investigate `null` storage error[/-][+][Due for payment 2026-08-17] [$75 Due for payment 2026-06-30] [Onyx] Investigate `null` storage error[/+]on Aug 17, 2026
Activity
sosek108 commentedon Jun 1, 2026
I'll be investigating this issue
sosek108 commentedon Jun 3, 2026
Investigation summary
Root cause
The log **
[Onyx]** Failed to save to storage. Error: nulloriginates on web only, in theIDBKeyValProviderpath. It is most likely related to aborted database transactions and howidb-keyvalhandles themidb-keyvalhandles database transactions viapromisifyRequestand handlesrequest.onabortby rejecting the request with request.error. When browser aborts any transaction, it does not treat this as error so reject is called with null. Line: https://github.com/jakearchibald/idb-keyval/blob/0c06d2659532745aef83fe01f7e8b4fb76b708d1/src/index.ts#L8Disclaimer: the error is
nullso we cannot exclude that there are multiple causes for this. Described solution can be confirmed with transaction.abort() call in codeThis may be related to
QuotaExceededError. Look into example logs:For set we have
nulland formergethere is AbortError which confirms the case.sosek108 commentedon Jun 3, 2026
Prepared draft PR Expensify/react-native-onyx#796. It unifies the way
setandmergeworks and we wantAbortErrorto be surfaced in case oftransaciton.abort().Previously
IDB.set()was used and it surfacedtransaction.errorinstead ofrequest.errorwhich wasnull.Additionally I provided tests that confirms if transaction abort is surfaced via AbortError
sosek108 commentedon Jun 3, 2026
PR is ready for reviewsosek108 commentedon Jun 3, 2026
cc: @Julesssss
sosek108 commentedon Jun 3, 2026
OOO notice 🌴: tomorrow there is Bank Holiday in Poland and I have vacation on Friday so I'll be OOO until Monday 8th.
sosek108 commentedon Jun 9, 2026
Another OOO notice 🌴: tommorow I start my planned vacation and I'm back on Monday.
15 remaining items
[-][Due for payment 2026-06-30] [Onyx] Investigate `null` storage error[/-][+][$75 Due for payment 2026-06-30] [Onyx] Investigate `null` storage error[/+]fabioh8010 commentedon Aug 17, 2026
Hi @Julesssss are we done here?
brunovjk commentedon Aug 17, 2026
I believe we just need to handle the payment, @fabioh8010. Thank you.
[-][$75 Due for payment 2026-06-30] [Onyx] Investigate `null` storage error[/-][+][Due for payment 2026-08-17] [$75 Due for payment 2026-06-30] [Onyx] Investigate `null` storage error[/+]melvin-bot commentedon Aug 17, 2026
Triggered auto assignment to @mallenexpensify (
Awaiting Payment)melvin-bot commentedon Aug 17, 2026
Payment Summary
Resolving PRs:
[Onyx bump] Bump react-native-onyx from 3.0.83 to 3.0.85 #93804
Contributor: @sosek108 does not require payment (Contractor)
Reviewer: @brunovjk owed $250 via NewDot
BugZero Checklist (@mallenexpensify)
mallenexpensify commentedon Aug 18, 2026
Payment Summary
Contributor+: @brunovjk due $75 via NewDot
Made $75 cuz that's what's in title, comment/reopen if ya disagree.