]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
stray reintegration, purging
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 6 Nov 2007 19:38:40 +0000 (19:38 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 6 Nov 2007 19:38:40 +0000 (19:38 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@2024 29311d96-e01e-0410-9327-a35deaab8ce9

branches/sage/mds/TODO
branches/sage/mds/mds/CInode.h
branches/sage/mds/mds/MDCache.cc
branches/sage/mds/mds/MDCache.h
branches/sage/mds/mds/Server.cc

index 5c670b9694ce13b3b0494882bbe7a5db4e85c9a0..caf03911846fa847444320f61e859aa09156e2d8 100644 (file)
@@ -56,8 +56,8 @@ mdsmon
 
 
 mds bugs
-- stray migration
- - purge on shutdown
+/- stray migration
+/ - purge on shutdown
 - rename slave in-memory rollback on failure
 - fix purge_stray bug
 - try_remove_unlinked_dn thing
index 2677f3d227881e75351bbf535a22214bf1fb5903..7397dec1e39091b453754fbeb03eb00242abdb12 100644 (file)
@@ -82,6 +82,7 @@ class CInode : public MDSCacheObject {
     case PIN_BATCHOPENJOURNAL: return "batchopenjournal";
     case PIN_SCATTERED: return "scattered";
     case PIN_STICKYDIRS: return "stickydirs";
+    case PIN_PURGING: return "purging";
     case PIN_FREEZING: return "freezing";
     case PIN_FROZEN: return "frozen";
     case PIN_IMPORTINGCAPS: return "importingcaps";
index e8c033d8970fb2437c53b28a8fa5f0b2846f4cdc..be8bbb800aa77e54872615ee2460809d35b6a28b 100644 (file)
@@ -2888,6 +2888,10 @@ void MDCache::purge_inode_finish_2(CInode *in, off_t newsize, off_t oldsize)
       waiting_for_purge.erase(in);
     finish_contexts(ls, 0);
   }
+
+  // done with inode?
+  if (in->get_num_ref() == 0) 
+    remove_inode(in);
 }
 
 void MDCache::add_recovered_purge(CInode *in, off_t newsize, off_t oldsize, LogSegment *ls)
@@ -3672,7 +3676,7 @@ bool MDCache::shutdown_export_strays()
       // FIXME: we'll deadlock if a rename fails.
       if (exported_strays.count(dn->get_inode()->ino()) == 0) {
        exported_strays.insert(dn->get_inode()->ino());
-       migrate_stray(dn, 0);  // send to root!
+       migrate_stray(dn, mds->get_nodeid(), 0);  // send to root!
       }
     }
   }
@@ -4745,7 +4749,7 @@ void MDCache::eval_stray(CDentry *dn)
   CInode *in = dn->inode;
   assert(in);
 
-  return;  // FIXME or test me rather, there is a bug here somewhere!
+  if (!dn->is_auth()) return;  // has to be mine
 
   // purge?
   if (in->inode.nlink == 0) {
@@ -4757,19 +4761,33 @@ void MDCache::eval_stray(CDentry *dn)
     // trivial reintegrate?
     if (!in->remote_parents.empty()) {
       CDentry *rlink = *in->remote_parents.begin();
-      if (rlink->is_auth() &&
-         rlink->dir->can_auth_pin())
+      if (rlink->is_auth() && rlink->dir->can_auth_pin())
        reintegrate_stray(dn, rlink);
       
-      if (!rlink->is_auth() &&
-         !in->is_ambiguous_auth()) 
-       migrate_stray(dn, rlink->authority().first);
+      if (!rlink->is_auth() && dn->is_auth())
+       migrate_stray(dn, mds->get_nodeid(), rlink->authority().first);
     }
   } else {
     // wait for next use.
   }
 }
 
