Whamcloud - gitweb
LU-184 Keep orphan on failover umount
authorNiu Yawei <niu@whamcloud.com>
Thu, 14 Apr 2011 02:50:37 +0000 (19:50 -0700)
committerOleg Drokin <green@whamcloud.com>
Mon, 18 Apr 2011 17:28:02 +0000 (10:28 -0700)
- On failover umount, the orphan should not be cleared on last close.
- In mdt_mfd_close(), the ma_valid should not be set as zero, otherwise,
  mds will never issue object destroy to OSS.

Issue:
Signed-off-by: Niu Yawei <niu@whamcloud.com>
Change-Id: If0a894655d0ea42ad0d07e725174b73a137b7adb
Reviewed-on: http://review.whamcloud.com/426
Tested-by: Hudson
Reviewed-by: Mikhail Pershin <tappro@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/lustre/lustre_idl.h
lustre/mdd/mdd_object.c
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_open.c

index cfbcbe0..c707ede 100644 (file)
@@ -1861,7 +1861,8 @@ enum {
         MDS_PERM_BYPASS   = 1 << 3,
         MDS_SOM           = 1 << 4,
         MDS_QUOTA_IGNORE  = 1 << 5,
-        MDS_CLOSE_CLEANUP = 1 << 6
+        MDS_CLOSE_CLEANUP = 1 << 6,
+        MDS_KEEP_ORPHAN   = 1 << 7
 };
 
 /* instance of mdt_reint_rec */
index 17089c7..b0e3911 100644 (file)
@@ -2077,6 +2077,15 @@ static int mdd_close(const struct lu_env *env, struct md_object *obj,
 #endif
         ENTRY;
 
+        if (ma->ma_valid & MA_FLAGS && ma->ma_attr_flags & MDS_KEEP_ORPHAN) {
+                mdd_obj->mod_count--;
+
+                if (mdd_obj->mod_flags & ORPHAN_OBJ && !mdd_obj->mod_count)
+                        CDEBUG(D_HA, "Object "DFID" is retained in orphan "
+                               "list\n", PFID(mdd_object_fid(mdd_obj)));
+                RETURN(0);
+        }
+
         /* check without any lock */
         if (mdd_obj->mod_count == 1 &&
             (mdd_obj->mod_flags & (ORPHAN_OBJ | DEAD_OBJ)) != 0) {
@@ -2090,8 +2099,7 @@ static int mdd_close(const struct lu_env *env, struct md_object *obj,
         }
 
         mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
-        if (handle == NULL &&
-            mdd_obj->mod_count == 1 &&
+        if (handle == NULL && mdd_obj->mod_count == 1 &&
             (mdd_obj->mod_flags & ORPHAN_OBJ) != 0) {
                 mdd_write_unlock(env, mdd_obj);
                 goto again;
@@ -2135,8 +2143,8 @@ static int mdd_close(const struct lu_env *env, struct md_object *obj,
                         rc = mdd_lov_destroy(env, mdd, mdd_obj, &ma->ma_attr);
                 } else {
                         rc = mdd_object_kill(env, mdd_obj, ma);
-                                if (rc == 0)
-                                        reset = 0;
+                        if (rc == 0)
+                                reset = 0;
                 }
 
                 if (rc != 0)
index c111721..6bc3935 100644 (file)
@@ -5139,8 +5139,11 @@ static int mdt_export_cleanup(struct obd_export *exp)
                         ma->ma_need = 0;
                         /* It is not for setattr, just tell MDD to send
                          * DESTROY RPC to OSS if needed */
-                        ma->ma_attr_flags = MDS_CLOSE_CLEANUP;
                         ma->ma_valid = MA_FLAGS;
+                        ma->ma_attr_flags = MDS_CLOSE_CLEANUP;
+                        /* Don't unlink orphan on failover umount, LU-184 */
+                        if (exp->exp_flags & OBD_OPT_FAILOVER)
+                                ma->ma_attr_flags |= MDS_KEEP_ORPHAN;
                         mdt_mfd_close(info, mfd);
                 }
                 OBD_FREE_LARGE(ma->ma_cookie, cookie_size);
@@ -5153,7 +5156,7 @@ out_lmm:
         info->mti_mdt = NULL;
         /* cleanup client slot early */
         /* Do not erase record for recoverable client. */
-        if (!obd->obd_fail || exp->exp_failed)
+        if (!(exp->exp_flags & OBD_OPT_FAILOVER) || exp->exp_failed)
                 mdt_client_del(&env, mdt);
         lu_env_fini(&env);
 
index 98155cd..2b39c60 100644 (file)
@@ -1477,7 +1477,7 @@ int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd)
         }
 
         ma->ma_need |= MA_INODE;
-        ma->ma_valid = 0;
+        ma->ma_valid &= ~MA_INODE;
 
         if (!MFD_CLOSED(mode))
                 rc = mo_close(info->mti_env, next, ma);