]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
half of inode->last_journaled business
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Fri, 27 Jul 2007 19:27:39 +0000 (19:27 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Fri, 27 Jul 2007 19:27:39 +0000 (19:27 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1561 29311d96-e01e-0410-9327-a35deaab8ce9

branches/sage/mds/mds/CInode.h
branches/sage/mds/mds/Locker.cc
branches/sage/mds/mds/MDCache.cc
branches/sage/mds/mds/Migrator.cc
branches/sage/mds/mds/Server.cc
branches/sage/mds/mds/events/EExport.h
branches/sage/mds/mds/events/EMetaBlob.h

index 76e0326fbc255e0765b3387094dfcd10dba3f5b4..45a6d417bfad9bcf43202419af921705c7e4f98b 100644 (file)
@@ -120,7 +120,8 @@ class CInode : public MDSCacheObject {
   fragtree_t       dirfragtree;  // dir frag tree, if any.  always consistent with our dirfrag map.
   //map<frag_t,int>  dirfrag_size; // size of each dirfrag
 
-  off_t            last_open_journaled;  // log offset for the last journaled EOpen
+  off_t last_journaled;       // log offset for the last time i was journaled
+  off_t last_open_journaled;  // log offset for the last journaled EOpen
 
   // projected values (only defined while dirty)
   list<inode_t*>    projected_inode;
@@ -201,7 +202,7 @@ protected:
   // ---------------------------
   CInode(MDCache *c, bool auth=true) : 
     mdcache(c),
-    last_open_journaled(0),
+    last_journaled(0), last_open_journaled(0), 
     stickydir_ref(0),
     parent(0), force_auth(CDIR_AUTH_DEFAULT),
     replica_caps_wanted(0),
index 56c3938a1020bd00cefaef4a1f744d853db743db..d0c5c7f1374561cc7ede80faed5007ce027b5180 100644 (file)
@@ -1535,7 +1535,8 @@ void Locker::scatter_writebehind(ScatterLock *lock)
   pi->version = in->pre_dirty();
   
   EUpdate *le = new EUpdate("scatter writebehind");
-  le->metablob.add_dir_context(in->get_parent_dn()->get_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), 
+                              in->get_parent_dn()->get_dir());
   le->metablob.add_primary_dentry(in->get_parent_dn(), true, 0, pi);
   
   mds->mdlog->submit_entry(le);
index 40936be58ff3f02c8be605c95d92a4379c70b4cf..be6f0ef04db125afaa5cd4b5e22ba63599f57f40 100644 (file)
@@ -523,7 +523,8 @@ void MDCache::try_subtree_merge_at(CDir *dir)
       pi->version = in->pre_dirty();
       
       EUpdate *le = new EUpdate("subtree merge writebehind");
-      le->metablob.add_dir_context(in->get_parent_dn()->get_dir());
+      le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), 
+                                  in->get_parent_dn()->get_dir());
       le->metablob.add_primary_dentry(in->get_parent_dn(), true, 0, pi);
       
       mds->mdlog->submit_entry(le);
@@ -989,7 +990,8 @@ void MDCache::log_subtree_map(Context *onsync)
 
     dout(15) << " subtree " << *dir << endl;
     le->subtrees[dir->dirfrag()].clear();
-    le->metablob.add_dir_context(dir, EMetaBlob::TO_ROOT);
+    le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), 
+                                dir, EMetaBlob::TO_ROOT);
     le->metablob.add_dir(dir, false);
 
     // bounds
@@ -999,7 +1001,8 @@ void MDCache::log_subtree_map(Context *onsync)
       CDir *bound = *q;
       dout(15) << " subtree bound " << *bound << endl;
       le->subtrees[dir->dirfrag()].push_back(bound->dirfrag());
-      le->metablob.add_dir_context(bound, EMetaBlob::TO_ROOT);
+      le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), 
+                                  bound, EMetaBlob::TO_ROOT);
       le->metablob.add_dir(bound, false);
     }
   }
