refactor: Clean up memory collection code (#1045)

This commit is contained in:
Clement Tsang 2023-03-05 02:31:45 -05:00 committed by GitHub
parent 3510563638
commit 8489c4bc10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -52,56 +52,57 @@ pub(crate) fn get_swap_data(sys: &System) -> Option<MemHarvest> {
#[cfg(feature = "zfs")] #[cfg(feature = "zfs")]
pub(crate) fn get_arc_data() -> Option<MemHarvest> { pub(crate) fn get_arc_data() -> Option<MemHarvest> {
let (mem_total_in_kib, mem_used_in_kib) = { let (mem_total_in_kib, mem_used_in_kib) = {
#[cfg(target_os = "linux")] cfg_if::cfg_if! {
{ if #[cfg(target_os = "linux")]
// TODO: [OPT] is this efficient? {
use std::fs::read_to_string; // TODO: [OPT] is this efficient?
if let Ok(arcinfo) = read_to_string("/proc/spl/kstat/zfs/arcstats") { use std::fs::read_to_string;
let mut mem_arc = 0; if let Ok(arc_stats) = read_to_string("/proc/spl/kstat/zfs/arcstats") {
let mut mem_total = 0; let mut mem_arc = 0;
let mut zfs_keys_read: u8 = 0; let mut mem_total = 0;
const ZFS_KEYS_NEEDED: u8 = 2; let mut zfs_keys_read: u8 = 0;
const ZFS_KEYS_NEEDED: u8 = 2;
for line in arcinfo.lines() { for line in arc_stats.lines() {
if let Some((label, value)) = line.split_once(' ') { if let Some((label, value)) = line.split_once(' ') {
let to_write = match label { let to_write = match label {
"size" => &mut mem_arc, "size" => &mut mem_arc,
"memory_all_bytes" => &mut mem_total, "memory_all_bytes" => &mut mem_total,
_ => { _ => {
continue; continue;
} }
}; };
if let Some((_type, number)) = value.trim_start().rsplit_once(' ') { if let Some((_type, number)) = value.trim_start().rsplit_once(' ') {
// Parse the value, remember it's in bytes! // Parse the value, remember it's in bytes!
if let Ok(number) = number.parse::<u64>() { if let Ok(number) = number.parse::<u64>() {
*to_write = number; *to_write = number;
// We only need a few keys, so we can bail early. // We only need a few keys, so we can bail early.
zfs_keys_read += 1; zfs_keys_read += 1;
if zfs_keys_read == ZFS_KEYS_NEEDED { if zfs_keys_read == ZFS_KEYS_NEEDED {
break; break;
}
} }
} }
} }
} }
(mem_total / 1024, mem_arc / 1024)
} else {
(0, 0)
} }
(mem_total / 1024, mem_arc / 1024) } else if #[cfg(target_os = "freebsd")] {
} else { use sysctl::Sysctl;
(0, 0) if let (Ok(mem_arc_value), Ok(mem_sys_value)) = (
} sysctl::Ctl::new("kstat.zfs.misc.arcstats.size"),
} sysctl::Ctl::new("hw.physmem"),
) {
#[cfg(target_os = "freebsd")] if let (Ok(sysctl::CtlValue::U64(arc)), Ok(sysctl::CtlValue::Ulong(mem))) =
{ (mem_arc_value.value(), mem_sys_value.value())
use sysctl::Sysctl; {
if let (Ok(mem_arc_value), Ok(mem_sys_value)) = ( (mem / 1024, arc / 1024)
sysctl::Ctl::new("kstat.zfs.misc.arcstats.size"), } else {
sysctl::Ctl::new("hw.physmem"), (0, 0)
) { }
if let (Ok(sysctl::CtlValue::U64(arc)), Ok(sysctl::CtlValue::Ulong(mem))) =
(mem_arc_value.value(), mem_sys_value.value())
{
(mem / 1024, arc / 1024)
} else { } else {
(0, 0) (0, 0)
} }
@ -109,14 +110,6 @@ pub(crate) fn get_arc_data() -> Option<MemHarvest> {
(0, 0) (0, 0)
} }
} }
#[cfg(target_os = "macos")]
{
(0, 0)
}
#[cfg(target_os = "windows")]
{
(0, 0)
}
}; };
Some(MemHarvest { Some(MemHarvest {