use crate::manager::error::{Error, Result};
use crate::{CPU_SHARES_V1_MAX, CPU_WEIGHT_V2_MAX};
pub(crate) fn cpu_shares_to_cgroup_v2(shares: u64) -> u64 {
if shares == 0 {
return 0;
}
if shares <= 2 {
return 1;
}
if shares >= CPU_SHARES_V1_MAX {
return CPU_WEIGHT_V2_MAX;
}
(((shares - 2) * 9999) / 262142) + 1
}
pub(crate) fn memory_swap_to_cgroup_v2(memswap_limit: i64, mem_limit: i64) -> Result<i64> {
if mem_limit == -1 && memswap_limit == 0 {
return Ok(-1);
}
if memswap_limit == -1 || memswap_limit == 0 {
return Ok(memswap_limit);
}
if mem_limit == -1 {
return Ok(memswap_limit);
}
if mem_limit == 0 {
return Err(Error::InvalidLinuxResource);
}
if mem_limit < 0 {
return Err(Error::InvalidLinuxResource);
}
if memswap_limit < mem_limit {
return Err(Error::InvalidLinuxResource);
}
Ok(memswap_limit - mem_limit)
}
#[cfg(test)]
mod tests {
use crate::manager::conv::*;
#[test]
fn test_cpu_shares_to_cgroup_v2() {
assert_eq!(cpu_shares_to_cgroup_v2(0), 0);
assert_eq!(cpu_shares_to_cgroup_v2(1), 1);
assert_eq!(cpu_shares_to_cgroup_v2(2), 1);
assert_eq!(cpu_shares_to_cgroup_v2(100), 4);
assert_eq!(
cpu_shares_to_cgroup_v2(CPU_SHARES_V1_MAX),
CPU_WEIGHT_V2_MAX
);
assert_eq!(
cpu_shares_to_cgroup_v2(CPU_SHARES_V1_MAX - 1),
CPU_WEIGHT_V2_MAX - 1
);
assert_eq!(cpu_shares_to_cgroup_v2(u64::MAX), CPU_WEIGHT_V2_MAX);
}
#[test]
fn test_memory_swap_to_cgroup_v2() {
assert_eq!(memory_swap_to_cgroup_v2(0, -1).unwrap(), -1);
assert_eq!(memory_swap_to_cgroup_v2(-1, 0).unwrap(), -1);
assert_eq!(memory_swap_to_cgroup_v2(0, 0).unwrap(), 0);
assert_eq!(memory_swap_to_cgroup_v2(100, -1).unwrap(), 100);
assert!(memory_swap_to_cgroup_v2(100, 0).is_err());
assert!(memory_swap_to_cgroup_v2(100, -2).is_err());
assert!(memory_swap_to_cgroup_v2(50, 100).is_err());
assert_eq!(memory_swap_to_cgroup_v2(200, 100).unwrap(), 100);
}
}