Whamcloud - gitweb
LU-7655 tests: ost fake write for performance testing
[fs/lustre-release.git] / lustre / ofd / ofd_io.c
index 14f8e13..777a332 100644 (file)
@@ -23,7 +23,7 @@
  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2012, 2014 Intel Corporation.
+ * Copyright (c) 2012, 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -172,7 +172,7 @@ static int ofd_inconsistency_verification_main(void *args)
 
        OBD_ALLOC_PTR(lr);
        if (unlikely(lr == NULL))
-               GOTO(out, rc = -ENOMEM);
+               GOTO(out_unlocked, rc = -ENOMEM);
 
        lr->lr_event = LE_PAIRS_VERIFY;
        lr->lr_active = LFSCK_TYPE_LAYOUT;
@@ -223,6 +223,8 @@ static int ofd_inconsistency_verification_main(void *args)
 
        GOTO(out, rc = 0);
 
+out_unlocked:
+       spin_lock(&ofd->ofd_inconsistency_lock);
 out:
        thread_set_flags(thread, SVC_STOPPED);
        wake_up_all(&thread->t_ctl_waitq);
@@ -629,10 +631,6 @@ static int ofd_preprw_write(const struct lu_env *env, struct obd_export *exp,
                        lnb[j+k].lnb_flags = rnb[i].rnb_flags;
                        if (!(rnb[i].rnb_flags & OBD_BRW_GRANTED))
                                lnb[j+k].lnb_rc = -ENOSPC;
-
-                       /* remote client can't break through quota */
-                       if (exp_connect_rmtclient(exp))
-                               lnb[j+k].lnb_flags &= ~OBD_BRW_NOQUOTA;
                }
                j += rc;
                *nr_local += rc;
@@ -652,7 +650,7 @@ err:
        ofd_read_unlock(env, fo);
        ofd_object_put(env, fo);
        /* ofd_grant_prepare_write() was called, so we must commit */
-       ofd_grant_commit(env, exp, rc);
+       ofd_grant_commit(exp, oa->o_grant_used, rc);
 out:
        /* let's still process incoming grant information packed in the oa,
         * but without enforcing grant since we won't proceed with the write.
@@ -676,7 +674,6 @@ out:
  * \param[in] rnb      remote buffers
  * \param[in] nr_local number of local buffers
  * \param[in] lnb      local buffers
- * \param[in] oti      request data from OST
  *
  * \retval             0 on successful prepare
  * \retval             negative value on error
@@ -684,7 +681,7 @@ out:
 int ofd_preprw(const struct lu_env *env, int cmd, struct obd_export *exp,
               struct obdo *oa, int objcount, struct obd_ioobj *obj,
               struct niobuf_remote *rnb, int *nr_local,
-              struct niobuf_local *lnb, struct obd_trans_info *oti)
+              struct niobuf_local *lnb)
 {
        struct tgt_session_info *tsi = tgt_ses_info(env);
        struct ofd_device       *ofd = ofd_exp(exp);
@@ -701,9 +698,7 @@ int ofd_preprw(const struct lu_env *env, int cmd, struct obd_export *exp,
        }
 
        if (tgt_ses_req(tsi) == NULL) { /* echo client case */
-               LASSERT(oti != NULL);
                info = ofd_info_init(env, exp);
