Merge "aconfigd: migrate to full rust aconfigd" into main am: 910e04d7c0
Original change: https://android-review.googlesource.com/c/platform/system/server_configurable_flags/+/3370012
Change-Id: I32d8beb9e5f9afa9c96e7f8121afa9091bf18914
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/aconfigd/Android.bp b/aconfigd/Android.bp
index 29d4c4d..443e1ff 100644
--- a/aconfigd/Android.bp
+++ b/aconfigd/Android.bp
@@ -31,7 +31,9 @@
srcs: ["src/main.rs"],
rustlibs: [
"libaconfig_flags",
+ "libaconfig_new_storage_flags_rust",
"libaconfigd_system",
+ "libaconfigd_rust",
"libandroid_logger",
"librustutils",
"liblibc",
@@ -141,6 +143,12 @@
aconfig_declarations: "aconfig_new_storage_flags",
}
+rust_aconfig_library {
+ name: "libaconfig_new_storage_flags_rust",
+ crate_name: "aconfig_new_storage_flags",
+ aconfig_declarations: "aconfig_new_storage_flags",
+}
+
java_aconfig_library {
name: "aconfig_new_storage_flags_lib",
aconfig_declarations: "aconfig_new_storage_flags",
diff --git a/aconfigd/new_aconfig_storage.aconfig b/aconfigd/new_aconfig_storage.aconfig
index db92ac0..4a0a9fe 100644
--- a/aconfigd/new_aconfig_storage.aconfig
+++ b/aconfigd/new_aconfig_storage.aconfig
@@ -14,4 +14,19 @@
namespace: "core_experiments_team_internal"
description: "Support immediate local overrides."
bug: "360205436"
-}
\ No newline at end of file
+}
+
+flag {
+ name: "enable_full_rust_system_aconfigd"
+ namespace: "core_experiments_team_internal"
+ description: "enable full rust implementation aconfigd"
+ is_fixed_read_only: true
+ bug: "312444587"
+}
+
+flag {
+ name: "enable_aconfigd_from_mainline"
+ namespace: "core_experiments_team_internal"
+ bug: "369808805"
+ description: "When enabled, launch aconfigd from config infra module."
+}
diff --git a/aconfigd/src/aconfigd_commands.rs b/aconfigd/src/aconfigd_commands.rs
index 28e93be..05e7bb5 100644
--- a/aconfigd/src/aconfigd_commands.rs
+++ b/aconfigd/src/aconfigd_commands.rs
@@ -15,7 +15,8 @@
*/
use aconfigd_protos::ProtoStorageReturnMessage;
-use aconfigd_system::Aconfigd;
+use aconfigd_rust::aconfigd::Aconfigd;
+use aconfigd_system::Aconfigd as CXXAconfigd;
use anyhow::{anyhow, bail, Result};
use log::{debug, error, info};
use std::io::{Read, Write};
@@ -40,44 +41,65 @@
let listener = UnixListener::from(fd);
- let aconfigd = Aconfigd::new(ACONFIGD_ROOT_DIR, STORAGE_RECORDS);
- aconfigd
- .initialize_in_memory_storage_records()
- .map_err(|e| anyhow!("failed to init memory storage records: {e}"))?;
+ if aconfig_new_storage_flags::enable_full_rust_system_aconfigd() {
+ let mut aconfigd = Aconfigd::new(Path::new(ACONFIGD_ROOT_DIR), Path::new(STORAGE_RECORDS));
+ aconfigd.initialize_from_storage_record()?;
- debug!("start waiting for a new client connection through socket.");
- for stream in listener.incoming() {
- match stream {
- Ok(mut stream) => {
- let mut length_buffer = [0u8; 4];
- stream.read_exact(&mut length_buffer)?;
- let message_length = u32::from_be_bytes(length_buffer);
-
- let mut message_buffer = vec![0u8; message_length as usize];
- stream.read_exact(&mut message_buffer)?;
-
- let response_buffer = match aconfigd.handle_socket_request(&message_buffer) {
- Ok(response) => response,
- Err(e) => {
- error!("failed to process socket request: {e}");
- let mut return_msg = ProtoStorageReturnMessage::new();
- return_msg
- .set_error_message(format!("failed to handle socket request: {:?}", e));
- protobuf::Message::write_to_bytes(&return_msg)?
+ debug!("start waiting for a new client connection through socket.");
+ for stream in listener.incoming() {
+ match stream {
+ Ok(mut stream) => {
+ if let Err(errmsg) = aconfigd.handle_socket_request_from_stream(&mut stream) {
+ error!("failed to handle socket request: {:?}", errmsg);
}
- };
-
- let mut response_length_buffer: [u8; 4] = [0; 4];
- let response_size = &response_buffer.len();
- response_length_buffer[0] = (response_size >> 24) as u8;
- response_length_buffer[1] = (response_size >> 16) as u8;
- response_length_buffer[2] = (response_size >> 8) as u8;
- response_length_buffer[3] = *response_size as u8;
- stream.write_all(&response_length_buffer)?;
- stream.write_all(&response_buffer)?;
+ }
+ Err(errmsg) => {
+ error!("failed to listen for an incoming message: {:?}", errmsg);
+ }
}
- Err(errmsg) => {
- error!("failed to listen for an incoming message: {:?}", errmsg);
+ }
+ } else {
+ let aconfigd = CXXAconfigd::new(ACONFIGD_ROOT_DIR, STORAGE_RECORDS);
+ aconfigd
+ .initialize_in_memory_storage_records()
+ .map_err(|e| anyhow!("failed to init memory storage records: {e}"))?;
+
+ debug!("start waiting for a new client connection through socket.");
+ for stream in listener.incoming() {
+ match stream {
+ Ok(mut stream) => {
+ let mut length_buffer = [0u8; 4];
+ stream.read_exact(&mut length_buffer)?;
+ let message_length = u32::from_be_bytes(length_buffer);
+
+ let mut message_buffer = vec![0u8; message_length as usize];
+ stream.read_exact(&mut message_buffer)?;
+
+ let response_buffer = match aconfigd.handle_socket_request(&message_buffer) {
+ Ok(response) => response,
+ Err(e) => {
+ error!("failed to process socket request: {e}");
+ let mut return_msg = ProtoStorageReturnMessage::new();
+ return_msg.set_error_message(format!(
+ "failed to handle socket request: {:?}",
+ e
+ ));
+ protobuf::Message::write_to_bytes(&return_msg)?
+ }
+ };
+
+ let mut response_length_buffer: [u8; 4] = [0; 4];
+ let response_size = &response_buffer.len();
+ response_length_buffer[0] = (response_size >> 24) as u8;
+ response_length_buffer[1] = (response_size >> 16) as u8;
+ response_length_buffer[2] = (response_size >> 8) as u8;
+ response_length_buffer[3] = *response_size as u8;
+ stream.write_all(&response_length_buffer)?;
+ stream.write_all(&response_buffer)?;
+ }
+ Err(errmsg) => {
+ error!("failed to listen for an incoming message: {:?}", errmsg);
+ }
}
}
}
@@ -87,14 +109,27 @@
/// initialize mainline module storage files
pub fn mainline_init() -> Result<()> {
- Aconfigd::new(ACONFIGD_ROOT_DIR, STORAGE_RECORDS)
- .initialize_mainline_storage()
- .map_err(|e| anyhow!("failed to init mainline storage: {e}"))
+ if aconfig_new_storage_flags::enable_full_rust_system_aconfigd() {
+ let mut aconfigd = Aconfigd::new(Path::new(ACONFIGD_ROOT_DIR), Path::new(STORAGE_RECORDS));
+ aconfigd.initialize_from_storage_record()?;
+ Ok(aconfigd.initialize_mainline_storage()?)
+ } else {
+ CXXAconfigd::new(ACONFIGD_ROOT_DIR, STORAGE_RECORDS)
+ .initialize_mainline_storage()
+ .map_err(|e| anyhow!("failed to init mainline storage: {e}"))
+ }
}
/// initialize platform storage files
pub fn platform_init() -> Result<()> {
- Aconfigd::new(ACONFIGD_ROOT_DIR, STORAGE_RECORDS)
- .initialize_platform_storage()
- .map_err(|e| anyhow!("failed to init platform storage: {e}"))
+ if aconfig_new_storage_flags::enable_full_rust_system_aconfigd() {
+ let mut aconfigd = Aconfigd::new(Path::new(ACONFIGD_ROOT_DIR), Path::new(STORAGE_RECORDS));
+ aconfigd.remove_boot_files()?;
+ aconfigd.initialize_from_storage_record()?;
+ Ok(aconfigd.initialize_platform_storage()?)
+ } else {
+ CXXAconfigd::new(ACONFIGD_ROOT_DIR, STORAGE_RECORDS)
+ .initialize_platform_storage()
+ .map_err(|e| anyhow!("failed to init platform storage: {e}"))
+ }
}
diff --git a/aconfigd/src/main.rs b/aconfigd/src/main.rs
index 03f170d..fdea219 100644
--- a/aconfigd/src/main.rs
+++ b/aconfigd/src/main.rs
@@ -43,7 +43,9 @@
}
fn main() {
- if !aconfig_flags::auto_generated::enable_system_aconfigd_rust() {
+ if !aconfig_flags::auto_generated::enable_system_aconfigd_rust()
+ || !aconfig_new_storage_flags::enable_aconfig_storage_daemon()
+ {
info!("aconfigd_system is disabled, exiting");
std::process::exit(0);
}