Fix SnapRAID parity association using directory-based discovery
All checks were successful
Build and Release / build-and-release (push) Successful in 1m8s
All checks were successful
Build and Release / build-and-release (push) Successful in 1m8s
- Replace blanket parity drive inclusion with smart relationship detection - Only associate parity drives from same parent directory as data drives - Prevent incorrect exclusion of nvme0n1 physical drives from grouping - Maintain zero-configuration auto-discovery without hardcoded paths
This commit is contained in:
@@ -218,9 +218,9 @@ impl DiskCollector {
|
||||
raw_paths
|
||||
};
|
||||
|
||||
// For SnapRAID setups, also include parity drives as part of the pool
|
||||
let snapraid_parity_paths = self.discover_snapraid_parity_drives()?;
|
||||
member_paths.extend(snapraid_parity_paths);
|
||||
// For SnapRAID setups, include parity drives that are related to this pool's data drives
|
||||
let related_parity_paths = self.discover_related_parity_drives(&member_paths)?;
|
||||
member_paths.extend(related_parity_paths);
|
||||
|
||||
// Categorize as data vs parity drives
|
||||
let (data_drives, parity_drives) = match self.categorize_pool_drives(&member_paths) {
|
||||
@@ -244,14 +244,36 @@ impl DiskCollector {
|
||||
Ok(pools)
|
||||
}
|
||||
|
||||
/// Discover SnapRAID parity drives
|
||||
fn discover_snapraid_parity_drives(&self) -> Result<Vec<String>> {
|
||||
/// Discover parity drives that are related to the given data drives
|
||||
fn discover_related_parity_drives(&self, data_drives: &[String]) -> Result<Vec<String>> {
|
||||
let mount_devices = self.get_mount_devices()?;
|
||||
let parity_paths: Vec<String> = mount_devices.keys()
|
||||
.filter(|path| path.contains("parity"))
|
||||
.cloned()
|
||||
.collect();
|
||||
Ok(parity_paths)
|
||||
let mut related_parity = Vec::new();
|
||||
|
||||
// Find parity drives that share the same parent directory as the data drives
|
||||
for data_path in data_drives {
|
||||
if let Some(parent_dir) = self.get_parent_directory(data_path) {
|
||||
// Look for parity drives in the same parent directory
|
||||
for (mount_point, _device) in &mount_devices {
|
||||
if mount_point.contains("parity") && mount_point.starts_with(&parent_dir) {
|
||||
if !related_parity.contains(mount_point) {
|
||||
related_parity.push(mount_point.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(related_parity)
|
||||
}
|
||||
|
||||
/// Get parent directory of a mount path (e.g., "/mnt/disk1" -> "/mnt")
|
||||
fn get_parent_directory(&self, path: &str) -> Option<String> {
|
||||
if let Some(last_slash) = path.rfind('/') {
|
||||
if last_slash > 0 {
|
||||
return Some(path[..last_slash].to_string());
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
/// Categorize pool member drives as data vs parity
|
||||
|
||||
Reference in New Issue
Block a user