From e70a6fd8a6400c0460a6c66668103c23b7997d30 Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Thu, 13 Sep 2018 21:07:08 +0300 Subject: [PATCH] LU-11375 mdc: use old statfs format when the client talks to old server with no support for aggregated statfs Test-Parameters: clientjob=lustre-b2_10 clientbuildno=136 testgroup=review-ldiskfs Change-Id: I447b312d46db56da152f62835b3f98401f997cf0 Signed-off-by: Alex Zhuravlev Reviewed-on: https://review.whamcloud.com/33162 Tested-by: Jenkins Tested-by: Maloo Tested-by: James Nunez Reviewed-by: Andreas Dilger Reviewed-by: James Simmons Tested-by: James Simmons --- lustre/include/lustre_req_layout.h | 1 + lustre/mdc/mdc_request.c | 31 +++++++++------- lustre/mdt/mdt_handler.c | 7 +++- lustre/ptlrpc/layout.c | 76 ++++++++++++++++++++------------------ lustre/tests/sanity.sh | 19 +++++++++- 5 files changed, 84 insertions(+), 50 deletions(-) diff --git a/lustre/include/lustre_req_layout.h b/lustre/include/lustre_req_layout.h index 6a2c154..8895f42 100644 --- a/lustre/include/lustre_req_layout.h +++ b/lustre/include/lustre_req_layout.h @@ -145,6 +145,7 @@ extern struct req_format RQF_FLD_READ; extern struct req_format RQF_MDS_CONNECT; extern struct req_format RQF_MDS_DISCONNECT; extern struct req_format RQF_MDS_STATFS; +extern struct req_format RQF_MDS_STATFS_NEW; extern struct req_format RQF_MDS_GET_ROOT; extern struct req_format RQF_MDS_SYNC; extern struct req_format RQF_MDS_GETXATTR; diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c index 3de6d18..bd723d4 100644 --- a/lustre/mdc/mdc_request.c +++ b/lustre/mdc/mdc_request.c @@ -1486,26 +1486,31 @@ static int mdc_statfs(const struct lu_env *env, struct obd_export *exp, struct obd_statfs *osfs, time64_t max_age, __u32 flags) { - struct obd_device *obd = class_exp2obd(exp); - struct ptlrpc_request *req; - struct obd_statfs *msfs; - struct obd_import *imp = NULL; - int rc; - ENTRY; + struct obd_device *obd = class_exp2obd(exp); + struct req_format *fmt; + struct ptlrpc_request *req; + struct obd_statfs *msfs; + struct obd_import *imp = NULL; + int rc; + ENTRY; /* * Since the request might also come from lprocfs, so we need * sync this with client_disconnect_export Bug15684 */ down_read(&obd->u.cli.cl_sem); - if (obd->u.cli.cl_import) - imp = class_import_get(obd->u.cli.cl_import); + if (obd->u.cli.cl_import) + imp = class_import_get(obd->u.cli.cl_import); up_read(&obd->u.cli.cl_sem); - if (!imp) - RETURN(-ENODEV); - - req = ptlrpc_request_alloc_pack(imp, &RQF_MDS_STATFS, - LUSTRE_MDS_VERSION, MDS_STATFS); + if (!imp) + RETURN(-ENODEV); + + fmt = &RQF_MDS_STATFS; + if ((exp_connect_flags2(exp) & OBD_CONNECT2_SUM_STATFS) && + (flags & OBD_STATFS_SUM)) + fmt = &RQF_MDS_STATFS_NEW; + req = ptlrpc_request_alloc_pack(imp, fmt, LUSTRE_MDS_VERSION, + MDS_STATFS); if (req == NULL) GOTO(output, rc = -ENOMEM); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index ace6f1f..5bf3306 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -436,8 +436,13 @@ static int mdt_statfs(struct tgt_session_info *tsi) if (!osfs) GOTO(out, rc = -EPROTO); - if (mdt_is_sum_statfs_client(req->rq_export)) + if (mdt_is_sum_statfs_client(req->rq_export) && + lustre_packed_msg_size(req->rq_reqmsg) == + req_capsule_fmt_size(req->rq_reqmsg->lm_magic, + &RQF_MDS_STATFS_NEW, RCL_CLIENT)) { + req_capsule_extend(info->mti_pill, &RQF_MDS_STATFS_NEW); reqbody = req_capsule_client_get(info->mti_pill, &RMF_MDT_BODY); + } if (reqbody && reqbody->mbo_valid & OBD_MD_FLAGSTATFS) msf = &mdt->mdt_sum_osfs; diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index 9edfd18..5d33739 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -719,23 +719,24 @@ static const struct req_msg_field *obd_lfsck_reply[] = { }; static struct req_format *req_formats[] = { - &RQF_OBD_PING, - &RQF_OBD_SET_INFO, + &RQF_OBD_PING, + &RQF_OBD_SET_INFO, &RQF_OBD_IDX_READ, - &RQF_SEC_CTX, - &RQF_MGS_TARGET_REG, + &RQF_SEC_CTX, + &RQF_MGS_TARGET_REG, #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 13, 53, 0) - &RQF_MGS_SET_INFO, + &RQF_MGS_SET_INFO, #endif - &RQF_MGS_CONFIG_READ, - &RQF_SEQ_QUERY, - &RQF_FLD_QUERY, + &RQF_MGS_CONFIG_READ, + &RQF_SEQ_QUERY, + &RQF_FLD_QUERY, &RQF_FLD_READ, - &RQF_MDS_CONNECT, - &RQF_MDS_DISCONNECT, - &RQF_MDS_GET_INFO, + &RQF_MDS_CONNECT, + &RQF_MDS_DISCONNECT, + &RQF_MDS_GET_INFO, &RQF_MDS_GET_ROOT, &RQF_MDS_STATFS, + &RQF_MDS_STATFS_NEW, &RQF_MDS_GETATTR, &RQF_MDS_GETATTR_NAME, &RQF_MDS_GETXATTR, @@ -766,21 +767,21 @@ static struct req_format *req_formats[] = { &RQF_MDS_HSM_REQUEST, &RQF_MDS_SWAP_LAYOUTS, &RQF_OUT_UPDATE, - &RQF_OST_CONNECT, - &RQF_OST_DISCONNECT, - &RQF_OST_QUOTACTL, - &RQF_OST_GETATTR, - &RQF_OST_SETATTR, - &RQF_OST_CREATE, - &RQF_OST_PUNCH, - &RQF_OST_SYNC, - &RQF_OST_DESTROY, - &RQF_OST_BRW_READ, - &RQF_OST_BRW_WRITE, - &RQF_OST_STATFS, - &RQF_OST_SET_GRANT_INFO, + &RQF_OST_CONNECT, + &RQF_OST_DISCONNECT, + &RQF_OST_QUOTACTL, + &RQF_OST_GETATTR, + &RQF_OST_SETATTR, + &RQF_OST_CREATE, + &RQF_OST_PUNCH, + &RQF_OST_SYNC, + &RQF_OST_DESTROY, + &RQF_OST_BRW_READ, + &RQF_OST_BRW_WRITE, + &RQF_OST_STATFS, + &RQF_OST_SET_GRANT_INFO, &RQF_OST_GET_INFO, - &RQF_OST_GET_INFO_LAST_ID, + &RQF_OST_GET_INFO_LAST_ID, &RQF_OST_GET_INFO_LAST_FID, &RQF_OST_SET_INFO_LAST_FID, &RQF_OST_GET_INFO_FIEMAP, @@ -803,10 +804,10 @@ static struct req_format *req_formats[] = { &RQF_LDLM_INTENT_GETXATTR, &RQF_LDLM_INTENT_QUOTA, &RQF_QUOTA_DQACQ, - &RQF_LLOG_ORIGIN_HANDLE_CREATE, - &RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK, - &RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK, - &RQF_LLOG_ORIGIN_HANDLE_READ_HEADER, + &RQF_LLOG_ORIGIN_HANDLE_CREATE, + &RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK, + &RQF_LLOG_ORIGIN_HANDLE_PREV_BLOCK, + &RQF_LLOG_ORIGIN_HANDLE_READ_HEADER, &RQF_CONNECT, &RQF_LFSCK_NOTIFY, &RQF_LFSCK_QUERY, @@ -1361,9 +1362,13 @@ struct req_format RQF_MDS_GET_ROOT = EXPORT_SYMBOL(RQF_MDS_GET_ROOT); struct req_format RQF_MDS_STATFS = - DEFINE_REQ_FMT0("MDS_STATFS", mdt_body_only, obd_statfs_server); + DEFINE_REQ_FMT0("MDS_STATFS", empty, obd_statfs_server); EXPORT_SYMBOL(RQF_MDS_STATFS); +struct req_format RQF_MDS_STATFS_NEW = + DEFINE_REQ_FMT0("MDS_STATFS_NEW", mdt_body_only, obd_statfs_server); +EXPORT_SYMBOL(RQF_MDS_STATFS_NEW); + struct req_format RQF_MDS_SYNC = DEFINE_REQ_FMT0("MDS_SYNC", mdt_body_capa, mdt_body_only); EXPORT_SYMBOL(RQF_MDS_SYNC); @@ -2320,12 +2325,13 @@ __u32 req_capsule_fmt_size(__u32 magic, const struct req_format *fmt, if (size == 0) return size; - for (; i < fmt->rf_fields[loc].nr; ++i) - if (fmt->rf_fields[loc].d[i]->rmf_size != -1) - size += cfs_size_round(fmt->rf_fields[loc].d[i]-> - rmf_size); - return size; + for (; i < fmt->rf_fields[loc].nr; ++i) + if (fmt->rf_fields[loc].d[i]->rmf_size != -1) + size += cfs_size_round(fmt->rf_fields[loc].d[i]-> + rmf_size); + return size; } +EXPORT_SYMBOL(req_capsule_fmt_size); /** * Changes the format of an RPC. diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 948adca..a74c2ea 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -10680,7 +10680,6 @@ check_stats() { ;; *) error "Wrong facet '$facet'" ;; esac - echo $res [ "$res" ] || error "The counter for $op on $facet was not incremented" # if the argument $3 is zero, it means any stat increment is ok. if [[ $want -gt 0 ]]; then @@ -10739,6 +10738,8 @@ test_133a() { run_test 133a "Verifying MDT stats ========================================" test_133b() { + local res + [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_ost_nodsh && skip "remote OST with nodsh" remote_mds_nodsh && skip "remote MDS with nodsh" @@ -10771,9 +10772,25 @@ test_133b() { # Sleep to avoid a cached response. #define OBD_STATFS_CACHE_SECONDS 1 sleep 2 + do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear + do_facet ost1 $LCTL set_param obdfilter.*.stats=clear $LFS df || error "lfs failed" check_stats $SINGLEMDS "statfs" 1 + # check aggregated statfs (LU-10018) + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.54) ] && + return 0 + [ $(lustre_version_code client) -lt $(version_code 2.11.54) ] && + return 0 + sleep 2 + do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear + do_facet ost1 $LCTL set_param obdfilter.*.stats=clear + df $DIR + check_stats $SINGLEMDS "statfs" 1 + res=$(do_facet ost1 \ + $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "statfs") + [ "$res" ] && error "OST got STATFS" + return 0 } run_test 133b "Verifying extra MDT stats ==================================" -- 1.8.3.1