Continuing effort to make PG interactions event based.
Signed-off-by: Sage Weil <sage@redhat.com>
}
}
-void OSD::handle_pg_scrub(MOSDScrub *m, PG *pg)
-{
- pg->lock();
- if (pg->is_primary()) {
- pg->unreg_next_scrub();
- pg->scrubber.must_scrub = true;
- pg->scrubber.must_deep_scrub = m->deep || m->repair;
- pg->scrubber.must_repair = m->repair;
- pg->reg_next_scrub();
- dout(10) << "marking " << *pg << " for scrub" << dendl;
- }
- pg->unlock();
-}
-
void OSD::handle_scrub(MOSDScrub *m)
{
dout(10) << "handle_scrub " << *m << dendl;
return;
}
if (m->fsid != monc->get_fsid()) {
- dout(0) << "handle_scrub fsid " << m->fsid << " != " << monc->get_fsid() << dendl;
+ dout(0) << "handle_scrub fsid " << m->fsid << " != " << monc->get_fsid()
+ << dendl;
m->put();
return;
}
- RWLock::RLocker l(pg_map_lock);
- if (m->scrub_pgs.empty()) {
- for (ceph::unordered_map<spg_t, PG*>::iterator p = pg_map.begin();
- p != pg_map.end();
- ++p) {
- if (p->second->is_deleted()) {
- continue;
+ vector<spg_t> spgs;
+ {
+ RWLock::RLocker l(pg_map_lock);
+ if (m->scrub_pgs.empty()) {
+ for (ceph::unordered_map<spg_t, PG*>::iterator p = pg_map.begin();
+ p != pg_map.end();
+ ++p) {
+ if (p->second->is_deleted()) {
+ continue;
+ }
+ spgs.push_back(p->second->get_pgid());
}
- handle_pg_scrub(m, p->second);
- }
- } else {
- for (vector<pg_t>::iterator p = m->scrub_pgs.begin();
- p != m->scrub_pgs.end();
- ++p) {
- spg_t pcand;
- if (osdmap->get_primary_shard(*p, &pcand)) {
- auto pg_map_entry = pg_map.find(pcand);
- if (pg_map_entry != pg_map.end()) {
- handle_pg_scrub(m, pg_map_entry->second);
+ } else {
+ for (vector<pg_t>::iterator p = m->scrub_pgs.begin();
+ p != m->scrub_pgs.end();
+ ++p) {
+ spg_t pcand;
+ if (osdmap->get_primary_shard(*p, &pcand)) {
+ auto pg_map_entry = pg_map.find(pcand);
+ if (pg_map_entry != pg_map.end()) {
+ spgs.push_back(pcand);
+ }
}
}
}
}
+ for (auto pgid : spgs) {
+ enqueue_peering_evt(
+ pgid,
+ PGPeeringEventRef(
+ std::make_shared<PGPeeringEvent>(
+ get_osdmap()->get_epoch(),
+ get_osdmap()->get_epoch(),
+ PG::RequestScrub(m->deep, m->repair))));
+ }
+
m->put();
}
ObjectStore *store,
uuid_d& cluster_fsid, uuid_d& osd_fsid, int whoami);
- void handle_pg_scrub(struct MOSDScrub *m, PG* pg);
void handle_scrub(struct MOSDScrub *m);
void handle_osd_ping(class MOSDPing *m);
return discard_event();
}
+boost::statechart::result PG::RecoveryState::Primary::react(
+ const RequestScrub& evt)
+{
+ PG *pg = context< RecoveryMachine >().pg;
+ if (pg->is_primary()) {
+ pg->unreg_next_scrub();
+ pg->scrubber.must_scrub = true;
+ pg->scrubber.must_deep_scrub = evt.deep || evt.repair;
+ pg->scrubber.must_repair = evt.repair;
+ pg->reg_next_scrub();
+ ldout(pg->cct,10) << "marking for scrub" << dendl;
+ }
+ return discard_event();
+}
+
boost::statechart::result PG::RecoveryState::Primary::react(
const SetForceBackfill&)
{
*out << "UnfoundRecovery";
}
};
+
+ struct RequestScrub : boost::statechart::event<RequestScrub> {
+ bool deep;
+ bool repair;
+ explicit RequestScrub(bool d, bool r) : deep(d), repair(r) {}
+ void print(std::ostream *out) const {
+ *out << "RequestScrub(" << (deep ? "deep" : "shallow")
+ << (repair ? " repair" : "");
+ }
+ };
+
protected:
TrivialEvent(Initialize)
TrivialEvent(GotInfo)
typedef boost::mpl::list <
boost::statechart::custom_reaction< QueryState >,
boost::statechart::custom_reaction< AdvMap >,
- boost::statechart::custom_reaction< NullEvt >,
boost::statechart::custom_reaction< IntervalFlush >,
- boost::statechart::transition< boost::statechart::event_base, Crashed >,
+ // ignored
+ boost::statechart::custom_reaction< NullEvt >,
boost::statechart::custom_reaction<SetForceRecovery>,
boost::statechart::custom_reaction<UnsetForceRecovery>,
boost::statechart::custom_reaction<SetForceBackfill>,
- boost::statechart::custom_reaction<UnsetForceBackfill>
+ boost::statechart::custom_reaction<UnsetForceBackfill>,
+ boost::statechart::custom_reaction<RequestScrub>,
+ // crash
+ boost::statechart::transition< boost::statechart::event_base, Crashed >
> reactions;
boost::statechart::result react(const QueryState& q);
boost::statechart::result react(const AdvMap&);
boost::statechart::custom_reaction<SetForceRecovery>,
boost::statechart::custom_reaction<UnsetForceRecovery>,
boost::statechart::custom_reaction<SetForceBackfill>,
- boost::statechart::custom_reaction<UnsetForceBackfill>
+ boost::statechart::custom_reaction<UnsetForceBackfill>,
+ boost::statechart::custom_reaction<RequestScrub>
> reactions;
boost::statechart::result react(const ActMap&);
boost::statechart::result react(const MNotifyRec&);
boost::statechart::result react(const UnsetForceRecovery&);
boost::statechart::result react(const SetForceBackfill&);
boost::statechart::result react(const UnsetForceBackfill&);
+ boost::statechart::result react(const RequestScrub&);
};
struct WaitActingChange : boost::statechart::state< WaitActingChange, Primary>,