Skip to content

🐛 [firestore] Firestore snapshot.exists occassionaly gives false negative #10331

Closed
@jimmyff

Description

@jimmyff

Bug report

docSnapshot.exists == flase when listening to shapshot changes and I know this to be untrue.

I launched a new app late last year and this issue has been causing issues for my app ever since launch. For a small percantage of my users receive a doc snapshot reporting the document does not exist. My apps behavior up until now was to log the user out, assuming their account had been removed. I've just updated my behavior (yesterday) to ignore snapshot updates that say the document doesn't exist. I'm monitoring it at the moment and yet to gauge customer feedback as if this has resolved the issue for them. When this happens, I have a number of other snapshot listeners that all seem to trigger with the same issue, reporting the document does not exist.

This also happened during the November 2022 Firestore outage. The snapshot stream received a snapshot and exits == false. This resulted in my app logging everyone out that was using the app during the outage.

This could be happening if the firestore http request fails or connection drops?

Steps to reproduce

It's hard to reproduce as my app has a lot of users and this isn't affecting everyone (although enough people to drive my app review score in the ground). I do have Crashlytics logging and can confirm that the firestore documents do exist at the time of the error.

Here is my implementation:

  Future _listenForAccountUpdates(String uid) async {
    if (_accountStream != null) {
      return;
    }
    log.fine('Listening to account updates for UID: $uid');
    _accountStream = FirebaseFirestore.instance
        .collection('account')
        .doc(uid)
        .snapshots()
        .listen(
            (docSnapshot) async {

              // This is problematic - gives false negatives
              if (!docSnapshot.exists) {
                await FirebaseCrashlytics.instance.recordError(
                    Exception(
                        'Ignoring: Account ${uid} not found in snapshot listener AuthUID: ${user?.uid}'),
                    null,
                    fatal: false);
                return;
              } 
             // My app does stuff here...
            },
            onDone: () => FirebaseCrashlytics.instance
                .log('listenForAccountUpdates onDone.'),
            cancelOnError: false,
            onError: (e) => FirebaseCrashlytics.instance
                  .recordError(e, null, reason: 'listenForAccountUpdates')
            );
    log.fine('Listening for account updates $uid');
  }

Example of captued error report:

# Crashlytics - Stack trace
# Platform: android
# Version: 1.2.22 (82)
# Issue: 523b11e89e94997a5911e86cec99100a
# Session: 63D215A602C200015884EF3568F8772F_DNE_0_v2
# Date: Thu Jan 26 2023 06:00:29 GMT+0000 (Greenwich Mean Time)

Non-fatal Exception: io.flutter.plugins.firebase.crashlytics.FlutterError: Exception: Ignoring: Account 902dfe92-d571-50a2-a9d8-b67c66720779 not found in snapshot listener AuthUID: ha7OPddnPdWwJaHP8iy6YpgDtax1. Error thrown null.
       at FirebaseCrashlytics.recordError(firebase_crashlytics.dart:117)
       at FbAuth._listenForAccountUpdates.<fn>(fb_auth.dart:569)

Yet here you can see that this document does exist and has existed since September:
image

You can also see that the pinged and notified timestamps are after the crashlytics report suggesting ignoring this report perhaps was the correct thing to do and the customer might not have noticed the issue.

The issue I have is that I shouldn't have to ignore .exsits this is valuable piece of information but only when it can be relied upon.

Thanks


Flutter doctor

Click To Expand
[✓] Flutter (Channel stable, 3.3.8, on macOS 12.6.2
    21G320 darwin-arm, locale en-GB)
    • Flutter version 3.3.8 on channel stable at
      /Users/jimmyff/sdks/flutter
    • Upstream repository
      https://github.com/flutter/flutter.git
    • Framework revision 52b3dc25f6 (3 months ago),
      2022-11-09 12:09:26 +0800
    • Engine revision 857bd6b74c
    • Dart version 2.18.4
    • DevTools version 2.15.0

[✓] Android toolchain - develop for Android devices
    (Android SDK version 33.0.0)
    • Android SDK at /Users/jimmyff/Library/Android/sdk
    • Platform android-33, build-tools 33.0.0
    • Java binary at: /Applications/Android
      Studio.app/Contents/jre/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build
      11.0.12+0-b1504.28-7817840)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
    • Xcode at
      /Applications/Xcode.app/Contents/Developer
    • Build 14C18
    • CocoaPods version 1.11.3

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google
      Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2021.2)
    • Android Studio at /Applications/Android
      Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨
      https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build
      11.0.12+0-b1504.28-7817840)

