]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: recover filelocks properly on client reconnect
authorGreg Farnum <gregf@hq.newdream.net>
Tue, 18 May 2010 16:02:27 +0000 (09:02 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Mon, 2 Aug 2010 17:39:56 +0000 (10:39 -0700)
src/mds/Server.cc
src/mds/Server.h

index 112f1e98996e5f400584d14bd47b6da62a192338..76a8ff09d7bc2015c722da23d47be0ad4d27603d 100644 (file)
@@ -602,6 +602,7 @@ void Server::handle_client_reconnect(MClientReconnect *m)
               << " on " << *in << dendl;
       in->reconnect_cap(from, p->second.capinfo, session);
       mds->mdcache->add_reconnected_cap(in, from, inodeno_t(p->second.capinfo.snaprealm));
+      recover_filelocks(in, p->second.flockbl, m->get_orig_source().num());
       continue;
     }
       
@@ -665,6 +666,29 @@ void Server::reconnect_tick()
   }
 }
 
+void Server::recover_filelocks(CInode *in, bufferlist locks, int64_t client)
+{
+  int numlocks;
+  ceph_filelock lock;
+  bufferlist::iterator p = locks.begin();
+  ::decode(numlocks, p);
+  for (int i = 0; i < numlocks; ++i) {
+    ::decode(lock, p);
+    lock.client = client;
+    in->fcntl_locks.held_locks.insert(pair<uint64_t, ceph_filelock>
+                                     (lock.start, lock));
+    ++in->fcntl_locks.client_held_lock_counts[client];
+  }
+  ::decode(numlocks, p);
+  for (int i = 0; i < numlocks; ++i) {
+    ::decode(lock, p);
+    lock.client = client;
+    in->flock_locks.held_locks.insert(pair<uint64_t, ceph_filelock>
+                                     (lock.start, lock));
+    ++in->flock_locks.client_held_lock_counts[client];
+  }
+}
+
 void Server::recall_client_state(float ratio)
 {
   int max_caps_per_client = (int)(g_conf.mds_cache_size * .8);
index 07596cfd476f22e930dcd8a2f7f9a2646f37b5aa..b49801ffddd943b8a8ecb01875e46d3438c7c77d 100644 (file)
@@ -87,6 +87,7 @@ public:
   //void process_reconnect_cap(CInode *in, int from, ceph_mds_cap_reconnect& capinfo);
   void reconnect_gather_finish();
   void reconnect_tick();
+  void recover_filelocks(CInode *in, bufferlist locks, int64_t client);
 
   void recall_client_state(float ratio);