From ec9b699817b322da2e0e6c6562d1ee07013dcfda Mon Sep 17 00:00:00 2001 From: argzdev Date: Thu, 18 Apr 2024 04:01:44 +0800 Subject: [PATCH] Try catch for datastore write (#5833) Proposed fix for issue #5802. Datastore crashes when writing from a device that has full internal memory. I did a manual test by creating a clean project and importing the part of the code with the condition checkers to simulate the issue. I was able to receive the issue stacktrace the developer was encountering and was able to verify that the try catch condition mitigates the issue. --- firebase-sessions/CHANGELOG.md | 2 ++ .../google/firebase/sessions/SessionDatastore.kt | 12 ++++++++++-- .../firebase/sessions/settings/SettingsCache.kt | 13 ++++++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/firebase-sessions/CHANGELOG.md b/firebase-sessions/CHANGELOG.md index 2ddf415e685..7287034099e 100644 --- a/firebase-sessions/CHANGELOG.md +++ b/firebase-sessions/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +* [fixed] Handled datastore writes when device has full internal memory more gracefully. + # 1.2.3 * [fixed] Force validation or rotation of FIDs. diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionDatastore.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionDatastore.kt index c5f5a51e77d..736761617fd 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionDatastore.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionDatastore.kt @@ -28,6 +28,7 @@ import androidx.datastore.preferences.preferencesDataStore import com.google.firebase.Firebase import com.google.firebase.app import com.google.firebase.sessions.ProcessDetailsProvider.getProcessName +import java.io.IOException import java.util.concurrent.atomic.AtomicReference import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope @@ -84,8 +85,15 @@ internal class SessionDatastoreImpl( override fun updateSessionId(sessionId: String) { CoroutineScope(backgroundDispatcher).launch { - context.dataStore.edit { preferences -> - preferences[FirebaseSessionDataKeys.SESSION_ID] = sessionId + try { + context.dataStore.edit { preferences -> + preferences[FirebaseSessionDataKeys.SESSION_ID] = sessionId + } + } catch (e: IOException) { + Log.w( + TAG, + "Failed to update session Id: $e", + ) } } } diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/settings/SettingsCache.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/settings/SettingsCache.kt index 83f0808713f..33b6a4fe7c8 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/settings/SettingsCache.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/settings/SettingsCache.kt @@ -99,9 +99,16 @@ internal class SettingsCache(private val dataStore: DataStore) { @VisibleForTesting internal suspend fun removeConfigs() { - dataStore.edit { preferences -> - preferences.clear() - updateSessionConfigs(preferences) + try { + dataStore.edit { preferences -> + preferences.clear() + updateSessionConfigs(preferences) + } + } catch (e: IOException) { + Log.w( + TAG, + "Failed to remove config values: $e", + ) } }