From 40179fbeac7db727a8956a05579f22f20a51251a Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Tue, 16 Mar 2010 12:53:44 -0700 Subject: [PATCH] msg: Add a new MForward message for encapsulating client caps and messages --- src/Makefile.am | 1 + src/messages/MForward.h | 76 +++++++++++++++++++++++++++++++++++++++++ src/msg/Message.cc | 4 +++ src/msg/Message.h | 1 + 4 files changed, 82 insertions(+) create mode 100644 src/messages/MForward.h diff --git a/src/Makefile.am b/src/Makefile.am index 2bafe536c7101..e8aac538cf4af 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 index 0000000000000..0fb617e27cab9 --- /dev/null +++ b/src/messages/MForward.h @@ -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 + * + * 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 diff --git a/src/msg/Message.cc b/src/msg/Message.cc index 97df383ddffb4..969ee89ef1100 100644 --- a/src/msg/Message.cc +++ b/src/msg/Message.cc @@ -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; diff --git a/src/msg/Message.h b/src/msg/Message.h index cc16d5784b10d..79795067a015f 100644 --- a/src/msg/Message.h +++ b/src/msg/Message.h @@ -42,6 +42,7 @@ #define MSG_POOLOPREPLY 48 #define MSG_ROUTE 47 +#define MSG_FORWARD 46 #define MSG_PAXOS 40 -- 2.39.5