From 2f8efe00af7ae33fede46d84e1eb0bf8b02614a8 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Thu, 4 Apr 2024 22:14:27 +0900 Subject: [PATCH] skip nop persistent property writes Bug: 332611029 Test: TH Change-Id: I0f6ca09c781964d1eb432a770c50e7216f043b4f --- init/persistent_properties.cpp | 3 +++ init/persistent_properties_test.cpp | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/init/persistent_properties.cpp b/init/persistent_properties.cpp index 59e57b95f..1d17e3c10 100644 --- a/init/persistent_properties.cpp +++ b/init/persistent_properties.cpp @@ -236,6 +236,9 @@ void WritePersistentProperty(const std::string& name, const std::string& value) persistent_properties->mutable_properties()->end(), [&name](const auto& record) { return record.name() == name; }); if (it != persistent_properties->mutable_properties()->end()) { + if (it->value() == value) { + return; + } it->set_name(name); it->set_value(value); } else { diff --git a/init/persistent_properties_test.cpp b/init/persistent_properties_test.cpp index 576305081..97865d7b4 100644 --- a/init/persistent_properties_test.cpp +++ b/init/persistent_properties_test.cpp @@ -17,6 +17,9 @@ #include "persistent_properties.h" #include +#include +#include +#include #include @@ -155,6 +158,31 @@ TEST(persistent_properties, UpdatePropertyBadParse) { EXPECT_FALSE(it == read_back_properties.properties().end()); } +TEST(persistent_properties, NopUpdateDoesntWriteFile) { + TemporaryFile tf; + ASSERT_TRUE(tf.fd != -1); + persistent_property_filename = tf.path; + + auto last_modified = [&tf]() -> time_t { + struct stat buf; + EXPECT_EQ(fstat(tf.fd, &buf), 0); + return buf.st_mtime; + }; + + std::vector> persistent_properties = { + {"persist.sys.locale", "en-US"}, + {"persist.sys.timezone", "America/Los_Angeles"}, + }; + ASSERT_RESULT_OK( + WritePersistentPropertyFile(VectorToPersistentProperties(persistent_properties))); + + time_t t = last_modified(); + sleep(2); + WritePersistentProperty("persist.sys.locale", "en-US"); + // Ensure that the file was not modified + ASSERT_EQ(last_modified(), t); +} + TEST(persistent_properties, RejectNonPersistProperty) { TemporaryFile tf; ASSERT_TRUE(tf.fd != -1);