+void MDCache::eval_remote(CDentry *dn)
+{
+  dout(10) << "eval_remote " << *dn << dendl;
+  assert(dn->is_remote());
+  CInode *in = dn->get_inode();
+  if (!in) return;
+
+  // refers to stray?
+  if (in->get_parent_dn()->get_dir()->get_inode()->is_stray()) {
+    if (in->is_auth())
+      eval_stray(in->get_parent_dn());
+    else
+      migrate_stray(in->get_parent_dn(), in->authority().first, mds->get_nodeid());
+  }
+}
+
 
 class C_MDC_PurgeStray : public Context {
   MDCache *cache;
@@ -4813,35 +4831,48 @@ void MDCache::_purge_stray_logged(CDentry *dn, version_t pdv, LogSegment *ls)
   dn->dir->remove_dentry(dn);
 
   // purge+remove inode
+  in->mark_clean();
   purge_inode(in, 0, in->inode.size, ls);
-  remove_inode(in);
 }
 
 
 
-void MDCache::reintegrate_stray(CDentry *dn, CDentry *rlink)
+void MDCache::reintegrate_stray(CDentry *straydn, CDentry *rdn)
 {
-  dout(10) << "reintegrate_stray " << *dn << " into " << *rlink << dendl;
+  dout(10) << "reintegrate_stray " << *straydn << " into " << *rdn << dendl;
   
+  // rename it to another mds.
+  filepath src;
+  straydn->make_path(src);
+  filepath dst;
+  rdn->make_path(dst);
+
+  MClientRequest *req = new MClientRequest(MDS_OP_RENAME, mds->messenger->get_myinst());
+  req->set_filepath(src);
+  req->set_filepath2(dst);
+  req->set_tid(mds->issue_tid());
+
+  mds->send_message_mds(req, rdn->authority().first, MDS_PORT_SERVER);
 }
  
 
-void MDCache::migrate_stray(CDentry *dn, int dest)
+void MDCache::migrate_stray(CDentry *dn, int from, int to)
 {
-  dout(10) << "migrate_stray to mds" << dest << " " << *dn << " " << *dn->inode << dendl;
+  dout(10) << "migrate_stray from mds" << from << " to mds" << to 
+          << " " << *dn << " " << *dn->inode << dendl;
 
   // rename it to another mds.
   string dname;
   dn->get_inode()->name_stray_dentry(dname);
-  filepath src(dname, MDS_INO_STRAY(mds->get_nodeid()));
-  filepath dst(dname, MDS_INO_STRAY(dest));
+  filepath src(dname, MDS_INO_STRAY(from));
+  filepath dst(dname, MDS_INO_STRAY(to));
 
   MClientRequest *req = new MClientRequest(MDS_OP_RENAME, mds->messenger->get_myinst());
   req->set_filepath(src);
   req->set_filepath2(dst);
   req->set_tid(mds->issue_tid());
 
-  mds->send_message_mds(req, dest, MDS_PORT_SERVER);
+  mds->send_message_mds(req, to, MDS_PORT_SERVER);
 }
 
 
index 93dd0c9976f49ca7eb2db3154e381797678a2bea..35c324f150686970f5c4e8f29ed27395e431f2c0 100644 (file)
@@ -623,12 +623,13 @@ protected:
   // -- stray --
 public:
   void eval_stray(CDentry *dn);
+  void eval_remote(CDentry *dn);
 protected:
   void _purge_stray(CDentry *dn);
   void _purge_stray_logged(CDentry *dn, version_t pdv, LogSegment *ls);
   friend class C_MDC_PurgeStray;
   void reintegrate_stray(CDentry *dn, CDentry *rlink);
-  void migrate_stray(CDentry *dn, int dest);
+  void migrate_stray(CDentry *dn, int src, int dest);
 
 
   // == messages ==
index fc92ff2f40e83b39761fd6b94e5f614241439c6c..e15d0ecde030b11d85b7971f9536da50ab67005c 100644 (file)
@@ -456,10 +456,9 @@ void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei)
   */
 
   // include trace
-  if (tracei) {
+  if (tracei)
     reply->set_trace_dist( tracei, mds->get_nodeid() );
-  }
-
+  
   reply->set_mdsmap_epoch(mds->mdsmap->get_epoch());
   
   // send reply
@@ -470,6 +469,11 @@ void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei)
   
   // finish request
   mdcache->request_finish(mdr);
+
+  if (tracei && 
+      tracei->get_parent_dn() &&
+      tracei->get_parent_dn()->is_remote())
+    mdcache->eval_remote(tracei->get_parent_dn());
 }