decode_raw(v, p);
_enc = v;
}
-
+ bool operator<(const frag_t& b) const
+ {
+ if (value() != b.value())
+ return value() < b.value();
+ else
+ return bits() < b.bits();
+ }
private:
_frag_t _enc = 0;
};
return out << ")";
}
-
/**
* fragset_t -- a set of fragments
*/
f = f.parent();
}
}
-
+
+ void insert_raw(frag_t f){
+ _set.insert(f);
+ }
void insert(frag_t f) {
_set.insert(f);
simplify();
}
void simplify() {
- while (1) {
- bool clean = true;
- std::set<frag_t>::iterator p = _set.begin();
- while (p != _set.end()) {
- if (!p->is_root() &&
- _set.count(p->get_sibling())) {
- _set.erase(p->get_sibling());
- _set.insert(p->parent());
- _set.erase(p++);
- clean = false;
- } else {
- p++;
- }
+ auto it = _set.begin();
+ while (it != _set.end()) {
+ if (!it->is_root() &&
+ _set.count(it->get_sibling())) {
+ _set.erase(it->get_sibling());
+ auto ret = _set.insert(it->parent());
+ _set.erase(it);
+ it = ret.first;
+ } else {
+ ++it;
}
- if (clean)
- break;
}
}
};
// sort by ino
map<inodeno_t, fragset_t> byino;
for (auto& frag : dfs) {
- byino[frag.ino].insert(frag.frag);
+ byino[frag.ino].insert_raw(frag.frag);
}
dout(10) << " by ino: " << byino << dendl;
for (map<inodeno_t,fragset_t>::iterator p = byino.begin(); p != byino.end(); ++p) {
+ p->second.simplify();
CInode *diri = get_inode(p->first);
if (!diri)
continue;
// group by inode
map<inodeno_t, fragset_t> ino_fragset;
for (const auto &df : dfs) {
- ino_fragset[df.ino].insert(df.frag);
+ ino_fragset[df.ino].insert_raw(df.frag);
}
-
// get frags
for (map<inodeno_t, fragset_t>::iterator p = ino_fragset.begin();
p != ino_fragset.end();
++p) {
+ p->second.simplify();
CInode *in = get_inode(p->first);
if (!in)
continue;
map<inodeno_t, fragset_t> import_bound_fragset;
for (const auto &bound : m->get_bounds()) {
dout(10) << " bound " << bound << dendl;
- import_bound_fragset[bound.ino].insert(bound.frag);
+ import_bound_fragset[bound.ino].insert_raw(bound.frag);
}
-
// assimilate contents?
if (!did_assim) {
dout(7) << "doing assim on " << *dir << dendl;
for (map<inodeno_t,fragset_t>::iterator p = import_bound_fragset.begin();
p != import_bound_fragset.end();
++p) {
+ p->second.simplify();
CInode *in = cache->get_inode(p->first);
ceph_assert(in);
in->get_stickydirs();