]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add bulk MClientCapRelease message
authorSage Weil <sage@newdream.net>
Mon, 30 Mar 2009 22:58:54 +0000 (15:58 -0700)
committerSage Weil <sage@newdream.net>
Tue, 31 Mar 2009 17:24:31 +0000 (10:24 -0700)
src/Makefile.am
src/include/ceph_fs.h
src/include/types.h
src/mds/Locker.cc
src/mds/Locker.h
src/messages/MClientCapRelease.h [new file with mode: 0644]
src/msg/Message.cc

index 470d292df02ec9164287de6f974460304708d85c..23059cde6a73bcce218800b3f3820a9b1d5674e8 100644 (file)
@@ -464,6 +464,7 @@ noinst_HEADERS = \
         mds/snap.h\
         messages/MCacheExpire.h\
         messages/MClientCaps.h\
+        messages/MClientCapRelease.h\
         messages/MClientLease.h\
         messages/MClientMount.h\
         messages/MClientMountAck.h\
index 3a1fbcdbf9b463c99f4a6bb87dab0b2f4dfbc1be..fa62f4c62a0a1766ed3b6c3e6475366accb88d39 100644 (file)
@@ -541,6 +541,7 @@ struct ceph_msg_footer {
 #define CEPH_MSG_CLIENT_CAPS            0x310
 #define CEPH_MSG_CLIENT_LEASE           0x311
 #define CEPH_MSG_CLIENT_SNAP            0x312
+#define CEPH_MSG_CLIENT_CAPRELEASE      0x313
 
 /* osd */
 #define CEPH_MSG_OSD_GETMAP       40
@@ -1105,6 +1106,15 @@ struct ceph_mds_caps {
        __le32 time_warp_seq;
 } __attribute__ ((packed));
 
+struct ceph_mds_cap_release {
+       __le32 num;
+} __attribute__ ((packed));
+
+struct ceph_mds_cap_item {
+       __le64 ino;
+       __le64 cap_id;
+       __le32 migrate_seq, seq;
+} __attribute__ ((packed));
 
 #define CEPH_MDS_LEASE_REVOKE           1  /*    mds  -> client */
 #define CEPH_MDS_LEASE_RELEASE          2  /* client  -> mds    */
index 4405d0015af0324c8fbf44de355517677ad8ad1e..8fe5aace9c0df0120253067b978a64390f1ad4f1 100644 (file)
@@ -202,6 +202,8 @@ WRITE_RAW_ENCODER(ceph_file_layout)
 WRITE_RAW_ENCODER(ceph_client_ticket)
 WRITE_RAW_ENCODER(ceph_mds_request_head)
 WRITE_RAW_ENCODER(ceph_mds_caps)
+WRITE_RAW_ENCODER(ceph_mds_cap_release)
+WRITE_RAW_ENCODER(ceph_mds_cap_item)
 WRITE_RAW_ENCODER(ceph_mds_lease)
 WRITE_RAW_ENCODER(ceph_mds_snap_head)
 WRITE_RAW_ENCODER(ceph_mds_snap_realm)
index eb6e3e755fba31b44c301db4c1748efe3a2869c1..fadb545e73bebe284259b3d81d864efbc8c24c98 100644 (file)
@@ -46,6 +46,7 @@
 #include "messages/MClientRequest.h"
 #include "messages/MClientReply.h"
 #include "messages/MClientCaps.h"
+#include "messages/MClientCapRelease.h"
 
 #include "messages/MMDSSlaveRequest.h"
 
@@ -80,6 +81,9 @@ void Locker::dispatch(Message *m)
   case CEPH_MSG_CLIENT_CAPS:
     handle_client_caps((MClientCaps*)m);
     break;
+  case CEPH_MSG_CLIENT_CAPRELEASE:
+    handle_client_cap_release((MClientCapRelease*)m);
+    break;
   case CEPH_MSG_CLIENT_LEASE:
     handle_client_lease((MClientLease*)m);
     break;
@@ -1754,6 +1758,43 @@ bool Locker::_do_cap_update(CInode *in, Capability *cap,
   return true;
 }
 
+void Locker::handle_client_cap_release(MClientCapRelease *m)
+{
+  int client = m->get_source().num();
+  dout(10) << "handle_client_cap_release " << *m << dendl;
+
+  for (vector<ceph_mds_cap_item>::iterator p = m->caps.begin(); p != m->caps.end(); p++) {
+    inodeno_t ino((__u64)p->ino);
+    CInode *in = mdcache->get_inode(ino);
+    if (!in) {
+      dout(10) << " missing ino " << ino << dendl;
+      continue;
+    }
+    Capability *cap = in->get_client_cap(client);
+    if (!cap) {
+      dout(10) << " no cap on " << *in << dendl;
+      continue;
+    }
+    if (cap->get_cap_id() != p->cap_id) {
+      dout(7) << " ignoring client capid " << p->cap_id << " != my " << cap->get_cap_id() << " on " << *in << dendl;
+      continue;
+    }
+    if (ceph_seq_cmp(p->migrate_seq, cap->get_mseq()) < 0) {
+      dout(7) << " mseq " << p->migrate_seq << " < " << cap->get_mseq()
+             << " on " << *in << dendl;
+      continue;
+    }
+    if (p->seq != cap->get_last_sent()) {
+      dout(10) << " seq " << p->seq << " != " << cap->get_last_seq() << " on " << *in << dendl;
+      continue;
+    }
+
+    dout(7) << "removing cap on " << *in << dendl;
+    mdcache->remove_client_cap(in, client, false);
+  }
+
+  delete m;
+}
 
 void Locker::handle_client_lease(MClientLease *m)
 {
index 454d0dbc3398258917a81920b68b0dc174001a9c..e7db57984059b19e361e2a479b2fa7f1e128ca89 100644 (file)
@@ -186,6 +186,7 @@ public:
   bool _do_cap_update(CInode *in, Capability *cap, int had, int wanted, snapid_t follows, MClientCaps *m,
                      MClientCaps *ack=0, ceph_seq_t releasecap=0);
   void _finish_release_cap(CInode *in, int client, ceph_seq_t seq, MClientCaps *ack);
+  void handle_client_cap_release(class MClientCapRelease *m);
 
 public:
   void request_inode_file_caps(CInode *in);
diff --git a/src/messages/MClientCapRelease.h b/src/messages/MClientCapRelease.h
new file mode 100644 (file)
index 0000000..2228c8c
--- /dev/null
@@ -0,0 +1,48 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software 
+ * Foundation.  See file COPYING.
+ * 
+ */
+
+#ifndef __MCLIENTCAPRELEASE_H
+#define __MCLIENTCAPRELEASE_H
+
+#include "msg/Message.h"
+
+
+class MClientCapRelease : public Message {
+ public:
+  struct ceph_mds_cap_release head;
+  vector<ceph_mds_cap_item> caps;
+
+  MClientCapRelease() : 
+    Message(CEPH_MSG_CLIENT_CAPRELEASE) {
+    memset(&head, 0, sizeof(head));
+  }
+
+  const char *get_type_name() { return "client_cap_release";}
+  void print(ostream& out) {
+    out << "client_cap_release(" << head.num << ")";
+  }
+  
+  void decode_payload() {
+    bufferlist::iterator p = payload.begin();
+    ::decode(head, p);
+    ::decode_nohead(head.num, caps, p);
+  }
+  void encode_payload() {
+    head.num = caps.size();
+    ::encode(head, payload);
+    ::encode_nohead(caps, payload);
+  }
+};
+
+#endif
index ad2f1779fe1dff77408d78a0c777e8b9c7860fde..e0e3de3cd829df558dc0aad8a9981170b8840ce0 100644 (file)
@@ -62,6 +62,7 @@ using namespace std;
 #include "messages/MClientRequestForward.h"
 #include "messages/MClientReply.h"
 #include "messages/MClientCaps.h"
+#include "messages/MClientCapRelease.h"
 #include "messages/MClientLease.h"
 #include "messages/MClientSnap.h"
 
@@ -285,6 +286,9 @@ Message *decode_message(ceph_msg_header& header, ceph_msg_footer& footer,
   case CEPH_MSG_CLIENT_CAPS:
     m = new MClientCaps;
     break;
+  case CEPH_MSG_CLIENT_CAPRELEASE:
+    m = new MClientCapRelease;
+    break;
   case CEPH_MSG_CLIENT_LEASE:
     m = new MClientLease;
     break;