*
*/
+/// Facilitating scrub-realated object access to private PG data
+class ScrubberPasskey {
+private:
+ friend class Scrub::ReplicaReservations;
+ friend class PrimaryLogScrub;
+ ScrubberPasskey() {}
+ ScrubberPasskey(const ScrubberPasskey&) = default;
+ ScrubberPasskey& operator=(const ScrubberPasskey&) = delete;
+};
+
class PG : public DoutPrefixProvider, public PeeringState::PeeringListener {
friend struct NamedState;
friend class PeeringState;
friend class PgScrubber;
- friend class PrimaryLogScrub;
- friend class Scrub::ReplicaReservations;
friend class Scrub::LocalReservation; // dout()-only friendship
friend class Scrub::ReservedByRemotePrimary; // dout()-only friendship
// ref to recovery_state.info
const pg_info_t &info;
+
+
+// ScrubberPasskey getters:
+public:
+ const pg_info_t& get_pg_info(ScrubberPasskey) const {
+ return info;
+ }
+
+ OSDService* get_pg_osd(ScrubberPasskey) const {
+ return osd;
+ }
+
};
#endif
#include "PrimaryLogPG.h"
#include "scrub_machine.h"
-#define dout_context (m_pg->cct)
+#define dout_context (m_pg->get_cct())
#define dout_subsys ceph_subsys_osd
#undef dout_prefix
#define dout_prefix _prefix(_dout, this->m_pg)
void PrimaryLogScrub::_scrub_finish()
{
- auto& info = m_pg->info; ///< a temporary alias
+ auto& info = m_pg->get_pg_info(ScrubberPasskey{}); ///< a temporary alias
dout(10) << __func__
<< " info stats: " << (info.stats.stats_invalid ? "invalid" : "valid")
using namespace std::chrono_literals;
using namespace std::literals;
-#define dout_context (m_pg->cct)
+#define dout_context (m_pg->get_cct())
#define dout_subsys ceph_subsys_osd
#undef dout_prefix
#define dout_prefix _prefix(_dout, this->m_pg)
void ReplicaReservations::release_replica(pg_shard_t peer, epoch_t epoch)
{
- auto m = new MOSDScrubReserve(spg_t(m_pg->info.pgid.pgid, peer.shard), epoch,
+ auto m = new MOSDScrubReserve(spg_t(m_pg_info.pgid.pgid, peer.shard), epoch,
MOSDScrubReserve::RELEASE, m_pg->pg_whoami);
m_osds->send_message_osd_cluster(peer.osd, m, epoch);
}
ReplicaReservations::ReplicaReservations(PG* pg, pg_shard_t whoami)
: m_pg{pg}
, m_acting_set{pg->get_actingset()}
- , m_osds{m_pg->osd}
+ , m_osds{m_pg->get_pg_osd(ScrubberPasskey())}
, m_pending{static_cast<int>(m_acting_set.size()) - 1}
+ , m_pg_info{m_pg->get_pg_info(ScrubberPasskey())}
{
epoch_t epoch = m_pg->get_osdmap_epoch();
for (auto p : m_acting_set) {
if (p == whoami)
continue;
- auto m = new MOSDScrubReserve(spg_t(m_pg->info.pgid.pgid, p.shard), epoch,
+ auto m = new MOSDScrubReserve(spg_t(m_pg_info.pgid.pgid, p.shard), epoch,
MOSDScrubReserve::REQUEST, m_pg->pg_whoami);
m_osds->send_message_osd_cluster(p.osd, m, epoch);
m_waited_for_peers.push_back(p);