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);
     }