diff --git a/firebase-firestore/CHANGELOG.md b/firebase-firestore/CHANGELOG.md index e89f4d95e4d..e54bd037d93 100644 --- a/firebase-firestore/CHANGELOG.md +++ b/firebase-firestore/CHANGELOG.md @@ -1,5 +1,6 @@ # Unreleased * [fixed] Fixed the `null` value handling in `whereNotEqualTo` and `whereNotIn` filters. +* [fixed] Catch exception when stream is already cancelled during close. [#6894](//github.com/firebase/firebase-android-sdk/pull/6894) # 25.1.3 * [fixed] Use lazy encoding in UTF-8 encoded byte comparison for strings to solve performance issues. [#6706](//github.com/firebase/firebase-android-sdk/pull/6706) diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/AbstractStream.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/AbstractStream.java index c1cd01dfbe9..963cb4ca532 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/AbstractStream.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/AbstractStream.java @@ -352,7 +352,21 @@ private void close(State finalState, Status status) { getClass().getSimpleName(), "(%x) Closing stream client-side", System.identityHashCode(this)); - call.halfClose(); + try { + call.halfClose(); + } catch (IllegalStateException e) { + // Secondary failure encountered. The underlying RPC has entered an error state. We will + // log and continue since the RPC is being discarded anyway. + // + // Example, "IllegalStateException: call was cancelled" was observed in + // https://github.com/firebase/firebase-android-sdk/issues/6883 + // Likely caused by other part of system already cancelling stream. + Logger.debug( + getClass().getSimpleName(), + "(%x) Closing stream client-side result in exception: [%s]", + System.identityHashCode(this), + e); + } } call = null; }