]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: support mds recall_state
authorSage Weil <sage@newdream.net>
Wed, 1 Jul 2009 18:39:59 +0000 (11:39 -0700)
committerSage Weil <sage@newdream.net>
Wed, 1 Jul 2009 18:39:59 +0000 (11:39 -0700)
Trim old caps.  Still need to make it an LRU.

src/TODO
src/client/Client.cc
src/client/Client.h
src/messages/MClientSession.h

index a0aa9bff7c2de3797acc6115f337e556517330f8..f08cd20cb4a68c6e5f0769bb753e4a3e702e9722 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -136,12 +136,15 @@ osd
 - preserve pg logs on disk for longer period
 - make scrub interruptible
 - salvage some way to allow both RMW and DELAYED mode ops?
+  - make the mode per-pg?  then at least per-pool access patterns will behave.
 - optionally separate osd interfaces (ips) for clients and osds (replication, peering, etc.)
 - pg repair
 - pg split should be a work queue
 - optimize remove wrt recovery pushes?
 
 userspace client
+- make session cap list an LRU
+  - make caps_issued_mask, touch_cap helpers to || kclient
 - clean up client mds session vs mdsmap behavior?
 - stop using mds's inode_t?
 - fix readdir vs fragment race by keeping a separate frag pos, and ignoring dentries below it
index 1b47d7f0f2d90e5c2270e45f12314bafddedd523..a536df21787eeb7af3c7de8a97f0dcccde4fefaa 100644 (file)
@@ -903,6 +903,11 @@ void Client::handle_client_session(MClientSession *m)
     mds_sessions[from].was_stale = true;
     renew_caps(from);
     break;
+
+  case CEPH_SESSION_RECALL_STATE:
+    trim_caps(from, m->get_max_caps());
+    break;
+
   default:
     assert(0);
   }
@@ -1801,12 +1806,36 @@ void Client::remove_all_caps(Inode *in)
     remove_cap(in, in->caps.begin()->first);
 }
 
-void Client::remove_session_caps(int mds_num) {
-  MDSSession* mds = &mds_sessions[mds_num];
+void Client::remove_session_caps(int mds_num)
+{
+  MDSSession *mds = &mds_sessions[mds_num];
   while (mds->caps.size())
     remove_cap((*mds->caps.begin())->inode, mds_num);
 }
 
+void Client::trim_caps(int mds, int max)
+{
+  dout(10) << "trim_caps mds" << mds << " max" << max << dendl;
+  MDSSession *s = &mds_sessions[mds];
+
+  int trimmed = 0;
+  xlist<InodeCap*>::iterator p = s->caps.begin();
+  while (s->caps.size() > max && !p.end()) {
+    InodeCap *cap = *p;
+    ++p;
+    Inode *in = cap->inode;
+    if (in->caps_used() ||
+       in->caps_dirty()) {
+      dout(20) << " keeping cap on " << *in << " used " << ccap_string(in->caps_used())
+              << " dirty " << ccap_string(in->caps_dirty()) << dendl;
+      continue;
+    }
+    dout(20) << " removing unused cap on " << *in << dendl;
+    remove_cap(in, mds);
+    trimmed++;
+  }
+}
+
 void Client::mark_caps_dirty(Inode *in, int caps)
 {
   dout(10) << "mark_caps_dirty " << *in << " " << ccap_string(in->dirty_caps) << " -> "
index a0aaae455517069e4481a1fce4173fcd11e21dee..f0062b3a0e5a5ac0f894566c77d775bb1a5d44a4 100644 (file)
@@ -866,6 +866,7 @@ protected:
   void remove_cap(Inode *in, int mds);
   void remove_all_caps(Inode *in);
   void remove_session_caps(int mds_num);
+  void trim_caps(int mds, int max);
   void mark_caps_dirty(Inode *in, int caps);
 
   void maybe_update_snaprealm(SnapRealm *realm, snapid_t snap_created, snapid_t snap_highwater, 
index c823f0f0177e4a29d0ec5ab96739c744b0b7ff47..e625beb6079d34e41cebfa594a2e3fb4e2fe82f1 100644 (file)
@@ -24,6 +24,8 @@ public:
   int get_op() { return head.op; }
   version_t get_seq() { return head.seq; }
   utime_t get_stamp() { return utime_t(head.stamp); }
+  int get_max_caps() { return head.max_caps; }
+  int get_max_leases() { return head.max_leases; }
 
   MClientSession() : Message(CEPH_MSG_CLIENT_SESSION) { }
   MClientSession(int o, version_t s=0) :