Skip to content

Commit

Permalink
Merge "Don't overwrite persistent property files" into main am: 68fbe13
Browse files Browse the repository at this point in the history
… am: c5dec99 am: d21e11b

Original change: https://android-review.googlesource.com/c/platform/system/core/+/2796061

Change-Id: I67083e4c0900b65402765308d21c1319e03d8176
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
  • Loading branch information
Treehugger Robot authored and android-build-merge-worker-robot committed Oct 20, 2023
2 parents 33479ce + d21e11b commit 3f1aea5
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 30 deletions.
36 changes: 18 additions & 18 deletions init/persistent_properties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,24 +115,6 @@ void RemoveLegacyPersistentPropertyFiles() {
}
}

PersistentProperties LoadPersistentPropertiesFromMemory() {
PersistentProperties persistent_properties;
__system_property_foreach(
[](const prop_info* pi, void* cookie) {
__system_property_read_callback(
pi,
[](void* cookie, const char* name, const char* value, unsigned serial) {
if (StartsWith(name, "persist.")) {
auto properties = reinterpret_cast<PersistentProperties*>(cookie);
AddPersistentProperty(name, value, properties);
}
},
cookie);
},
&persistent_properties);
return persistent_properties;
}

Result<std::string> ReadPersistentPropertyFile() {
const std::string temp_filename = persistent_property_filename + ".tmp";
if (access(temp_filename.c_str(), F_OK) == 0) {
Expand Down Expand Up @@ -221,6 +203,24 @@ Result<void> WritePersistentPropertyFile(const PersistentProperties& persistent_
return {};
}

PersistentProperties LoadPersistentPropertiesFromMemory() {
PersistentProperties persistent_properties;
__system_property_foreach(
[](const prop_info* pi, void* cookie) {
__system_property_read_callback(
pi,
[](void* cookie, const char* name, const char* value, unsigned serial) {
if (StartsWith(name, "persist.")) {
auto properties = reinterpret_cast<PersistentProperties*>(cookie);
AddPersistentProperty(name, value, properties);
}
},
cookie);
},
&persistent_properties);
return persistent_properties;
}

// Persistent properties are not written often, so we rather not keep any data in memory and read
// then rewrite the persistent property file for each update.
void WritePersistentProperty(const std::string& name, const std::string& value) {
Expand Down
1 change: 1 addition & 0 deletions init/persistent_properties.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ void AddPersistentProperty(const std::string& name, const std::string& value,
PersistentProperties* persistent_properties);
PersistentProperties LoadPersistentProperties();
void WritePersistentProperty(const std::string& name, const std::string& value);
PersistentProperties LoadPersistentPropertiesFromMemory();

// Exposed only for testing
Result<PersistentProperties> LoadPersistentPropertyFile();
Expand Down
15 changes: 3 additions & 12 deletions init/property_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1419,8 +1419,6 @@ static void HandleInitSocket() {
// Apply staged and persistent properties
bool has_staged_prop = false;
auto const staged_prefix = std::string_view("next_boot.");
auto const staged_persist_prefix = std::string_view("next_boot.persist.");
auto persist_props_map = std::unordered_map<std::string, std::string>();

auto persistent_properties = LoadPersistentProperties();
for (const auto& property_record : persistent_properties.properties()) {
Expand All @@ -1431,23 +1429,16 @@ static void HandleInitSocket() {
has_staged_prop = true;
auto actual_prop_name = prop_name.substr(staged_prefix.size());
InitPropertySet(actual_prop_name, prop_value);
if (StartsWith(prop_name, staged_persist_prefix)) {
persist_props_map[actual_prop_name] = prop_value;
}
} else if (!persist_props_map.count(prop_name)) {
} else {
InitPropertySet(prop_name, prop_value);
}
}

// Update persist prop file if there are staged props
if (has_staged_prop) {
PersistentProperties updated_persist_props;
for (auto const& [prop_name, prop_value] : persist_props_map) {
AddPersistentProperty(prop_name, prop_value, &updated_persist_props);
}

PersistentProperties props = LoadPersistentPropertiesFromMemory();
// write current updated persist prop file
auto result = WritePersistentPropertyFile(updated_persist_props);
auto result = WritePersistentPropertyFile(props);
if (!result.ok()) {
LOG(ERROR) << "Could not store persistent property: " << result.error();
}
Expand Down

0 comments on commit 3f1aea5

Please sign in to comment.