Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Firestore breaks on mobile safari if network is lost while app is in the background. #3495

Closed
aidanas opened this issue Jul 28, 2020 · 2 comments · Fixed by #3535
Closed

Comments

@aidanas
Copy link

aidanas commented Jul 28, 2020

[REQUIRED] Describe your environment

  • Operating System version: iOS 13.6
  • Browser version: Mobile Safari. (Agent string "Mozilla/5.0 (iPad; CPU OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148")
  • Firebase SDK version: 7.16.0 (also present on 7.17.1 )
  • Firebase Product: firestore

[REQUIRED] Describe the problem

We have a multi page Cordova app which uses Firestore with persistence enabled. It issue happens when users navigate about a few pages and then put the app in the background and toggle their wifi on and off. Then when users bring the app to the foreground firebase finds itself in some inconsistent state and cannot be used until users reload the page.

This could potentially be related to :
#2710

And this
#2755
Even though all PRs in @schmidt-sebastian comment in the link above have been merged we're still experiencing the issue.

Steps to reproduce:

With our production app we can consistently recreate it with the following steps:

  1. Open the app and navigate around a few screens.
    This seems to be important as we could not recreate it while being on the same screen. However it is not important which few screens we navigate to as we could reproduce the same error navigating between any two screens. I will add that that before leaving each of the screens (before runtime is destroyed) we destroy firebase app to release resources and then reinitialise it on the following screen.
  2. Put app to background
  3. Go to settings and toggle wifi off back on
  4. Resume the app
  5. Observe firestore errors in console and none of firebase features work.

Debug enabled log output shows starts at the time just before app is put to background, then toggling wifi on and off in the settings and ends after the app has been resumed:

[Log] [2020-07-28T08:42:31.200Z]  @firebase/firestore: – "Firestore (7.16.0): IndexedDbPersistence" – "Client '5NhcKwxvsOrbLAAu0fIU' is not zombied in LocalStorage" (cordova.js, line 1540)
[Log] [2020-07-28T08:42:31.204Z]  @firebase/firestore: – "Firestore (7.16.0): SimpleDb" – "PUT" – "owner" – "owner" – "{\"ownerId\":\"5NhcKwxvsOrbLAAu0fIU\",\"allowTabSynchronization\":true,\"leaseTimestampMs\":1595925751203}" (cordova.js, line 1540)
[Error] Failed to load resource: The network connection was lost. (channel, line 0)
[Error] Failed to load resource: The Internet connection appears to be offline. (channel, line 0)
[Log] [2020-07-28T08:42:38.087Z]  @firebase/firestore: – "Firestore (7.16.0): IndexedDbPersistence" – "Starting transaction:" – "updateClientMetadataAndTryBecomePrimary" (cordova.js, line 1540)
[Log] [2020-07-28T08:42:38.092Z]  @firebase/firestore: – "Firestore (7.16.0): SharedClientState" – "SET" – "firestore_sequence_number_firestore/[DEFAULT]/nutshell-container/" – "78" (cordova.js, line 1540)
[Log] [2020-07-28T08:42:38.102Z]  @firebase/firestore: – "Firestore (7.16.0): ConnectivityMonitor" – "Network connectivity changed: UNAVAILABLE" (cordova.js, line 1540)
[Log] [2020-07-28T08:42:40.967Z]  @firebase/firestore: – "Firestore (7.16.0): SimpleDb" – "GET" – "owner" – "owner" – "{\"ownerId\":\"5NhcKwxvsOrbLAAu0fIU\",\"allowTabSynchronization\":true,\"leaseTimestampMs\":1595925751203}" (cordova.js, line 1540)
[Log] [2020-07-28T08:42:40.975Z]  @firebase/firestore: – "Firestore (7.16.0): SimpleDb" – "PUT" – "clientMetadata" – "<auto-key>" – "{\"clientId\":\"5NhcKwxvsOrbLAAu0fIU\",\"updateTimeMs\":1595925760975,\"networkEnabled\":true,\"inForeground\":false}" (cordova.js, line 1540)
[Error] Failed to load resource: WebKit encountered an internal error (channel, line 0)
[Log] [2020-07-28T08:42:41.007Z]  @firebase/firestore: – "Firestore (7.16.0): SimpleDb" – "Aborting transaction:" – "An internal error was encountered in the Indexed Database server" (cordova.js, line 1540)
[Log] [2020-07-28T08:42:41.013Z]  @firebase/firestore: – "Firestore (7.16.0): SimpleDb" – "Transaction failed with error: %s. Retrying: %s." – "An internal error was encountered in the Indexed Database server" – "true" (cordova.js, line 1540)
[Log] [2020-07-28T08:42:41.017Z]  @firebase/firestore: – "Firestore (7.16.0): IndexedDbPersistence" – "Releasing owner lease after error during lease refresh" – "{\"line\":1,\"column\":562504,\"sourceURL\":\"file:///private/var/containers/Bundle/Application/BB78BC7B-202A-4934-BD01-D98218DD5674/Nutshell%20App…" (cordova.js, line 1540)
[Log] [2020-07-28T08:42:41.023Z]  @firebase/firestore: – "Firestore (7.16.0): RemoteStore" – "Restarting streams for network reachability change." (cordova.js, line 1540)
[Log] [2020-07-28T08:42:41.239Z]  @firebase/firestore: – "Firestore (7.16.0): Connection" – "WebChannel transport closed" (cordova.js, line 1540)
[Log] [2020-07-28T08:42:41.313Z]  @firebase/firestore: – "Firestore (7.16.0): IndexedDbPersistence" – "Starting transaction:" – "Get next mutation batch" (cordova.js, line 1540)
[Log] [2020-07-28T08:42:41.338Z]  @firebase/firestore: – "Firestore (7.16.0): Connection" – "Creating WebChannel: https://firestore.googleapis.com/google.firestore.v1.Firestore/Listen/channel [object Object]" (cordova.js, line 1540)
[Error] [2020-07-28T08:42:41.349Z]  @firebase/firestore: – "Firestore (7.16.0): INTERNAL UNHANDLED ERROR: " (1)
Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.transaction(anonymous function) — 7.16.0_firebase.js:1:562505(anonymous function) — 7.16.0_firebase.js:1:560864(anonymous function) — 7.16.0_firebase.js:1:52606(anonymous function) — 7.16.0_firebase.js:1:52092(anonymous function) — 7.16.0_firebase.js:1:51648PromiseTs — 7.16.0_firebase.js:1:51412(anonymous function) — 7.16.0_firebase.js:1:542215(anonymous function) — 7.16.0_firebase.js:1:614240(anonymous function) — 7.16.0_firebase.js:1:52606(anonymous function) — 7.16.0_firebase.js:1:51648PromiseTs — 7.16.0_firebase.js:1:51412(anonymous function) — 7.16.0_firebase.js:1:609744(anonymous function) — 7.16.0_firebase.js:1:52606(anonymous function) — 7.16.0_firebase.js:1:51648PromiseTs — 7.16.0_firebase.js:1:51412(anonymous function) — 7.16.0_firebase.js:1:616267(anonymous function) — 7.16.0_firebase.js:1:52606r — 7.16.0_firebase.js:1:51453promiseReactionJob
	(anonymous function) (cordova.js:1540)
	Ca (7.16.0_firebase.js:1:67760)
	(anonymous function) (7.16.0_firebase.js:1:69820)
	ng (7.16.0_firebase.js:1:462169)
	(anonymous function) (7.16.0_firebase.js:1:567938)
	promiseReactionJob
