From 1734c6e2f50f61eb14a7a80eca6ffb029d43f8cf Mon Sep 17 00:00:00 2001 From: Themis wang Date: Mon, 21 Oct 2024 13:15:10 -0400 Subject: [PATCH] handle oom error as IOException --- .../internal/metadata/MetaDataStore.java | 17 +++++++++++++++++ .../internal/metadata/QueueFileLogStore.java | 2 ++ .../CrashlyticsReportPersistence.java | 9 +++++++++ 3 files changed, 28 insertions(+) diff --git a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/metadata/MetaDataStore.java b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/metadata/MetaDataStore.java index ce9667e4ed9..c0ee9db54bf 100644 --- a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/metadata/MetaDataStore.java +++ b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/metadata/MetaDataStore.java @@ -63,6 +63,8 @@ public void writeUserData(String sessionId, String userId) { writer.flush(); } catch (Exception e) { Logger.getLogger().w("Error serializing user metadata.", e); + } catch (OutOfMemoryError e) { + Logger.getLogger().w("OOM serializing user metadata.", e); } finally { CommonUtils.closeOrLog(writer, "Failed to close user metadata file."); } @@ -86,6 +88,9 @@ public String readUserId(String sessionId) { } catch (Exception e) { Logger.getLogger().w("Error deserializing user metadata.", e); safeDeleteCorruptFile(f); + } catch (OutOfMemoryError e) { + Logger.getLogger().w("OOM deserializing user metadata.", e); + safeDeleteCorruptFile(f); } finally { CommonUtils.closeOrLog(is, "Failed to close user metadata file."); } @@ -108,6 +113,9 @@ public void writeKeyData(String sessionId, Map keyData, boolean } catch (Exception e) { Logger.getLogger().w("Error serializing key/value metadata.", e); safeDeleteCorruptFile(f); + } catch (OutOfMemoryError e) { + Logger.getLogger().w("OOM serializing key/value metadata.", e); + safeDeleteCorruptFile(f); } finally { CommonUtils.closeOrLog(writer, "Failed to close key/value metadata file."); } @@ -132,6 +140,9 @@ Map readKeyData(String sessionId, boolean isInternal) { } catch (Exception e) { Logger.getLogger().w("Error deserializing user metadata.", e); safeDeleteCorruptFile(f); + } catch (OutOfMemoryError e) { + Logger.getLogger().w("OOM deserializing user metadata.", e); + safeDeleteCorruptFile(f); } finally { CommonUtils.closeOrLog(is, "Failed to close user metadata file."); } @@ -155,6 +166,9 @@ public List readRolloutsState(String sessionId) { } catch (Exception e) { Logger.getLogger().w("Error deserializing rollouts state.", e); safeDeleteCorruptFile(f); + } catch (OutOfMemoryError e) { + Logger.getLogger().w("OOM deserializing rollouts state.", e); + safeDeleteCorruptFile(f); } finally { CommonUtils.closeOrLog(is, "Failed to close rollouts state file."); } @@ -177,6 +191,9 @@ public void writeRolloutState(String sessionId, List rollouts } catch (Exception e) { Logger.getLogger().w("Error serializing rollouts state.", e); safeDeleteCorruptFile(f); + } catch (OutOfMemoryError e) { + Logger.getLogger().w("OOM serializing rollouts state.", e); + safeDeleteCorruptFile(f); } finally { CommonUtils.closeOrLog(writer, "Failed to close rollouts state file."); } diff --git a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/metadata/QueueFileLogStore.java b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/metadata/QueueFileLogStore.java index 23f7b5bae29..924b615d0d5 100644 --- a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/metadata/QueueFileLogStore.java +++ b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/metadata/QueueFileLogStore.java @@ -176,6 +176,8 @@ private void doWriteToLog(long timestamp, String msg) { } } catch (IOException e) { Logger.getLogger().e("There was a problem writing to the Crashlytics log.", e); + } catch (OutOfMemoryError e) { + Logger.getLogger().e("OOM when writing to the Crashlytics log.", e); } } } diff --git a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence.java b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence.java index d684fda7b31..37d83ebf395 100644 --- a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence.java +++ b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence.java @@ -413,6 +413,9 @@ private static int oldestEventFileFirst(@NonNull File f1, @NonNull File f2) { private static void writeTextFile(File file, String text) throws IOException { try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), UTF_8)) { writer.write(text); + } catch (OutOfMemoryError e) { + Logger.getLogger().w("Write text file out of memory.", e); + throw new IOException("out of memory"); } } @@ -421,6 +424,9 @@ private static void writeTextFile(File file, String text, long lastModifiedTimes try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), UTF_8)) { writer.write(text); file.setLastModified(convertTimestampFromSecondsToMs(lastModifiedTimestampSeconds)); + } catch (OutOfMemoryError e) { + Logger.getLogger().w("Write text file out of memory.", e); + throw new IOException("out of memory"); } } @@ -434,6 +440,9 @@ private static String readTextFile(@NonNull File file) throws IOException { bos.write(readBuffer, 0, read); } return new String(bos.toByteArray(), UTF_8); + } catch (OutOfMemoryError e) { + Logger.getLogger().w("Read text file out of memory.", e); + throw new IOException("out of memory"); } }