[✓] VS Code (version 1.74.3)
    • VS Code at /Applications/Visual Studio
      Code.app/Contents
    • Flutter extension version 3.58.0

[✓] Connected device (4 available)
    • Pixel 5 (mobile)            • 09021FDD40027X •
      android-arm64  • Android 13 (API 33)
    • sdk gphone64 arm64 (mobile) • emulator-5554  •
      android-arm64  • Android 13 (API 33) (emulator)
    • macOS (desktop)             • macos          •
      darwin-arm64   • macOS 12.6.2 21G320 darwin-arm
    • Chrome (web)                • chrome         •
      web-javascript • Google Chrome 109.0.5414.119

[✓] HTTP Host Availability
    • All required HTTP hosts are available

• No issues found!

Flutter dependencies

Click To Expand
Dart SDK 2.18.4
Flutter SDK 3.3.8
onesceneapp 1.2.22+82

dependencies:
- animate_countdown_text 1.1.3 [flutter animate_do]
- animated_text_kit 4.2.2 [flutter characters]
- audioplayers 1.0.1 [audioplayers_android audioplayers_darwin audioplayers_linux audioplayers_platform_interface audioplayers_web audioplayers_windows flutter http path_provider uuid]
- badges 2.0.3 [flutter]
- blurhash_dart 1.1.0 [image]
- carousel_slider 4.1.1 [flutter]
- chroma 0.1.2 [vector_math logging image]
- cloud_firestore 3.3.0 [cloud_firestore_platform_interface cloud_firestore_web collection firebase_core firebase_core_platform_interface flutter meta]
- cloud_firestore_platform_interface 5.6.0 [collection firebase_core flutter meta plugin_platform_interface]
- collection 1.16.0
- confetti 0.7.0 [flutter vector_math]
- crypto 3.0.2 [typed_data]
- csv 5.0.1
- cupertino_icons 1.0.5
- device_info 2.0.3 [flutter device_info_platform_interface]
- dotted_border 2.0.0+2 [flutter path_drawing]
- encrypt 5.0.1 [args asn1lib clock collection crypto pointycastle]
- equatable 2.0.3 [collection meta]
- exif 3.1.1 [args collection convert json_annotation sprintf]
- firebase_analytics 9.2.0 [firebase_analytics_platform_interface firebase_analytics_web firebase_core firebase_core_platform_interface flutter]
- firebase_app_check 0.0.6+17 [firebase_app_check_platform_interface firebase_app_check_web firebase_core firebase_core_platform_interface flutter]
- firebase_auth 3.4.2 [firebase_auth_platform_interface firebase_auth_web firebase_core firebase_core_platform_interface flutter meta]
- firebase_core 1.19.2 [firebase_core_platform_interface firebase_core_web flutter meta]
- firebase_crashlytics 2.8.7 [firebase_core firebase_core_platform_interface firebase_crashlytics_platform_interface flutter stack_trace]
- firebase_messaging 12.0.0 [firebase_core firebase_core_platform_interface firebase_messaging_platform_interface firebase_messaging_web flutter meta]
- firebase_remote_config 2.0.12 [firebase_core firebase_core_platform_interface firebase_remote_config_platform_interface firebase_remote_config_web flutter]
- firebase_storage 10.3.2 [firebase_core firebase_core_platform_interface firebase_storage_platform_interface firebase_storage_web flutter]
- flutter 0.0.0 [characters collection material_color_utilities meta vector_math sky_engine]
- flutter_facebook_auth 4.4.0+1 [flutter flutter_facebook_auth_platform_interface flutter_facebook_auth_web]
- flutter_image 4.1.3 [flutter]
- flutter_local_notifications 9.7.0 [clock flutter flutter_local_notifications_linux flutter_local_notifications_platform_interface timezone]
- flutter_localizations 0.0.0 [flutter intl characters clock collection material_color_utilities meta path vector_math]
- flutter_markdown 0.6.10+2 [flutter markdown meta path]
- flutter_placeholder_textlines 1.1.2 [flutter]
- flutter_redux 0.10.0 [redux flutter]
- flutter_redux_navigation 0.7.1 [flutter redux]
- geolocator 9.0.1 [flutter geolocator_platform_interface geolocator_android geolocator_apple geolocator_web geolocator_windows]
- google_maps_flutter 2.2.2 [flutter google_maps_flutter_android google_maps_flutter_ios google_maps_flutter_platform_interface]
- google_sign_in 5.4.0 [flutter google_sign_in_android google_sign_in_ios google_sign_in_platform_interface google_sign_in_web]
- http 0.13.4 [async http_parser meta path]
- image 3.2.0 [archive meta xml]
- image_cropper 2.0.3 [flutter image_cropper_platform_interface image_cropper_for_web]
- image_picker 0.8.5+3 [flutter image_picker_android image_picker_for_web image_picker_ios image_picker_platform_interface]
- in_app_purchase 3.0.6 [flutter in_app_purchase_android in_app_purchase_platform_interface in_app_purchase_storekit]
- infinite_scroll_pagination 3.2.0 [flutter sliver_tools]
- ink_page_indicator 0.2.1 [flutter meta]
- intl 0.17.0 [clock path]
- intl_phone_number_input 0.7.0+2 [flutter meta libphonenumber_plugin equatable collection]
- jovial_svg 1.1.5 [xml collection args vector_math jovial_misc http meta flutter]
- loading_indicator 3.1.0 [flutter async collection]
- logging 1.0.2
- lottie 1.3.0 [archive flutter path vector_math]
- material_design_icons_flutter 5.0.6996 [flutter]
- meta 1.8.0
- onescene_brand 1.0.0 [flutter os_core lottie]
- open_store 0.3.1 [flutter url_launcher talker]
- os_core 0.0.1 [redux redux_logging copy_with_extension quiver_hashcode intl uuid http encrypt built_value built_collection quiver archive recase logging json_annotation]
- package_info 2.0.2 [flutter]
- package_info_plus 1.4.3+1 [flutter package_info_plus_platform_interface package_info_plus_linux package_info_plus_macos package_info_plus_windows package_info_plus_web]
- page_transition 2.0.9 [flutter]
- palette_generator 0.3.3+1 [collection flutter path]
- path_provider 2.0.11 [flutter path_provider_android path_provider_ios path_provider_linux path_provider_macos path_provider_platform_interface path_provider_windows]
- photofilters 3.0.1 [flutter image meta path_provider]
- pinch_zoom 1.0.0 [flutter]
- pinput 2.2.11 [flutter smart_auth]
- quiver 3.1.0 [matcher]
- recase 4.0.0
- redux 5.0.0
- redux_logging 0.5.0 [redux logging]
- redux_thunk 0.4.0 [redux]
- reorderables 0.5.0 [flutter]
- settings_ui 2.0.2 [flutter]
- shared_preferences 2.0.15 [flutter shared_preferences_android shared_preferences_ios shared_preferences_linux shared_preferences_macos shared_preferences_platform_interface shared_preferences_web shared_preferences_windows]
- shimmer 2.0.0 [flutter]
- sign_in_with_apple 4.1.0 [flutter meta sign_in_with_apple_platform_interface sign_in_with_apple_web]
- store_redirect 2.0.1 [flutter]
- transparent_image 2.0.0
- url_launcher 6.1.5 [flutter url_launcher_android url_launcher_ios url_launcher_linux url_launcher_macos url_launcher_platform_interface url_launcher_web url_launcher_windows]
- uuid 3.0.6 [crypto]

