]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: adjust cap release logic...
authorSage Weil <sage@newdream.net>
Sun, 4 Jan 2009 18:28:50 +0000 (10:28 -0800)
committerSage Weil <sage@newdream.net>
Sun, 4 Jan 2009 18:28:50 +0000 (10:28 -0800)
src/client/Client.cc
src/client/Client.h

index 8a92b0419063c1175058d3959ce9b0d6e947a3c5..a4cbeac826f37e9e9503d210b33bdc240f9c96cd 100644 (file)
@@ -1449,8 +1449,8 @@ void Client::cap_delay_requeue(Inode *in)
 
 void Client::check_caps(Inode *in, bool is_delayed)
 {
-  int wanted = in->caps_wanted();
-  int used = in->caps_used();
+  unsigned wanted = in->caps_wanted();
+  unsigned used = in->caps_used();
 
   dout(10) << "check_caps on " << *in
           << " wanted " << ccap_string(wanted)
@@ -1479,6 +1479,10 @@ void Client::check_caps(Inode *in, bool is_delayed)
     InodeCap *cap = it->second;
     it++;
 
+    int like = wanted;
+    if (!unmounting)
+      like |= CEPH_CAP_ANY_RD;
+
     int revoking = cap->implemented & ~cap->issued;
     
     if (in->wanted_max_size > in->inode.max_size &&
@@ -1499,8 +1503,11 @@ void Client::check_caps(Inode *in, bool is_delayed)
       goto ack;
     }
 
-    if ((cap->issued & ~wanted) == 0)
-      continue;     /* nothing extra, all good */
+    if (wanted == cap->wanted &&   // mds knows what we want.
+       cap->issued & ~like)       // and we don't have anything we wouldn't like
+      continue;   
+    //if ((cap->issued & ~wanted) == 0)
+    //continue;     /* nothing extra, all good */
 
     if (now < in->hold_caps_until) {
       dout(10) << "delaying cap release" << dendl;
@@ -1520,6 +1527,7 @@ void Client::check_caps(Inode *in, bool is_delayed)
                                     cap->issued,
                                     wanted,
                                     cap->mseq);
+    cap->wanted = wanted;
     in->reported_size = in->inode.size;
     m->set_max_size(in->wanted_max_size);
     in->requested_max_size = in->wanted_max_size;
@@ -2134,6 +2142,7 @@ void Client::handle_cap_grant(Inode *in, MClientCaps *m)
 
   // don't want it?
   int wanted = in->caps_wanted();
+  /*
   if (wanted == 0) {
     dout(5) << "handle_cap_grant on ino " << m->get_ino() 
             << " seq " << m->get_seq() 
@@ -2145,6 +2154,7 @@ void Client::handle_cap_grant(Inode *in, MClientCaps *m)
     messenger->send_message(m, m->get_source_inst());
     return;
   }
+  */
 
   int used = in->caps_used();
 
@@ -2195,6 +2205,7 @@ void Client::handle_cap_grant(Inode *in, MClientCaps *m)
       m->set_mtime(in->inode.mtime);
       m->set_atime(in->inode.atime);
       m->set_wanted(wanted);
+      cap->wanted = wanted;
       m->set_snap_follows(in->snaprealm->get_snap_context().seq);
       m->set_migrate_seq(cap->mseq);
     }
index 18fd78d255ffdb5adcc6360eb88ff0b668dd8fa7..c7ae260069b2f7ce6785f1dfb4a6a3a33de8b29b 100644 (file)
@@ -161,10 +161,11 @@ inline ostream& operator<<(ostream& out, const SnapRealm& r) {
 struct InodeCap {
   unsigned issued;
   unsigned implemented;
+  unsigned wanted;   // as known to mds.
   __u64 seq;
   __u32 mseq;  // migration seq
 
-  InodeCap() : issued(0), implemented(0), seq(0), mseq(0) {}
+  InodeCap() : issued(0), implemented(0), wanted(0), seq(0), mseq(0) {}
 };
 
 struct CapSnap {