summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage.weil@dreamhost.com>2011-09-03 14:17:26 -0700
committerSage Weil <sage.weil@dreamhost.com>2011-09-03 14:17:26 -0700
commitae53d8011f20c473997fa40c8d57f3bba00482f1 (patch)
treee536503707869c50f17c9575263b3108adf7cbe1
parent933e7945acf9ed5dff658062437a42d429cb882c (diff)
downloadceph-historic/wip-mds-layout.tar.gz
mds: use inode_t::layout for dir layout policyhistoric/wip-mds-layout
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 <sage.weil@dreamhost.com>
-rw-r--r--src/include/ceph_fs.h2
-rw-r--r--src/mds/CInode.cc46
-rw-r--r--src/mds/CInode.h83
-rw-r--r--src/mds/Locker.cc4
-rw-r--r--src/mds/MDCache.cc5
-rw-r--r--src/mds/Server.cc34
-rw-r--r--src/mds/events/EMetaBlob.h40
-rw-r--r--src/mds/journal.cc3
-rw-r--r--src/mds/mdstypes.h9
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<string,bufferptr> *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<string,bufferptr> *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<string, bufferptr> *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<string, bufferptr> *xp = NULL, sr_t *sn = NULL)
+ : inode(in), xattrs(xp), snapnode(sn) {}
};
list<projected_inode_t*> 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<SimpleLock*>& 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<string,bufferptr> &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;
}