-               ofd_oti2info(info, oti);
                jobid = NULL;
        } else {
                info = tsi2ofd_info(tsi);
@@ -712,7 +707,7 @@ int ofd_preprw(const struct lu_env *env, int cmd, struct obd_export *exp,
 
        LASSERT(oa != NULL);
 
-       if (OBD_FAIL_CHECK(OBD_FAIL_OST_ENOENT)) {
+       if (OBD_FAIL_CHECK(OBD_FAIL_SRV_ENOENT)) {
                struct ofd_seq          *oseq;
 
                oseq = ofd_seq_load(env, ofd, ostid_seq(&oa->o_oi));
@@ -1000,6 +995,7 @@ static int ofd_soft_sync_cb_add(struct thandle *th, struct obd_export *exp)
  * \param[in] objcount always 1
  * \param[in] niocount number of local buffers
  * \param[in] lnb      local buffers
+ * \param[in] granted  grant space consumed for the bulk I/O
  * \param[in] old_rc   result of processing at this point
  *
  * \retval             0 on successful commit
@@ -1009,18 +1005,19 @@ static int
 ofd_commitrw_write(const struct lu_env *env, struct obd_export *exp,
                   struct ofd_device *ofd, const struct lu_fid *fid,
                   struct lu_attr *la, struct filter_fid *ff, int objcount,
-                  int niocount, struct niobuf_local *lnb, int old_rc)
+                  int niocount, struct niobuf_local *lnb,
+                  unsigned long granted, int old_rc)
 {
-       struct ofd_thread_info  *info = ofd_info(env);
-       struct ofd_object       *fo;
-       struct dt_object        *o;
-       struct thandle          *th;
-       int                      rc = 0;
-       int                      retries = 0;
-       int                      i;
        struct filter_export_data *fed = &exp->exp_filter_data;
-       bool                     soft_sync = false;
-       bool                     cb_registered = false;
+       struct ofd_object *fo;
+       struct dt_object *o;
+       struct thandle *th;
+       int rc = 0;
+       int retries = 0;
+       int i;
+       bool soft_sync = false;
+       bool cb_registered = false;
+       bool fake_write = false;
 
        ENTRY;
 
@@ -1048,6 +1045,28 @@ ofd_commitrw_write(const struct lu_env *env, struct obd_export *exp,
 
        la->la_valid &= LA_ATIME | LA_MTIME | LA_CTIME;
 
+       /* do fake write, to simulate the write case for performance testing */
+       if (OBD_FAIL_CHECK(OBD_FAIL_OST_FAKE_WRITE)) {
+               struct niobuf_local *last = &lnb[niocount - 1];
+               __u64 file_size = last->lnb_file_offset + last->lnb_len;
+               __u64 valid = la->la_valid;
+
+               la->la_valid = LA_SIZE;
+               la->la_size = 0;
+               rc = dt_attr_get(env, o, la);
+               if (rc < 0 && rc != -ENOENT)
+                       GOTO(out, rc);
+
+               if (file_size < la->la_size)
+                       file_size = la->la_size;
+
+               /* dirty inode by setting file size */
+               la->la_valid = valid | LA_SIZE;
+               la->la_size = file_size;
+
+               fake_write = true;
+       }
+
 retry:
        th = ofd_trans_create(env, ofd);
        if (IS_ERR(th))
@@ -1068,9 +1087,11 @@ retry:
        if (OBD_FAIL_CHECK(OBD_FAIL_OST_DQACQ_NET))
                GOTO(out_stop, rc = -EINPROGRESS);
 
-       rc = dt_declare_write_commit(env, o, lnb, niocount, th);
-       if (rc)
-               GOTO(out_stop, rc);
+       if (likely(!fake_write)) {
+               rc = dt_declare_write_commit(env, o, lnb, niocount, th);
+               if (rc)
+                       GOTO(out_stop, rc);
+       }
 
        if (la->la_valid) {
                /* update [mac]time if needed */
@@ -1083,9 +1104,11 @@ retry:
        if (rc)
                GOTO(out_stop, rc);
 
-       rc = dt_write_commit(env, o, lnb, niocount, th);
-       if (rc)
-               GOTO(out_stop, rc);
+       if (likely(!fake_write)) {
+               rc = dt_write_commit(env, o, lnb, niocount, th);
+               if (rc)
+                       GOTO(out_stop, rc);
+       }
 
        if (la->la_valid) {
                rc = dt_attr_set(env, o, la, th);
@@ -1108,6 +1131,11 @@ out_stop:
                cb_registered = true;
        }
 
+       if (rc == 0 && granted > 0) {
+               if (ofd_grant_commit_cb_add(th, exp, granted) == 0)
+                       granted = 0;
+       }
+
        ofd_trans_stop(env, ofd, th, rc);
        if (rc == -ENOSPC && retries++ < 3) {
                CDEBUG(D_INODE, "retry after force commit, retries:%d\n",
@@ -1128,7 +1156,8 @@ out:
        ofd_object_put(env, fo);
        /* second put is pair to object_get in ofd_preprw_write */
        ofd_object_put(env, fo);
-       ofd_grant_commit(env, info->fti_exp, old_rc);
+       if (granted > 0)
+               ofd_grant_commit(exp, granted, old_rc);
        RETURN(rc);
 }
 
@@ -1149,7 +1178,6 @@ out:
  * \param[in] rnb      remote buffers
  * \param[in] npages   number of local buffers
  * \param[in] lnb      local buffers
- * \param[in] oti      request data from OST
  * \param[in] old_rc   result of processing at this point
  *
  * \retval             0 on successful commit
@@ -1158,8 +1186,7 @@ out:
 int ofd_commitrw(const struct lu_env *env, int cmd, struct obd_export *exp,
                 struct obdo *oa, int objcount, struct obd_ioobj *obj,
                 struct niobuf_remote *rnb, int npages,
-                struct niobuf_local *lnb, struct obd_trans_info *oti,
-                int old_rc)
+                struct niobuf_local *lnb, int old_rc)
 {
        struct ofd_thread_info  *info = ofd_info(env);
        struct ofd_mod_data     *fmd;
@@ -1193,7 +1220,8 @@ int ofd_commitrw(const struct lu_env *env, int cmd, struct obd_export *exp,
                }
 
                rc = ofd_commitrw_write(env, exp, ofd, fid, &info->fti_attr,
-                                       ff, objcount, npages, lnb, old_rc);
+                                       ff, objcount, npages, lnb,
+                                       oa->o_grant_used, old_rc);
                if (rc == 0)
                        obdo_from_la(oa, &info->fti_attr,
                                     OFD_VALID_FLAGS | LA_GID | LA_UID);
@@ -1247,7 +1275,5 @@ int ofd_commitrw(const struct lu_env *env, int cmd, struct obd_export *exp,
                rc = -EPROTO;
        }
 
-       if (oti != NULL)
-               ofd_info2oti(info, oti);
        RETURN(rc);
 }