From: Greg Farnum Date: Tue, 18 May 2010 16:02:27 +0000 (-0700) Subject: mds: recover filelocks properly on client reconnect X-Git-Tag: v0.22~346^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e555ac67c9d26bbfadbc85d23ab48bccb369175f;p=ceph.git mds: recover filelocks properly on client reconnect --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 112f1e98996..76a8ff09d7b 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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 + (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 + (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); diff --git a/src/mds/Server.h b/src/mds/Server.h index 07596cfd476..b49801ffddd 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -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);