]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
msg: Add a new MForward message for encapsulating client caps and messages
authorGreg Farnum <gregf@hq.newdream.net>
Tue, 16 Mar 2010 19:53:44 +0000 (12:53 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Wed, 17 Mar 2010 21:57:12 +0000 (14:57 -0700)
src/Makefile.am
src/messages/MForward.h [new file with mode: 0644]
src/msg/Message.cc
src/msg/Message.h

index 2bafe536c7101a28fb86bacd379f1ed6a17c9803..e8aac538cf4af49e1ac52dfa1a0a0134c8bc1d6d 100644 (file)
@@ -665,6 +665,7 @@ noinst_HEADERS = \
        messages/MPoolOpReply.h\
         messages/MRemoveSnaps.h\
        messages/MRoute.h\
+       messages/MForward.h\
         messages/MStatfs.h\
         messages/MStatfsReply.h\
        messages/PaxosServiceMessage.h\
diff --git a/src/messages/MForward.h b/src/messages/MForward.h
new file mode 100644 (file)
index 0000000..0fb617e
--- /dev/null
@@ -0,0 +1,76 @@
+// -*- 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-2010 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.
+ * 
+ * Client requests often need to get forwarded from some monitor
+ * to the leader. This class encapsulates the original message
+ * along with the client's caps so the leader can do proper permissions
+ * checking.
+ */
+
+#ifndef __MFORWARD_H
+#define __MFORWARD_H
+
+#include "msg/Message.h"
+#include "mon/MonCaps.h"
+#include "include/encoding.h"
+
+struct MForward : public Message {
+  PaxosServiceMessage *msg;
+  entity_inst_t client;
+  MonCaps client_caps;
+  bool has_caps;
+  
+  MForward() : Message(MSG_FORWARD), msg(NULL), has_caps(false) {}
+  //the message needs to have caps filled in!
+  MForward(PaxosServiceMessage *m) :
+    Message(MSG_FORWARD), msg(m) {
+    client = m->get_source_inst();
+    if (m->caps) {
+      client_caps = *m->caps;
+      has_caps = true;
+    } else {
+      has_caps = false;
+      generic_dout(10) << "creating MForward without caps on message " 
+                      << m << dendl;
+    }
+  }
+
+  ~MForward() {
+    delete msg;
+  }
+  
+  void encode_payload() {
+    ::encode(client, payload);
+    ::encode(has_caps, payload);
+    ::encode(client_caps, payload);
+    encode_message(msg, payload);
+  }
+
+  void decode_payload() {
+    bufferlist::iterator p = payload.begin();
+    ::decode(client, p);
+    ::decode(has_caps, p);
+    ::decode(client_caps, p);
+    msg = (PaxosServiceMessage *)decode_message(p);
+    if (has_caps) msg->caps = &client_caps;
+    else msg->caps = NULL;
+  }
+
+  const char *get_type_name() { return "forward"; }
+  void print(ostream& o) {
+    if (msg)
+      o << "forward(" << *msg << ") to leader";
+    else o << "forward(??? ) to leader";
+  }
+};
+  
+#endif
index 97df383ddffb45a805179e7e3737e5545bb80e8a..969ee89ef11002b7ff787df0a3ad29c821121571 100644 (file)
@@ -36,6 +36,7 @@ using namespace std;
 #include "messages/MPing.h"
 
 #include "messages/MRoute.h"
+#include "messages/MForward.h"
 
 #include "messages/MOSDBoot.h"
 #include "messages/MOSDAlive.h"
@@ -242,6 +243,9 @@ Message *decode_message(ceph_msg_header& header, ceph_msg_footer& footer,
   case MSG_ROUTE:
     m = new MRoute;
     break;
+  case MSG_FORWARD:
+    m = new MForward;
+    break;
     
   case CEPH_MSG_MON_MAP:
     m = new MMonMap;
index cc16d5784b10d53b82cf86f253bed14391c3c048..79795067a015fc56429dce26c5da1de2cefddfa1 100644 (file)
@@ -42,6 +42,7 @@
 #define MSG_POOLOPREPLY            48
 
 #define MSG_ROUTE                  47
+#define MSG_FORWARD                46
 
 #define MSG_PAXOS                  40