#include "messages/MOSDPGTrim.h"
#include "messages/MOSDPGLog.h"
#include "messages/MOSDPGNotify.h"
+#include "messages/MOSDPGQuery.h"
#define dout_context cct
#define dout_subsys ceph_subsys_osd
);
}
+void BufferedRecoveryMessages::send_query(
+ int to,
+ spg_t to_spgid,
+ const pg_query_t &q)
+{
+ map<spg_t,pg_query_t> queries;
+ queries[to_spgid] = q;
+ message_map[to].push_back(
+ new MOSDPGQuery(q.epoch_sent, std::move(queries))
+ );
+}
+
void PGPool::update(CephContext *cct, OSDMapRef map)
{
const pg_pool_t *pi = map->get_pg_pool(id);
cached_epoch = map->get_epoch();
}
-void PeeringState::PeeringMachine::send_query(
- pg_shard_t to, const pg_query_t &query) {
- ceph_assert(state->rctx);
- state->rctx->query_map[to.osd][
- spg_t(context< PeeringMachine >().spgid.pgid, to.shard)] = query;
-}
-
/*-------------Peering State Helpers----------------*/
#undef dout_prefix
#define dout_prefix (dpp->gen_prefix(*_dout))
}
bool PeeringState::discover_all_missing(
- map<int, map<spg_t,pg_query_t> > &query_map)
+ BufferedRecoveryMessages &rctx)
{
auto &missing = pg_log.get_missing();
uint64_t unfound = get_num_unfound();
psdout(10) << __func__ << ": osd." << peer << ": requesting pg_missing_t"
<< dendl;
peer_missing_requested.insert(peer);
- query_map[peer.osd][spg_t(info.pgid.pgid, peer.shard)] =
+ rctx.send_query(
+ peer.osd,
+ spg_t(info.pgid.pgid, peer.shard),
pg_query_t(
pg_query_t::FULLLOG,
peer.shard, pg_whoami.shard,
- info.history, get_osdmap_epoch());
+ info.history, get_osdmap_epoch()));
any = true;
}
return any;
build_might_have_unfound();
// Always call now so update_calc_stats() will be accurate
- discover_all_missing(query_map);
+ discover_all_missing(ctx.msgs);
}
if (ps->have_unfound()) {
// object may have become unfound
- ps->discover_all_missing(context< PeeringMachine >().get_query_map());
+ ps->discover_all_missing(context<PeeringMachine>().get_recovery_ctx().msgs);
}
uint64_t unfound = ps->missing_loc.num_unfound();
ps->proc_replica_info(
notevt.from, notevt.notify.info, notevt.notify.epoch_sent);
if (ps->have_unfound() || (ps->is_degraded() && ps->might_have_unfound.count(notevt.from))) {
- ps->discover_all_missing(context< PeeringMachine >().get_query_map());
+ ps->discover_all_missing(
+ context<PeeringMachine>().get_recovery_ctx().msgs);
}
}
return discard_event();
} else {
psdout(10) << " querying info from osd." << peer << dendl;
context< PeeringMachine >().send_query(
- peer, pg_query_t(pg_query_t::INFO,
- it->shard, ps->pg_whoami.shard,
- ps->info.history,
- ps->get_osdmap_epoch()));
+ peer.osd,
+ pg_query_t(pg_query_t::INFO,
+ it->shard, ps->pg_whoami.shard,
+ ps->info.history,
+ ps->get_osdmap_epoch()));
peer_info_requested.insert(peer);
ps->blocked_by.insert(peer.osd);
}
// how much?
psdout(10) << " requesting log from osd." << auth_log_shard << dendl;
context<PeeringMachine>().send_query(
- auth_log_shard,
+ auth_log_shard.osd,
pg_query_t(
pg_query_t::LOG,
auth_log_shard.shard, ps->pg_whoami.shard,
if (pi.log_tail <= since) {
psdout(10) << " requesting log+missing since " << since << " from osd." << *i << dendl;
context< PeeringMachine >().send_query(
- *i,
+ i->osd,
pg_query_t(
pg_query_t::LOG,
i->shard, ps->pg_whoami.shard,
<< " (want since " << since << " < log.tail "
<< pi.log_tail << ")" << dendl;
context< PeeringMachine >().send_query(
- *i, pg_query_t(
+ i->osd, pg_query_t(
pg_query_t::FULLLOG,
i->shard, ps->pg_whoami.shard,
ps->info.history, ps->get_osdmap_epoch()));
message_map[target].push_back(m);
}
void send_notify(int to, const pg_notify_t &n);
+ void send_query(int to, spg_t spgid, const pg_query_t &q);
};
struct HeartbeatStamps : public RefCountedObject {
void send_notify(int to, const pg_notify_t &n) {
msgs.send_notify(to, n);
}
+ void send_query(int to, spg_t spgid, const pg_query_t &q) {
+ msgs.send_query(to, spgid, q);
+ }
};
/* Encapsulates PG recovery process */
return state->rctx->transaction;
}
- void send_query(pg_shard_t to, const pg_query_t &query);
map<int, map<spg_t, pg_query_t> > &get_query_map() {
ceph_assert(state->rctx);
ceph_assert(state->rctx);
state->rctx->send_notify(to, n);
}
+ void send_query(int to, const pg_query_t &query) {
+ state->rctx->send_query(
+ to,
+ spg_t(spgid.pgid, query.to),
+ query);
+ }
};
friend class PeeringMachine;
/// Pull missing sets from all candidate peers
bool discover_all_missing(
- map<int, map<spg_t,pg_query_t> > &query_map);
+ BufferedRecoveryMessages &rctx);
/// Notify that hoid has been fully recocovered
void object_recovered(