};
WRITE_CLASS_ENCODER(fragtree_t)
+inline bool operator==(const fragtree_t& l, const fragtree_t& r) {
+ return l._splits == r._splits;
+}
+inline bool operator!=(const fragtree_t& l, const fragtree_t& r) {
+ return l._splits != r._splits;
+}
+
inline std::ostream& operator<<(std::ostream& out, fragtree_t& ft)
{
out << "fragtree_t(";
assert(!bad);
}
+void CInode::force_dirfrags()
+{
+ bool bad = false;
+ for (map<frag_t,CDir*>::iterator p = dirfrags.begin(); p != dirfrags.end(); ++p) {
+ if (!dirfragtree.is_leaf(p->first)) {
+ dout(0) << "have open dirfrag " << p->first << " but not leaf in " << dirfragtree
+ << ": " << *p->second << dendl;
+ bad = true;
+ }
+ }
+
+ if (bad) {
+ list<frag_t> leaves;
+ dirfragtree.get_leaves(leaves);
+ for (list<frag_t>::iterator p = leaves.begin(); p != leaves.end(); ++p)
+ mdcache->get_force_dirfrag(dirfrag_t(ino(),*p));
+ }
+
+ verify_dirfrags();
+}
+
CDir *CInode::get_approx_dirfrag(frag_t fg)
{
CDir *dir = get_dirfrag(fg);
void close_dirfrags();
bool has_subtree_root_dirfrag();
+ void force_dirfrags();
void verify_dirfrags();
void get_stickydirs();
::decode(dirty, bl);
}
- void update_inode(CInode *in) {
- in->inode = inode;
- in->xattrs = xattrs;
- if (in->inode.is_dir()) {
- in->dirfragtree = dirfragtree;
- 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
- * divy up
- */
- in->decode_snap_blob(snapbl);
- } else if (in->inode.is_symlink()) {
- in->symlink = symlink;
- }
- }
+ void update_inode(CInode *in);
void print(ostream& out) {
out << " fullbit dn " << dn << " [" << dnfirst << "," << dnlast << "] dnv " << dnv
// ls->last_client_tid[client_reqs.rbegin()->client] = client_reqs.rbegin()->tid);
}
+void EMetaBlob::fullbit::update_inode(CInode *in)
+{
+ in->inode = inode;
+ in->xattrs = xattrs;
+ if (in->inode.is_dir()) {
+ if (!(in->dirfragtree == dirfragtree)) {
+ in->dirfragtree = dirfragtree;
+ 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
+ * divy up
+ */
+ in->decode_snap_blob(snapbl);
+ } else if (in->inode.is_symlink()) {
+ in->symlink = symlink;
+ }
+}
+
void EMetaBlob::replay(MDS *mds, LogSegment *logseg)
{
dout(10) << "EMetaBlob.replay " << lump_map.size() << " dirlumps by " << client_name << dendl;