From ae53d8011f20c473997fa40c8d57f3bba00482f1 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sat, 3 Sep 2011 14:17:26 -0700 Subject: mds: use inode_t::layout for dir layout policy Remove the default_file_layout struct, which was just a ceph_file_layout, and store it in the inode_t. Rip out all the annoying code that put this on the heap. Signed-off-by: Sage Weil --- src/include/ceph_fs.h | 2 +- src/mds/CInode.cc | 46 +++++++++---------------- src/mds/CInode.h | 83 ++++++---------------------------------------- src/mds/Locker.cc | 4 +-- src/mds/MDCache.cc | 5 ++- src/mds/Server.cc | 34 +++++++++---------- src/mds/events/EMetaBlob.h | 40 ++++++---------------- src/mds/journal.cc | 3 -- src/mds/mdstypes.h | 9 +++++ 9 files changed, 68 insertions(+), 158 deletions(-) diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 97143138954..01824463d4d 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -25,7 +25,7 @@ #define CEPH_MDS_PROTOCOL 14 /* cluster internal */ #define CEPH_MON_PROTOCOL 8 /* cluster internal */ #define CEPH_OSDC_PROTOCOL 24 /* server/client */ -#define CEPH_MDSC_PROTOCOL 32 /* server/client */ +#define CEPH_MDSC_PROTOCOL 33 /* server/client */ #define CEPH_MONC_PROTOCOL 15 /* server/client */ diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 528d1f8b970..33e9a026e77 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -310,14 +310,11 @@ inode_t *CInode::project_inode(map *px) projected_nodes.push_back(new projected_inode_t(new inode_t(inode))); if (px) *px = xattrs; - projected_nodes.back()->dir_layout = default_layout; } else { - default_file_layout *last_dl = projected_nodes.back()->dir_layout; projected_nodes.push_back(new projected_inode_t( new inode_t(*projected_nodes.back()->inode))); if (px) *px = *get_projected_xattrs(); - projected_nodes.back()->dir_layout = last_dl; } projected_nodes.back()->xattrs = px; dout(15) << "project_inode " << projected_nodes.back()->inode << dendl; @@ -338,11 +335,6 @@ void CInode::pop_and_dirty_projected_inode(LogSegment *ls) delete px; } - if (projected_nodes.front()->dir_layout != default_layout) { - delete default_layout; - default_layout = projected_nodes.front()->dir_layout; - } - if (projected_nodes.front()->snapnode) pop_projected_snaprealm(projected_nodes.front()->snapnode); @@ -1106,12 +1098,14 @@ void CInode::encode_lock_state(int type, bufferlist& bl) case CEPH_LOCK_IFILE: if (is_auth()) { - ::encode(inode.layout, bl); - ::encode(inode.size, bl); ::encode(inode.mtime, bl); ::encode(inode.atime, bl); ::encode(inode.time_warp_seq, bl); - ::encode(inode.client_ranges, bl); + if (!is_dir()) { + ::encode(inode.layout, bl); + ::encode(inode.size, bl); + ::encode(inode.client_ranges, bl); + } } else { bool dirty = filelock.is_dirty(); ::encode(dirty, bl); @@ -1193,9 +1187,7 @@ void CInode::encode_lock_state(int type, bufferlist& bl) case CEPH_LOCK_IPOLICY: if (inode.is_dir()) { - ::encode((default_layout ? true : false), bl); - if (default_layout) - encode(*default_layout, bl); + ::encode(inode.layout, bl); } break; @@ -1289,12 +1281,14 @@ void CInode::decode_lock_state(int type, bufferlist& bl) case CEPH_LOCK_IFILE: if (!is_auth()) { - ::decode(inode.layout, p); - ::decode(inode.size, p); ::decode(inode.mtime, p); ::decode(inode.atime, p); ::decode(inode.time_warp_seq, p); - ::decode(inode.client_ranges, p); + if (!is_dir()) { + ::decode(inode.layout, p); + ::decode(inode.size, p); + ::decode(inode.client_ranges, p); + } } else { bool replica_dirty; ::decode(replica_dirty, p); @@ -1436,12 +1430,7 @@ void CInode::decode_lock_state(int type, bufferlist& bl) case CEPH_LOCK_IPOLICY: if (inode.is_dir()) { - bool default_layout_exists; - ::decode(default_layout_exists, p); - if (default_layout_exists) { - default_layout = new default_file_layout; - decode(*default_layout, p); - } + ::decode(inode.layout, p); } break; @@ -2627,15 +2616,10 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session, // file i = pfile ? pi:oi; - if (is_file()) { - e.layout = i->layout; + if (is_dir()) { + e.layout = (ppolicy ? pi : oi)->layout; } else { - if (ppolicy && get_projected_dir_layout()) - e.layout = *get_projected_dir_layout(); - else if (default_layout) - e.layout = default_layout->layout; - else - memset(&e.layout, 0, sizeof(e.layout)); + e.layout = i->layout; } e.size = i->size; e.truncate_seq = i->truncate_seq; diff --git a/src/mds/CInode.h b/src/mds/CInode.h index b28fe58065f..15d9493f53d 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -63,32 +63,6 @@ struct cinode_lock_info_t { extern cinode_lock_info_t cinode_lock_info[]; extern int num_cinode_locks; -/** - * Default file layout stuff. This lets us set a default file layout on - * a directory inode that all files in its tree will use on creation. - */ -struct default_file_layout { - - ceph_file_layout layout; - - void encode(bufferlist &bl) const { - __u8 struct_v = 1; - ::encode(struct_v, bl); - ::encode(layout, bl); - } - - void decode(bufferlist::iterator& bl) { - __u8 struct_v; - ::decode(struct_v, bl); - if (struct_v != 1) { //uh-oh - dout(0) << "got default layout I don't understand!" << dendl; - assert(0); - } - ::decode(layout, bl); - } -}; -WRITE_CLASS_ENCODER(default_file_layout); - // cached inode wrapper class CInode : public MDSCacheObject { @@ -237,8 +211,6 @@ public: //bool hack_accessed; //utime_t hack_load_stamp; - default_file_layout *default_layout; - /** * Projection methods, used to store inode changes until they have been journaled, * at which point they are popped. @@ -256,14 +228,13 @@ public: inode_t *inode; map *xattrs; sr_t *snapnode; - default_file_layout *dir_layout; - - projected_inode_t() : inode(NULL), xattrs(NULL), snapnode(NULL), dir_layout(NULL) {} - projected_inode_t(inode_t *in, sr_t *sn) : inode(in), xattrs(NULL), snapnode(sn), - dir_layout(NULL) {} - projected_inode_t(inode_t *in, map *xp = NULL, sr_t *sn = NULL, - default_file_layout *dl = NULL) : - inode(in), xattrs(xp), snapnode(sn), dir_layout(dl) {} + + projected_inode_t() + : inode(NULL), xattrs(NULL), snapnode(NULL) {} + projected_inode_t(inode_t *in, sr_t *sn) + : inode(in), xattrs(NULL), snapnode(sn) {} + projected_inode_t(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) @@ -277,19 +248,6 @@ public: return projected_nodes.back(); } - ceph_file_layout *get_projected_dir_layout() { - if (!inode.is_dir()) return NULL; - if (projected_nodes.empty()) { - if (default_layout) - return &default_layout->layout; - else - return NULL; - } - else if (projected_nodes.back()->dir_layout) - return &projected_nodes.back()->dir_layout->layout; - else return NULL; - } - version_t get_projected_version() { if (projected_nodes.empty()) return inode.version; @@ -463,7 +421,6 @@ private: snaprealm(0), containing_realm(0), first(f), last(l), last_journaled(0), //last_open_journaled(0), - default_layout(NULL), //hack_accessed(true), stickydir_ref(0), parent(0), @@ -574,7 +531,7 @@ private: unsigned encode_parent_mutation(ObjectOperation& m); void encode_store(bufferlist& bl) { - __u8 struct_v = 2; + __u8 struct_v = 3; ::encode(struct_v, bl); ::encode(inode, bl); if (is_symlink()) @@ -585,11 +542,6 @@ private: encode_snap_blob(snapbl); ::encode(snapbl, bl); ::encode(old_inodes, bl); - if (inode.is_dir()) { - ::encode((default_layout ? true : false), bl); - if (default_layout) - ::encode(*default_layout, bl); - } } void decode_store(bufferlist::iterator& bl) { __u8 struct_v; @@ -603,12 +555,12 @@ private: ::decode(snapbl, bl); decode_snap_blob(snapbl); ::decode(old_inodes, bl); - if (struct_v >= 2 && inode.is_dir()) { + if (struct_v == 2 && inode.is_dir()) { bool default_layout_exists; ::decode(default_layout_exists, bl); if (default_layout_exists) { - default_layout = new default_file_layout; - ::decode(*default_layout, bl); + ::decode(struct_v, bl); + ::decode(inode.layout, bl); } } } @@ -625,11 +577,6 @@ private: _encode_base(bl); _encode_locks_state_for_replica(bl); - if (inode.is_dir()) { - ::encode((default_layout ? true : false), bl); - if (default_layout) - ::encode(*default_layout, bl); - } } void decode_replica(bufferlist::iterator& p, bool is_new) { __u32 nonce; @@ -638,14 +585,6 @@ private: _decode_base(p); _decode_locks_state(p, is_new); - if (inode.is_dir()) { - bool default_layout_exists; - ::decode(default_layout_exists, p); - if (default_layout_exists) { - default_layout = new default_file_layout; - ::decode(*default_layout, p); - } - } } diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 2f8c91b610b..ffe012cdd17 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -154,8 +154,8 @@ void Locker::include_snap_rdlocks_wlayout(set& rdlocks, CInode *in, rdlocks.insert(&t->snaplock); if (!found_layout) { rdlocks.insert(&t->policylock); - if (t->get_projected_dir_layout()) { - *layout = t->get_projected_dir_layout(); + if (t->get_projected_inode()->has_layout()) { + *layout = &t->get_projected_inode()->layout; found_layout = true; } } diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 5422f5b4992..66f3c68b20f 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -310,9 +310,8 @@ CInode *MDCache::create_system_inode(inodeno_t ino, int mode) CInode *MDCache::create_root_inode() { CInode *i = create_system_inode(MDS_INO_ROOT, S_IFDIR|0755); - i->default_layout = new struct default_file_layout; - i->default_layout->layout = default_file_layout; - i->default_layout->layout.fl_pg_pool = mds->mdsmap->get_data_pg_pool(); + i->inode.layout = default_file_layout; + i->inode.layout.fl_pg_pool = mds->mdsmap->get_data_pg_pool(); return i; } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index d8de4b46d93..917312c74c4 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3279,38 +3279,38 @@ void Server::handle_client_setdirlayout(MDRequest *mdr) return; // validate layout - default_file_layout *layout = new default_file_layout; - if (cur->get_projected_dir_layout()) - layout->layout = *cur->get_projected_dir_layout(); + inode_t *pi = cur->get_projected_inode(); + ceph_file_layout layout; + if (pi->has_layout()) + layout = pi->layout; else if (dir_layout) - layout->layout = *dir_layout; + layout = *dir_layout; else - layout->layout = mds->mdcache->default_file_layout; + layout = mds->mdcache->default_file_layout; if (req->head.args.setlayout.layout.fl_object_size > 0) - layout->layout.fl_object_size = req->head.args.setlayout.layout.fl_object_size; + layout.fl_object_size = req->head.args.setlayout.layout.fl_object_size; if (req->head.args.setlayout.layout.fl_stripe_unit > 0) - layout->layout.fl_stripe_unit = req->head.args.setlayout.layout.fl_stripe_unit; + layout.fl_stripe_unit = req->head.args.setlayout.layout.fl_stripe_unit; if (req->head.args.setlayout.layout.fl_stripe_count > 0) - layout->layout.fl_stripe_count=req->head.args.setlayout.layout.fl_stripe_count; + layout.fl_stripe_count=req->head.args.setlayout.layout.fl_stripe_count; if (req->head.args.setlayout.layout.fl_cas_hash > 0) - layout->layout.fl_cas_hash = req->head.args.setlayout.layout.fl_cas_hash; + layout.fl_cas_hash = req->head.args.setlayout.layout.fl_cas_hash; if (req->head.args.setlayout.layout.fl_object_stripe_unit > 0) - layout->layout.fl_object_stripe_unit = req->head.args.setlayout.layout.fl_object_stripe_unit; + layout.fl_object_stripe_unit = req->head.args.setlayout.layout.fl_object_stripe_unit; if (req->head.args.setlayout.layout.fl_pg_preferred != (__le32)-1) - layout->layout.fl_pg_preferred = req->head.args.setlayout.layout.fl_pg_preferred; + layout.fl_pg_preferred = req->head.args.setlayout.layout.fl_pg_preferred; if (req->head.args.setlayout.layout.fl_pg_pool > 0) - layout->layout.fl_pg_pool = req->head.args.setlayout.layout.fl_pg_pool; - if (!ceph_file_layout_is_valid(&layout->layout)) { + layout.fl_pg_pool = req->head.args.setlayout.layout.fl_pg_pool; + if (!ceph_file_layout_is_valid(&layout)) { dout(10) << "bad layout" << dendl; reply_request(mdr, -EINVAL); - delete layout; return; } - cur->project_inode(); - cur->get_projected_node()->dir_layout = layout; - cur->get_projected_inode()->version = cur->pre_dirty(); + pi = cur->project_inode(); + pi->layout = layout; + pi->version = cur->pre_dirty(); // log + wait mdr->ls = mdlog->get_current_segment(); diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h index e03f14770e4..678003cb1cf 100644 --- a/src/mds/events/EMetaBlob.h +++ b/src/mds/events/EMetaBlob.h @@ -67,7 +67,6 @@ public: string symlink; bufferlist snapbl; bool dirty; - struct default_file_layout *dir_layout; bufferlist _enc; @@ -77,11 +76,13 @@ public: fullbit(const string& d, snapid_t df, snapid_t dl, version_t v, inode_t& i, fragtree_t &dft, map &xa, const string& sym, - bufferlist &sbl, bool dr, default_file_layout *defl = NULL) : + bufferlist &sbl, bool dr) : //dn(d), dnfirst(df), dnlast(dl), dnv(v), //inode(i), dirfragtree(dft), xattrs(xa), symlink(sym), snapbl(sbl), dirty(dr) - dir_layout(NULL), _enc(1024) + _enc(1024) { + __u8 struct_v = 3; + ::encode(struct_v, _enc); ::encode(d, _enc); ::encode(df, _enc); ::encode(dl, _enc); @@ -93,21 +94,13 @@ public: if (i.is_dir()) { ::encode(dft, _enc); ::encode(sbl, _enc); - ::encode((defl ? true : false), _enc); - if (defl) - ::encode(*defl, _enc); } ::encode(dr, _enc); } - fullbit(bufferlist::iterator &p) : dir_layout(NULL) { decode(p); } - fullbit() : dir_layout(NULL) {} - ~fullbit() { - delete dir_layout; - } + fullbit(bufferlist::iterator &p) { decode(p); } + fullbit() {} void encode(bufferlist& bl) const { - __u8 struct_v = 2; - ::encode(struct_v, bl); assert(_enc.length()); bl.append(_enc); } @@ -125,12 +118,12 @@ public: if (inode.is_dir()) { ::decode(dirfragtree, bl); ::decode(snapbl, bl); - if (struct_v >= 2) { + if (struct_v == 2) { bool dir_layout_exists; ::decode(dir_layout_exists, bl); if (dir_layout_exists) { - dir_layout = new default_file_layout; - ::decode(*dir_layout, bl); + ::decode(struct_v, bl); + ::decode(inode.layout, bl); } } } @@ -544,11 +537,6 @@ private: //cout << "journaling " << in->inode.ino << " at " << my_offset << std::endl; inode_t *pi = in->get_projected_inode(); - default_file_layout *default_layout = NULL; - if (in->is_dir()) - default_layout = (in->get_projected_node() ? - in->get_projected_node()->dir_layout : - in->default_layout); bufferlist snapbl; sr_t *sr = in->get_projected_srnode(); @@ -562,7 +550,7 @@ private: *pi, in->dirfragtree, *in->get_projected_xattrs(), in->symlink, snapbl, - dirty, default_layout))); + dirty))); if (pi) lump.get_dfull().back()->inode = *pi; return &lump.get_dfull().back()->inode; @@ -595,12 +583,6 @@ private: if (!pdft) pdft = &in->dirfragtree; if (!px) px = &in->xattrs; - default_file_layout *default_layout = NULL; - if (in->is_dir()) - default_layout = (in->get_projected_node() ? - in->get_projected_node()->dir_layout : - in->default_layout); - bufferlist snapbl; if (psnapbl) snapbl = *psnapbl; @@ -614,7 +596,7 @@ private: 0, *pi, *pdft, *px, in->symlink, snapbl, - dirty, default_layout); + dirty); return &root->inode; } diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 1d40b5eab02..201b9ae9011 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -403,9 +403,6 @@ void EMetaBlob::fullbit::update_inode(MDS *mds, CInode *in) in->force_dirfrags(); } - delete in->default_layout; - in->default_layout = dir_layout; - dir_layout = NULL; /* * we can do this before linking hte inode bc the split_at would * be a no-op.. we have no children (namely open snaprealms) to diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 32f597277a1..7c6512f4e9e 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -439,6 +439,15 @@ struct inode_t { truncate_pending++; } + bool has_layout() const { + // why on earth is there no converse of memchr() in string.h? + const char *p = (const char *)&layout; + for (size_t i = 0; i < sizeof(layout); i++) + if (p[i] != '\0') + return true; + return false; + } + uint64_t get_layout_size_increment() { return layout.fl_object_size * layout.fl_stripe_count; } -- cgit v1.2.1