From f21bd53ee01d27abe001d3cdddc96171b3199096 Mon Sep 17 00:00:00 2001 From: sundengyu Date: Mon, 23 Dec 2024 18:19:29 +0800 Subject: [PATCH] feat(zap): zap list will take a limit Signed-off-by: sundengyu --- src/bindings/async_sys.rs | 6 ++++++ src/dataset.rs | 4 +++- src/tests/dataset_tests.rs | 2 +- zfs | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/bindings/async_sys.rs b/src/bindings/async_sys.rs index 5c4e24a..170bc1e 100644 --- a/src/bindings/async_sys.rs +++ b/src/bindings/async_sys.rs @@ -282,6 +282,8 @@ pub unsafe extern "C" fn libuzfs_dataset_expand_c(arg: *mut c_void) { pub struct LibuzfsZapListArg { pub dhp: *mut libuzfs_dataset_handle_t, pub obj: u64, + pub limit: usize, + pub err: i32, pub list: Vec<(String, Vec)>, } @@ -328,6 +330,10 @@ pub unsafe extern "C" fn libuzfs_zap_list_c(arg: *mut c_void) { let name = String::from_utf8(name).unwrap(); arg.list.push((name, value)); + if arg.list.len() >= arg.limit { + break; + } + arg.err = libuzfs_zap_iterator_advance(iter); if arg.err != 0 { if arg.err == libc::ENOENT { diff --git a/src/dataset.rs b/src/dataset.rs index 4fcc169..3e1a1a2 100644 --- a/src/dataset.rs +++ b/src/dataset.rs @@ -365,10 +365,12 @@ impl Dataset { self.claim_inode(ino, gen, InodeType::DIR).await } - pub async fn zap_list(&self, zap_obj: u64) -> Result)>> { + pub async fn zap_list(&self, zap_obj: u64, limit: usize) -> Result)>> { let mut arg = LibuzfsZapListArg { dhp: self.dhp, obj: zap_obj, + limit, + err: 0, list: Vec::new(), }; diff --git a/src/tests/dataset_tests.rs b/src/tests/dataset_tests.rs index 5e83041..9f0992a 100644 --- a/src/tests/dataset_tests.rs +++ b/src/tests/dataset_tests.rs @@ -496,7 +496,7 @@ async fn uzfs_zap_iterator_test() { let remover_handle = tokio::task::spawn(async move { let mut total_ops = num_adders * num_ops_per_adder; while total_ops > 0 { - for (key, value) in ds_remover.zap_list(zap_obj).await.unwrap() { + for (key, value) in ds_remover.zap_list(zap_obj, usize::MAX).await.unwrap() { ds_remover.zap_remove(zap_obj, &key).await.unwrap(); assert_eq!(key.as_bytes(), value.as_slice()); total_ops -= 1; diff --git a/zfs b/zfs index f6391b7..2ebda18 160000 --- a/zfs +++ b/zfs @@ -1 +1 @@ -Subproject commit f6391b78f669c91dd25f6dc0da984d044d3d0b47 +Subproject commit 2ebda185181dc918414bc19e0667e835cec09473