]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: only recover files from stale clients when auth
authorSage Weil <sage@newdream.net>
Tue, 13 Apr 2010 17:38:48 +0000 (10:38 -0700)
committerSage Weil <sage@newdream.net>
Tue, 13 Apr 2010 17:38:48 +0000 (10:38 -0700)
Replicas have client_ranges defined too, but only the auth MDS should do
the file size/mtime recovery.

Also rename clear_client_caps_after_export() for clarity, and assert inode
is_auth throughout file recover code.

src/mds/CInode.h
src/mds/Locker.cc
src/mds/MDCache.cc
src/mds/Migrator.cc

index 89bb585791985c5d06de1cf939bbacc931b77f45..cfe10b5bc48e2b3db4109ff64b8e1a288c677341 100644 (file)
@@ -714,7 +714,7 @@ public:
     inode.atime = MAX(inode.atime, utime_t(icr.atime));
     return cap;
   }
-  void clear_client_caps() {
+  void clear_client_caps_after_export() {
     while (!client_caps.empty())
       remove_client_cap(client_caps.begin()->first);
   }
index d65d2afae404e7f5189b7d272d956037cd0e60a2..53f78fcb87c9602717e072c05efe23ad0bc8bb63 100644 (file)
@@ -1281,7 +1281,8 @@ void Locker::revoke_stale_caps(Session *session)
       dout(10) << " revoking " << ccap_string(issued) << " on " << *in << dendl;      
       cap->revoke();
 
-      if (in->inode.client_ranges.count(client))
+      if (in->is_auth() &&
+         in->inode.client_ranges.count(client))
        in->state_set(CInode::STATE_NEEDSRECOVER);
 
       if (!in->filelock.is_stable()) eval_gather(&in->filelock);
index 536e4487b374532ea491673a82e568e0c504ca8a..8806c733ae4e67621117d9ce3c849244af77132b 100644 (file)
@@ -4382,6 +4382,7 @@ struct C_MDC_QueuedCow : public Context {
 void MDCache::queue_file_recover(CInode *in)
 {
   dout(10) << "queue_file_recover " << *in << dendl;
+  assert(in->is_auth());
 
   // cow?
   SnapRealm *realm = in->find_snaprealm();
@@ -4432,6 +4433,7 @@ void MDCache::_queued_file_recover_cow(CInode *in, Mutation *mut)
 void MDCache::_queue_file_recover(CInode *in)
 {
   dout(15) << "_queue_file_recover " << *in << dendl;
+  assert(in->is_auth());
   in->state_clear(CInode::STATE_NEEDSRECOVER);
   in->state_set(CInode::STATE_RECOVERING);
   in->auth_pin(this);
index f92de726c8ee60003a266df9948e4fd41e0c5db3..2864bad7731da17469e7647c30fc8b9a7632bb94 100644 (file)
@@ -920,7 +920,7 @@ void Migrator::finish_export_inode_caps(CInode *in)
                                     cap->get_mseq());
     mds->send_message_client(m, it->first);
   }
-  in->clear_client_caps();
+  in->clear_client_caps_after_export();
 }
 
 void Migrator::finish_export_inode(CInode *in, utime_t now, list<Context*>& finished)