improve alloc stats interface; fix admin command formatting

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-07-09 21:55:56 +00:00
parent 2a304c2b6c
commit 16e76d45cb
5 changed files with 20 additions and 24 deletions

View file

@ -632,12 +632,12 @@ pub(super) async fn resolve_true_destination(
pub(super) fn memory_stats() -> RoomMessageEventContent { pub(super) fn memory_stats() -> RoomMessageEventContent {
let html_body = conduit::alloc::memory_stats(); let html_body = conduit::alloc::memory_stats();
if html_body.is_empty() { if html_body.is_none() {
return RoomMessageEventContent::text_plain("malloc stats are not supported on your compiled malloc."); return RoomMessageEventContent::text_plain("malloc stats are not supported on your compiled malloc.");
} }
RoomMessageEventContent::text_html( RoomMessageEventContent::text_html(
"This command's output can only be viewed by clients that render HTML.".to_owned(), "This command's output can only be viewed by clients that render HTML.".to_owned(),
html_body, html_body.expect("string result"),
) )
} }

View file

@ -20,17 +20,12 @@ pub(super) async fn show_config(_body: Vec<&str>) -> Result<RoomMessageEventCont
} }
pub(super) async fn memory_usage(_body: Vec<&str>) -> Result<RoomMessageEventContent> { pub(super) async fn memory_usage(_body: Vec<&str>) -> Result<RoomMessageEventContent> {
let response0 = services().memory_usage().await?; let services_usage = services().memory_usage().await?;
let response1 = services().db.db.memory_usage()?; let database_usage = services().db.db.memory_usage()?;
let response2 = conduit::alloc::memory_usage(); let allocator_usage = conduit::alloc::memory_usage().map_or(String::new(), |s| format!("\nAllocator:\n{s}"));
Ok(RoomMessageEventContent::text_plain(format!( Ok(RoomMessageEventContent::text_plain(format!(
"Services:\n{response0}\nDatabase:\n{response1}\n{}", "Services:\n{services_usage}\nDatabase:\n{database_usage}{allocator_usage}",
if !response2.is_empty() {
format!("Allocator:\n {response2}")
} else {
String::new()
}
))) )))
} }

View file

@ -1,9 +1,9 @@
//! Default allocator with no special features //! Default allocator with no special features
/// Always returns the empty string /// Always returns None
#[must_use] #[must_use]
pub fn memory_stats() -> String { String::default() } pub fn memory_stats() -> Option<String> { None }
/// Always returns the empty string /// Always returns None
#[must_use] #[must_use]
pub fn memory_usage() -> String { String::default() } pub fn memory_usage() -> Option<String> { None }

View file

@ -4,9 +4,10 @@
static HMALLOC: hardened_malloc_rs::HardenedMalloc = hardened_malloc_rs::HardenedMalloc; static HMALLOC: hardened_malloc_rs::HardenedMalloc = hardened_malloc_rs::HardenedMalloc;
#[must_use] #[must_use]
pub fn memory_usage() -> String { //TODO: get usage
String::default() //TODO: get usage pub fn memory_usage() -> Option<string> { None }
}
#[must_use] #[must_use]
pub fn memory_stats() -> String { "Extended statistics are not available from hardened_malloc.".to_owned() } pub fn memory_stats() -> Option<String> {
Some("Extended statistics are not available from hardened_malloc.".to_owned())
}

View file

@ -10,7 +10,7 @@ use tikv_jemallocator as jemalloc;
static JEMALLOC: jemalloc::Jemalloc = jemalloc::Jemalloc; static JEMALLOC: jemalloc::Jemalloc = jemalloc::Jemalloc;
#[must_use] #[must_use]
pub fn memory_usage() -> String { pub fn memory_usage() -> Option<String> {
use mallctl::stats; use mallctl::stats;
let mibs = |input: Result<usize, mallctl::Error>| { let mibs = |input: Result<usize, mallctl::Error>| {
@ -27,14 +27,14 @@ pub fn memory_usage() -> String {
let metadata = mibs(stats::metadata::read()); let metadata = mibs(stats::metadata::read());
let resident = mibs(stats::resident::read()); let resident = mibs(stats::resident::read());
let retained = mibs(stats::retained::read()); let retained = mibs(stats::retained::read());
format!( Some(format!(
"allocated: {allocated:.2} MiB\nactive: {active:.2} MiB\nmapped: {mapped:.2} MiB\nmetadata: {metadata:.2} \ "allocated: {allocated:.2} MiB\nactive: {active:.2} MiB\nmapped: {mapped:.2} MiB\nmetadata: {metadata:.2} \
MiB\nresident: {resident:.2} MiB\nretained: {retained:.2} MiB\n" MiB\nresident: {resident:.2} MiB\nretained: {retained:.2} MiB\n"
) ))
} }
#[must_use] #[must_use]
pub fn memory_stats() -> String { pub fn memory_stats() -> Option<String> {
const MAX_LENGTH: usize = 65536 - 4096; const MAX_LENGTH: usize = 65536 - 4096;
let opts_s = "d"; let opts_s = "d";
@ -51,7 +51,7 @@ pub fn memory_stats() -> String {
unsafe { ffi::malloc_stats_print(Some(malloc_stats_cb), opaque, opts_p) }; unsafe { ffi::malloc_stats_print(Some(malloc_stats_cb), opaque, opts_p) };
str.truncate(MAX_LENGTH); str.truncate(MAX_LENGTH);
format!("<pre><code>{str}</code></pre>") Some(format!("<pre><code>{str}</code></pre>"))
} }
extern "C" fn malloc_stats_cb(opaque: *mut c_void, msg: *const c_char) { extern "C" fn malloc_stats_cb(opaque: *mut c_void, msg: *const c_char) {