TransactionTraceWriter - always overwrite old files
Update TransactionTraceWriter to overwrite files older than ten minutes, even when overwrite is set to false.
Bug: 302249537
Bug: 306466281
Test: TransactionTraceWriterTest
Change-Id: Ic49662251debe3ccd2f0bba37535680733793c2d
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 9b9a67a..dc19cbd 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -103,6 +103,7 @@
#include <cinttypes>
#include <cmath>
#include <cstdint>
+#include <filesystem>
#include <functional>
#include <memory>
#include <mutex>
@@ -309,6 +310,19 @@
return LayerHandle::getLayerId(surfaceControl->getHandle());
}
+/**
+ * Returns true if the file at path exists and is newer than duration.
+ */
+bool fileNewerThan(const std::string& path, std::chrono::minutes duration) {
+ using Clock = std::filesystem::file_time_type::clock;
+ std::error_code error;
+ std::filesystem::file_time_type updateTime = std::filesystem::last_write_time(path, error);
+ if (error) {
+ return false;
+ }
+ return duration > (Clock::now() - updateTime);
+}
+
} // namespace anonymous
// ---------------------------------------------------------------------------
@@ -899,7 +913,7 @@
TransactionTraceWriter::getInstance().setWriterFunction(
[&](const std::string& filename, bool overwrite) {
auto writeFn = [&]() {
- if (!overwrite && access(filename.c_str(), F_OK) == 0) {
+ if (!overwrite && fileNewerThan(filename, std::chrono::minutes{10})) {
ALOGD("TransactionTraceWriter: file=%s already exists", filename.c_str());
return;
}