+++ /dev/null
-// -*- 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 CEPH_MOSDSUBOP_H
-#define CEPH_MOSDSUBOP_H
-
-#include "MOSDFastDispatchOp.h"
-
-#include "include/ceph_features.h"
-
-/*
- * OSD sub op - for internal ops on pobjects between primary and replicas(/stripes/whatever)
- */
-
-class MOSDSubOp : public MOSDFastDispatchOp {
-
- static const int HEAD_VERSION = 12;
- static const int COMPAT_VERSION = 7;
-
-public:
- epoch_t map_epoch = 0;
-
- // metadata from original request
- osd_reqid_t reqid;
-
- // subop
- pg_shard_t from;
- spg_t pgid;
- hobject_t poid;
- object_locator_t oloc;
-
- __u8 acks_wanted = 0;
-
- // op to exec
- vector<OSDOp> ops;
- utime_t mtime;
-
- bool old_exists = false;
- uint64_t old_size = 0;
- eversion_t old_version;
-
- SnapSet snapset;
-
- // transaction to exec
- bufferlist logbl;
- pg_stat_t pg_stats;
-
- // subop metadata
- eversion_t version;
-
- // piggybacked osd/og state
- eversion_t pg_trim_to; // primary->replica: trim to here
- eversion_t pg_roll_forward_to; // primary->replica: trim rollback
- // info to here
- osd_peer_stat_t peer_stat;
-
- map<string,bufferlist> attrset;
-
- interval_set<uint64_t> data_subset;
- map<hobject_t, interval_set<uint64_t>> clone_subsets;
-
- bool first = false, complete = false;
- bool bdata_encode;
-
- interval_set<uint64_t> data_included;
- ObjectRecoveryInfo recovery_info;
-
- // reflects result of current push
- ObjectRecoveryProgress recovery_progress;
-
- // reflects progress before current push
- ObjectRecoveryProgress current_progress;
-
- map<string,bufferlist> omap_entries;
- bufferlist omap_header;
-
-
- hobject_t new_temp_oid; ///< new temp object that we must now start tracking
- hobject_t discard_temp_oid; ///< previously used temp object that we can now stop tracking
-
- /// non-empty if this transaction involves a hit_set history update
- boost::optional<pg_hit_set_history_t> updated_hit_set_history;
-
- epoch_t get_map_epoch() const override {
- return map_epoch;
- }
- spg_t get_spg() const override {
- return pgid;
- }
-
- int get_cost() const override {
- if (ops.size() == 1 && ops[0].op.op == CEPH_OSD_OP_PULL)
- return ops[0].op.extent.length;
- return data.length();
- }
-
- void decode_payload() override {
- //since we drop incorrect_pools flag, now we only support
- //version >=7
- assert (header.version >= 7);
- bufferlist::iterator p = payload.begin();
- ::decode(map_epoch, p);
- ::decode(reqid, p);
- ::decode(pgid.pgid, p);
- ::decode(poid, p);
-
- __u32 num_ops;
- ::decode(num_ops, p);
- ops.resize(num_ops);
- unsigned off = 0;
- for (unsigned i = 0; i < num_ops; i++) {
- ::decode(ops[i].op, p);
- ops[i].indata.substr_of(data, off, ops[i].op.payload_len);
- off += ops[i].op.payload_len;
- }
- ::decode(mtime, p);
- //we don't need noop anymore
- bool noop_dont_need;
- ::decode(noop_dont_need, p);
-
- ::decode(acks_wanted, p);
- ::decode(version, p);
- ::decode(old_exists, p);
- ::decode(old_size, p);
- ::decode(old_version, p);
- ::decode(snapset, p);
-
- if (header.version <= 11) {
- SnapContext snapc_dont_need;
- ::decode(snapc_dont_need, p);
- }
-
- ::decode(logbl, p);
- ::decode(pg_stats, p);
- ::decode(pg_trim_to, p);
- ::decode(peer_stat, p);
- ::decode(attrset, p);
-
- ::decode(data_subset, p);
- ::decode(clone_subsets, p);
-
- ::decode(first, p);
- ::decode(complete, p);
- ::decode(oloc, p);
- ::decode(data_included, p);
- recovery_info.decode(p, pgid.pool());
- ::decode(recovery_progress, p);
- ::decode(current_progress, p);
- ::decode(omap_entries, p);
- ::decode(omap_header, p);
-
- if (header.version >= 8) {
- ::decode(new_temp_oid, p);
- ::decode(discard_temp_oid, p);
- }
-
- if (header.version >= 9) {
- ::decode(from, p);
- ::decode(pgid.shard, p);
- } else {
- from = pg_shard_t(
- get_source().num(),
- shard_id_t::NO_SHARD);
- pgid.shard = shard_id_t::NO_SHARD;
- }
- if (header.version >= 10) {
- ::decode(updated_hit_set_history, p);
- }
- if (header.version >= 11) {
- ::decode(pg_roll_forward_to, p);
- } else {
- pg_roll_forward_to = pg_trim_to;
- }
- }
-
- void finish_decode() { }
-
- void encode_payload(uint64_t features) override {
- header.version = HEAD_VERSION;
- ::encode(map_epoch, payload);
- ::encode(reqid, payload);
- ::encode(pgid.pgid, payload);
- ::encode(poid, payload);
-
- __u32 num_ops = ops.size();
- ::encode(num_ops, payload);
- for (unsigned i = 0; i < ops.size(); i++) {
- ops[i].op.payload_len = ops[i].indata.length();
- ::encode(ops[i].op, payload);
- if(false == bdata_encode) {
- data.append(ops[i].indata);
- bdata_encode = true;
- }
- }
- ::encode(mtime, payload);
- //encode a false here for backward compatiable
- ::encode(false, payload);
- ::encode(acks_wanted, payload);
- ::encode(version, payload);
- ::encode(old_exists, payload);
- ::encode(old_size, payload);
- ::encode(old_version, payload);
- ::encode(snapset, payload);
-
- if ((features & CEPH_FEATURE_OSDSUBOP_NO_SNAPCONTEXT) == 0) {
- header.version = 11;
- SnapContext dummy_snapc;
- ::encode(dummy_snapc, payload);
- }
-
- ::encode(logbl, payload);
- ::encode(pg_stats, payload);
- ::encode(pg_trim_to, payload);
- ::encode(peer_stat, payload);
- ::encode(attrset, payload);
- ::encode(data_subset, payload);
- ::encode(clone_subsets, payload);
- if (ops.size())
- header.data_off = ops[0].op.extent.offset;
- else
- header.data_off = 0;
- ::encode(first, payload);
- ::encode(complete, payload);
- ::encode(oloc, payload);
- ::encode(data_included, payload);
- ::encode(recovery_info, payload, features);
- ::encode(recovery_progress, payload);
- ::encode(current_progress, payload);
- ::encode(omap_entries, payload);
- ::encode(omap_header, payload);
- ::encode(new_temp_oid, payload);
- ::encode(discard_temp_oid, payload);
- ::encode(from, payload);
- ::encode(pgid.shard, payload);
- ::encode(updated_hit_set_history, payload);
- ::encode(pg_roll_forward_to, payload);
- }
-
- MOSDSubOp()
- : MOSDFastDispatchOp(MSG_OSD_SUBOP, HEAD_VERSION, COMPAT_VERSION),
- bdata_encode(false) { }
- MOSDSubOp(osd_reqid_t r, pg_shard_t from,
- spg_t p, const hobject_t& po, int aw,
- epoch_t mape, ceph_tid_t rtid, eversion_t v)
- : MOSDFastDispatchOp(MSG_OSD_SUBOP, HEAD_VERSION, COMPAT_VERSION),
- map_epoch(mape),
- reqid(r),
- from(from),
- pgid(p),
- poid(po),
- acks_wanted(aw),
- old_exists(false), old_size(0),
- version(v),
- first(false), complete(false),
- bdata_encode(false) {
- memset(&peer_stat, 0, sizeof(peer_stat));
- set_tid(rtid);
- }
-private:
- ~MOSDSubOp() override {}
-
-public:
- const char *get_type_name() const override { return "osd_sub_op"; }
- void print(ostream& out) const override {
- out << "osd_sub_op(" << reqid
- << " " << pgid
- << " " << poid
- << " " << ops;
- if (first)
- out << " first";
- if (complete)
- out << " complete";
- out << " v " << version
- << " snapset=" << snapset;
- if (!data_subset.empty()) out << " subset " << data_subset;
- if (updated_hit_set_history)
- out << ", has_updated_hit_set_history";
- out << ")";
- }
-};
-
-
-#endif
+++ /dev/null
-// -*- 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 CEPH_MOSDSUBOPREPLY_H
-#define CEPH_MOSDSUBOPREPLY_H
-
-#include "MOSDFastDispatchOp.h"
-
-#include "MOSDSubOp.h"
-#include "os/ObjectStore.h"
-
-/*
- * OSD op reply
- *
- * oid - object id
- * op - OSD_OP_DELETE, etc.
- *
- */
-
-class MOSDSubOpReply : public MOSDFastDispatchOp {
- static const int HEAD_VERSION = 2;
- static const int COMPAT_VERSION = 1;
-public:
- epoch_t map_epoch = 0;
-
- // subop metadata
- osd_reqid_t reqid;
- pg_shard_t from;
- spg_t pgid;
- hobject_t poid;
-
- vector<OSDOp> ops;
-
- // result
- __u8 ack_type = 0;
- int32_t result = 0;
-
- // piggybacked osd state
- eversion_t last_complete_ondisk;
- osd_peer_stat_t peer_stat;
-
- map<string,bufferptr> attrset;
-
- epoch_t get_map_epoch() const override {
- return map_epoch;
- }
- spg_t get_spg() const override {
- return pgid;
- }
-
- void decode_payload() override {
- bufferlist::iterator p = payload.begin();
- ::decode(map_epoch, p);
- ::decode(reqid, p);
- ::decode(pgid.pgid, p);
- ::decode(poid, p);
-
- unsigned num_ops;
- ::decode(num_ops, p);
- ops.resize(num_ops);
- for (unsigned i = 0; i < num_ops; i++) {
- ::decode(ops[i].op, p);
- }
- ::decode(ack_type, p);
- ::decode(result, p);
- ::decode(last_complete_ondisk, p);
- ::decode(peer_stat, p);
- ::decode(attrset, p);
-
- if (!poid.is_max() && poid.pool == -1)
- poid.pool = pgid.pool();
-
- if (header.version >= 2) {
- ::decode(from, p);
- ::decode(pgid.shard, p);
- } else {
- from = pg_shard_t(
- get_source().num(),
- shard_id_t::NO_SHARD);
- pgid.shard = shard_id_t::NO_SHARD;
- }
- }
-
- void finish_decode() { }
-
- void encode_payload(uint64_t features) override {
- ::encode(map_epoch, payload);
- ::encode(reqid, payload);
- ::encode(pgid.pgid, payload);
- ::encode(poid, payload);
- __u32 num_ops = ops.size();
- ::encode(num_ops, payload);
- for (unsigned i = 0; i < ops.size(); i++) {
- ::encode(ops[i].op, payload);
- }
- ::encode(ack_type, payload);
- ::encode(result, payload);
- ::encode(last_complete_ondisk, payload);
- ::encode(peer_stat, payload);
- ::encode(attrset, payload);
- ::encode(from, payload);
- ::encode(pgid.shard, payload);
- }
-
- epoch_t get_map_epoch() { return map_epoch; }
-
- spg_t get_pg() const { return pgid; }
- const hobject_t& get_poid() const { return poid; }
-
- int get_ack_type() { return ack_type; }
- bool is_ondisk() { return ack_type & CEPH_OSD_FLAG_ONDISK; }
- bool is_onnvram() { return ack_type & CEPH_OSD_FLAG_ONNVRAM; }
-
- int get_result() { return result; }
-
- void set_last_complete_ondisk(eversion_t v) { last_complete_ondisk = v; }
- eversion_t get_last_complete_ondisk() { return last_complete_ondisk; }
-
- void set_peer_stat(const osd_peer_stat_t& stat) { peer_stat = stat; }
- const osd_peer_stat_t& get_peer_stat() { return peer_stat; }
-
- void set_attrset(map<string,bufferptr> &as) { attrset = as; }
- map<string,bufferptr>& get_attrset() { return attrset; }
-
-public:
- MOSDSubOpReply(
- const MOSDSubOp *req, pg_shard_t from, int result_, epoch_t e, int at)
- : MOSDFastDispatchOp(MSG_OSD_SUBOPREPLY, HEAD_VERSION, COMPAT_VERSION),
- map_epoch(e),
- reqid(req->reqid),
- from(from),
- pgid(req->pgid.pgid, req->from.shard),
- poid(req->poid),
- ops(req->ops),
- ack_type(at),
- result(result_) {
- memset(&peer_stat, 0, sizeof(peer_stat));
- set_tid(req->get_tid());
- }
- MOSDSubOpReply()
- : MOSDFastDispatchOp(MSG_OSD_SUBOPREPLY, HEAD_VERSION, COMPAT_VERSION) {}
-private:
- ~MOSDSubOpReply() override {}
-
-public:
- const char *get_type_name() const override { return "osd_subop_reply"; }
-
- void print(ostream& out) const override {
- out << "osd_sub_op_reply(" << reqid
- << " " << pgid
- << " " << poid << " " << ops;
- if (ack_type & CEPH_OSD_FLAG_ONDISK)
- out << " ondisk";
- if (ack_type & CEPH_OSD_FLAG_ONNVRAM)
- out << " onnvram";
- if (ack_type & CEPH_OSD_FLAG_ACK)
- out << " ack";
- out << ", result = " << result;
- out << ")";
- }
-
-};
-
-
-#endif
#include "messages/MOSDPing.h"
#include "messages/MOSDOp.h"
#include "messages/MOSDOpReply.h"
-#include "messages/MOSDSubOp.h"
-#include "messages/MOSDSubOpReply.h"
#include "messages/MOSDRepOp.h"
#include "messages/MOSDRepOpReply.h"
#include "messages/MOSDMap.h"
case CEPH_MSG_OSD_OPREPLY:
m = new MOSDOpReply();
break;
- case MSG_OSD_SUBOP:
- m = new MOSDSubOp();
- break;
- case MSG_OSD_SUBOPREPLY:
- m = new MOSDSubOpReply();
- break;
case MSG_OSD_REPOP:
m = new MOSDRepOp();
break;
#define MSG_OSD_MARK_ME_DOWN 74
#define MSG_OSD_FULL 75
-#define MSG_OSD_SUBOP 76
-#define MSG_OSD_SUBOPREPLY 77
+// removed right after luminous
+//#define MSG_OSD_SUBOP 76
+//#define MSG_OSD_SUBOPREPLY 77
#define MSG_OSD_PGTEMP 78
switch (m->get_type()) {
case CEPH_MSG_OSD_OP:
case CEPH_MSG_OSD_BACKOFF:
- case MSG_OSD_SUBOP:
case MSG_OSD_REPOP:
- case MSG_OSD_SUBOPREPLY:
case MSG_OSD_REPOPREPLY:
case MSG_OSD_PG_PUSH:
case MSG_OSD_PG_PULL:
#include "common/config.h"
#include "msg/Message.h"
#include "messages/MOSDOp.h"
-#include "messages/MOSDSubOp.h"
-#include "messages/MOSDSubOpReply.h"
#include "messages/MOSDRepOp.h"
#include "messages/MOSDRepOpReply.h"
#include "include/assert.h"
}
if (req->get_type() == CEPH_MSG_OSD_OP) {
reqid = static_cast<MOSDOp*>(req)->get_reqid();
- } else if (req->get_type() == MSG_OSD_SUBOP) {
- reqid = static_cast<MOSDSubOp*>(req)->reqid;
- } else if (req->get_type() == MSG_OSD_SUBOPREPLY) {
- reqid = static_cast<MOSDSubOpReply*>(req)->reqid;
} else if (req->get_type() == MSG_OSD_REPOP) {
reqid = static_cast<MOSDRepOp*>(req)->reqid;
} else if (req->get_type() == MSG_OSD_REPOPREPLY) {
#include "messages/MOSDPGUpdateLogMissingReply.h"
#include "messages/MOSDBackoff.h"
#include "messages/MOSDScrubReserve.h"
-#include "messages/MOSDSubOp.h"
#include "messages/MOSDRepOp.h"
-#include "messages/MOSDSubOpReply.h"
#include "messages/MOSDRepOpReply.h"
#include "messages/MOSDRepScrubMap.h"
#include "messages/MOSDPGRecoveryDelete.h"
}
}
-void PG::sub_op_scrub_map(OpRequestRef op)
-{
- // for legacy jewel compatibility only
- const MOSDSubOp *m = static_cast<const MOSDSubOp *>(op->get_req());
- assert(m->get_type() == MSG_OSD_SUBOP);
- dout(7) << "sub_op_scrub_map" << dendl;
-
- if (m->map_epoch < info.history.same_interval_since) {
- dout(10) << "sub_op_scrub discarding old sub_op from "
- << m->map_epoch << " < " << info.history.same_interval_since << dendl;
- return;
- }
-
- if (!scrubber.is_chunky_scrub_active()) {
- dout(10) << "sub_op_scrub_map scrub isn't active" << dendl;
- return;
- }
-
- op->mark_started();
-
- dout(10) << " got " << m->from << " scrub map" << dendl;
- bufferlist::iterator p = const_cast<bufferlist&>(m->get_data()).begin();
-
- scrubber.received_maps[m->from].decode(p, info.pgid.pool());
- dout(10) << "map version is "
- << scrubber.received_maps[m->from].valid_through
- << dendl;
-
- --scrubber.waiting_on;
- scrubber.waiting_on_whom.erase(m->from);
-
- if (scrubber.waiting_on == 0) {
- if (ops_blocked_by_scrub()) {
- requeue_scrub(true);
- } else {
- requeue_scrub(false);
- }
- }
-}
-
// send scrub v3 messages (chunky scrub)
void PG::_request_scrub_map(
pg_shard_t replica, eversion_t version,
dout(20) << __func__ << ": failed to reserve remotely" << dendl;
scrubber.reserved = false;
}
- if (op->get_req()->get_type() == MSG_OSD_SCRUB_RESERVE) {
- const MOSDScrubReserve *m =
- static_cast<const MOSDScrubReserve*>(op->get_req());
- Message *reply = new MOSDScrubReserve(
- spg_t(info.pgid.pgid, primary.shard),
- m->map_epoch,
- scrubber.reserved ? MOSDScrubReserve::GRANT : MOSDScrubReserve::REJECT,
- pg_whoami);
- osd->send_message_osd_cluster(reply, op->get_req()->get_connection());
- } else {
- // for jewel compat only
- const MOSDSubOp *req = static_cast<const MOSDSubOp*>(op->get_req());
- assert(req->get_type() == MSG_OSD_SUBOP);
- MOSDSubOpReply *reply = new MOSDSubOpReply(
- req, pg_whoami, 0, get_osdmap()->get_epoch(), CEPH_OSD_FLAG_ACK);
- ::encode(scrubber.reserved, reply->get_data());
- osd->send_message_osd_cluster(reply, op->get_req()->get_connection());
- }
+ const MOSDScrubReserve *m =
+ static_cast<const MOSDScrubReserve*>(op->get_req());
+ Message *reply = new MOSDScrubReserve(
+ spg_t(info.pgid.pgid, primary.shard),
+ m->map_epoch,
+ scrubber.reserved ? MOSDScrubReserve::GRANT : MOSDScrubReserve::REJECT,
+ pg_whoami);
+ osd->send_message_osd_cluster(reply, op->get_req()->get_connection());
}
void PG::handle_scrub_reserve_grant(OpRequestRef op, pg_shard_t from)
++i) {
if (*i == pg_whoami) continue;
dout(10) << "scrub requesting reserve from osd." << *i << dendl;
- if (HAVE_FEATURE(get_min_acting_features(), SERVER_LUMINOUS)) {
- osd->send_message_osd_cluster(
- i->osd,
- new MOSDScrubReserve(spg_t(info.pgid.pgid, i->shard),
- get_osdmap()->get_epoch(),
- MOSDScrubReserve::REQUEST, pg_whoami),
- get_osdmap()->get_epoch());
- } else {
- // for jewel compat only
- vector<OSDOp> scrub(1);
- scrub[0].op.op = CEPH_OSD_OP_SCRUB_RESERVE;
- hobject_t poid;
- eversion_t v;
- osd_reqid_t reqid;
- MOSDSubOp *subop = new MOSDSubOp(
- reqid, pg_whoami, spg_t(info.pgid.pgid, i->shard), poid, 0,
- get_osdmap()->get_epoch(), osd->get_tid(), v);
- subop->ops = scrub;
- osd->send_message_osd_cluster(
- i->osd, subop, get_osdmap()->get_epoch());
- }
+ osd->send_message_osd_cluster(
+ i->osd,
+ new MOSDScrubReserve(spg_t(info.pgid.pgid, i->shard),
+ get_osdmap()->get_epoch(),
+ MOSDScrubReserve::REQUEST, pg_whoami),
+ get_osdmap()->get_epoch());
}
}
++i) {
if (*i == pg_whoami) continue;
dout(10) << "scrub requesting unreserve from osd." << *i << dendl;
- if (HAVE_FEATURE(get_min_acting_features(), SERVER_LUMINOUS)) {
- osd->send_message_osd_cluster(
- i->osd,
- new MOSDScrubReserve(spg_t(info.pgid.pgid, i->shard),
- get_osdmap()->get_epoch(),
- MOSDScrubReserve::RELEASE, pg_whoami),
- get_osdmap()->get_epoch());
- } else {
- // for jewel compat only
- vector<OSDOp> scrub(1);
- scrub[0].op.op = CEPH_OSD_OP_SCRUB_UNRESERVE;
- hobject_t poid;
- eversion_t v;
- osd_reqid_t reqid;
- MOSDSubOp *subop = new MOSDSubOp(
- reqid, pg_whoami, spg_t(info.pgid.pgid, i->shard), poid, 0,
- get_osdmap()->get_epoch(), osd->get_tid(), v);
- subop->ops = scrub;
- osd->send_message_osd_cluster(i->osd, subop, get_osdmap()->get_epoch());
- }
+ osd->send_message_osd_cluster(
+ i->osd,
+ new MOSDScrubReserve(spg_t(info.pgid.pgid, i->shard),
+ get_osdmap()->get_epoch(),
+ MOSDScrubReserve::RELEASE, pg_whoami),
+ get_osdmap()->get_epoch());
}
}
map, start, end, msg->deep, msg->seed,
handle);
- if (HAVE_FEATURE(acting_features, SERVER_LUMINOUS)) {
- MOSDRepScrubMap *reply = new MOSDRepScrubMap(
- spg_t(info.pgid.pgid, get_primary().shard),
- msg->map_epoch,
- pg_whoami);
- ::encode(map, reply->get_data());
- osd->send_message_osd_cluster(reply, msg->get_connection());
- } else {
- // for jewel compatibility
- vector<OSDOp> scrub(1);
- scrub[0].op.op = CEPH_OSD_OP_SCRUB_MAP;
- hobject_t poid;
- eversion_t v;
- osd_reqid_t reqid;
- MOSDSubOp *subop = new MOSDSubOp(
- reqid,
- pg_whoami,
- spg_t(info.pgid.pgid, get_primary().shard),
- poid,
- 0,
- msg->map_epoch,
- osd->get_tid(),
- v);
- ::encode(map, subop->get_data());
- subop->ops = scrub;
- osd->send_message_osd_cluster(subop, msg->get_connection());
- }
+ MOSDRepScrubMap *reply = new MOSDRepScrubMap(
+ spg_t(info.pgid.pgid, get_primary().shard),
+ msg->map_epoch,
+ pg_whoami);
+ ::encode(map, reply->get_data());
+ osd->send_message_osd_cluster(reply, msg->get_connection());
}
/* Scrub:
return can_discard_op(op);
case CEPH_MSG_OSD_BACKOFF:
return false; // never discard
- case MSG_OSD_SUBOP:
- return can_discard_replica_op<MOSDSubOp, MSG_OSD_SUBOP>(op);
case MSG_OSD_REPOP:
return can_discard_replica_op<MOSDRepOp, MSG_OSD_REPOP>(op);
case MSG_OSD_PG_PUSH:
return can_discard_replica_op<MOSDPGPull, MSG_OSD_PG_PULL>(op);
case MSG_OSD_PG_PUSH_REPLY:
return can_discard_replica_op<MOSDPGPushReply, MSG_OSD_PG_PUSH_REPLY>(op);
- case MSG_OSD_SUBOPREPLY:
- return can_discard_replica_op<MOSDSubOpReply, MSG_OSD_SUBOPREPLY>(op);
case MSG_OSD_REPOPREPLY:
return can_discard_replica_op<MOSDRepOpReply, MSG_OSD_REPOPREPLY>(op);
case MSG_OSD_PG_RECOVERY_DELETE:
OpRequestRef op,
ThreadPool::TPHandle &handle);
void do_replica_scrub_map(OpRequestRef op);
- void sub_op_scrub_map(OpRequestRef op);
void handle_scrub_reserve_request(OpRequestRef op);
void handle_scrub_reserve_grant(OpRequestRef op, pg_shard_t from);
) = 0;
virtual void do_op(OpRequestRef& op) = 0;
- virtual void do_sub_op(OpRequestRef op) = 0;
- virtual void do_sub_op_reply(OpRequestRef op) = 0;
virtual void do_scan(
OpRequestRef op,
ThreadPool::TPHandle &handle
#include "messages/MOSDOp.h"
#include "messages/MOSDBackoff.h"
-#include "messages/MOSDSubOp.h"
-#include "messages/MOSDSubOpReply.h"
#include "messages/MOSDPGTrim.h"
#include "messages/MOSDPGScan.h"
#include "messages/MOSDRepScrub.h"
}
break;
- case MSG_OSD_SUBOP:
- do_sub_op(op);
- break;
-
- case MSG_OSD_SUBOPREPLY:
- do_sub_op_reply(op);
- break;
-
case MSG_OSD_PG_SCAN:
do_scan(op, handle);
break;
<< " lat " << latency << dendl;
}
-void PrimaryLogPG::do_sub_op(OpRequestRef op)
-{
- const MOSDSubOp *m = static_cast<const MOSDSubOp*>(op->get_req());
- assert(have_same_or_newer_map(m->map_epoch));
- assert(m->get_type() == MSG_OSD_SUBOP);
- dout(15) << "do_sub_op " << *op->get_req() << dendl;
-
- if (!is_peered()) {
- waiting_for_peered.push_back(op);
- op->mark_delayed("waiting for active");
- return;
- }
-
- const OSDOp *first = NULL;
- if (m->ops.size() >= 1) {
- first = &m->ops[0];
- }
-
- if (first) {
- switch (first->op.op) {
- case CEPH_OSD_OP_DELETE:
- sub_op_remove(op);
- return;
- case CEPH_OSD_OP_SCRUB_RESERVE:
- handle_scrub_reserve_request(op);
- return;
- case CEPH_OSD_OP_SCRUB_UNRESERVE:
- handle_scrub_reserve_release(op);
- return;
- case CEPH_OSD_OP_SCRUB_MAP:
- sub_op_scrub_map(op);
- return;
- }
- }
-}
-
-void PrimaryLogPG::do_sub_op_reply(OpRequestRef op)
-{
- const MOSDSubOpReply *r = static_cast<const MOSDSubOpReply *>(op->get_req());
- assert(r->get_type() == MSG_OSD_SUBOPREPLY);
- if (r->ops.size() >= 1) {
- const OSDOp& first = r->ops[0];
- switch (first.op.op) {
- case CEPH_OSD_OP_SCRUB_RESERVE:
- {
- pg_shard_t from = r->from;
- bufferlist::iterator p = const_cast<bufferlist&>(r->get_data()).begin();
- bool reserved;
- ::decode(reserved, p);
- if (reserved) {
- handle_scrub_reserve_grant(op, from);
- } else {
- handle_scrub_reserve_reject(op, from);
- }
- }
- return;
- }
- }
-}
-
void PrimaryLogPG::do_scan(
OpRequestRef op,
ThreadPool::TPHandle &handle)
return PULL_YES;
}
-void PrimaryLogPG::send_remove_op(
- const hobject_t& oid, eversion_t v, pg_shard_t peer)
-{
- ceph_tid_t tid = osd->get_tid();
- osd_reqid_t rid(osd->get_cluster_msgr_name(), 0, tid);
-
- dout(10) << "send_remove_op " << oid << " from osd." << peer
- << " tid " << tid << dendl;
-
- MOSDSubOp *subop = new MOSDSubOp(
- rid, pg_whoami, spg_t(info.pgid.pgid, peer.shard),
- oid, CEPH_OSD_FLAG_ACK,
- get_osdmap()->get_epoch(), tid, v);
- subop->ops = vector<OSDOp>(1);
- subop->ops[0].op.op = CEPH_OSD_OP_DELETE;
-
- osd->send_message_osd_cluster(peer.osd, subop, get_osdmap()->get_epoch());
-}
-
void PrimaryLogPG::remove_missing_object(const hobject_t &soid,
eversion_t v, Context *on_complete)
{
finish_recovery_op(soid); // close out this attempt,
}
-void PrimaryLogPG::sub_op_remove(OpRequestRef op)
-{
- const MOSDSubOp *m = static_cast<const MOSDSubOp*>(op->get_req());
- assert(m->get_type() == MSG_OSD_SUBOP);
- dout(7) << "sub_op_remove " << m->poid << dendl;
-
- op->mark_started();
-
- ObjectStore::Transaction t;
- remove_snap_mapped_object(t, m->poid);
- int r = osd->store->queue_transaction(osr.get(), std::move(t), NULL);
- assert(r == 0);
-}
-
eversion_t PrimaryLogPG::pick_newest_available(const hobject_t& oid)
{
eversion_t v;
add_object_context_to_pg_stat(obc, &stat);
pending_backfill_updates[*i] = stat;
}
- if (HAVE_FEATURE(get_min_upacting_features(), SERVER_LUMINOUS)) {
- map<pg_shard_t,MOSDPGBackfillRemove*> reqs;
- for (unsigned i = 0; i < to_remove.size(); ++i) {
- handle.reset_tp_timeout();
- const hobject_t& oid = to_remove[i].get<0>();
- eversion_t v = to_remove[i].get<1>();
- pg_shard_t peer = to_remove[i].get<2>();
- MOSDPGBackfillRemove *m;
- auto it = reqs.find(peer);
- if (it != reqs.end()) {
- m = it->second;
- } else {
- m = reqs[peer] = new MOSDPGBackfillRemove(
- spg_t(info.pgid.pgid, peer.shard),
- get_osdmap()->get_epoch());
- }
- m->ls.push_back(make_pair(oid, v));
-
- if (oid <= last_backfill_started)
- pending_backfill_updates[oid]; // add empty stat!
- }
- for (auto p : reqs) {
- osd->send_message_osd_cluster(p.first.osd, p.second,
- get_osdmap()->get_epoch());
+ map<pg_shard_t,MOSDPGBackfillRemove*> reqs;
+ for (unsigned i = 0; i < to_remove.size(); ++i) {
+ handle.reset_tp_timeout();
+ const hobject_t& oid = to_remove[i].get<0>();
+ eversion_t v = to_remove[i].get<1>();
+ pg_shard_t peer = to_remove[i].get<2>();
+ MOSDPGBackfillRemove *m;
+ auto it = reqs.find(peer);
+ if (it != reqs.end()) {
+ m = it->second;
+ } else {
+ m = reqs[peer] = new MOSDPGBackfillRemove(
+ spg_t(info.pgid.pgid, peer.shard),
+ get_osdmap()->get_epoch());
}
- } else {
- // for jewel targets
- for (unsigned i = 0; i < to_remove.size(); ++i) {
- handle.reset_tp_timeout();
+ m->ls.push_back(make_pair(oid, v));
- // ordered before any subsequent updates
- send_remove_op(to_remove[i].get<0>(), to_remove[i].get<1>(),
- to_remove[i].get<2>());
-
- if (to_remove[i].get<0>() <= last_backfill_started)
- pending_backfill_updates[to_remove[i].get<0>()]; // add empty stat!
- }
+ if (oid <= last_backfill_started)
+ pending_backfill_updates[oid]; // add empty stat!
+ }
+ for (auto p : reqs) {
+ osd->send_message_osd_cluster(p.first.osd, p.second,
+ get_osdmap()->get_epoch());
}
pgbackend->run_recovery_op(h, get_recovery_op_priority());
class C_OSD_AppliedRecoveredObject;
class C_OSD_CommittedPushedObject;
class C_OSD_AppliedRecoveredObjectReplica;
- void sub_op_remove(OpRequestRef op);
void _applied_recovered_object(ObjectContextRef obc);
void _applied_recovered_object_replica();
void record_write_error(OpRequestRef op, const hobject_t &soid,
MOSDOpReply *orig_reply, int r);
void do_pg_op(OpRequestRef op);
- void do_sub_op(OpRequestRef op) override;
- void do_sub_op_reply(OpRequestRef op) override;
void do_scan(
OpRequestRef op,
ThreadPool::TPHandle &handle) override;
#include "common/errno.h"
#include "ReplicatedBackend.h"
#include "messages/MOSDOp.h"
-#include "messages/MOSDSubOp.h"
#include "messages/MOSDRepOp.h"
-#include "messages/MOSDSubOpReply.h"
#include "messages/MOSDRepOpReply.h"
#include "messages/MOSDPGPush.h"
#include "messages/MOSDPGPull.h"
do_push_reply(op);
return true;
- case MSG_OSD_SUBOP: {
- const MOSDSubOp *m = static_cast<const MOSDSubOp*>(op->get_req());
- if (m->ops.size() == 0) {
- assert(0);
- }
- break;
- }
-
case MSG_OSD_REPOP: {
do_repop(op);
return true;
if (osd_op_type_t::client_op != type) {
return type;
+ /* fixme: this should match REPOP and probably others
} else if (MSG_OSD_SUBOP ==
boost::get<OpRequestRef>(
request.second.get_variant())->get_req()->get_header().type) {
return osd_op_type_t::osd_subop;
+ */
} else {
return osd_op_type_t::client_op;
}
if (osd_op_type_t::client_op != type) {
return type;
+ /* fixme: this should match REPOP and probably others
} else if (MSG_OSD_SUBOP ==
boost::get<OpRequestRef>(
request.second.get_variant())->get_req()->get_header().type) {
return osd_op_type_t::osd_subop;
+ */
} else {
return osd_op_type_t::client_op;
}
MESSAGE(MOSDScrub)
#include "messages/MOSDForceRecovery.h"
MESSAGE(MOSDForceRecovery)
-#include "messages/MOSDSubOp.h"
-MESSAGE(MOSDSubOp)
-#include "messages/MOSDSubOpReply.h"
-MESSAGE(MOSDSubOpReply)
#include "messages/MPGStats.h"
MESSAGE(MPGStats)
#include "messages/MPGStatsAck.h"