From 63166614cc5d1eede4b58ce50a965c87a96ad4c6 Mon Sep 17 00:00:00 2001 From: Niu Yawei Date: Tue, 12 May 2026 03:22:17 -0400 Subject: [PATCH 1/4] DAOS-18866 vos: unconditional punch fix Return DER_NONEXIST error when object doesn't exist for unconditional puch case. This patch also fixed vos_obj_incarnate() to return DER_NONEXIST error when CREATE flag isn't present. Signed-off-by: Niu Yawei --- src/vos/vos_obj.c | 10 ++++++++++ src/vos/vos_obj_cache.c | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/vos/vos_obj.c b/src/vos/vos_obj.c index bdc45b071ef..4d376d79551 100644 --- a/src/vos/vos_obj.c +++ b/src/vos/vos_obj.c @@ -494,6 +494,16 @@ vos_obj_punch(daos_handle_t coh, daos_unit_oid_t oid, daos_epoch_t epoch, if (rc != 0) goto reset; + if (!(hold_flags & VOS_OBJ_CREATE) && (obj->obj_df == NULL)) { + rc = vos_ilog_ts_add(ts_set, NULL, &oid, sizeof(oid)); + D_ASSERT(rc == 0); + + rc = -DER_NONEXIST; + vos_obj_release(obj, 0, true); + obj = NULL; + goto reset; + } + rc = vos_tx_begin(dth, vos_cont2umm(cont), cont->vc_pool->vp_sysdb, obj); if (rc != 0) goto reset; diff --git a/src/vos/vos_obj_cache.c b/src/vos/vos_obj_cache.c index 002fb2e4ca9..8e4da564f66 100644 --- a/src/vos/vos_obj_cache.c +++ b/src/vos/vos_obj_cache.c @@ -545,6 +545,8 @@ vos_obj_incarnate(struct vos_object *obj, daos_epoch_range_t *epr, daos_epoch_t if (rc == 0) { obj->obj_sync_epoch = obj->obj_df->vo_sync; } else if (rc == -DER_NONEXIST) { + if (!(flags & VOS_OBJ_CREATE)) + return -DER_NONEXIST; rc = vos_oi_alloc(cont, obj->obj_id, epr->epr_hi, &obj->obj_df, ts_set); if (rc) { DL_ERROR(rc, DF_CONT ": Failed to allocate OI " DF_UOID ".", From 64ecc2998d0e4d7403d1a3d7cb76befa9796a1a0 Mon Sep 17 00:00:00 2001 From: Niu Yawei Date: Sun, 17 May 2026 23:58:02 -0400 Subject: [PATCH 2/4] DAOS-18866 vos: debug Add assertions for debugging. Cancel-prev-build: false Test-tag: test_ior_hard Skip-func-test-hw-large: false Skip-func-test-hw-large-md-on-ssd: true Allow-unstable-test: true Signed-off-by: Niu Yawei --- src/vos/vos_obj_cache.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vos/vos_obj_cache.c b/src/vos/vos_obj_cache.c index 8e4da564f66..96b201dbb8c 100644 --- a/src/vos/vos_obj_cache.c +++ b/src/vos/vos_obj_cache.c @@ -561,6 +561,14 @@ vos_obj_incarnate(struct vos_object *obj, daos_epoch_range_t *epr, daos_epoch_t return rc; } } else if (likely(intent != DAOS_INTENT_MARK)) { + struct vos_obj_df *tmp_df = NULL; + + /* XXX debug */ + rc = vos_oi_find(cont, obj->obj_id, &tmp_df, NULL); + D_ASSERT(rc == 0); + D_ASSERT(tmp_df != NULL); + D_ASSERT(tmp_df == obj->obj_df); + vos_ilog_ts_ignore(vos_obj2umm(obj), &obj->obj_df->vo_ilog); rc = vos_ilog_ts_add(ts_set, &obj->obj_df->vo_ilog, &obj->obj_id, sizeof(obj->obj_id)); From 7c56e15927452c54d466e78fcf8bd7476d39453c Mon Sep 17 00:00:00 2001 From: Niu Yawei Date: Mon, 18 May 2026 03:51:08 -0400 Subject: [PATCH 3/4] DAOS-18866 vos: reduce tx restart for pmem mode Reduce tx restart for pmem mode. Test-tag: test_ior_hard Skip-func-test-hw-large: false Skip-func-test-hw-large-md-on-ssd: true Allow-unstable-test: true Signed-off-by: Niu Yawei --- src/vos/vos_io.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/vos/vos_io.c b/src/vos/vos_io.c index e2bcad16dc3..fcdf80438b5 100644 --- a/src/vos/vos_io.c +++ b/src/vos/vos_io.c @@ -2568,7 +2568,11 @@ vos_update_end(daos_handle_t ioh, uint32_t pm_ver, daos_key_t *dkey, int err, goto abort; D_ASSERT(ioc->ic_obj != NULL); - if (unlikely(vos_obj_is_evicted(ioc->ic_obj))) { + if (ioc->ic_obj == NULL) { + err = vos_obj_acquire(ioc->ic_cont, ioc->ic_oid, true, &ioc->ic_obj); + if (err != 0) + goto abort; + } else if (unlikely(vos_obj_is_evicted(ioc->ic_obj))) { D_DEBUG(DB_IO, "Obj " DF_UOID " is evicted during update, need to restart TX.\n", DP_UOID(ioc->ic_oid)); @@ -2755,9 +2759,12 @@ vos_update_begin(daos_handle_t coh, daos_unit_oid_t oid, daos_epoch_t epoch, goto error; } - rc = vos_obj_acquire(ioc->ic_cont, ioc->ic_oid, true, &ioc->ic_obj); - if (rc != 0) - goto error; + /* Hold the object for the evictable md-on-ssd phase2 pool */ + if (vos_pool_is_evictable(vos_cont2pool(ioc->ic_cont))) { + rc = vos_obj_acquire(ioc->ic_cont, ioc->ic_oid, true, &ioc->ic_obj); + if (rc != 0) + goto error; + } rc = dkey_update_begin(ioc); if (rc != 0) { From 387c30eeecd29f14766d6075fddba0ac4343654a Mon Sep 17 00:00:00 2001 From: Niu Yawei Date: Mon, 18 May 2026 06:10:54 -0400 Subject: [PATCH 4/4] DAOS-18866 vos: fix Test-tag: test_ior_hard Skip-func-test-hw-large: false Skip-func-test-hw-large-md-on-ssd: true Allow-unstable-test: true Signed-off-by: Niu Yawei --- src/vos/vos_io.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vos/vos_io.c b/src/vos/vos_io.c index fcdf80438b5..93f698c80d7 100644 --- a/src/vos/vos_io.c +++ b/src/vos/vos_io.c @@ -2567,7 +2567,6 @@ vos_update_end(daos_handle_t ioh, uint32_t pm_ver, daos_key_t *dkey, int err, if (err != 0) goto abort; - D_ASSERT(ioc->ic_obj != NULL); if (ioc->ic_obj == NULL) { err = vos_obj_acquire(ioc->ic_cont, ioc->ic_oid, true, &ioc->ic_obj); if (err != 0)