@@ -4543,7 +4546,8 @@ void MDCache::_anchor_create_prepared(CInode *in, version_t atid)
   version_t pdv = in->pre_dirty();
 
   EUpdate *le = new EUpdate("anchor_create");
-  le->metablob.add_dir_context(in->get_parent_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), 
+                              in->get_parent_dir());
 
   // update the logged inode copy
   inode_t *pi = le->metablob.add_dentry(in->parent, true);
@@ -4650,7 +4654,8 @@ void MDCache::_anchor_destroy_prepared(CInode *in, version_t atid)
   version_t pdv = in->pre_dirty();
 
   EUpdate *le = new EUpdate("anchor_destroy");
-  le->metablob.add_dir_context(in->get_parent_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), 
+                              in->get_parent_dir());
 
   // update the logged inode copy
   inode_t *pi = le->metablob.add_dentry(in->parent, true);
@@ -4741,7 +4746,7 @@ void MDCache::_purge_stray(CDentry *dn)
   version_t pdv = dn->pre_dirty();
 
   EUpdate *le = new EUpdate("purge_stray");
-  le->metablob.add_dir_context(dn->dir);
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->dir);
   le->metablob.add_null_dentry(dn, true);
   le->metablob.add_inode_truncate(dn->inode->inode, 0);
   mds->mdlog->submit_entry(le, new C_MDC_PurgeStray(this, dn, pdv));
@@ -5720,7 +5725,7 @@ void MDCache::fragment_go(CInode *diri, list<CDir*>& startfrags, frag_t basefrag
 
     // first time only, 
     if (p == resultfrags.begin()) {
-      le->metablob.add_dir_context(dir);
+      le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dir);
       
       // note peers
       // only do this once: all frags have identical replica_maps.
index 7150c46a4ff532bd363054e3fba36489677074a8..51ae31702122a51cee6502e0df69ef49841e7d1d 100644 (file)
@@ -977,13 +977,14 @@ void Migrator::handle_export_ack(MExportDirAck *m)
 
   // log completion
   EExport *le = new EExport(dir);
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dir);
   le->metablob.add_dir( dir, false );
   for (set<CDir*>::iterator p = bounds.begin();
        p != bounds.end();
        ++p) {
     CDir *bound = *p;
     le->get_bounds().insert(bound->dirfrag());
-    le->metablob.add_dir_context(bound);
+    le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), bound);
     le->metablob.add_dir(bound, false);
   }
 
@@ -1506,7 +1507,7 @@ void Migrator::handle_export_dir(MExportDir *m)
 
   // start the journal entry
   EImportStart *le = new EImportStart(dir->dirfrag(), m->get_bounds());
-  le->metablob.add_dir_context(dir);
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dir);
   
   // adjust auth (list us _first_)
   cache->adjust_subtree_auth(dir, mds->get_nodeid(), oldauth);
index 3392fbd0d8eee4ad3be0648e4a21269a414ef8dd..56a7ee69405cf836808f96748105ef69281f324f 100644 (file)
@@ -1226,7 +1226,8 @@ version_t Server::predirty_dn_diri(MDRequest *mdr, CDentry *dn, EMetaBlob *blob)
     inode_t *pi = diri->project_inode();
     if (dirpv) pi->version = dirpv;
     pi->ctime = pi->mtime = mdr->now;
