diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-11-18 21:59:36 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-11-18 21:59:36 +0000 |
commit | 3d056b21ecea2e3006aeda01bff497facb197697 (patch) | |
tree | dd72a84514306c5cc0c9025a1fb9e9e3976ced32 /profcollectd/libprofcollectd | |
parent | c964f7422a4da1300ce2a63e09e7ffd17d5ce88c (diff) | |
parent | 3b739c8720db08d5b34e8a547a5b2f6305fe37b6 (diff) | |
download | extras-android12-mainline-adbd-release.tar.gz |
Snap for 7929046 from 3b739c8720db08d5b34e8a547a5b2f6305fe37b6 to mainline-adbd-releaseandroid-mainline-12.0.0_r97android-mainline-12.0.0_r85android-mainline-12.0.0_r68android-mainline-12.0.0_r41android12-mainline-adbd-release
Change-Id: I8bec35e4a57068f57d92a932eb770925a2d443e6
Diffstat (limited to 'profcollectd/libprofcollectd')
11 files changed, 111 insertions, 75 deletions
diff --git a/profcollectd/libprofcollectd/bindings/libbase/Android.bp b/profcollectd/libprofcollectd/bindings/libbase/Android.bp index b99d41d8..8e5fb1e0 100644 --- a/profcollectd/libprofcollectd/bindings/libbase/Android.bp +++ b/profcollectd/libprofcollectd/bindings/libbase/Android.bp @@ -26,20 +26,25 @@ package { cc_library_static { name: "libprofcollect_libbase", srcs: ["properties.cpp"], + generated_headers: ["cxx-bridge-header"], + generated_sources: ["libprofcollect_libbase_bridge_code"], } -rust_bindgen { - name: "libprofcollect_libbase_bindgen", - wrapper_src: "properties.hpp", - crate_name: "profcollect_libbase_bindgen", - source_stem: "bindings", +genrule { + name: "libprofcollect_libbase_bridge_code", + tools: ["cxxbridge"], + cmd: "$(location cxxbridge) $(in) >> $(out)", + srcs: ["lib.rs"], + out: ["libprofcollect_libbase_cxx_generated.cc"], } rust_library { name: "libprofcollect_libbase_rust", crate_name: "profcollect_libbase_rust", srcs: ["lib.rs"], - rlibs: ["libprofcollect_libbase_bindgen"], + rustlibs: [ + "libcxx", + ], static_libs: ["libprofcollect_libbase"], shared_libs: [ "libc++", diff --git a/profcollectd/libprofcollectd/bindings/libbase/lib.rs b/profcollectd/libprofcollectd/bindings/libbase/lib.rs index 6ac34d58..bdd99a02 100644 --- a/profcollectd/libprofcollectd/bindings/libbase/lib.rs +++ b/profcollectd/libprofcollectd/bindings/libbase/lib.rs @@ -14,26 +14,21 @@ // limitations under the License. // -//! This module implements safe wrappers for GetProperty method from libbase. +//! This module implements safe wrappers for GetProperty and SetProperty from libbase. -use std::ffi::{CStr, CString}; +pub use ffi::{GetProperty, SetProperty}; -/// Returns the current value of the system property `key`, -/// or `default_value` if the property is empty or doesn't exist. -pub fn get_property<'a>(key: &str, default_value: &'a str) -> &'a str { - let key = CString::new(key).unwrap(); - let default_value = CString::new(default_value).unwrap(); - unsafe { - let cstr = profcollect_libbase_bindgen::GetProperty(key.as_ptr(), default_value.as_ptr()); - CStr::from_ptr(cstr).to_str().unwrap() - } -} +/// Safe wrappers for the GetProperty and SetProperty methods from libbase. +#[cxx::bridge] +mod ffi { + unsafe extern "C++" { + include!("properties.hpp"); + + /// Returns the current value of the system property `key`, + /// or `default_value` if the property is empty or doesn't exist. + fn GetProperty(key: &str, default_value: &str) -> String; -/// Sets the system property `key` to `value`. -pub fn set_property(key: &str, value: &str) { - let key = CString::new(key).unwrap(); - let value = CString::new(value).unwrap(); - unsafe { - profcollect_libbase_bindgen::SetProperty(key.as_ptr(), value.as_ptr()); + /// Sets the system property `key` to `value`. + fn SetProperty(key: &str, value: &str); } } diff --git a/profcollectd/libprofcollectd/bindings/libbase/properties.cpp b/profcollectd/libprofcollectd/bindings/libbase/properties.cpp index 01be7c73..908f19d0 100644 --- a/profcollectd/libprofcollectd/bindings/libbase/properties.cpp +++ b/profcollectd/libprofcollectd/bindings/libbase/properties.cpp @@ -17,11 +17,10 @@ #include "../../../../../libbase/include/android-base/properties.h" #include "properties.hpp" -const char* GetProperty(const char* key, const char* default_value) { - auto v = android::base::GetProperty(std::string(key), std::string(default_value)); - return strdup(v.c_str()); +rust::String GetProperty(rust::Str key, rust::Str default_value) { + return android::base::GetProperty(std::string(key), std::string(default_value)); } -void SetProperty(const char* key, const char* value) { +void SetProperty(rust::Str key, rust::Str value) { android::base::SetProperty(std::string(key), std::string(value)); } diff --git a/profcollectd/libprofcollectd/bindings/libbase/properties.hpp b/profcollectd/libprofcollectd/bindings/libbase/properties.hpp index d6785a28..c8ef1f64 100644 --- a/profcollectd/libprofcollectd/bindings/libbase/properties.hpp +++ b/profcollectd/libprofcollectd/bindings/libbase/properties.hpp @@ -14,6 +14,9 @@ * limitations under the License. */ -// C declaration for bindgen. -const char* GetProperty(const char*, const char*); -void SetProperty(const char*, const char*); +#pragma once + +#include "rust/cxx.h" + +rust::String GetProperty(rust::Str, rust::Str); +void SetProperty(rust::Str, rust::Str); diff --git a/profcollectd/libprofcollectd/bindings/libflags/Android.bp b/profcollectd/libprofcollectd/bindings/libflags/Android.bp index 102a6c05..fb846678 100644 --- a/profcollectd/libprofcollectd/bindings/libflags/Android.bp +++ b/profcollectd/libprofcollectd/bindings/libflags/Android.bp @@ -26,20 +26,23 @@ package { cc_library_static { name: "libprofcollect_libflags", srcs: ["get_flags.cpp"], + generated_headers: ["cxx-bridge-header"], + generated_sources: ["libprofcollect_libflags_bridge_code"], } -rust_bindgen { - name: "libprofcollect_libflags_bindgen", - wrapper_src: "get_flags.hpp", - crate_name: "profcollect_libflags_bindgen", - source_stem: "bindings", +genrule { + name: "libprofcollect_libflags_bridge_code", + tools: ["cxxbridge"], + cmd: "$(location cxxbridge) $(in) >> $(out)", + srcs: ["lib.rs"], + out: ["libprofcollect_libflags_cxx_generated.cc"], } rust_library { name: "libprofcollect_libflags_rust", crate_name: "profcollect_libflags_rust", srcs: ["lib.rs"], - rlibs: ["libprofcollect_libflags_bindgen"], + rustlibs: ["libcxx"], static_libs: ["libprofcollect_libflags"], shared_libs: [ "libc++", diff --git a/profcollectd/libprofcollectd/bindings/libflags/get_flags.cpp b/profcollectd/libprofcollectd/bindings/libflags/get_flags.cpp index e5ce65a1..d8bab841 100644 --- a/profcollectd/libprofcollectd/bindings/libflags/get_flags.cpp +++ b/profcollectd/libprofcollectd/bindings/libflags/get_flags.cpp @@ -17,12 +17,9 @@ #include "../../../../../server_configurable_flags/libflags/include/server_configurable_flags/get_flags.h" #include "get_flags.hpp" -const char* GetServerConfigurableFlag(const char* experiment_category_name, - const char* experiment_flag_name, - const char* default_value) { - auto v = server_configurable_flags::GetServerConfigurableFlag( - std::string(experiment_category_name), - std::string(experiment_flag_name), - std::string(default_value)); - return strdup(v.c_str()); +rust::String GetServerConfigurableFlag(rust::Str experiment_category_name, + rust::Str experiment_flag_name, rust::Str default_value) { + return server_configurable_flags::GetServerConfigurableFlag(std::string(experiment_category_name), + std::string(experiment_flag_name), + std::string(default_value)); } diff --git a/profcollectd/libprofcollectd/bindings/libflags/get_flags.hpp b/profcollectd/libprofcollectd/bindings/libflags/get_flags.hpp index ab3be989..a42c52e8 100644 --- a/profcollectd/libprofcollectd/bindings/libflags/get_flags.hpp +++ b/profcollectd/libprofcollectd/bindings/libflags/get_flags.hpp @@ -14,5 +14,8 @@ * limitations under the License. */ -// C declaration for bindgen. -const char* GetServerConfigurableFlag(const char*, const char*, const char*); +#pragma once + +#include "rust/cxx.h" + +rust::String GetServerConfigurableFlag(rust::Str, rust::Str, rust::Str); diff --git a/profcollectd/libprofcollectd/bindings/libflags/lib.rs b/profcollectd/libprofcollectd/bindings/libflags/lib.rs index c8875cb1..c6435bbd 100644 --- a/profcollectd/libprofcollectd/bindings/libflags/lib.rs +++ b/profcollectd/libprofcollectd/bindings/libflags/lib.rs @@ -17,27 +17,22 @@ //! This module implements safe wrappers for GetServerConfigurableFlag method //! from libflags. -use std::ffi::{CStr, CString}; +pub use ffi::GetServerConfigurableFlag; -/// Use the category name and flag name registered in SettingsToPropertiesMapper.java -/// to query the experiment flag value. This method will return default_value if -/// querying fails. -/// Note that for flags from Settings.Global, experiment_category_name should -/// always be global_settings. -pub fn get_server_configurable_flag<'a>( - experiment_category_name: &str, - experiment_flag_name: &str, - default_value: &'a str, -) -> &'a str { - let experiment_category_name = CString::new(experiment_category_name).unwrap(); - let experiment_flag_name = CString::new(experiment_flag_name).unwrap(); - let default_value = CString::new(default_value).unwrap(); - unsafe { - let cstr = profcollect_libflags_bindgen::GetServerConfigurableFlag( - experiment_category_name.as_ptr(), - experiment_flag_name.as_ptr(), - default_value.as_ptr(), - ); - CStr::from_ptr(cstr).to_str().unwrap() +#[cxx::bridge] +mod ffi { + unsafe extern "C++" { + include!("get_flags.hpp"); + + /// Use the category name and flag name registered in SettingsToPropertiesMapper.java + /// to query the experiment flag value. This method will return default_value if + /// querying fails. + /// Note that for flags from Settings.Global, experiment_category_name should + /// always be global_settings. + fn GetServerConfigurableFlag( + experiment_category_name: &str, + experiment_flag_name: &str, + default_value: &str, + ) -> String; } } diff --git a/profcollectd/libprofcollectd/config.rs b/profcollectd/libprofcollectd/config.rs index d2850e82..e8afb37f 100644 --- a/profcollectd/libprofcollectd/config.rs +++ b/profcollectd/libprofcollectd/config.rs @@ -29,6 +29,8 @@ use std::time::Duration; const PROFCOLLECT_CONFIG_NAMESPACE: &str = "profcollect_native_boot"; const PROFCOLLECT_NODE_ID_PROPERTY: &str = "persist.profcollectd.node_id"; +pub const REPORT_RETENTION_SECS: u64 = 14 * 24 * 60 * 60; // 14 days. + lazy_static! { pub static ref TRACE_OUTPUT_DIR: &'static Path = Path::new("/data/misc/profcollectd/trace/"); pub static ref PROFILE_OUTPUT_DIR: &'static Path = Path::new("/data/misc/profcollectd/output/"); @@ -105,7 +107,7 @@ where T::Err: Error + Send + Sync + 'static, { let default_value = default_value.to_string(); - let config = profcollect_libflags_rust::get_server_configurable_flag( + let config = profcollect_libflags_rust::GetServerConfigurableFlag( &PROFCOLLECT_CONFIG_NAMESPACE, &key, &default_value, @@ -119,7 +121,7 @@ where T::Err: Error + Send + Sync + 'static, { let default_value = default_value.to_string(); - let value = profcollect_libbase_rust::get_property(&key, &default_value); + let value = profcollect_libbase_rust::GetProperty(&key, &default_value); Ok(T::from_str(&value)?) } @@ -128,7 +130,7 @@ where T: ToString, { let value = value.to_string(); - profcollect_libbase_rust::set_property(&key, &value); + profcollect_libbase_rust::SetProperty(&key, &value); } fn generate_random_node_id() -> MacAddr6 { diff --git a/profcollectd/libprofcollectd/report.rs b/profcollectd/libprofcollectd/report.rs index c37993b7..a67d500b 100644 --- a/profcollectd/libprofcollectd/report.rs +++ b/profcollectd/libprofcollectd/report.rs @@ -23,7 +23,7 @@ use std::fs::{self, File, Permissions}; use std::io::{Read, Write}; use std::os::unix::fs::PermissionsExt; use std::path::{Path, PathBuf}; -use std::time::SystemTime; +use std::time::{Duration, SystemTime}; use uuid::v1::{Context, Timestamp}; use uuid::Uuid; use zip::write::FileOptions; @@ -82,3 +82,12 @@ fn get_report_filename(node_id: &MacAddr6) -> Result<String> { let uuid = Uuid::new_v1(ts, &node_id.as_bytes())?; Ok(uuid.to_string()) } + +/// Get report creation timestamp through its filename (version 1 UUID). +pub fn get_report_ts(filename: &str) -> Result<SystemTime> { + let uuid_ts = Uuid::parse_str(filename)? + .to_timestamp() + .ok_or_else(|| anyhow!("filename is not a valid V1 UUID."))? + .to_unix(); + Ok(SystemTime::UNIX_EPOCH + Duration::new(uuid_ts.0, uuid_ts.1)) +} diff --git a/profcollectd/libprofcollectd/service.rs b/profcollectd/libprofcollectd/service.rs index 0b9cca1e..04f30f89 100644 --- a/profcollectd/libprofcollectd/service.rs +++ b/profcollectd/libprofcollectd/service.rs @@ -21,16 +21,17 @@ use binder::public_api::Result as BinderResult; use binder::Status; use profcollectd_aidl_interface::aidl::com::android::server::profcollect::IProfCollectd::IProfCollectd; use std::ffi::CString; -use std::fs::{copy, create_dir, read_to_string, remove_dir_all, remove_file, write}; +use std::fs::{copy, create_dir, read_dir, read_to_string, remove_dir_all, remove_file, write}; use std::path::PathBuf; use std::str::FromStr; use std::sync::{Mutex, MutexGuard}; +use std::time::Duration; use crate::config::{ Config, BETTERBUG_CACHE_DIR_PREFIX, BETTERBUG_CACHE_DIR_SUFFIX, CONFIG_FILE, - PROFILE_OUTPUT_DIR, REPORT_OUTPUT_DIR, TRACE_OUTPUT_DIR, + PROFILE_OUTPUT_DIR, REPORT_OUTPUT_DIR, REPORT_RETENTION_SECS, TRACE_OUTPUT_DIR, }; -use crate::report::pack_report; +use crate::report::{get_report_ts, pack_report}; use crate::scheduler::Scheduler; fn err_to_binder_status(msg: Error) -> Status { @@ -155,6 +156,30 @@ impl ProfcollectdBinderService { write(*CONFIG_FILE, &new_config.to_string())?; } + // Clear profile reports out of rentention period. + for report in read_dir(*REPORT_OUTPUT_DIR)? { + let report = report?.path(); + let report_name = report + .file_stem() + .and_then(|f| f.to_str()) + .ok_or_else(|| anyhow!("Malformed path {}", report.display()))?; + let report_ts = get_report_ts(report_name); + if let Err(e) = report_ts { + log::error!( + "Cannot decode creation timestamp for report {}, caused by {}, deleting", + report_name, + e + ); + remove_file(report)?; + continue; + } + let report_age = report_ts.unwrap().elapsed()?; + if report_age > Duration::from_secs(REPORT_RETENTION_SECS) { + log::info!("Report {} past rentention period, deleting", report_name); + remove_file(report)?; + } + } + Ok(ProfcollectdBinderService { lock: Mutex::new(Lock { scheduler: new_scheduler, config: new_config }), }) |