map<dirfrag_t, uint32_t> dirs;
map<dirfrag_t, map<pair<string,snapid_t>,uint32_t> > dentries;
+ void merge(realm& o) {
+ inodes.insert(o.inodes.begin(), o.inodes.end());
+ dirs.insert(o.dirs.begin(), o.dirs.end());
+ for (map<dirfrag_t,map<pair<string,snapid_t>,uint32_t> >::iterator p = o.dentries.begin();
+ p != o.dentries.end();
+ ++p) {
+ if (dentries.count(p->first) == 0)
+ dentries[p->first] = p->second;
+ else
+ dentries[p->first].insert(p->second.begin(), p->second.end());
+ }
+ }
+
void encode(bufferlist &bl) const {
::encode(inodes, bl);
::encode(dirs, bl);
}
void add_realm(dirfrag_t df, realm& r) {
- realms[df] = r;
+ if (realms.count(df) == 0)
+ realms[df] = r;
+ else
+ realms[df].merge(r);
}
void decode_payload() {