From: Lai Siyao Date: Sat, 6 Jun 2020 20:00:00 +0000 (+0800) Subject: LU-13408 target: update in-memory per client data X-Git-Tag: 2.13.55~135 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=300858ccfcd00b52663de45e0bb472012242f342 LU-13408 target: update in-memory per client data Some clients don't support recovery: 1. lightweight clients. 2. local clients on MDS which doesn't support "local_recovery". 3. OFD connect may cause transaction before export has valid last_rcvd slot. Though such clients don't store per client data on disk, they still need to update in memory per client data to allow reply reconstruct and track saved LDLM locks (both local and remote) be tracked by transaction number. Signed-off-by: Lai Siyao Change-Id: Id0082358e7720e5ef61f366682ae91282bd66d6d Reviewed-on: https://review.whamcloud.com/38855 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Alex Zhuravlev Reviewed-by: Oleg Drokin --- diff --git a/lustre/target/tgt_lastrcvd.c b/lustre/target/tgt_lastrcvd.c index aac5a6f..061f088 100644 --- a/lustre/target/tgt_lastrcvd.c +++ b/lustre/target/tgt_lastrcvd.c @@ -1343,11 +1343,11 @@ static int tgt_last_rcvd_update(const struct lu_env *env, struct lu_target *tgt, { struct tgt_thread_info *tti = tgt_th_info(env); struct tgt_session_info *tsi = tgt_ses_info(env); - struct obd_export *exp = tsi->tsi_exp; - struct tg_export_data *ted; - __u64 *transno_p; - int rc = 0; - bool lw_client; + struct obd_export *exp = tsi->tsi_exp; + struct tg_export_data *ted; + __u64 *transno_p; + bool nolcd = false; + int rc = 0; ENTRY; @@ -1355,11 +1355,15 @@ static int tgt_last_rcvd_update(const struct lu_env *env, struct lu_target *tgt, LASSERT(exp != NULL); ted = &exp->exp_target_data; - lw_client = exp_connect_flags(exp) & OBD_CONNECT_LIGHTWEIGHT; - if (ted->ted_lr_idx < 0 && !lw_client) - /* ofd connect may cause transaction before export has - * last_rcvd slot */ - RETURN(0); + /* Some clients don't support recovery, and they don't have last_rcvd + * client data: + * 1. lightweight clients. + * 2. local clients on MDS which doesn't enable "localrecov". + * 3. OFD connect may cause transaction before export has last_rcvd + * slot. + */ + if (ted->ted_lr_idx < 0) + nolcd = true; if (req != NULL) tti->tti_transno = lustre_msg_get_transno(req->rq_reqmsg); @@ -1400,14 +1404,13 @@ static int tgt_last_rcvd_update(const struct lu_env *env, struct lu_target *tgt, /* if can't add callback, do sync write */ th->th_sync |= !!tgt_last_commit_cb_add(th, tgt, exp, tti->tti_transno); - if (lw_client) { - /* All operations performed by LW clients are synchronous and - * we store the committed transno in the last_rcvd header */ + if (nolcd) { + /* store transno in the last_rcvd header */ spin_lock(&tgt->lut_translock); if (tti->tti_transno > tgt->lut_lsd.lsd_last_transno) { tgt->lut_lsd.lsd_last_transno = tti->tti_transno; spin_unlock(&tgt->lut_translock); - /* Although lightweight (LW) connections have no slot + /* Although current connection doesn't have slot * in the last_rcvd, we still want to maintain * the in-memory lsd_client_data structure in order to * properly handle reply reconstruction. */ @@ -1480,7 +1483,7 @@ static int tgt_last_rcvd_update(const struct lu_env *env, struct lu_target *tgt, } } - if (!lw_client) { + if (!nolcd) { tti->tti_off = ted->ted_lr_off; if (CFS_FAIL_CHECK(OBD_FAIL_TGT_RCVD_EIO)) rc = -EIO;