Skip to content

[cloud_firestore][Android]: Transaction callback timeout can cause fatal assertion on subsequent read #18666

Description

@Laqeith

Is there an existing issue for this?

  • I have searched the existing issues.

Which plugins are affected?

Other

Which platforms are affected?

Android

Description

My production Android app crashes with:

java.lang.AssertionError: INTERNAL ASSERTION FAILED:
A transaction object cannot be used after its update callback has been invoked.

Affected dependencies:

  • cloud_firestore: 6.9.0
  • cloud_firestore_platform_interface: 8.0.7
  • firebase_core: 4.14.0

The transaction callback performs sequential, awaited document reads.
No transaction object is intentionally retained outside the callback.

Crashlytics breadcrumbs show the first read completing approximately
47 seconds after the callback started, followed immediately by the
second read and the fatal assertion. The transaction uses the default
30-second timeout.

Expected: the transaction fails with a recoverable timeout error.
Actual: the Android process terminates with a native AssertionError.

Reproducing the issue

Observed in production with this transaction pattern:

await firestore.runTransaction((transaction) async {
final first = await transaction.get(firstRef);
final second = await transaction.get(secondRef);
// Validate the snapshots, then queue writes.
});

Both reads are awaited within the callback. The transaction uses the
default 30-second timeout.

Crashlytics breadcrumbs show:

  1. The callback starts and requests the first document.
  2. The first read returns approximately 47 seconds later.
  3. The callback requests the second document.
  4. The native assertion occurs at the same timestamp.

Firebase Core version

4.14.0

Flutter Version

3.47.2

Relevant Log Output

08:51:27 cloud_save_commit callback_start attempt=1
08:51:27 read_start manifest
08:52:14 read_complete manifest
08:52:14 read_start character_shard_1_of_1
08:52:14 transaction error elapsed_ms=46350
         cloud_firestore/deadline-exceeded: timed out

Fatal Exception: java.lang.AssertionError:
INTERNAL ASSERTION FAILED: A transaction object cannot be used
after its update callback has been invoked.
  at com.google.firebase.firestore.util.Assert.fail(Assert.java:63)
  at com.google.firebase.firestore.util.Assert.hardAssert(Assert.java:31)
  at com.google.firebase.firestore.core.Transaction.ensureCommitNotCalled(Transaction.java:252)
  at com.google.firebase.firestore.core.Transaction.lookup(Transaction.java:81)
  at com.google.firebase.firestore.Transaction.getAsync(Transaction.java:189)
  at com.google.firebase.firestore.Transaction.get(Transaction.java:226)
  at io.flutter.plugins.firebase.firestore.FlutterFirebaseFirestorePlugin.lambda$transactionGet$12(FlutterFirebaseFirestorePlugin.java:634)

Flutter dependencies

Expand Flutter dependencies snippet
Dart SDK 3.13.2
Flutter SDK 3.47.2

