[pve-devel] [PATCH installer v3 2/2] assistant: avoid regex for simple prefix matching
Christoph Heiss
c.heiss at proxmox.com
Thu Nov 14 15:15:28 CET 2024
udev properties are very easy to parse and can be done by doing a
line-based scan and matching the prefix, splitting once for properties.
Avoids the use of regexes and signicantly reduces binary size by about
-46%(!).
Tested by comparing the output of `proxmox-auto-install-assistant
device-info`, running it before and after the changes.
Stripped binary size for release builds:
before: 3869304 bytes ~ 3.69MiB
after: 2091608 bytes ~ 1.99MiB
text data bss dec hex filename
3580692 280920 545 3862157 3aee8d assistant-before
2031252 52336 505 2084093 1fccfd assistant-after
No functional changes.
Reviewed-By: Aaron Lauterer <a.lauterer at proxmox.com>
Tested-By: Aaron Lauterer <a.lauterer at proxmox.com>
Signed-off-by: Christoph Heiss <c.heiss at proxmox.com>
---
Changes v1 -> v2:
* rebased on latest master
Changes v2 -> v3:
* rebased on latest master
proxmox-auto-install-assistant/src/main.rs | 57 +++++++++-------------
1 file changed, 24 insertions(+), 33 deletions(-)
diff --git a/proxmox-auto-install-assistant/src/main.rs b/proxmox-auto-install-assistant/src/main.rs
index da1ebda..bdcf067 100644
--- a/proxmox-auto-install-assistant/src/main.rs
+++ b/proxmox-auto-install-assistant/src/main.rs
@@ -1,7 +1,6 @@
use anyhow::{bail, format_err, Result};
use clap::{Args, Parser, Subcommand, ValueEnum};
use glob::Pattern;
-use regex::Regex;
use serde::Serialize;
use std::{
collections::BTreeMap,
@@ -454,13 +453,9 @@ fn get_disks() -> Result<BTreeMap<String, BTreeMap<String, String>>> {
Pattern::new("sr[0-9]*")?,
];
- // compile Regex here once and not inside the loop
- let re_disk = Regex::new(r"(?m)^E: DEVTYPE=disk")?;
- let re_cdrom = Regex::new(r"(?m)^E: ID_CDROM")?;
- let re_iso9660 = Regex::new(r"(?m)^E: ID_FS_TYPE=iso9660")?;
-
- let re_name = Regex::new(r"(?m)^N: (.*)$")?;
- let re_props = Regex::new(r"(?m)^E: ([^=]+)=(.*)$")?;
+ const PROP_DEVTYP_PREFIX: &str = "E: DEVTYPE=";
+ const PROP_CDROM: &str = "E: ID_CDROM";
+ const PROP_ISO9660_FS: &str = "E: ID_FS_TYPE=iso9660";
let mut disks: BTreeMap<String, BTreeMap<String, String>> = BTreeMap::new();
@@ -482,30 +477,27 @@ fn get_disks() -> Result<BTreeMap<String, BTreeMap<String, String>>> {
}
};
- if !re_disk.is_match(&output) {
- continue 'outer;
- };
- if re_cdrom.is_match(&output) {
- continue 'outer;
- };
- if re_iso9660.is_match(&output) {
- continue 'outer;
- };
-
let mut name = filename;
- if let Some(cap) = re_name.captures(&output) {
- if let Some(res) = cap.get(1) {
- name = String::from(res.as_str());
+ let mut udev_props: BTreeMap<String, String> = BTreeMap::new();
+ for line in output.lines() {
+ if let Some(prop) = line.strip_prefix(PROP_DEVTYP_PREFIX) {
+ if prop != "disk" {
+ continue 'outer;
+ }
}
- }
- let mut udev_props: BTreeMap<String, String> = BTreeMap::new();
+ if line.starts_with(PROP_CDROM) || line.starts_with(PROP_ISO9660_FS) {
+ continue 'outer;
+ }
- for line in output.lines() {
- if let Some(caps) = re_props.captures(line) {
- let key = String::from(caps.get(1).unwrap().as_str());
- let value = String::from(caps.get(2).unwrap().as_str());
- udev_props.insert(key, value);
+ if let Some(prop) = line.strip_prefix("N: ") {
+ name = prop.to_owned();
+ };
+
+ if let Some(prop) = line.strip_prefix("E: ") {
+ if let Some((key, val)) = prop.split_once('=') {
+ udev_props.insert(key.to_owned(), val.to_owned());
+ }
}
}
@@ -515,7 +507,6 @@ fn get_disks() -> Result<BTreeMap<String, BTreeMap<String, String>>> {
}
fn get_nics() -> Result<BTreeMap<String, BTreeMap<String, String>>> {
- let re_props = Regex::new(r"(?m)^E: (.*)=(.*)$")?;
let mut nics: BTreeMap<String, BTreeMap<String, String>> = BTreeMap::new();
let links = get_nic_list()?;
@@ -533,10 +524,10 @@ fn get_nics() -> Result<BTreeMap<String, BTreeMap<String, String>>> {
let mut udev_props: BTreeMap<String, String> = BTreeMap::new();
for line in output.lines() {
- if let Some(caps) = re_props.captures(line) {
- let key = String::from(caps.get(1).unwrap().as_str());
- let value = String::from(caps.get(2).unwrap().as_str());
- udev_props.insert(key, value);
+ if let Some(prop) = line.strip_prefix("E: ") {
+ if let Some((key, val)) = prop.split_once('=') {
+ udev_props.insert(key.to_owned(), val.to_owned());
+ }
}
}
--
2.47.0
More information about the pve-devel
mailing list