dout(10) << " realm " << *realm << " on " << *realm->inode << dendl;
realm->invalidate_cached_snaps();
- for (map<client_t, xlist<Capability*> >::iterator p = realm->client_caps.begin();
+ for (map<client_t, xlist<Capability*>* >::iterator p = realm->client_caps.begin();
p != realm->client_caps.end();
p++) {
- assert(!p->second.empty());
+ assert(!p->second->empty());
if (!nosend && updates.count(p->first) == 0) {
MClientSnap *update = new MClientSnap(snapop);
update->head.split = in->ino();
bufferlist cached_snap_trace;
elist<CInode*> inodes_with_caps; // for efficient realm splits
- map<client_t, xlist<Capability*> > client_caps; // to identify clients who need snap notifications
+ map<client_t, xlist<Capability*>* > client_caps; // to identify clients who need snap notifications
SnapRealm(MDCache *c, CInode *in) :
srnode(),
void join(SnapRealm *child);
void add_cap(client_t client, Capability *cap) {
- client_caps[client].push_back(&cap->item_snaprealm_caps);
+ if (client_caps.count(client) == 0)
+ client_caps[client] = new xlist<Capability*>;
+ client_caps[client]->push_back(&cap->item_snaprealm_caps);
}
void remove_cap(client_t client, Capability *cap) {
cap->item_snaprealm_caps.remove_myself();
- if (client_caps[client].empty())
+ if (client_caps[client]->empty()) {
+ delete client_caps[client];
client_caps.erase(client);
+ }
}
};