dependencies:
- audioplayers 6.8.1 [audioplayers_android audioplayers_darwin audioplayers_linux audioplayers_platform_interface audioplayers_web audioplayers_windows file flutter http meta path_provider synchronized uuid]
- cloud_firestore 6.9.0 [cloud_firestore_platform_interface cloud_firestore_web collection firebase_core firebase_core_platform_interface flutter meta]
- cloud_functions 6.4.0 [cloud_functions_platform_interface cloud_functions_web firebase_core firebase_core_platform_interface flutter]
- connectivity_plus 7.3.1 [flutter flutter_web_plugins connectivity_plus_platform_interface web meta nm collection]
- crypto 3.0.7 [typed_data]
- cupertino_icons 1.0.9
- ffi 2.2.0
- firebase_analytics 12.5.0 [firebase_analytics_platform_interface firebase_analytics_web firebase_core firebase_core_platform_interface flutter]
- firebase_app_check 0.4.7 [firebase_app_check_platform_interface firebase_app_check_web firebase_core firebase_core_platform_interface flutter]
- firebase_auth 6.6.1 [firebase_auth_platform_interface firebase_auth_web firebase_core firebase_core_platform_interface flutter meta]
- firebase_core 4.14.0 [firebase_core_platform_interface firebase_core_web flutter meta]
- firebase_crashlytics 5.3.0 [firebase_core firebase_core_platform_interface firebase_crashlytics_platform_interface flutter stack_trace]
- firebase_remote_config 6.6.0 [firebase_core firebase_core_platform_interface firebase_remote_config_platform_interface firebase_remote_config_web flutter]
- flame 1.38.2 [collection flutter meta ordered_set vector_math]
- flame_audio 2.12.2 [audioplayers flame flutter synchronized]
- flutter 0.0.0 [characters collection material_color_utilities meta vector_math sky_engine]
- flutter_local_notifications 19.5.0 [clock flutter flutter_local_notifications_linux flutter_local_notifications_windows flutter_local_notifications_platform_interface timezone]
- flutter_localizations 0.0.0 [flutter intl path]
- flutter_svg 2.3.0 [flutter http vector_graphics vector_graphics_codec vector_graphics_compiler]
- flutter_timezone 5.1.0 [equatable flutter flutter_web_plugins meta]
- font_awesome_flutter 11.0.0 [flutter]
- gma_mediation_meta 1.7.0 [flutter google_mobile_ads plugin_platform_interface]
- gma_mediation_unity 1.10.0 [flutter google_mobile_ads meta plugin_platform_interface]
- google_mobile_ads 9.1.0 [meta flutter webview_flutter_android webview_flutter_wkwebview webview_flutter]
- google_sign_in 7.2.0 [flutter google_sign_in_android google_sign_in_ios google_sign_in_platform_interface google_sign_in_web]
- in_app_purchase 3.3.0 [flutter in_app_purchase_android in_app_purchase_platform_interface in_app_purchase_storekit]
- in_app_review 2.0.12 [flutter in_app_review_platform_interface]
- in_app_update 4.2.5 [flutter]
- intl 0.20.3 [clock meta path]
- meta 1.19.0
- package_info_plus 10.1.0 [clock ffi flutter flutter_web_plugins http meta package_info_plus_platform_interface path web win32]
- path 1.9.1
- path_provider 2.1.6 [flutter path_provider_android path_provider_foundation path_provider_linux path_provider_platform_interface path_provider_windows]
- timezone 0.10.1 [http path]
- url_launcher 6.3.2 [flutter url_launcher_android url_launcher_ios url_launcher_linux url_launcher_macos url_launcher_platform_interface url_launcher_web url_launcher_windows]
- visibility_detector 0.4.0+2 [flutter]
- wakelock_plus 1.6.1 [flutter flutter_web_plugins meta wakelock_plus_platform_interface win32 dbus package_info_plus web]

dev dependencies:
- fake_cloud_firestore 4.2.0 [flutter cloud_firestore cloud_firestore_platform_interface collection plugin_platform_interface rxdart mock_exceptions fake_firebase_security_rules rx equatable clock]
- flame_lint 1.4.4 [lints]
- flutter_test 0.0.0 [flutter test_api matcher path fake_async clock stack_trace vector_math leak_tracker_flutter_testing collection meta stream_channel]

