[pbs-devel] [PATCH proxmox-backup 1/2] tools: zfs_dataset_stats: remove dataset <-> obset file mapping on error

Dominik Csapak d.csapak at proxmox.com
Mon Mar 7 09:13:30 CET 2022


this can only real fail for two reasons:
* the format is wrong:
    this should not happen unless the format changed, then it will
    happen every time
* the file can't be read:
    this can happen if a user deletes and recreates a dataset manually,
    since the mapped file does not exist anymore but the dataset does

for the second case, delete the mapping from the hashmap, so that the
next call will refresh the mapping with the correct file

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 src/tools/disks/zfs.rs | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/tools/disks/zfs.rs b/src/tools/disks/zfs.rs
index 9bca0297..a02baa00 100644
--- a/src/tools/disks/zfs.rs
+++ b/src/tools/disks/zfs.rs
@@ -198,6 +198,14 @@ pub fn zfs_dataset_stats(dataset: &str) -> Result<BlockDevStat, Error> {
     }
     let (pool, objset_id) =
         mapping.ok_or_else(|| format_err!("could not find objset id for dataset"))?;
-    let (_, stat) = parse_objset_stat(&pool, &objset_id)?;
-    Ok(stat)
+
+    match parse_objset_stat(&pool, &objset_id) {
+        Ok((_, stat)) => Ok(stat),
+        Err(err) => {
+            // on error remove dataset from map, it probably vanished or the
+            // mapping was incorrect
+            ZFS_DATASET_OBJSET_MAP.lock().unwrap().remove(dataset);
+            Err(err)
+        }
+    }
 }
-- 
2.30.2






More information about the pbs-devel mailing list