Use AtomicFile in CarTelemetryService
All usages of File are replaced with AtomicFile, with the exception of
simple deletion, because AtomicFile uses the same method underneath.
Bug: 205049095
Test: atest CarServiceUnitTest:ResultStoreTest
Test: atest CarServiceUnitTest:MetricsConfigStoreTest
Test: atest CarServiceUnitTest:StatsPublisherTest
Test: atest CarServiceUnitTest:CarTelemetryServiceTest
Change-Id: Ib74202b5d69cfb158d502a579e9d953a34ffb75b
Merged-In: Ib74202b5d69cfb158d502a579e9d953a34ffb75b
(cherry picked from commit 3f1dce5dc692b717d960b7a9d7afe669c194fa05)
diff --git a/service/src/com/android/car/telemetry/MetricsConfigStore.java b/service/src/com/android/car/telemetry/MetricsConfigStore.java
index 5a6e1ca..d369085 100644
--- a/service/src/com/android/car/telemetry/MetricsConfigStore.java
+++ b/service/src/com/android/car/telemetry/MetricsConfigStore.java
@@ -23,12 +23,14 @@
import android.car.telemetry.MetricsConfigKey;
import android.util.ArrayMap;
+import android.util.AtomicFile;
import com.android.car.CarLog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.utils.Slogf;
import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
@@ -54,14 +56,14 @@
mActiveConfigs = new ArrayMap<>();
// TODO(b/197336485): Add expiration date check for MetricsConfig
for (File file : mConfigDirectory.listFiles()) {
+ AtomicFile atomicFile = new AtomicFile(file);
try {
- byte[] serializedConfig = Files.readAllBytes(file.toPath());
TelemetryProto.MetricsConfig config =
- TelemetryProto.MetricsConfig.parseFrom(serializedConfig);
+ TelemetryProto.MetricsConfig.parseFrom(atomicFile.readFully());
mActiveConfigs.put(config.getName(), config);
} catch (IOException e) {
// TODO(b/197336655): record failure
- file.delete();
+ atomicFile.delete();
}
}
}
@@ -94,12 +96,15 @@
}
}
mActiveConfigs.put(metricsConfig.getName(), metricsConfig);
+ AtomicFile atomicFile = new AtomicFile(new File(mConfigDirectory, metricsConfig.getName()));
+ FileOutputStream fos = null;
try {
- Files.write(
- new File(mConfigDirectory, metricsConfig.getName()).toPath(),
- metricsConfig.toByteArray());
+ fos = atomicFile.startWrite();
+ fos.write(metricsConfig.toByteArray());
+ atomicFile.finishWrite(fos);
} catch (IOException e) {
// TODO(b/197336655): record failure
+ atomicFile.failWrite(fos);
Slogf.w(CarLog.TAG_TELEMETRY, "Failed to write metrics config to disk", e);
return ERROR_METRICS_CONFIG_UNKNOWN;
}