[Log] [2020-07-28T08:42:41.370Z]  @firebase/firestore: – "Firestore (7.16.0): ConnectivityMonitor" – "Network connectivity changed: AVAILABLE" (cordova.js, line 1540)
[Error] [2020-07-28T08:42:41.373Z]  @firebase/firestore: – "Firestore (7.16.0): FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state"
	(anonymous function) (cordova.js:1540)
	Ca (7.16.0_firebase.js:1:67760)
	(anonymous function) (7.16.0_firebase.js:1:69820)
	ng (7.16.0_firebase.js:1:462169)
	ig (7.16.0_firebase.js:1:462417)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:617195)
	(anonymous function) (7.16.0_firebase.js:1:660114)
[Error] [2020-07-28T08:42:52.801Z]  @firebase/firestore: – "Firestore (7.16.0): FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state"
	(anonymous function) (cordova.js:1540)
	Ca (7.16.0_firebase.js:1:67760)
	(anonymous function) (7.16.0_firebase.js:1:69820)
	ng (7.16.0_firebase.js:1:462169)
	ig (7.16.0_firebase.js:1:462417)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:667379)
	(anonymous function) (7.16.0_firebase.js:1:700186)
	(anonymous function) (remoteLogger.js:36)
	Promise
	_log (remoteLogger.js:29)
	(anonymous function) (app.js:140)
[Error] [2020-07-28T08:42:52.807Z]  @firebase/firestore: – "Firestore (7.16.0): FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state"
	(anonymous function) (cordova.js:1540)
	Ca (7.16.0_firebase.js:1:67760)
	(anonymous function) (7.16.0_firebase.js:1:69820)
	ng (7.16.0_firebase.js:1:462169)
	ig (7.16.0_firebase.js:1:462417)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:667379)
	(anonymous function) (7.16.0_firebase.js:1:700186)
	(anonymous function) (remoteLogger.js:57)
	Promise
	_log (remoteLogger.js:29)
	(anonymous function) (app.js:140)