dev dependencies:
- flutter_lints 2.0.1 [lints]
- flutter_test 0.0.0 [flutter test_api path fake_async clock stack_trace vector_math async boolean_selector characters collection matcher material_color_utilities meta source_span stream_channel string_scanner term_glyph]

transitive dependencies:
- animate_do 2.1.0 [flutter]
- ansicolor 2.0.1
- archive 3.3.0 [crypto path]
- args 2.3.1
- asn1lib 1.1.0
- async 2.9.0 [collection meta]
- audioplayers_android 1.0.1 [audioplayers_platform_interface flutter]
- audioplayers_darwin 1.0.1 [audioplayers_platform_interface flutter]
- audioplayers_linux 1.0.0 [audioplayers_platform_interface flutter]
- audioplayers_platform_interface 1.0.0 [flutter plugin_platform_interface]
- audioplayers_web 1.0.0 [audioplayers_platform_interface flutter flutter_web_plugins]
- audioplayers_windows 1.0.0 [audioplayers_platform_interface flutter]
- boolean_selector 2.1.0 [source_span string_scanner]
- built_collection 5.1.1
- built_value 8.4.0 [built_collection collection fixnum meta]
- characters 1.2.1
- charcode 1.3.1
- clock 1.1.1
- cloud_firestore_web 2.7.0 [cloud_firestore_platform_interface collection firebase_core firebase_core_web flutter flutter_web_plugins js]
- convert 3.0.2 [typed_data]
- copy_with_extension 4.0.4
- cross_file 0.3.3+1 [js meta]
- dbus 0.7.6 [args ffi meta xml]
- device_info_platform_interface 2.0.1 [flutter meta plugin_platform_interface]
- fake_async 1.3.1 [clock collection]
- ffi 2.0.1
- file 6.1.2 [meta path]
- firebase_analytics_platform_interface 3.2.0 [firebase_core flutter meta plugin_platform_interface]
- firebase_analytics_web 0.4.1 [firebase_analytics_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins js]
- firebase_app_check_platform_interface 0.0.4+11 [firebase_core flutter meta plugin_platform_interface]
- firebase_app_check_web 0.0.6 [firebase_app_check_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins js]
- firebase_auth_platform_interface 6.3.2 [firebase_core flutter meta plugin_platform_interface]
- firebase_auth_web 4.0.0 [firebase_auth_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins http_parser intl js meta]
- firebase_core_platform_interface 4.5.0 [collection flutter flutter_test meta plugin_platform_interface]
- firebase_core_web 1.7.0 [firebase_core_platform_interface flutter flutter_web_plugins js meta]
- firebase_crashlytics_platform_interface 3.2.13 [collection firebase_core flutter meta plugin_platform_interface]
- firebase_messaging_platform_interface 4.0.0 [firebase_core flutter meta plugin_platform_interface]
- firebase_messaging_web 3.0.0 [firebase_core firebase_core_web firebase_messaging_platform_interface flutter flutter_web_plugins js meta]
- firebase_remote_config_platform_interface 1.1.11 [firebase_core flutter meta plugin_platform_interface]
- firebase_remote_config_web 1.1.0 [firebase_core firebase_core_web firebase_remote_config_platform_interface flutter flutter_web_plugins js]
- firebase_storage_platform_interface 4.1.11 [collection firebase_core flutter meta plugin_platform_interface]
- firebase_storage_web 3.3.0 [async firebase_core firebase_core_web firebase_storage_platform_interface flutter flutter_web_plugins http js meta]
- fixnum 1.0.1
- flutter_facebook_auth_platform_interface 3.2.0 [flutter plugin_platform_interface]
- flutter_facebook_auth_web 3.2.0 [flutter flutter_web_plugins js flutter_facebook_auth_platform_interface]
- flutter_local_notifications_linux 0.5.0+1 [flutter flutter_local_notifications_platform_interface dbus path xdg_directories]
- flutter_local_notifications_platform_interface 5.0.0 [flutter plugin_platform_interface]
- flutter_plugin_android_lifecycle 2.0.7 [flutter]
- flutter_web_plugins 0.0.0 [flutter js characters collection material_color_utilities meta vector_math]
- geolocator_android 4.0.1 [flutter geolocator_platform_interface]
- geolocator_apple 2.2.1 [flutter geolocator_platform_interface]
- geolocator_platform_interface 4.0.6 [flutter plugin_platform_interface vector_math meta]
- geolocator_web 2.1.6 [flutter flutter_web_plugins geolocator_platform_interface]
- geolocator_windows 0.1.1 [flutter geolocator_platform_interface]
- google_maps_flutter_android 2.4.0 [flutter flutter_plugin_android_lifecycle google_maps_flutter_platform_interface stream_transform]
- google_maps_flutter_ios 2.1.12 [flutter google_maps_flutter_platform_interface stream_transform]
- google_maps_flutter_platform_interface 2.2.4 [collection flutter plugin_platform_interface stream_transform]
- google_sign_in_android 6.0.1 [flutter google_sign_in_platform_interface]
- google_sign_in_ios 5.4.0 [flutter google_sign_in_platform_interface]
- google_sign_in_platform_interface 2.2.0 [flutter quiver]
- google_sign_in_web 0.10.2 [flutter flutter_web_plugins google_sign_in_platform_interface js]
- http_parser 4.0.1 [collection source_span string_scanner typed_data]
- image_cropper_for_web 0.0.4 [flutter flutter_web_plugins image_cropper_platform_interface js]
- image_cropper_platform_interface 2.0.0 [flutter plugin_platform_interface http]
- image_picker_android 0.8.5+1 [flutter flutter_plugin_android_lifecycle image_picker_platform_interface]
- image_picker_for_web 2.1.8 [flutter flutter_web_plugins image_picker_platform_interface]
- image_picker_ios 0.8.5+6 [flutter image_picker_platform_interface]
- image_picker_platform_interface 2.5.0 [cross_file flutter http plugin_platform_interface]
- in_app_purchase_android 0.2.3+1 [collection flutter in_app_purchase_platform_interface json_annotation]
- in_app_purchase_platform_interface 1.3.1 [flutter plugin_platform_interface]
- in_app_purchase_storekit 0.3.1 [collection flutter in_app_purchase_platform_interface json_annotation]
- jovial_misc 0.8.4 [pointycastle intl async collection convert meta]
- js 0.6.4
- json_annotation 4.6.0 [meta]
- libphonenumber 2.0.2 [flutter meta]
- libphonenumber_platform_interface 0.3.1 [flutter plugin_platform_interface]
- libphonenumber_plugin 0.2.3 [flutter flutter_web_plugins libphonenumber_platform_interface libphonenumber_web libphonenumber]
- libphonenumber_web 0.2.0+1 [flutter flutter_web_plugins js libphonenumber_platform_interface]
- lints 2.0.0
- markdown 5.0.0 [args charcode meta]
- matcher 0.12.12 [stack_trace]
- material_color_utilities 0.1.5
- package_info_plus_linux 1.0.5 [package_info_plus_platform_interface flutter path]
- package_info_plus_macos 1.3.0 [flutter]
- package_info_plus_platform_interface 1.0.2 [flutter meta plugin_platform_interface]
- package_info_plus_web 1.0.6 [flutter flutter_web_plugins http meta package_info_plus_platform_interface]
- package_info_plus_windows 2.1.0 [package_info_plus_platform_interface ffi flutter win32]
- path 1.8.2
- path_drawing 1.0.0 [vector_math meta path_parsing flutter]
- path_parsing 1.0.0 [vector_math meta]
- path_provider_android 2.0.16 [flutter path_provider_platform_interface]
- path_provider_ios 2.0.10 [flutter path_provider_platform_interface]
- path_provider_linux 2.1.7 [ffi flutter path path_provider_platform_interface xdg_directories]
- path_provider_macos 2.0.6 [flutter path_provider_platform_interface]
- path_provider_platform_interface 2.0.4 [flutter platform plugin_platform_interface]
- path_provider_windows 2.1.0 [ffi flutter path path_provider_platform_interface win32]
- petitparser 5.0.0 [meta]
- platform 3.1.0
- plugin_platform_interface 2.1.2 [meta]
- pointycastle 3.6.0 [collection convert js]
- process 4.2.4 [file path platform]
- quiver_hashcode 3.0.0+1
- shared_preferences_android 2.0.12 [flutter shared_preferences_platform_interface]
- shared_preferences_ios 2.1.1 [flutter shared_preferences_platform_interface]
- shared_preferences_linux 2.1.1 [file flutter path path_provider_linux path_provider_platform_interface shared_preferences_platform_interface]
- shared_preferences_macos 2.0.4 [flutter shared_preferences_platform_interface]
- shared_preferences_platform_interface 2.0.0 [flutter]
- shared_preferences_web 2.0.4 [flutter flutter_web_plugins shared_preferences_platform_interface]
- shared_preferences_windows 2.1.1 [file flutter path path_provider_platform_interface path_provider_windows shared_preferences_platform_interface]
- sign_in_with_apple_platform_interface 1.0.0 [flutter plugin_platform_interface meta]
- sign_in_with_apple_web 1.0.1 [flutter flutter_web_plugins sign_in_with_apple_platform_interface js]
- sky_engine 0.0.99
- sliver_tools 0.2.8 [flutter]
- smart_auth 1.0.5 [flutter flutter_web_plugins]
- source_span 1.9.0 [collection path term_glyph]
- sprintf 6.0.0
- stack_trace 1.10.0 [path]
- stream_channel 2.1.0 [async]
- stream_transform 2.1.0
- string_scanner 1.1.1 [source_span]
- talker 1.3.0+1 [talker_logger]
- talker_logger 1.2.1 [ansicolor]
- term_glyph 1.2.1
- test_api 0.4.12 [async boolean_selector collection meta source_span stack_trace stream_channel string_scanner term_glyph matcher]
- timezone 0.8.0 [path]
- typed_data 1.3.1 [collection]
- url_launcher_android 6.0.17 [flutter url_launcher_platform_interface]
- url_launcher_ios 6.0.17 [flutter url_launcher_platform_interface]
- url_launcher_linux 3.0.1 [flutter url_launcher_platform_interface]
- url_launcher_macos 3.0.1 [flutter url_launcher_platform_interface]
- url_launcher_platform_interface 2.1.0 [flutter plugin_platform_interface]
- url_launcher_web 2.0.12 [flutter flutter_web_plugins url_launcher_platform_interface]
- url_launcher_windows 3.0.1 [flutter url_launcher_platform_interface]
- vector_math 2.1.2
- win32 2.7.0 [ffi]
- xdg_directories 0.2.0+1 [meta path process]
- xml 6.1.0 [collection meta petitparser]

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions