From 2716c0c8921752a4097a495452029eea64270218 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Tue, 17 Aug 2010 16:08:46 -0700 Subject: [PATCH] mds: move inode and xattr projection into projected_nodes list. --- src/mds/CInode.cc | 36 ++++++++++++++++++++---------------- src/mds/CInode.h | 35 +++++++++++++++-------------------- 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 3d66c97017af..cefdf192570f 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -203,38 +203,42 @@ void CInode::print(ostream& out) inode_t *CInode::project_inode(map *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 *px = projected_xattrs.front(); + map *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) diff --git a/src/mds/CInode.h b/src/mds/CInode.h index a59f2d852cb9..305aa2dca1c8 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -194,37 +194,30 @@ public: projection_node(inode_t *in, map *xp = NULL, sr_t *sn = NULL) : inode(in), xattrs(xp), snapnode(sn) {} }; - list projected_nodes; - // projected values (only defined while dirty) - list projected_inode; + list projected_nodes; - // if xattr* is null, it is defined to be the same as the previous version - list*> projected_xattrs; + sr_t *projected_snaprealm_ptr; + map *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 *get_projected_xattrs() { - if (!projected_xattrs.empty()) - for (list*>::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::reverse_iterator p = projected_inode.rbegin(); + assert(!projected_nodes.empty()); + list::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), -- 2.47.3