Whamcloud - gitweb
LU-9127 target: tgt_cb_last_committed is too noisy
[fs/lustre-release.git] / lustre / target / tgt_lastrcvd.c
index 55e5995..ea70037 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -27,7 +23,7 @@
  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2015, Intel Corporation.
+ * Copyright (c) 2011, 2016, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -464,9 +460,9 @@ int tgt_client_data_read(const struct lu_env *env, struct lu_target *tgt,
                        ptlrpc_status_ntoh(lcd->lcd_last_close_result);
        }
 
-       CDEBUG(D_INFO, "%s: read lcd @%lld uuid = %s, last_transno = "LPU64
-              ", last_xid = "LPU64", last_result = %u, last_data = %u, "
-              "last_close_transno = "LPU64", last_close_xid = "LPU64", "
+       CDEBUG(D_INFO, "%s: read lcd @%lld uuid = %s, last_transno = %llu"
+              ", last_xid = %llu, last_result = %u, last_data = %u, "
+              "last_close_transno = %llu, last_close_xid = %llu, "
               "last_close_result = %u, rc = %d\n", tgt->lut_obd->obd_name,
               *off, lcd->lcd_uuid, lcd->lcd_last_transno, lcd->lcd_last_xid,
               lcd->lcd_last_result, lcd->lcd_last_data,
@@ -517,7 +513,6 @@ static int tgt_client_data_update(const struct lu_env *env,
                RETURN(PTR_ERR(th));
 
        tti_buf_lcd(tti);
-       mutex_lock(&ted->ted_lcd_lock);
        rc = dt_declare_record_write(env, tgt->lut_last_rcvd,
                                     &tti->tti_buf,
                                     ted->ted_lr_off, th);
@@ -527,6 +522,9 @@ static int tgt_client_data_update(const struct lu_env *env,
        rc = dt_trans_start_local(env, tgt->lut_bottom, th);
        if (rc)
                GOTO(out, rc);
+
+       mutex_lock(&ted->ted_lcd_lock);
+
        /*
         * Until this operations will be committed the sync is needed
         * for this export. This should be done _after_ starting the
@@ -545,12 +543,14 @@ static int tgt_client_data_update(const struct lu_env *env,
 
        tti->tti_off = ted->ted_lr_off;
        rc = tgt_client_data_write(env, tgt, ted->ted_lcd, &tti->tti_off, th);
+
+       mutex_unlock(&ted->ted_lcd_lock);
+
        EXIT;
 out:
-       mutex_unlock(&ted->ted_lcd_lock);
        dt_trans_stop(env, tgt->lut_bottom, th);
        CDEBUG(D_INFO, "%s: update last_rcvd client data for UUID = %s, "
-              "last_transno = "LPU64": rc = %d\n", tgt->lut_obd->obd_name,
+              "last_transno = %llu: rc = %d\n", tgt->lut_obd->obd_name,
               tgt->lut_lsd.lsd_uuid, tgt->lut_lsd.lsd_last_transno, rc);
 
        return rc;
@@ -569,7 +569,7 @@ int tgt_server_data_read(const struct lu_env *env, struct lu_target *tgt)
                lsd_le_to_cpu(&tti->tti_lsd, &tgt->lut_lsd);
 
        CDEBUG(D_INFO, "%s: read last_rcvd server data for UUID = %s, "
-              "last_transno = "LPU64": rc = %d\n", tgt->lut_obd->obd_name,
+              "last_transno = %llu: rc = %d\n", tgt->lut_obd->obd_name,
               tgt->lut_lsd.lsd_uuid, tgt->lut_lsd.lsd_last_transno, rc);
         return rc;
 }
@@ -591,7 +591,7 @@ int tgt_server_data_write(const struct lu_env *env, struct lu_target *tgt,
        rc = dt_record_write(env, dto, &tti->tti_buf, &tti->tti_off, th);
 
        CDEBUG(D_INFO, "%s: write last_rcvd server data for UUID = %s, "
-              "last_transno = "LPU64": rc = %d\n", tgt->lut_obd->obd_name,
+              "last_transno = %llu: rc = %d\n", tgt->lut_obd->obd_name,
               tgt->lut_lsd.lsd_uuid, tgt->lut_lsd.lsd_last_transno, rc);
 
        RETURN(rc);
@@ -610,7 +610,7 @@ int tgt_server_data_update(const struct lu_env *env, struct lu_target *tgt,
        ENTRY;
 
        CDEBUG(D_SUPER,
-              "%s: mount_count is "LPU64", last_transno is "LPU64"\n",
+              "%s: mount_count is %llu, last_transno is %llu\n",
               tgt->lut_lsd.lsd_uuid, tgt->lut_obd->u.obt.obt_mount_count,
               tgt->lut_last_transno);
 
@@ -640,7 +640,7 @@ out:
        dt_trans_stop(env, tgt->lut_bottom, th);
 
        CDEBUG(D_INFO, "%s: update last_rcvd server data for UUID = %s, "
-              "last_transno = "LPU64": rc = %d\n", tgt->lut_obd->obd_name,
+              "last_transno = %llu: rc = %d\n", tgt->lut_obd->obd_name,
               tgt->lut_lsd.lsd_uuid, tgt->lut_lsd.lsd_last_transno, rc);
        RETURN(rc);
 }
@@ -781,6 +781,11 @@ static void tgt_cb_last_committed(struct lu_env *env, struct thandle *th,
        LASSERT(ccb->llcc_tgt != NULL);
        LASSERT(ccb->llcc_exp->exp_obd == ccb->llcc_tgt->lut_obd);
 
+       /* error hit, don't update last committed to provide chance to
+        * replay data after fail */
+       if (err != 0)
+               goto out;
+
        /* Fast path w/o spinlock, if exp_last_committed was updated
         * with higher transno, no need to take spinlock and check,
         * also no need to update obd_last_committed. */
@@ -795,18 +800,23 @@ static void tgt_cb_last_committed(struct lu_env *env, struct thandle *th,
                spin_unlock(&ccb->llcc_tgt->lut_translock);
 
                ptlrpc_commit_replies(ccb->llcc_exp);
-               tgt_cancel_slc_locks(ccb->llcc_transno);
+               tgt_cancel_slc_locks(ccb->llcc_tgt, ccb->llcc_transno);
        } else {
                spin_unlock(&ccb->llcc_tgt->lut_translock);
        }
+
+       CDEBUG(D_HA, "%s: transno %lld is committed\n",
+              ccb->llcc_tgt->lut_obd->obd_name, ccb->llcc_transno);
+
 out:
        class_export_cb_put(ccb->llcc_exp);
-       if (ccb->llcc_transno)
-               CDEBUG(D_HA, "%s: transno "LPD64" is committed\n",
-                      ccb->llcc_tgt->lut_obd->obd_name, ccb->llcc_transno);
        OBD_FREE_PTR(ccb);
 }
 
+/**
+ * Add commit callback function, it returns a non-zero value to inform
+ * caller to use sync transaction if necessary.
+ */
 int tgt_last_commit_cb_add(struct thandle *th, struct lu_target *tgt,
                           struct obd_export *exp, __u64 transno)
 {
@@ -837,7 +847,9 @@ int tgt_last_commit_cb_add(struct thandle *th, struct lu_target *tgt,
                /* report failure to force synchronous operation */
                return -EPERM;
 
-       return rc;
+       /* if exp_need_sync is set, return non-zero value to force
+        * a sync transaction. */
+       return rc ? rc : exp->exp_need_sync;
 }
 
 struct tgt_new_client_callback {
@@ -1044,6 +1056,14 @@ int tgt_client_del(const struct lu_env *env, struct obd_export *exp)
            exp_connect_flags(exp) & OBD_CONNECT_LIGHTWEIGHT)
                RETURN(0);
 
+       /* Slot may be not yet assigned, use case is race between Client
+        * reconnect and forced eviction */
+       if (ted->ted_lr_idx < 0) {
+               CWARN("%s: client with UUID '%s' not in bitmap\n",
+                     tgt->lut_obd->obd_name, ted->ted_lcd->lcd_uuid);
+               RETURN(0);
+       }
+
        CDEBUG(D_INFO, "%s: del client at idx %u, off %lld, UUID '%s'\n",
               tgt->lut_obd->obd_name, ted->ted_lr_idx, ted->ted_lr_off,
               ted->ted_lcd->lcd_uuid);
@@ -1060,6 +1080,9 @@ int tgt_client_del(const struct lu_env *env, struct obd_export *exp)
        if (exp->exp_flags & OBD_OPT_FAILOVER)
                RETURN(0);
 
+       if (OBD_FAIL_CHECK(OBD_FAIL_TGT_CLIENT_DEL))
+               RETURN(0);
+
        /* Make sure the server's last_transno is up to date.
         * This should be done before zeroing client slot so last_transno will
         * be in server data or in client data in case of failure */
@@ -1170,7 +1193,7 @@ static int tgt_last_rcvd_update(const struct lu_env *env, struct lu_target *tgt,
        spin_lock(&tgt->lut_translock);
        if (th->th_result != 0) {
                if (tti->tti_transno != 0) {
-                       CERROR("%s: replay transno "LPU64" failed: rc = %d\n",
+                       CERROR("%s: replay transno %llu failed: rc = %d\n",
                               tgt_name(tgt), tti->tti_transno, th->th_result);
                }
        } else if (tti->tti_transno == 0) {
@@ -1189,7 +1212,7 @@ static int tgt_last_rcvd_update(const struct lu_env *env, struct lu_target *tgt,
        }
 
        /* filling reply data */
-       CDEBUG(D_INODE, "transno = "LPU64", last_committed = "LPU64"\n",
+       CDEBUG(D_INODE, "transno = %llu, last_committed = %llu\n",
               tti->tti_transno, tgt->lut_obd->obd_last_committed);
 
        if (req != NULL) {
@@ -1302,7 +1325,7 @@ static int tgt_last_rcvd_update(const struct lu_env *env, struct lu_target *tgt,
                if (*transno_p > tti->tti_transno) {
                        if (!tgt->lut_no_reconstruct) {
                                CERROR("%s: trying to overwrite bigger transno:"
-                                      "on-disk: "LPU64", new: "LPU64" replay: "
+                                      "on-disk: %llu, new: %llu replay: "
                                       "%d. See LU-617.\n", tgt_name(tgt),
                                       *transno_p, tti->tti_transno,
                                       req_is_replay(req));
@@ -1321,7 +1344,11 @@ static int tgt_last_rcvd_update(const struct lu_env *env, struct lu_target *tgt,
 
        if (!lw_client) {
                tti->tti_off = ted->ted_lr_off;
-               rc = tgt_client_data_write(env, tgt, ted->ted_lcd, &tti->tti_off, th);
+               if (CFS_FAIL_CHECK(OBD_FAIL_TGT_RCVD_EIO))
+                       rc = -EIO;
+               else
+                       rc = tgt_client_data_write(env, tgt, ted->ted_lcd,
+                                                  &tti->tti_off, th);
                if (rc < 0) {
                        mutex_unlock(&ted->ted_lcd_lock);
                        RETURN(rc);
@@ -1431,8 +1458,8 @@ static int tgt_clients_data_init(const struct lu_env *env,
                /* These exports are cleaned up by disconnect, so they
                 * need to be set up like real exports as connect does.
                 */
-               CDEBUG(D_HA, "RCVRNG CLIENT uuid: %s idx: %d lr: "LPU64
-                      " srv lr: "LPU64" lx: "LPU64" gen %u\n", lcd->lcd_uuid,
+               CDEBUG(D_HA, "RCVRNG CLIENT uuid: %s idx: %d lr: %llu"
+                      " srv lr: %llu lx: %llu gen %u\n", lcd->lcd_uuid,
                       cl_idx, last_transno, lsd->lsd_last_transno,
                       lcd_last_xid(lcd), lcd->lcd_generation);
 
@@ -1486,7 +1513,7 @@ static int tgt_clients_data_init(const struct lu_env *env,
                }
 
                /* Need to check last_rcvd even for duplicated exports. */
-               CDEBUG(D_OTHER, "client at idx %d has last_transno = "LPU64"\n",
+               CDEBUG(D_OTHER, "client at idx %d has last_transno = %llu\n",
                       cl_idx, last_transno);
 
                spin_lock(&tgt->lut_translock);
@@ -1649,9 +1676,9 @@ int tgt_server_data_init(const struct lu_env *env, struct lu_target *tgt)
        lsd->lsd_mount_count++;
 
        CDEBUG(D_INODE, "=======,=BEGIN DUMPING LAST_RCVD========\n");
-       CDEBUG(D_INODE, "%s: server last_transno: "LPU64"\n",
+       CDEBUG(D_INODE, "%s: server last_transno: %llu\n",
               tgt_name(tgt), tgt->lut_last_transno);
-       CDEBUG(D_INODE, "%s: server mount_count: "LPU64"\n",
+       CDEBUG(D_INODE, "%s: server mount_count: %llu\n",
               tgt_name(tgt), lsd->lsd_mount_count);
        CDEBUG(D_INODE, "%s: server data size: %u\n",
               tgt_name(tgt), lsd->lsd_server_size);
@@ -1732,13 +1759,10 @@ int tgt_txn_start_cb(const struct lu_env *env, struct thandle *th,
                 * because a replay slot has not been assigned.  This should be
                 * replaced by dmu_tx_hold_append() when available.
                 */
-               tti->tti_off = atomic_read(&tgt->lut_num_clients) * 8 *
-                               sizeof(struct lsd_reply_data);
                tti->tti_buf.lb_buf = NULL;
                tti->tti_buf.lb_len = sizeof(struct lsd_reply_data);
                dto = dt_object_locate(tgt->lut_reply_data, th->th_dev);
-               rc = dt_declare_record_write(env, dto, &tti->tti_buf,
-                                            tti->tti_off, th);
+               rc = dt_declare_record_write(env, dto, &tti->tti_buf, -1, th);
                if (rc)
                        return rc;
        } else {
@@ -1783,7 +1807,7 @@ int tgt_txn_stop_cb(const struct lu_env *env, struct thandle *th,
 
        if (tti->tti_has_trans && !echo_client) {
                if (tti->tti_mult_trans == 0) {
-                       CDEBUG(D_HA, "More than one transaction "LPU64"\n",
+                       CDEBUG(D_HA, "More than one transaction %llu\n",
                               tti->tti_transno);
                        RETURN(0);
                }