From d8e55c4d9916592c585e14e80dbd818485063718 Mon Sep 17 00:00:00 2001 From: Fan Yong Date: Tue, 11 Feb 2025 13:55:16 +0800 Subject: [PATCH] DAOS-16876 vos: skip DTX record when load partial committed DTX It is used to handle existing partial committed DTX records that were generated when ran as DAOS-2.6.3-rc{1,2} to avoid repeated DTX commit after engine restarted. To be safe, it is required for the user/admin to explicitly set server side environment variable "DAOS_SKIP_OLD_PARTIAL_DTX" when restart the engine that has ever run as DAOS-2.6.3-rc{1,2}. If the user has never used such version, such as directly upgrading from 2.6.1 to 2.6.3-rc3 or newer, then please do NOT set this environment variable. Signed-off-by: Fan Yong --- src/vos/vos_common.c | 8 ++++++++ src/vos/vos_dtx.c | 7 ++++++- src/vos/vos_internal.h | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/vos/vos_common.c b/src/vos/vos_common.c index 4713971d65c..948b3a2f6d0 100644 --- a/src/vos/vos_common.c +++ b/src/vos/vos_common.c @@ -716,6 +716,14 @@ vos_mod_init(void) d_getenv_bool("DAOS_DKEY_PUNCH_PROPAGATE", &vos_dkey_punch_propagate); D_INFO("DKEY punch propagation is %s\n", vos_dkey_punch_propagate ? "enabled" : "disabled"); + /* + * NOTE: It is used to skip old partial committed DTX records that were generated when + * ran as DAOS-2.6.3-rc{1,2}. If the user has never used such version, please do + * NOT set this environment variable. + */ + d_getenv_bool("DAOS_SKIP_OLD_PARTIAL_DTX", &vos_skip_old_partial_dtx); + D_INFO("%s old partial committed DTX record\n", vos_skip_old_partial_dtx ? "Skip" : "Keep"); + vos_agg_gap = VOS_AGG_GAP_DEF; d_getenv_uint("DAOS_VOS_AGG_GAP", &vos_agg_gap); if (vos_agg_gap < VOS_AGG_GAP_MIN || vos_agg_gap > VOS_AGG_GAP_MAX) { diff --git a/src/vos/vos_dtx.c b/src/vos/vos_dtx.c index e0a6f9c1c89..2127db776c9 100644 --- a/src/vos/vos_dtx.c +++ b/src/vos/vos_dtx.c @@ -41,6 +41,8 @@ DAE_EPOCH(dae)); \ } while (0) +bool vos_skip_old_partial_dtx; + static inline uint32_t dtx_umoff_flag2type(umem_off_t umoff) { @@ -706,7 +708,7 @@ dtx_rec_release(struct vos_container *cont, struct vos_dtx_act_ent *dae, bool ab * If it is required to keep the active DTX entry, then it must be for partial * commit. Let's mark it as DTE_PARTIAL_COMMITTED. */ - if ((DAE_FLAGS(dae) & DTE_PARTIAL_COMMITTED)) + if (DAE_FLAGS(dae) & DTE_PARTIAL_COMMITTED) return 0; rc = umem_tx_add_ptr(umm, &dae_df->dae_flags, sizeof(dae_df->dae_flags)); @@ -3235,6 +3237,9 @@ vos_dtx_act_reindex(struct vos_container *cont) dae->dae_need_release = 1; D_INIT_LIST_HEAD(&dae->dae_link); + if (vos_skip_old_partial_dtx && DAE_FLAGS(dae) & DTE_PARTIAL_COMMITTED) + DAE_REC_CNT(dae) = 0; + if (DAE_REC_CNT(dae) > DTX_INLINE_REC_CNT) { size_t size; int count; diff --git a/src/vos/vos_internal.h b/src/vos/vos_internal.h index a64e4f19dd1..b5ada253806 100644 --- a/src/vos/vos_internal.h +++ b/src/vos/vos_internal.h @@ -149,6 +149,7 @@ extern uint32_t vos_agg_gap; extern unsigned int vos_agg_nvme_thresh; extern bool vos_dkey_punch_propagate; +extern bool vos_skip_old_partial_dtx; static inline uint32_t vos_byte2blkcnt(uint64_t bytes) {