transitive dependencies:
- _flutterfire_internals 1.3.77 [collection firebase_core firebase_core_platform_interface flutter meta]
- antlr4 4.13.2 [logging collection]
- args 2.7.0
- async 2.13.1 [collection meta]
- audioplayers_android 5.3.0 [audioplayers_platform_interface flutter]
- audioplayers_darwin 6.5.0 [audioplayers_platform_interface flutter]
- audioplayers_linux 4.3.0 [audioplayers_platform_interface flutter]
- audioplayers_platform_interface 7.2.0 [collection flutter meta plugin_platform_interface]
- audioplayers_web 5.3.0 [audioplayers_platform_interface flutter flutter_web_plugins web]
- audioplayers_windows 4.4.1 [audioplayers_platform_interface flutter]
- boolean_selector 2.1.2 [source_span string_scanner]
- cel 0.5.4+1 [antlr4 collection equatable]
- characters 1.4.1
- clock 1.1.3
- cloud_firestore_platform_interface 8.0.7 [_flutterfire_internals collection firebase_core flutter meta plugin_platform_interface]
- cloud_firestore_web 5.7.3 [_flutterfire_internals cloud_firestore_platform_interface collection firebase_core firebase_core_web flutter flutter_web_plugins]
- cloud_functions_platform_interface 6.0.7 [firebase_core flutter meta plugin_platform_interface]
- cloud_functions_web 5.1.13 [cloud_functions_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins web]
- code_assets 2.0.0 [collection hooks logging]
- collection 1.19.1
- connectivity_plus_platform_interface 2.1.0 [flutter meta plugin_platform_interface]
- dbus 0.7.15 [args ffi meta xml]
- equatable 2.1.0 [collection meta]
- fake_async 1.3.3 [clock collection]
- fake_firebase_security_rules 0.5.4 [antlr4 cel equatable logger]
- ffi_leak_tracker 0.1.2 [ffi]
- file 7.0.1 [meta path]
- firebase_analytics_platform_interface 6.0.7 [_flutterfire_internals firebase_core flutter meta plugin_platform_interface]
- firebase_analytics_web 0.6.1+13 [_flutterfire_internals firebase_analytics_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins]
- firebase_app_check_platform_interface 0.4.2+1 [_flutterfire_internals firebase_core flutter meta plugin_platform_interface]
- firebase_app_check_web 0.2.6+1 [_flutterfire_internals firebase_app_check_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins web]
- firebase_auth_platform_interface 9.0.7 [_flutterfire_internals collection firebase_core flutter http meta plugin_platform_interface]
- firebase_auth_web 6.2.7 [firebase_auth_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins http_parser meta web]
- firebase_core_platform_interface 8.1.1 [collection flutter meta plugin_platform_interface]
- firebase_core_web 3.11.0 [firebase_core_platform_interface flutter flutter_web_plugins meta web]
- firebase_crashlytics_platform_interface 3.9.0 [_flutterfire_internals collection firebase_core firebase_core_platform_interface flutter meta plugin_platform_interface]
- firebase_remote_config_platform_interface 3.0.7 [_flutterfire_internals firebase_core flutter meta plugin_platform_interface]
- firebase_remote_config_web 1.10.14 [_flutterfire_internals firebase_core firebase_core_web firebase_remote_config_platform_interface flutter flutter_web_plugins]
- fixnum 1.1.1
- flutter_local_notifications_linux 6.0.0 [dbus ffi flutter flutter_local_notifications_platform_interface path xdg_directories]
- flutter_local_notifications_platform_interface 9.1.0 [plugin_platform_interface]
- flutter_local_notifications_windows 1.0.3 [flutter ffi flutter_local_notifications_platform_interface meta timezone xml]
- flutter_web_plugins 0.0.0 [flutter]
- google_identity_services_web 0.3.3+1 [meta web]
- google_sign_in_android 7.2.17 [flutter google_sign_in_platform_interface meta]
- google_sign_in_ios 6.3.2 [flutter google_sign_in_platform_interface meta]
- google_sign_in_platform_interface 3.1.0 [flutter plugin_platform_interface]
- google_sign_in_web 1.1.3 [flutter flutter_web_plugins google_identity_services_web google_sign_in_platform_interface http web]
- hooks 2.2.0 [collection crypto logging pub_semver record_use yaml]
- http 1.6.0 [async http_parser meta web]
- http_parser 4.1.2 [collection source_span string_scanner typed_data]
- in_app_purchase_android 0.5.3 [collection flutter in_app_purchase_platform_interface meta]
- in_app_purchase_platform_interface 1.4.1 [flutter plugin_platform_interface]
- in_app_purchase_storekit 0.4.11+2 [collection flutter in_app_purchase_platform_interface json_annotation meta]
- in_app_review_platform_interface 2.0.5 [flutter url_launcher plugin_platform_interface platform]
- jni 1.0.3 [args collection ffi jni_util meta package_config path plugin_platform_interface]
- jni_flutter 1.0.3 [flutter jni]
- jni_util 1.0.0 [path]
- json_annotation 4.12.0 [meta]
- leak_tracker 11.0.2 [clock collection meta path vm_service]
- leak_tracker_flutter_testing 3.0.10 [flutter leak_tracker leak_tracker_testing matcher meta]
- leak_tracker_testing 3.0.2 [leak_tracker matcher meta]
- lints 6.1.0
- logger 2.7.0 [meta clock]
- logging 1.3.0
- matcher 0.12.20 [async meta stack_trace term_glyph test_api]
- material_color_utilities 0.13.0 [collection]
- mock_exceptions 0.8.2 [matcher]
- more 4.7.0 [characters clock collection meta]
- nm 0.5.0 [dbus]
- objective_c 9.6.0 [code_assets collection ffi hooks logging meta pub_semver]
- ordered_set 8.0.1
- package_config 3.0.0 [meta]
- package_info_plus_platform_interface 4.1.0 [flutter meta plugin_platform_interface]
- path_parsing 1.1.0 [meta vector_math]
- path_provider_android 2.3.1 [flutter jni jni_flutter path_provider_platform_interface]
- path_provider_foundation 2.6.0 [ffi flutter objective_c path_provider_platform_interface]
- path_provider_linux 2.2.2 [ffi flutter path path_provider_platform_interface xdg_directories]
- path_provider_platform_interface 2.1.3 [flutter platform plugin_platform_interface]
- path_provider_windows 2.3.0 [ffi flutter path path_provider_platform_interface]
- petitparser 7.0.2 [meta collection]
- platform 3.1.6
- plugin_platform_interface 2.1.8 [meta]
- pub_semver 2.2.1 [collection]
- record_use 1.1.1 [collection meta pub_semver]
- rx 0.5.0 [collection matcher meta more]
- rxdart 0.28.0
- sky_engine 0.0.0
- source_span 1.10.2 [collection path term_glyph]
- stack_trace 1.12.2 [path]
- stream_channel 2.1.4 [async]
- string_scanner 1.4.1 [source_span]
- synchronized 3.4.1+2
- term_glyph 1.2.2
- test_api 0.7.12 [async boolean_selector collection meta source_span stack_trace stream_channel string_scanner term_glyph]
- typed_data 1.4.0 [collection]
- url_launcher_android 6.3.33 [flutter meta url_launcher_platform_interface]
- url_launcher_ios 6.4.2 [flutter meta url_launcher_platform_interface]
- url_launcher_linux 3.2.3 [flutter meta url_launcher_platform_interface]
- url_launcher_macos 3.2.6 [flutter meta url_launcher_platform_interface]
- url_launcher_platform_interface 2.3.2 [flutter plugin_platform_interface]
- url_launcher_web 2.4.3 [flutter flutter_web_plugins url_launcher_platform_interface web]
- url_launcher_windows 3.1.6 [flutter meta url_launcher_platform_interface]
- uuid 4.6.0 [crypto fixnum]
- vector_graphics 1.2.3 [flutter http vector_graphics_codec]
- vector_graphics_codec 1.1.13
- vector_graphics_compiler 1.3.0 [args meta path path_parsing vector_graphics_codec xml]
- vector_math 2.4.2
- vm_service 15.3.0
- wakelock_plus_platform_interface 1.7.0 [flutter plugin_platform_interface meta]
- web 1.1.1
- webview_flutter 4.14.1 [flutter webview_flutter_android webview_flutter_platform_interface webview_flutter_wkwebview]
- webview_flutter_android 4.14.1 [flutter meta webview_flutter_platform_interface]
- webview_flutter_platform_interface 2.15.1 [flutter meta plugin_platform_interface]
- webview_flutter_wkwebview 3.26.1 [flutter meta path webview_flutter_platform_interface]
- win32 6.4.0 [ffi ffi_leak_tracker meta]
- xdg_directories 1.1.0 [meta path]
- xml 6.6.1 [collection meta petitparser]
- yaml 3.1.4 [collection source_span string_scanner]

Additional context and comments

Source investigation suggests the Android TransactionStreamHandler
returns FlutterFirebaseFirestoreTransactionResult.failed(...) when
semaphore.tryAcquire times out.

This returns a value rather than throwing from the native callback.
The Firebase Android SDK can consequently proceed into commit while
the Dart callback is still awaiting its read. A subsequent native
transaction.get can then encounter ensureCommitNotCalled.

transactionGet catches Exception, which does not catch AssertionError.

Historical report with the same assertion:
#2968

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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