From 836e4f01436161f4b121856ffa7ccf3fc93e64ef Mon Sep 17 00:00:00 2001 From: sage Date: Thu, 20 Dec 2007 08:24:40 -0800 Subject: [PATCH] subop messages --- src/messages/MOSDSubOp.h | 124 ++++++++++++++++++++++++++++++++++ src/messages/MOSDSubOpReply.h | 124 ++++++++++++++++++++++++++++++++++ src/msg/Message.cc | 8 +++ src/msg/Message.h | 2 + 4 files changed, 258 insertions(+) create mode 100644 src/messages/MOSDSubOp.h create mode 100644 src/messages/MOSDSubOpReply.h diff --git a/src/messages/MOSDSubOp.h b/src/messages/MOSDSubOp.h new file mode 100644 index 0000000000000..9f4e77bb8c8e0 --- /dev/null +++ b/src/messages/MOSDSubOp.h @@ -0,0 +1,124 @@ +// -*- 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 + * + * 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 __MOSDSUBOP_H +#define __MOSDSUBOP_H + +#include "msg/Message.h" +#include "osd/osd_types.h" + +/* + * OSD sub op - for internal ops on pobjects between primary and replicas(/stripes/whatever) + */ + +class MOSDSubOp : public Message { +public: +private: + struct st_ { + epoch_t map_epoch; + + // metadata from original request + osdreqid_t reqid; + + // subop + pg_t pgid; + pobject_t poid; + int32_t op; + off_t offset, length; + + // subop metadata + tid_t rep_tid; + eversion_t version; + + // piggybacked osd/og state + eversion_t pg_trim_to; // primary->replica: trim to here + osd_peer_stat_t peer_stat; + } st; + + map attrset; + + +public: + const epoch_t get_map_epoch() { return st.map_epoch; } + + const osdreqid_t& get_reqid() { return st.reqid; } + + bool wants_reply() { + if (st.op < 100) return true; + return false; // no reply needed for primary-lock, -unlock. + } + + const pg_t get_pg() { return st.pgid; } + const pobject_t get_poid() { return st.poid; } + const int get_op() { return st.op; } + bool is_read() { return st.op < 10; } + const off_t get_length() { return st.length; } + const off_t get_offset() { return st.offset; } + + const tid_t get_rep_tid() { return st.rep_tid; } + const eversion_t get_version() { return st.version; } + const eversion_t get_pg_trim_to() { return st.pg_trim_to; } + void set_pg_trim_to(eversion_t v) { st.pg_trim_to = v; } + + map& get_attrset() { return attrset; } + void set_attrset(map &as) { attrset.swap(as); } + + void set_peer_stat(const osd_peer_stat_t& stat) { st.peer_stat = stat; } + const osd_peer_stat_t& get_peer_stat() { return st.peer_stat; } + + MOSDSubOp(osdreqid_t r, pg_t p, pobject_t po, int o, off_t of, off_t le, + epoch_t mape, tid_t rtid, eversion_t v, evertsion_t pgtt) : + Message(CEPH_MSG_OSD_SUBOP) { + memset(&st, 0, sizeof(st)); + st.reqid = r; + + st.pgid = p; + st.poid = po; + st.o = op; + st.of = offset; + st.le = length; + st.map_epoch = mape; + st.rep_tid = rtid; + st.version = v; + st.pg_trim_to = pgtt; + } + MOSDSubOp() {} + + // marshalling + virtual void decode_payload() { + int off = 0; + ::_decode(st, payload, off); + ::_decode(attrset, payload, off); + } + + virtual void encode_payload() { + ::_encode(st, payload); + ::_encode(attrset, payload); + env.data_off = st.offset; + } + + virtual char *get_type_name() { return "osd_sub_op"; } + void print(ostream& out) { + out << "osd_sub_op(" << st.reqid + << " " << get_opname(st.op) + << " " << st.poid + << " v" << st.version; + if (st.length) out << " " << st.offset << "~" << st.length; + out << ")"; + } +}; + + +#endif diff --git a/src/messages/MOSDSubOpReply.h b/src/messages/MOSDSubOpReply.h new file mode 100644 index 0000000000000..c65f9f5614953 --- /dev/null +++ b/src/messages/MOSDSubOpReply.h @@ -0,0 +1,124 @@ +// -*- 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 + * + * 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 __MOSDSUBOPREPLY_H +#define __MOSDSUBOPREPLY_H + +#include "msg/Message.h" + +#include "MOSDSubOp.h" +#include "osd/ObjectStore.h" + +/* + * OSD op reply + * + * oid - object id + * op - OSD_OP_DELETE, etc. + * + */ + +class MOSDSubOpReply : public Message { + struct st_t { + epoch_t map_epoch; + + // subop metadata + pg_t pgid; + tid_t rep_tid; + int32_t op; + pobject_t poid; + off_t length, offset; + + // result + bool commit; + int32_t result; + + // piggybacked osd state + eversion_t pg_complete_thru; + osd_peer_stat_t peer_stat; + } st; + + map attrset; + + public: + epoch_t get_map_epoch() { return st.map_epoch; } + + pg_t get_pg() { return st.pgid; } + tid_t get_rep_tid() { return st.rep_tid; } + int get_op() { return st.op; } + pobject_t get_poid() { return st.poid; } + const off_t get_length() { return st.length; } + const off_t get_offset() { return st.offset; } + + bool get_commit() { return st.commit; } + int get_result() { return st.result; } + + void set_pg_complete_thru(eversion_t v) { st.pg_complete_thru = v; } + eversion_t get_pg_complete_thru() { return st.pg_complete_thru; } + + void set_peer_stat(const osd_peer_stat_t& stat) { st.peer_stat = stat; } + const osd_peer_stat_t& get_peer_stat() { return st.peer_stat; } + + void set_attrset(map &as) { attrset = as; } + map& get_attrset() { return attrset; } + +public: + MOSDSubOpReply(MOSDSubOp *req, int result, epoch_t e, bool commit) : + Message(CEPH_MSG_OSD_OPREPLY) { + st.map_epoch = e; + st.pgid = req->get_pg(); + st.rep_tid = req->get_rep_tid(); + st.op = req->get_op(); + st.poid = req->get_poid(); + st.commit = commit; + st.result = result; + st.length = req->get_length(); + st.offset = req->get_offset(); + } + MOSDSubOpReply() {} + + + // marshalling + virtual void decode_payload() { + int off = 0; + ::_decode(st, payload, off); + ::_decode(attrset, payload, off); + } + virtual void encode_payload() { + ::_encode(st, payload); + ::_encode(attrset, payload); + env.data_off = st.offset; + } + + virtual char *get_type_name() { return "osd_op_reply"; } + + void print(ostream& out) { + out << "osd_op_reply(" << st.reqid + << " " << MOSDOp::get_opname(st.op) + << " " << st.oid; + if (st.length) out << " " << st.offset << "~" << st.length; + if (st.op >= 10) { + if (st.commit) + out << " commit"; + else + out << " ack"; + } + out << " = " << st.result; + out << ")"; + } + +}; + + +#endif diff --git a/src/msg/Message.cc b/src/msg/Message.cc index fbf73e629b696..2ee7e0faa9e0e 100644 --- a/src/msg/Message.cc +++ b/src/msg/Message.cc @@ -32,6 +32,8 @@ using namespace std; #include "messages/MOSDPing.h" #include "messages/MOSDOp.h" #include "messages/MOSDOpReply.h" +#include "messages/MOSDSubOp.h" +#include "messages/MOSDSubOpReply.h" #include "messages/MOSDMap.h" #include "messages/MOSDGetMap.h" @@ -173,6 +175,12 @@ decode_message(ceph_msg_header& env, bufferlist& front, bufferlist& data) case CEPH_MSG_OSD_OPREPLY: m = new MOSDOpReply(); break; + case CEPH_MSG_OSD_SUBOP: + m = new MOSDSubOp(); + break; + case CEPH_MSG_OSD_SUBOPREPLY: + m = new MOSDSubOpReply(); + break; case CEPH_MSG_OSD_MAP: m = new MOSDMap(); diff --git a/src/msg/Message.h b/src/msg/Message.h index 75b50c4be411a..6f0b3f1b72d3d 100644 --- a/src/msg/Message.h +++ b/src/msg/Message.h @@ -33,6 +33,8 @@ #define MSG_OSD_IN 73 #define MSG_OSD_OUT 74 +#define MSG_OSD_SUBOP 75 + #define MSG_OSD_PG_NOTIFY 80 #define MSG_OSD_PG_QUERY 81 #define MSG_OSD_PG_SUMMARY 82 -- 2.39.5