Merge pull request #154 from justxuewei/systemd-version

systemd: Do not check systemd version
This commit is contained in:
Tim Zhang
2025-08-08 11:19:32 +08:00
committed by GitHub
8 changed files with 16 additions and 92 deletions

View File

@@ -72,22 +72,11 @@ pub mod tests {
child child
} }
pub fn systemd_version() -> Option<usize> { pub fn systemd_version() -> Option<String> {
let output = Command::new("systemd").arg("--version").output().ok()?; // Return None if command execution fails let output = Command::new("systemd").arg("--version").output().ok()?; // Return None if command execution fails
if !output.status.success() { if !output.status.success() {
return None; return None;
} }
Some(String::from_utf8_lossy(&output.stdout).to_string())
let stdout = String::from_utf8_lossy(&output.stdout);
// The first line is typically like "systemd 254 (254.5-1-arch)"
let first_line = stdout.lines().next()?;
let mut words = first_line.split_whitespace();
words.next()?; // Skip the "systemd" word
let version_str = words.next()?; // The version number as string
version_str.parse::<usize>().ok()
} }
} }

View File

@@ -91,31 +91,21 @@ impl SystemdManager<'_> {
&self.unit &self.unit
} }
fn set_cpuset( fn set_cpuset(&self, props: &mut Vec<Property>, linux_cpu: &LinuxCpu) -> Result<()> {
&self,
props: &mut Vec<Property>,
linux_cpu: &LinuxCpu,
systemd_version: usize,
) -> Result<()> {
if let Some(cpus) = linux_cpu.cpus().as_ref() { if let Some(cpus) = linux_cpu.cpus().as_ref() {
let (id, value) = cpuset::cpus(cpus, systemd_version)?; let (id, value) = cpuset::cpus(cpus)?;
props.push((id, value.into())); props.push((id, value.into()));
} }
if let Some(mems) = linux_cpu.mems().as_ref() { if let Some(mems) = linux_cpu.mems().as_ref() {
let (id, value) = cpuset::mems(mems, systemd_version)?; let (id, value) = cpuset::mems(mems)?;
props.push((id, value.into())); props.push((id, value.into()));
} }
Ok(()) Ok(())
} }
fn set_cpu( fn set_cpu(&self, props: &mut Vec<Property>, linux_cpu: &LinuxCpu) -> Result<()> {
&self,
props: &mut Vec<Property>,
linux_cpu: &LinuxCpu,
systemd_version: usize,
) -> Result<()> {
if let Some(shares) = linux_cpu.shares() { if let Some(shares) = linux_cpu.shares() {
let shares = if self.v2() { let shares = if self.v2() {
conv::cpu_shares_to_cgroup_v2(shares) conv::cpu_shares_to_cgroup_v2(shares)
@@ -130,7 +120,7 @@ impl SystemdManager<'_> {
let quota = linux_cpu.quota().unwrap_or(0); let quota = linux_cpu.quota().unwrap_or(0);
if period != 0 { if period != 0 {
let (id, value) = cpu::period(period, systemd_version)?; let (id, value) = cpu::period(period)?;
props.push((id, value.into())); props.push((id, value.into()));
} }
@@ -272,11 +262,9 @@ impl Manager for SystemdManager<'_> {
fn set(&mut self, resources: &LinuxResources) -> Result<()> { fn set(&mut self, resources: &LinuxResources) -> Result<()> {
let mut props = vec![]; let mut props = vec![];
let systemd_version = self.systemd_client.systemd_version()?;
if let Some(linux_cpu) = resources.cpu() { if let Some(linux_cpu) = resources.cpu() {
self.set_cpuset(&mut props, linux_cpu, systemd_version)?; self.set_cpuset(&mut props, linux_cpu)?;
self.set_cpu(&mut props, linux_cpu, systemd_version)?; self.set_cpu(&mut props, linux_cpu)?;
} }
if let Some(linux_memory) = resources.memory() { if let Some(linux_memory) = resources.memory() {

View File

@@ -3,10 +3,8 @@
// SPDX-License-Identifier: Apache-2.0 or MIT // SPDX-License-Identifier: Apache-2.0 or MIT
// //
use crate::systemd::error::{Error, Result}; use crate::systemd::error::Result;
use crate::systemd::{ use crate::systemd::{CPU_QUOTA_PERIOD_US, CPU_QUOTA_PER_SEC_US, CPU_SHARES, CPU_WEIGHT};
CPU_QUOTA_PERIOD_US, CPU_QUOTA_PER_SEC_US, CPU_SHARES, CPU_SYSTEMD_VERSION, CPU_WEIGHT,
};
/// Returns the property for CPU shares. /// Returns the property for CPU shares.
/// ///
@@ -21,11 +19,7 @@ pub fn shares(shares: u64, v2: bool) -> Result<(&'static str, u64)> {
} }
/// Returns the property for CPU period. /// Returns the property for CPU period.
pub fn period(period: u64, systemd_version: usize) -> Result<(&'static str, u64)> { pub fn period(period: u64) -> Result<(&'static str, u64)> {
if systemd_version < CPU_SYSTEMD_VERSION {
return Err(Error::ObsoleteSystemd);
}
Ok((CPU_QUOTA_PERIOD_US, period)) Ok((CPU_QUOTA_PERIOD_US, period))
} }

View File

@@ -6,29 +6,19 @@
use bit_vec::BitVec; use bit_vec::BitVec;
use crate::systemd::error::{Error, Result}; use crate::systemd::error::{Error, Result};
use crate::systemd::{ALLOWED_CPUS, ALLOWED_MEMORY_NODES, CPUSET_SYSTEMD_VERSION}; use crate::systemd::{ALLOWED_CPUS, ALLOWED_MEMORY_NODES};
const BYTE_IN_BITS: usize = 8; const BYTE_IN_BITS: usize = 8;
/// Returns the property for cpuset CPUs. /// Returns the property for cpuset CPUs.
pub fn cpus(cpus: &str, systemd_version: usize) -> Result<(&'static str, Vec<u8>)> { pub fn cpus(cpus: &str) -> Result<(&'static str, Vec<u8>)> {
if systemd_version < CPUSET_SYSTEMD_VERSION {
return Err(Error::ObsoleteSystemd);
}
let mask = convert_list_to_mask(cpus)?; let mask = convert_list_to_mask(cpus)?;
Ok((ALLOWED_CPUS, mask)) Ok((ALLOWED_CPUS, mask))
} }
/// Returns the property for cpuset memory nodes. /// Returns the property for cpuset memory nodes.
pub fn mems(mems: &str, systemd_version: usize) -> Result<(&'static str, Vec<u8>)> { pub fn mems(mems: &str) -> Result<(&'static str, Vec<u8>)> {
if systemd_version < CPUSET_SYSTEMD_VERSION {
return Err(Error::ObsoleteSystemd);
}
let mask = convert_list_to_mask(mems)?; let mask = convert_list_to_mask(mems)?;
Ok((ALLOWED_MEMORY_NODES, mask)) Ok((ALLOWED_MEMORY_NODES, mask))
} }

View File

@@ -143,21 +143,6 @@ impl SystemdClient<'_> {
Ok(()) Ok(())
} }
/// Get the systemd version.
pub fn systemd_version(&self) -> Result<usize> {
let sys_proxy = systemd_manager_proxy()?;
// Parse 249 from "249.11-0ubuntu3.16"
let version = sys_proxy.version()?;
let version = version
.split('.')
.next()
.and_then(|v| v.parse::<usize>().ok())
.ok_or(Error::CorruptedSystemdVersion(version))?;
Ok(version)
}
/// Check if the unit exists. /// Check if the unit exists.
pub fn exists(&self) -> bool { pub fn exists(&self) -> bool {
let sys_proxy = match systemd_manager_proxy() { let sys_proxy = match systemd_manager_proxy() {
@@ -216,7 +201,7 @@ pub mod tests {
use crate::systemd::props::PropertiesBuilder; use crate::systemd::props::PropertiesBuilder;
use crate::systemd::utils::expand_slice; use crate::systemd::utils::expand_slice;
use crate::systemd::{DEFAULT_DESCRIPTION, DESCRIPTION, PIDS}; use crate::systemd::{DEFAULT_DESCRIPTION, DESCRIPTION, PIDS};
use crate::tests::{spawn_sleep_inf, spawn_yes, systemd_version}; use crate::tests::{spawn_sleep_inf, spawn_yes};
const TEST_SLICE: &str = "cgroupsrs-test.slice"; const TEST_SLICE: &str = "cgroupsrs-test.slice";
@@ -504,19 +489,6 @@ pub mod tests {
child.wait().unwrap(); child.wait().unwrap();
} }
#[test]
fn test_systemd_version() {
skip_if_no_systemd!();
let unit = test_unit();
let props = PropertiesBuilder::default_cgroup(TEST_SLICE, &unit).build();
let cgroup = SystemdClient::new(&unit, props).unwrap();
let version = cgroup.systemd_version().unwrap();
let expected_version = systemd_version().unwrap();
assert_eq!(version, expected_version, "Systemd version mismatch");
}
#[test] #[test]
fn test_exists() { fn test_exists() {
skip_if_no_systemd!(); skip_if_no_systemd!();

View File

@@ -12,7 +12,4 @@ pub enum Error {
#[error("dbus error: {0}")] #[error("dbus error: {0}")]
Dbus(#[from] zbus::Error), Dbus(#[from] zbus::Error),
#[error("corrupted systemd version: {0}")]
CorruptedSystemdVersion(String),
} }

View File

@@ -10,9 +10,6 @@ pub enum Error {
#[error("invalid argument")] #[error("invalid argument")]
InvalidArgument, InvalidArgument,
#[error("obsolete systemd, please upgrade your systemd")]
ObsoleteSystemd,
#[error("resource not supported by cgroups v1")] #[error("resource not supported by cgroups v1")]
CgroupsV1NotSupported, CgroupsV1NotSupported,
} }

View File

@@ -20,6 +20,3 @@ pub const DEFAULT_SLICE: &str = "system.slice";
pub const SLICE_SUFFIX: &str = ".slice"; pub const SLICE_SUFFIX: &str = ".slice";
pub const SCOPE_SUFFIX: &str = ".scope"; pub const SCOPE_SUFFIX: &str = ".scope";
pub const CPU_SYSTEMD_VERSION: usize = 242;
pub const CPUSET_SYSTEMD_VERSION: usize = 244;