]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: avoid copying snap client_caps xlist
authorSage Weil <sage.weil@dreamhost.com>
Tue, 21 Jun 2011 16:07:03 +0000 (09:07 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Tue, 21 Jun 2011 22:53:53 +0000 (15:53 -0700)
Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/mds/MDCache.cc
src/mds/snap.h

index b4b39cd852faedaa26d601f784982e4f1996123d..0dfff427bbc4755de193b7de6fa470e9c22ee443 100644 (file)
@@ -7698,10 +7698,10 @@ void MDCache::do_realm_invalidate_and_update_notify(CInode *in, int snapop, bool
     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();
index 899c2977b98a57a709fbca7fcb42f52bb9b0c005..b1c0a7de68ff60e4a63abc2815721dd67aa96a40 100644 (file)
@@ -179,7 +179,7 @@ struct SnapRealm {
   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(),
@@ -263,12 +263,16 @@ struct SnapRealm {
   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);
+    }
   }
 
 };