-    blob->add_dir_context(diri->get_parent_dir());
+    blob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+                         diri->get_parent_dir());
     blob->add_primary_dentry(diri->get_parent_dn(), true, 0, pi);
   } else {
     // journal the mtime change anyway.
@@ -1361,7 +1362,8 @@ void Server::handle_client_utime(MDRequest *mdr)
   // log + wait
   EUpdate *le = new EUpdate("utime");
   le->metablob.add_client_req(req->get_reqid());
-  le->metablob.add_dir_context(cur->get_parent_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+                              cur->get_parent_dir());
   le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
   
   mdlog->submit_entry(le);
@@ -1396,7 +1398,8 @@ void Server::handle_client_chmod(MDRequest *mdr)
   // log + wait
   EUpdate *le = new EUpdate("chmod");
   le->metablob.add_client_req(req->get_reqid());
-  le->metablob.add_dir_context(cur->get_parent_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+                              cur->get_parent_dir());
   le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
 
   mdlog->submit_entry(le);
@@ -1432,7 +1435,8 @@ void Server::handle_client_chown(MDRequest *mdr)
   // log + wait
   EUpdate *le = new EUpdate("chown");
   le->metablob.add_client_req(req->get_reqid());
-  le->metablob.add_dir_context(cur->get_parent_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+                              cur->get_parent_dir());
   le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
   
   mdlog->submit_entry(le);
@@ -1604,7 +1608,7 @@ void Server::handle_client_mknod(MDRequest *mdr)
   le->metablob.add_client_req(req->get_reqid());
   le->metablob.add_allocated_ino(newi->ino(), mds->idalloc->get_version());
   version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);  // dir mtime too
-  le->metablob.add_dir_context(dn->dir);
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->dir);
   le->metablob.add_primary_dentry(dn, true, newi, &newi->inode);
   
   // log + wait
@@ -1645,7 +1649,7 @@ void Server::handle_client_mkdir(MDRequest *mdr)
   le->metablob.add_client_req(req->get_reqid());
   le->metablob.add_allocated_ino(newi->ino(), mds->idalloc->get_version());
   version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);  // dir mtime too
-  le->metablob.add_dir_context(dn->dir);
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->dir);
   le->metablob.add_primary_dentry(dn, true, newi, &newi->inode);
   le->metablob.add_dir(newdir, true, true); // dirty AND complete
   
@@ -1694,7 +1698,7 @@ void Server::handle_client_symlink(MDRequest *mdr)
   le->metablob.add_client_req(req->get_reqid());
   le->metablob.add_allocated_ino(newi->ino(), mds->idalloc->get_version());
   version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);  // dir mtime too
-  le->metablob.add_dir_context(dn->dir);
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->dir);
   le->metablob.add_primary_dentry(dn, true, newi, &newi->inode);
   
   // log + wait
@@ -1841,9 +1845,9 @@ void Server::_link_local(MDRequest *mdr, CDentry *dn, CInode *targeti)
   EUpdate *le = new EUpdate("link_local");
   le->metablob.add_client_req(mdr->reqid);
   version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);   // dir inode's mtime
-  le->metablob.add_dir_context(dn->get_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->get_dir());
   le->metablob.add_remote_dentry(dn, true, targeti->ino());  // new remote
-  le->metablob.add_dir_context(targeti->get_parent_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), targeti->get_parent_dir());
   le->metablob.add_primary_dentry(targeti->parent, true, targeti, pi);  // update old primary
 
   mdlog->submit_entry(le);
@@ -1922,7 +1926,7 @@ void Server::_link_remote(MDRequest *mdr, CDentry *dn, CInode *targeti)
   EUpdate *le = new EUpdate("link_remote");
   le->metablob.add_client_req(mdr->reqid);
   version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);   // dir inode's mtime
-  le->metablob.add_dir_context(dn->get_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->get_dir());
   le->metablob.add_remote_dentry(dn, true, targeti->ino());  // new remote
 
   // mark committing (needed for proper recovery)
@@ -2018,7 +2022,7 @@ void Server::handle_slave_link_prep(MDRequest *mdr)
 
   // journal it
   ESlaveUpdate *le = new ESlaveUpdate("slave_link_prep", mdr->reqid, mdr->slave_to_mds, ESlaveUpdate::OP_PREPARE);
-  le->metablob.add_dir_context(targeti->get_parent_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), targeti->get_parent_dir());
   le->metablob.add_primary_dentry(dn, true, targeti, pi);  // update old primary
   mds->mdlog->submit_entry(le, new C_MDS_SlaveLinkPrep(this, mdr, targeti, old_ctime, inc));
 }
@@ -2271,12 +2275,13 @@ void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn)
     // primary link.  add stray dentry.
     assert(straydn);
     ipv = straydn->pre_dirty(dn->inode->inode.version);
