]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: Refactor need_snapflush into CInode helpers
authorSage Weil <sage@newdream.net>
Fri, 29 Oct 2010 20:05:16 +0000 (13:05 -0700)
committerSage Weil <sage@newdream.net>
Fri, 29 Oct 2010 20:07:19 +0000 (13:07 -0700)
Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/CInode.cc
src/mds/CInode.h
src/mds/Locker.cc
src/mds/MDCache.cc

index 00db3a723f65addf970cf61eed3d11cbda48ae95..bd9085d60f942656d0ffb3535c0d0dfaf0464ba5 100644 (file)
@@ -225,6 +225,34 @@ void CInode::print(ostream& out)
 
 
 
+void CInode::add_need_snapflush(CInode *snapin, snapid_t snapid, client_t client)
+{
+  dout(10) << "add_need_snapflush client" << client << " snapid " << snapid << " on " << snapin << dendl;
+
+  if (client_need_snapflush.empty()) {
+    get(CInode::PIN_NEEDSNAPFLUSH);
+  }
+
+  set<client_t>& clients = client_need_snapflush[snapid];
+  clients.insert(client);
+}
+
+void CInode::remove_need_snapflush(CInode *snapin, snapid_t snapid, client_t client)
+{
+  dout(10) << "remove_need_snapflush client" << client << " snapid " << snapid << " on " << snapin << dendl;
+  set<client_t>& clients = client_need_snapflush[snapid];
+  clients.erase(client);
+  if (clients.empty()) {
+    client_need_snapflush.erase(snapid);
+
+    if (client_need_snapflush.empty()) {
+      put(CInode::PIN_NEEDSNAPFLUSH);
+    }
+  }
+}
+
+
+
 void CInode::mark_dirty_rstat()
 {
   if (!state_test(STATE_DIRTYRSTAT)) {
index edee617206b3eba513ab3e9e7f4ad8481f615fd4..9003abc85feb056f6c384571d78ec7e5bbae0541 100644 (file)
@@ -401,6 +401,10 @@ protected:
   map<int, set<client_t> > client_snap_caps;     // [auth] [snap] dirty metadata we still need from the head
 public:
   map<snapid_t, set<client_t> > client_need_snapflush;
+
+  void add_need_snapflush(CInode *snapin, snapid_t snapid, client_t client);
+  void remove_need_snapflush(CInode *snapin, snapid_t snapid, client_t client);
+
 protected:
 
   ceph_lock_state_t fcntl_locks;
index 037aece238253ca9927912e7fc08b7f5766f6fbd..aac4b42bbf43a1bd075a24df757dc6505b305ebf 100644 (file)
@@ -1800,25 +1800,22 @@ void Locker::_do_null_snapflush(CInode *head_in, client_t client, snapid_t follo
   dout(10) << "_do_null_snapflish client" << client << " follows " << follows << " on " << *head_in << dendl;
   map<snapid_t, set<client_t> >::iterator p = head_in->client_need_snapflush.begin();
   while (p != head_in->client_need_snapflush.end()) {
-    // p->first is the snap inode's ->last
-    if (follows > p->first)
+    snapid_t snapid = p->first;
+    set<client_t>& clients = p->second;
+    p++;
+
+    // snapid is the snap inode's ->last
+    if (follows > snapid)
       break;
-    if (p->second.count(client)) {
-      dout(10) << " doing async NULL snapflush on " << p->first << " from client" << p->second << dendl;
-      CInode *sin = mdcache->get_inode(head_in->ino(), p->first);
+    if (clients.count(client)) {
+      dout(10) << " doing async NULL snapflush on " << snapid << " from client" << client << dendl;
+      CInode *sin = mdcache->get_inode(head_in->ino(), snapid);
       if (!sin && head_in->is_multiversion())
        sin = head_in;
       assert(sin);
-      _do_snap_update(sin, p->first, 0, sin->first - 1, client, NULL, NULL);
-      head_in->client_need_snapflush[p->first].erase(client);
-      if (head_in->client_need_snapflush[p->first].empty()) {
-       head_in->client_need_snapflush.erase(p++);
-       if (head_in->client_need_snapflush.empty())
-         head_in->put(CInode::PIN_NEEDSNAPFLUSH);
-       continue;
-      }
+      _do_snap_update(sin, snapid, 0, sin->first - 1, client, NULL, NULL);
+      head_in->remove_need_snapflush(sin, snapid, client);
     }
-    p++;
   }
 }
 
@@ -1932,14 +1929,8 @@ void Locker::handle_client_caps(MClientCaps *m)
 
       _do_snap_update(in, snap, m->get_dirty(), follows, client, m, ack);
 
-      if (in != head_in) {
-       head_in->client_need_snapflush[snap].erase(client);
-       if (head_in->client_need_snapflush[snap].empty()) {
-         head_in->client_need_snapflush.erase(snap);
-         if (head_in->client_need_snapflush.empty())
-           head_in->put(CInode::PIN_NEEDSNAPFLUSH);
-       }
-      }
+      if (in != head_in)
+       head_in->remove_need_snapflush(in, snap, client);
       
     } else
       dout(7) << " not expecting flushsnap " << snap << " from client" << client << " on " << *in << dendl;
index 22688bdabf554e8d1ff4a88e8aa3f0b375d10d80..a773843a1cc46780dbdd137e622d3e8d0e75fb38 100644 (file)
@@ -1306,10 +1306,7 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last)
       for (set<snapid_t>::const_iterator q = snaps.lower_bound(oldin->first);
           q != snaps.end() && *q <= last;
           q++) {
-       dout(10) << "   need_snapflush on " << *q << dendl;
-       if (in->client_need_snapflush.empty())
-         in->get(CInode::PIN_NEEDSNAPFLUSH);
-       in->client_need_snapflush[*q].insert(client);
+       in->add_need_snapflush(oldin, *q, client);
       }
     } else {
       dout(10) << " ignoring client" << client << " cap follows " << cap->client_follows << dendl;