[Error] Error: FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state
	ig (7.16.0_firebase.js:1:462433)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:617195)
	(anonymous function) (7.16.0_firebase.js:1:660114)
[Error] Unhandled Promise Rejection: InvalidStateError: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
	(anonymous function) (7.16.0_firebase.js:1:562505)
	promiseReactionJob
[Error] Unhandled Promise Rejection: Error: FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state
	ig (7.16.0_firebase.js:1:462433)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:667379)
	(anonymous function) (7.16.0_firebase.js:1:700186)
	(anonymous function) (remoteLogger.js:57)
	Promise
	_log (remoteLogger.js:29)
	(anonymous function) (app.js:140)
[Error] [2020-07-28T08:42:52.812Z]  @firebase/firestore: – "Firestore (7.16.0): FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state"
	(anonymous function) (cordova.js:1540)
	Ca (7.16.0_firebase.js:1:67760)
	(anonymous function) (7.16.0_firebase.js:1:69820)
	ng (7.16.0_firebase.js:1:462169)
	ig (7.16.0_firebase.js:1:462417)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:543661)
[Error] [2020-07-28T08:43:04.527Z]  @firebase/firestore: – "Firestore (7.16.0): FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state"
	(anonymous function) (cordova.js:1540)
	Ca (7.16.0_firebase.js:1:67760)
	(anonymous function) (7.16.0_firebase.js:1:69820)
	ng (7.16.0_firebase.js:1:462169)
	ig (7.16.0_firebase.js:1:462417)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:667379)
	(anonymous function) (7.16.0_firebase.js:1:700186)
	(anonymous function) (remoteLogger.js:36)
	Promise
	_log (remoteLogger.js:29)
	(anonymous function) (app.js:140)
[Error] [2020-07-28T08:43:04.532Z]  @firebase/firestore: – "Firestore (7.16.0): FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state"
	(anonymous function) (cordova.js:1540)
	Ca (7.16.0_firebase.js:1:67760)
	(anonymous function) (7.16.0_firebase.js:1:69820)
	ng (7.16.0_firebase.js:1:462169)
	ig (7.16.0_firebase.js:1:462417)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:667379)
	(anonymous function) (7.16.0_firebase.js:1:700186)
	(anonymous function) (remoteLogger.js:57)
	Promise
	_log (remoteLogger.js:29)
	(anonymous function) (app.js:140)
[Error] Error: FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state
	ig (7.16.0_firebase.js:1:462433)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:543661)
[Error] Unhandled Promise Rejection: Error: FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state
	ig (7.16.0_firebase.js:1:462433)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:667379)
	(anonymous function) (7.16.0_firebase.js:1:700186)
	(anonymous function) (remoteLogger.js:57)
	Promise
	_log (remoteLogger.js:29)
	(anonymous function) (app.js:140)
[Error] [2020-07-28T08:43:04.571Z]  @firebase/firestore: – "Firestore (7.16.0): FIRESTORE (7.16.0) INTERNAL ASSERTION FAILED: Unexpected state"
	(anonymous function) (cordova.js:1540)
	Ca (7.16.0_firebase.js:1:67760)
	(anonymous function) (7.16.0_firebase.js:1:69820)
	ng (7.16.0_firebase.js:1:462169)
	ig (7.16.0_firebase.js:1:462417)
	(anonymous function) (7.16.0_firebase.js:1:568331)
	(anonymous function) (7.16.0_firebase.js:1:567180)
	(anonymous function) (7.16.0_firebase.js:1:566729)
	(anonymous function) (7.16.0_firebase.js:1:601468)
	(anonymous function) (7.16.0_firebase.js:1:600925)
	(anonymous function) (7.16.0_firebase.js:1:655918)
	(anonymous function) (7.16.0_firebase.js:1:659544)

If the issue is already being addressed on some other ticket/tracker, please let us know.
As this is our production app you would understand our keenness to get to the bottom of it

Thanks!

EDIT:
This only seems to happen with persistence enabled.
Also it seems older iOS versions are not affected. Tested on iOS 12.4.1 with no issues.

@google-oss-bot
Copy link
Contributor

I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.

@schmidt-sebastian
Copy link
Contributor

I have actually seen this locally as well. "The database connection is closing" is however thrown at a strange layer in our code, and so the work I have done to recover from IndexedDB errors doesn't help here. I need to see if I can figure out how to change our recovery logic to apply here as well.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
4 participants