-    le->metablob.add_dir_context(straydn->dir);
+    le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), straydn->dir);
     ji = le->metablob.add_primary_dentry(straydn, true, dn->inode);
   } else {
     // remote link.  update remote inode.
     ipv = dn->inode->pre_dirty();
-    le->metablob.add_dir_context(dn->inode->get_parent_dir());
+    le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(),
+                                dn->inode->get_parent_dir());
     ji = le->metablob.add_primary_dentry(dn->inode->parent, true, dn->inode);
   }
   
@@ -2290,7 +2295,7 @@ void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn)
   // the unlinked dentry
   dn->pre_dirty();
   version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);
-  le->metablob.add_dir_context(dn->get_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->get_dir());
   le->metablob.add_null_dentry(dn, true);
 
   if (mdr->dst_reanchor_atid)
@@ -2408,7 +2413,7 @@ void Server::_unlink_remote(MDRequest *mdr, CDentry *dn)
   // the unlinked dentry
   dn->pre_dirty();
   version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);
-  le->metablob.add_dir_context(dn->get_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->get_dir());
   le->metablob.add_null_dentry(dn, true);
 
   if (mdr->dst_reanchor_atid)
@@ -2874,13 +2879,13 @@ void Server::_rename_prepare(MDRequest *mdr,
     dout(10) << "will merge remote+primary links" << endl;
 
     // destdn -> primary
-    metablob->add_dir_context(destdn->dir);
+    metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), destdn->dir);
     if (destdn->is_auth())
       ipv = mdr->pvmap[destdn] = destdn->pre_dirty(destdn->inode->inode.version);
     ji = metablob->add_primary_dentry(destdn, true, destdn->inode); 
     
     // do src dentry
-    metablob->add_dir_context(srcdn->dir);
+    metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), srcdn->dir);
     if (srcdn->is_auth())
       mdr->pvmap[srcdn] = srcdn->pre_dirty();
     metablob->add_null_dentry(srcdn, true);
@@ -2892,7 +2897,7 @@ void Server::_rename_prepare(MDRequest *mdr,
       assert(straydn);
 
       // link-- inode, move to stray dir.
-      metablob->add_dir_context(straydn->dir);
+      metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), straydn->dir);
       if (straydn->is_auth())
        ipv = mdr->pvmap[straydn] = straydn->pre_dirty(destdn->inode->inode.version);
       ji = metablob->add_primary_dentry(straydn, true, destdn->inode);
@@ -2900,7 +2905,8 @@ void Server::_rename_prepare(MDRequest *mdr,
     else if (destdn->is_remote()) {
       // remote.
       // nlink-- targeti
-      metablob->add_dir_context(destdn->inode->get_parent_dir());
+      metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), 
+                               destdn->inode->get_parent_dir());
       if (destdn->inode->is_auth())
        ipv = mdr->pvmap[destdn->inode] = destdn->inode->pre_dirty();
       ji = metablob->add_primary_dentry(destdn->inode->parent, true, destdn->inode);  // update primary
@@ -2911,7 +2917,7 @@ void Server::_rename_prepare(MDRequest *mdr,
     }
 
     // add dest dentry
