]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: move inode and xattr projection into projected_nodes list.
authorGreg Farnum <gregf@hq.newdream.net>
Tue, 17 Aug 2010 23:08:46 +0000 (16:08 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Thu, 19 Aug 2010 22:33:53 +0000 (15:33 -0700)
src/mds/CInode.cc
src/mds/CInode.h

index 3d66c97017af936d4d3227ece62c1a5a3dfda7cb..cefdf192570fb0a4c045a60617d172f0c5cd090e 100644 (file)
@@ -203,38 +203,42 @@ void CInode::print(ostream& out)
 
 inode_t *CInode::project_inode(map<string,bufferptr> *px) 
 {
-  if (projected_inode.empty()) {
-    projected_inode.push_back(new inode_t(inode));
+  if (projected_nodes.empty()) {
+    projected_nodes.push_back(new projection_node(new inode_t(inode)));
     if (px)
       *px = xattrs;
   } else {
-    projected_inode.push_back(new inode_t(*projected_inode.back()));
+    projected_nodes.push_back(new projection_node(
+        new inode_t(*projected_nodes.back()->inode)));
     if (px)
       *px = *get_projected_xattrs();
   }
-  projected_xattrs.push_back(px);
-  projected_nodes.push_back(projection_node(projected_inode.back(), px));
-  dout(15) << "project_inode " << projected_inode.back() << dendl;
-  return projected_inode.back();
+  projected_nodes.back()->xattrs = px;
+  if (px) projected_xattrs_ptr = px;
+  dout(15) << "project_inode " << projected_nodes.back()->inode << dendl;
+  return projected_nodes.back()->inode;
 }
 
 void CInode::pop_and_dirty_projected_inode(LogSegment *ls) 
 {
-  assert(!projected_inode.empty());
-  dout(15) << "pop_and_dirty_projected_inode " << projected_inode.front()
-          << " v" << projected_inode.front()->version << dendl;
-  mark_dirty(projected_inode.front()->version, ls);
-  inode = *projected_inode.front();
-  delete projected_inode.front();
+  assert(!projected_nodes.empty());
+  dout(15) << "pop_and_dirty_projected_inode " << projected_nodes.front()->inode
+          << " v" << projected_nodes.front()->inode->version << dendl;
+  mark_dirty(projected_nodes.front()->inode->version, ls);
+  inode = *projected_nodes.front()->inode;
 
-  map<string,bufferptr> *px = projected_xattrs.front();
+  map<string,bufferptr> *px = projected_nodes.front()->xattrs;
   if (px) {
     xattrs = *px;
+    if (projected_xattrs_ptr && projected_xattrs_ptr == px)
+      projected_xattrs_ptr = NULL;
     delete px;
   }
 
-  projected_inode.pop_front();
-  projected_xattrs.pop_front();
+  delete projected_nodes.front()->inode;
+  delete projected_nodes.front();
+
+  projected_nodes.pop_front();
 }
 
 sr_t *CInode::project_snaprealm(snapid_t snapid)
index a59f2d852cb91801a8ff143095e5d7651a0c0f68..305aa2dca1c86667ea2bb1d25ad29b57344b14a1 100644 (file)
@@ -194,37 +194,30 @@ public:
     projection_node(inode_t *in, map<string, bufferptr> *xp = NULL, sr_t *sn = NULL) :
       inode(in), xattrs(xp), snapnode(sn) {}
   };
-  list<projection_node*> projected_nodes;
-
   // projected values (only defined while dirty)
-  list<inode_t*>   projected_inode;
+  list<projection_node*> projected_nodes;
 
-  // if xattr* is null, it is defined to be the same as the previous version
-  list<map<string,bufferptr>*>   projected_xattrs;
+  sr_t *projected_snaprealm_ptr;
+  map<string, bufferptr> *projected_xattrs_ptr;
   
   version_t get_projected_version() {
-    if (projected_inode.empty())
+    if (projected_nodes.empty())
       return inode.version;
     else
-      return projected_inode.back()->version;
+      return projected_nodes.back()->inode->version;
   }
   bool is_projected() {
-    return !projected_inode.empty();
+    return !projected_nodes.empty();
   }
 
   inode_t *get_projected_inode() { 
-    if (projected_inode.empty())
+    if (projected_nodes.empty())
       return &inode;
     else
-      return projected_inode.back();
+      return projected_nodes.back()->inode;
   }
   map<string,bufferptr> *get_projected_xattrs() {
-    if (!projected_xattrs.empty())
-      for (list<map<string,bufferptr>*>::reverse_iterator p = projected_xattrs.rbegin();
-          p != projected_xattrs.rend();
-          p++)
-       if (*p)
-         return *p;
+    if (projected_xattrs_ptr) return projected_xattrs_ptr;
     return &xattrs;
   }
 
@@ -232,11 +225,11 @@ public:
   void pop_and_dirty_projected_inode(LogSegment *ls);
 
   inode_t *get_previous_projected_inode() {
-    assert(!projected_inode.empty());
-    list<inode_t*>::reverse_iterator p = projected_inode.rbegin();
+    assert(!projected_nodes.empty());
+    list<projection_node*>::reverse_iterator p = projected_nodes.rbegin();
     p++;
-    if (p != projected_inode.rend())
-      return *p;
+    if (p != projected_nodes.rend())
+      return (*p)->inode;
     else
       return &inode;
   }
@@ -351,6 +344,8 @@ private:
     first(f), last(l),
     last_journaled(0), //last_open_journaled(0), 
     //hack_accessed(true),
+    projected_snaprealm_ptr(NULL),
+    projected_xattrs_ptr(NULL),
     stickydir_ref(0),
     parent(0),
     inode_auth(CDIR_AUTH_DEFAULT),