]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fixed stray reintegration (rename should not change nlink, dir mtime)
authorSage Weil <sage@newdream.net>
Mon, 26 May 2008 22:40:13 +0000 (15:40 -0700)
committerSage Weil <sage@newdream.net>
Mon, 26 May 2008 22:40:13 +0000 (15:40 -0700)
src/client/SyntheticClient.cc
src/mds/CInode.cc
src/mds/Server.cc
src/vstartnew.sh

index 93c10bab3836ee92fc95df509595ef65c3976f34..fe3b374191c7f112b5eef15d1c03475fdfacf69e 100644 (file)
@@ -2836,7 +2836,7 @@ int SyntheticClient::thrash_links(const char *basedir, int dirs, int files, int
 
   if (time_to_stop()) return 0;
 
-  if (0) {
+  if (1) {
     for (int k=0; k<n; k++) {
       
       if (rand() % 10 == 0) {
index c40caa36f56222ad70bb3412fb750bdea4ffb506..8c03ec00a544414f00eeb9f55e528995d1ae154c 100644 (file)
@@ -70,6 +70,8 @@ ostream& operator<<(ostream& out, CInode& in)
   if (in.is_freezing_inode()) out << " FREEZING=" << in.auth_pin_freeze_allowance;
   if (in.is_frozen_inode()) out << " FROZEN";
 
+  out << " nl=" << in.inode.nlink;
+
   out << " s=" << in.inode.size;
   out << " rb=" << in.inode.dirstat.rbytes << "/" << in.inode.accounted_dirstat.rbytes;
   out << " rf=" << in.inode.dirstat.rfiles << "/" << in.inode.accounted_dirstat.rfiles;
index 854756ecec299670ae6376a5878ee1009e008df7..005f4362b68a97e769aeab74c311c114ac10ea0b 100644 (file)
@@ -3357,6 +3357,10 @@ void Server::_rename_prepare(MDRequest *mdr,
   // primary+remote link merge?
   bool linkmerge = (srcdn->inode == destdn->inode &&
                    (srcdn->is_primary() || destdn->is_primary()));
+  bool silent = srcdn->dir->inode->is_stray();
+
+  if (silent)
+    dout(10) << "reintegrating stray; will avoid changing nlink or dir mtime" << dendl;
 
   // prepare
   inode_t *pi = 0, *ji = 0;    // renamed inode
@@ -3446,19 +3450,22 @@ void Server::_rename_prepare(MDRequest *mdr,
       mdr->more()->pvmap[srcdn] = srcdn->pre_dirty();
   }
 
-  if (pi) {
-    pi->ctime = mdr->now;
-  }
-  if (tpi) {
-    tpi->nlink--;
-    tpi->ctime = mdr->now;
+  if (!silent) {
+    if (pi) {
+      pi->ctime = mdr->now;
+    }
+    if (tpi) {
+      tpi->nlink--;
+      tpi->ctime = mdr->now;
+    }
   }
 
   // prepare nesting, mtime updates
   if (mdr->is_master()) {
     // sub off target
+    int predirty_dir = silent ? 0:PREDIRTY_DIR;
     if (!linkmerge && destdn->is_primary())
-      mds->locker->predirty_nested(mdr, metablob, destdn->inode, destdn->dir, PREDIRTY_PRIMARY|PREDIRTY_DIR, -1);
+      mds->locker->predirty_nested(mdr, metablob, destdn->inode, destdn->dir, PREDIRTY_PRIMARY|predirty_dir, -1);
     if (destdn->dir == srcdn->dir) {
       // same dir.  don't update nested info or adjust counts.
       mds->locker->predirty_nested(mdr, metablob, srcdn->inode, srcdn->dir,
@@ -3466,7 +3473,7 @@ void Server::_rename_prepare(MDRequest *mdr,
     } else {
       // different dir.  update nested accounting.
       int flags = srcdn->is_primary() ? PREDIRTY_PRIMARY:0;
-      flags |= PREDIRTY_DIR;
+      flags |= predirty_dir;
       if (srcdn->is_auth())
        mds->locker->predirty_nested(mdr, metablob, srcdn->inode, srcdn->dir, flags, -1);
       mds->locker->predirty_nested(mdr, metablob, srcdn->inode, destdn->dir, flags, 1);
@@ -3511,12 +3518,14 @@ void Server::_rename_prepare(MDRequest *mdr,
   }
 
   // do inode updates in journal, even if we aren't auth (hmm, is this necessary?)
-  if (ji && !pi) {
-    ji->ctime = mdr->now;
-  }
-  if (tji && !tpi) {
-    tji->nlink--;
-    tji->ctime = mdr->now;
+  if (!silent) {
+    if (ji && !pi) {
+      ji->ctime = mdr->now;
+    }
+    if (tji && !tpi) {
+      tji->nlink--;
+      tji->ctime = mdr->now;
+    }
   }
 
   // anchor updates?
index 208625094d2adac7a514e4a31081a7263870ca25..d766cb601c60b00d500d0ecc52836fe1096361a7 100755 (executable)
@@ -49,7 +49,7 @@ done
 
 # mds
 $CEPH_BIN/cmds $ARGS --debug_ms 1 --debug_mds 20 --mds_thrash_fragments 0 --mds_thrash_exports 1 #--debug_ms 20
-$CEPH_BIN/cmds $ARGS --debug_ms 1 --debug_mds 20 --mds_thrash_fragments 0 --mds_thrash_exports 1 #--debug_ms 20
+#$CEPH_BIN/cmds $ARGS --debug_ms 1 --debug_mds 20 --mds_thrash_fragments 0 --mds_thrash_exports 1 #--debug_ms 20
 ./cmonctl mds set_max_mds 2
 
 echo "started.  stop.sh to stop.  see out/* (e.g. 'tail -f out/????') for debug output."