-    metablob->add_dir_context(destdn->dir);
+    metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), destdn->dir);
     if (srcdn->is_primary()) {
       dout(10) << "src is a primary dentry" << endl;
       if (destdn->is_auth()) {
@@ -2933,7 +2939,7 @@ void Server::_rename_prepare(MDRequest *mdr,
     }
     
     // remove src dentry
-    metablob->add_dir_context(srcdn->dir);
+    metablob->add_dir_context(mds->mdlog->get_last_subtree_map_offset(), srcdn->dir);
     if (srcdn->is_auth())
       mdr->pvmap[srcdn] = srcdn->pre_dirty();
     metablob->add_null_dentry(srcdn, true);
@@ -3397,7 +3403,7 @@ void Server::handle_client_truncate(MDRequest *mdr)
   // log + wait
   EUpdate *le = new EUpdate("truncate");
   le->metablob.add_client_req(mdr->reqid);
-  le->metablob.add_dir_context(cur->get_parent_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), cur->get_parent_dir());
   le->metablob.add_inode_truncate(cur->inode, req->args.truncate.length);
   inode_t *pi = le->metablob.add_dentry(cur->parent, true);
   pi->mtime = ctime;
@@ -3614,7 +3620,7 @@ void Server::handle_client_opent(MDRequest *mdr)
   // log + wait
   EUpdate *le = new EUpdate("open_truncate");
   le->metablob.add_client_req(mdr->reqid);
-  le->metablob.add_dir_context(cur->get_parent_dir());
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), cur->get_parent_dir());
   le->metablob.add_inode_truncate(cur->inode, 0);
   inode_t *pi = le->metablob.add_dentry(cur->parent, true);
   pi->mtime = ctime;
@@ -3703,7 +3709,7 @@ void Server::handle_client_openc(MDRequest *mdr)
   EUpdate *le = new EUpdate("openc");
   le->metablob.add_client_req(req->get_reqid());
   le->metablob.add_allocated_ino(in->ino(), mds->idalloc->get_version());
-  le->metablob.add_dir_context(dn->dir);
+  le->metablob.add_dir_context(mds->mdlog->get_last_subtree_map_offset(), dn->dir);
   le->metablob.add_primary_dentry(dn, true, in, &in->inode);
   
   // log + wait
index 29d8e0df08f499df2451e3a222e65200787cc78c..a7add9737d809058915b71c8f309a0daf6778e88 100644 (file)
@@ -32,9 +32,7 @@ protected:
   
 public:
   EExport(CDir *dir) : LogEvent(EVENT_EXPORT),
-                      base(dir->dirfrag()) { 
-    metablob.add_dir_context(dir);
-  }
+                      base(dir->dirfrag()) { }
   EExport() : LogEvent(EVENT_EXPORT) { }
   
   set<dirfrag_t> &get_bounds() { return bounds; }
index 53d6370d350c6c4646c8f82e6c86961e4fac9515..481cc7ba718d418520c386fb77b953e9ffbf15dc 100644 (file)
@@ -322,6 +322,9 @@ private:
                              CInode *in=0, inode_t *pi=0, fragtree_t *pdft=0) {
     if (!in) 
       in = dn->get_inode();
+
+    // ** FIXME: set in->last_journaled **
+
     lump.nfull++;
     if (dirty) {
       lump.get_dfull().push_front(fullbit(dn->get_name(), 
@@ -376,24 +379,32 @@ private:
   static const int TO_AUTH_SUBTREE_ROOT = 0;  // default.
   static const int TO_ROOT = 1;
   
-  void add_dir_context(CDir *dir, int mode = TO_AUTH_SUBTREE_ROOT) {
+  void add_dir_context(off_t subtree_map_offset, CDir *dir, int mode = TO_AUTH_SUBTREE_ROOT) {
     // already have this dir?  (we must always add in order)
     if (lump_map.count(dir->dirfrag())) 
       return;
 
-    // stop at subtree root?
-    if (mode == TO_AUTH_SUBTREE_ROOT &&
-       dir->is_subtree_root() && dir->is_auth())
-      return;
+    if (mode == TO_AUTH_SUBTREE_ROOT) {
+      // subtree root?
+      if (dir->is_subtree_root() && dir->is_auth())
+       return;
+      // was the inode journaled since the last subtree_map?
+      if (dir->inode->last_journaled >= subtree_map_offset) {
+       cout << "already journaled " << dir->inode->ino() << endl;
+       return;
+      }
+    }
     
     // stop at root/stray
     CInode *diri = dir->get_inode();
     if (!diri->get_parent_dn())
       return;
 
+    // journaled?
+
     // add parent dn
     CDentry *parent = diri->get_parent_dn();
-    add_dir_context(parent->get_dir(), mode);
+    add_dir_context(subtree_map_offset, parent->get_dir(), mode);
     add_dentry(parent, false);
   }