Skip to content

Commit 7145287

Browse files
authored
Merge pull request ceph#45962 from ronen-fr/wip-rf-sbe-test2
test/osd: test environment for the scrubber "backend" Reviewed-by: Samuel Just <[email protected]> Reviewed-by: Matan Breizman <[email protected]>
2 parents 058a0ee + ce7e7e5 commit 7145287

24 files changed

+1742
-167
lines changed

src/crimson/osd/ops_executer.cc

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ OpsExecuter::do_execute_op(OSDOp& osd_op)
611611
});
612612
case CEPH_OSD_OP_OMAPSETVALS:
613613
#if 0
614-
if (!pg.get_pool().info.supports_omap()) {
614+
if (!pg.get_pgpool().info.supports_omap()) {
615615
return crimson::ct_error::operation_not_supported::make();
616616
}
617617
#endif
@@ -620,7 +620,7 @@ OpsExecuter::do_execute_op(OSDOp& osd_op)
620620
}, true);
621621
case CEPH_OSD_OP_OMAPSETHEADER:
622622
#if 0
623-
if (!pg.get_pool().info.supports_omap()) {
623+
if (!pg.get_pgpool().info.supports_omap()) {
624624
return crimson::ct_error::operation_not_supported::make();
625625
}
626626
#endif
@@ -630,7 +630,7 @@ OpsExecuter::do_execute_op(OSDOp& osd_op)
630630
}, true);
631631
case CEPH_OSD_OP_OMAPRMKEYRANGE:
632632
#if 0
633-
if (!pg.get_pool().info.supports_omap()) {
633+
if (!pg.get_pgpool().info.supports_omap()) {
634634
return crimson::ct_error::operation_not_supported::make();
635635
}
636636
#endif
@@ -639,7 +639,7 @@ OpsExecuter::do_execute_op(OSDOp& osd_op)
639639
}, true);
640640
case CEPH_OSD_OP_OMAPRMKEYS:
641641
/** TODO: Implement supports_omap()
642-
if (!pg.get_pool().info.supports_omap()) {
642+
if (!pg.get_pgpool().info.supports_omap()) {
643643
return crimson::ct_error::operation_not_supported::make();
644644
}*/
645645
return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
@@ -714,7 +714,7 @@ std::vector<pg_log_entry_t> OpsExecuter::prepare_transaction(
714714

715715
// Defined here because there is a circular dependency between OpsExecuter and PG
716716
uint32_t OpsExecuter::get_pool_stripe_width() const {
717-
return pg->get_pool().info.get_stripe_width();
717+
return pg->get_pgpool().info.get_stripe_width();
718718
}
719719

720720
// Defined here because there is a circular dependency between OpsExecuter and PG
@@ -908,7 +908,7 @@ static PG::interruptible_future<> do_pgnls(
908908
}
909909
const auto pg_start = pg.get_pgid().pgid.get_hobj_start();
910910
const auto pg_end = \
911-
pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num());
911+
pg.get_pgid().pgid.get_hobj_end(pg.get_pgpool().info.get_pg_num());
912912
return do_pgnls_common(pg_start,
913913
pg_end,
914914
pg.get_backend(),
@@ -952,7 +952,7 @@ static PG::interruptible_future<> do_pgnls_filtered(
952952
return seastar::do_with(std::move(filter),
953953
[&, lower_bound=std::move(lower_bound)](auto&& filter) {
954954
const auto pg_start = pg.get_pgid().pgid.get_hobj_start();
955-
const auto pg_end = pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num());
955+
const auto pg_end = pg.get_pgid().pgid.get_hobj_end(pg.get_pgpool().info.get_pg_num());
956956
return do_pgnls_common(pg_start,
957957
pg_end,
958958
pg.get_backend(),
@@ -1037,7 +1037,7 @@ static PG::interruptible_future<> do_pgls(
10371037
}
10381038
const auto pg_start = pg.get_pgid().pgid.get_hobj_start();
10391039
const auto pg_end =
1040-
pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num());
1040+
pg.get_pgid().pgid.get_hobj_end(pg.get_pgpool().info.get_pg_num());
10411041
return do_pgls_common(pg_start,
10421042
pg_end,
10431043
pg.get_backend(),
@@ -1081,7 +1081,7 @@ static PG::interruptible_future<> do_pgls_filtered(
10811081
return seastar::do_with(std::move(filter),
10821082
[&, lower_bound=std::move(lower_bound)](auto&& filter) {
10831083
const auto pg_start = pg.get_pgid().pgid.get_hobj_start();
1084-
const auto pg_end = pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num());
1084+
const auto pg_end = pg.get_pgid().pgid.get_hobj_end(pg.get_pgpool().info.get_pg_num());
10851085
return do_pgls_common(pg_start,
10861086
pg_end,
10871087
pg.get_backend(),

src/crimson/osd/pg.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ void PG::prepare_write(pg_info_t &info,
331331
}
332332
pglog.write_log_and_missing(
333333
t, &km, coll_ref->get_cid(), pgmeta_oid,
334-
peering_state.get_pool().info.require_rollback());
334+
peering_state.get_pgpool().info.require_rollback());
335335
if (!km.empty()) {
336336
t.omap_setkeys(coll_ref->get_cid(), pgmeta_oid, km);
337337
}
@@ -628,15 +628,15 @@ PG::do_osd_ops_execute(
628628
// check for full
629629
if ((ox->delta_stats.num_bytes > 0 ||
630630
ox->delta_stats.num_objects > 0) &&
631-
get_pool().info.has_flag(pg_pool_t::FLAG_FULL)) {
631+
get_pgpool().info.has_flag(pg_pool_t::FLAG_FULL)) {
632632
const auto& m = ox->get_message();
633633
if (m.get_reqid().name.is_mds() || // FIXME: ignore MDS for now
634634
m.has_flag(CEPH_OSD_FLAG_FULL_FORCE)) {
635635
logger().info(" full, but proceeding due to FULL_FORCE or MDS");
636636
} else if (m.has_flag(CEPH_OSD_FLAG_FULL_TRY)) {
637637
// they tried, they failed.
638638
logger().info(" full, replying to FULL_TRY op");
639-
if (get_pool().info.has_flag(pg_pool_t::FLAG_FULL_QUOTA))
639+
if (get_pgpool().info.has_flag(pg_pool_t::FLAG_FULL_QUOTA))
640640
return interruptor::make_ready_future<OpsExecuter::rep_op_fut_tuple>(
641641
seastar::now(),
642642
OpsExecuter::osd_op_ierrorator::future<>(

src/crimson/osd/pg.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,8 @@ class PG : public boost::intrusive_ref_counter<
462462
return get_info().history.same_interval_since;
463463
}
464464

465-
const auto& get_pool() const {
466-
return peering_state.get_pool();
465+
const auto& get_pgpool() const {
466+
return peering_state.get_pgpool();
467467
}
468468
pg_shard_t get_primary() const {
469469
return peering_state.get_primary();
@@ -702,7 +702,7 @@ class PG : public boost::intrusive_ref_counter<
702702
interruptible_future<std::tuple<bool, int>> already_complete(const osd_reqid_t& reqid);
703703
int get_recovery_op_priority() const {
704704
int64_t pri = 0;
705-
get_pool().info.opts.get(pool_opts_t::RECOVERY_OP_PRIORITY, &pri);
705+
get_pgpool().info.opts.get(pool_opts_t::RECOVERY_OP_PRIORITY, &pri);
706706
return pri > 0 ? pri : crimson::common::local_conf()->osd_recovery_op_priority;
707707
}
708708
seastar::future<> mark_unfound_lost(int) {

src/include/types_fmt.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,22 @@ struct fmt::formatter<std::list<A>> {
4343
}
4444
};
4545

46+
template <class A>
47+
struct fmt::formatter<std::vector<A>> {
48+
constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
49+
50+
template <typename FormatContext>
51+
auto format(const std::vector<A>& l, FormatContext& ctx)
52+
{
53+
std::string_view sep = "[";
54+
for (const auto& e : l) {
55+
fmt::format_to(ctx.out(), "{}{}", sep, e);
56+
sep = ",";
57+
}
58+
return fmt::format_to(ctx.out(), "]");
59+
}
60+
};
61+
4662
template <class A>
4763
struct fmt::formatter<std::set<A>> {
4864
constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }

src/osd/ECBackend.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,8 @@ class ECBackend : public PGBackend {
675675
ScrubMap &map,
676676
ScrubMapBuilder &pos,
677677
ScrubMap::object &o) override;
678-
uint64_t be_get_ondisk_size(uint64_t logical_size) override {
678+
679+
uint64_t be_get_ondisk_size(uint64_t logical_size) const final {
679680
return sinfo.logical_to_next_chunk_offset(logical_size);
680681
}
681682
void _failed_push(const hobject_t &hoid,

src/osd/OSD.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9140,7 +9140,7 @@ void OSD::split_pgs(
91409140
*i,
91419141
split_bits,
91429142
i->ps(),
9143-
&child->get_pool().info,
9143+
&child->get_pgpool().info,
91449144
rctx.transaction);
91459145
parent->split_into(
91469146
i->pgid,

src/osd/PG.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ PG::PG(OSDService *o, OSDMapRef curmap,
215215
curmap,
216216
this,
217217
this),
218-
pool(recovery_state.get_pool()),
218+
pool(recovery_state.get_pgpool()),
219219
info(recovery_state.get_info())
220220
{
221221
#ifdef PG_DEBUG_REFS

src/osd/PG.h

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -163,18 +163,9 @@ class PGRecoveryStats {
163163
*
164164
*/
165165

166-
/// Facilitating scrub-realated object access to private PG data
167-
class ScrubberPasskey {
168-
private:
169-
friend class Scrub::ReplicaReservations;
170-
friend class PrimaryLogScrub;
171-
friend class PgScrubber;
172-
ScrubberPasskey() {}
173-
ScrubberPasskey(const ScrubberPasskey&) = default;
174-
ScrubberPasskey& operator=(const ScrubberPasskey&) = delete;
175-
};
176-
177-
class PG : public DoutPrefixProvider, public PeeringState::PeeringListener {
166+
class PG : public DoutPrefixProvider,
167+
public PeeringState::PeeringListener,
168+
public Scrub::PgScrubBeListener {
178169
friend struct NamedState;
179170
friend class PeeringState;
180171
friend class PgScrubber;
@@ -245,7 +236,7 @@ class PG : public DoutPrefixProvider, public PeeringState::PeeringListener {
245236
return pg_id;
246237
}
247238

248-
const PGPool& get_pool() const {
239+
const PGPool& get_pgpool() const final {
249240
return pool;
250241
}
251242
uint64_t get_last_user_version() const {
@@ -261,6 +252,11 @@ class PG : public DoutPrefixProvider, public PeeringState::PeeringListener {
261252
return info.history.same_interval_since;
262253
}
263254

255+
bool is_waiting_for_unreadable_object() const final
256+
{
257+
return !waiting_for_unreadable_object.empty();
258+
}
259+
264260
static void set_last_scrub_stamp(
265261
utime_t t, pg_history_t &history, pg_stat_t &stats) {
266262
stats.last_scrub_stamp = t;
@@ -346,7 +342,7 @@ class PG : public DoutPrefixProvider, public PeeringState::PeeringListener {
346342
int get_acting_primary() const {
347343
return recovery_state.get_acting_primary();
348344
}
349-
pg_shard_t get_primary() const {
345+
pg_shard_t get_primary() const final {
350346
return recovery_state.get_primary();
351347
}
352348
const std::vector<int> get_up() const {
@@ -1408,20 +1404,29 @@ class PG : public DoutPrefixProvider, public PeeringState::PeeringListener {
14081404
const pg_info_t &info;
14091405

14101406

1411-
// ScrubberPasskey getters:
1407+
// ScrubberPasskey getters/misc:
14121408
public:
1413-
const pg_info_t& get_pg_info(ScrubberPasskey) const {
1414-
return info;
1415-
}
1416-
1417-
OSDService* get_pg_osd(ScrubberPasskey) const {
1418-
return osd;
1419-
}
1420-
1421-
requested_scrub_t& get_planned_scrub(ScrubberPasskey) {
1422-
return m_planned_scrub;
1423-
}
1424-
1409+
const pg_info_t& get_pg_info(ScrubberPasskey) const final { return info; }
1410+
1411+
OSDService* get_pg_osd(ScrubberPasskey) const { return osd; }
1412+
1413+
requested_scrub_t& get_planned_scrub(ScrubberPasskey)
1414+
{
1415+
return m_planned_scrub;
1416+
}
1417+
1418+
void force_object_missing(ScrubberPasskey,
1419+
const std::set<pg_shard_t>& peer,
1420+
const hobject_t& oid,
1421+
eversion_t version) final
1422+
{
1423+
recovery_state.force_object_missing(peer, oid, version);
1424+
}
1425+
1426+
uint64_t logical_to_ondisk_size(uint64_t logical_size) const final
1427+
{
1428+
return get_pgbackend()->be_get_ondisk_size(logical_size);
1429+
}
14251430
};
14261431

14271432
#endif

src/osd/PGBackend.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,8 @@ typedef std::shared_ptr<const OSDMap> OSDMapRef;
586586
ScrubMapBuilder &pos);
587587

588588
virtual uint64_t be_get_ondisk_size(
589-
uint64_t logical_size) = 0;
589+
uint64_t logical_size) const = 0;
590+
590591
virtual int be_deep_scrub(
591592
const hobject_t &oid,
592593
ScrubMap &map,

src/osd/PeeringState.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "PGStateUtils.h"
2121
#include "PGPeeringEvent.h"
2222
#include "osd_types.h"
23+
#include "osd_types_fmt.h"
2324
#include "os/ObjectStore.h"
2425
#include "OSDMap.h"
2526
#include "MissingLoc.h"
@@ -57,6 +58,22 @@ struct PGPool {
5758
}
5859
};
5960

61+
template <>
62+
struct fmt::formatter<PGPool> {
63+
template <typename ParseContext>
64+
constexpr auto parse(ParseContext& ctx) { return ctx.begin(); }
65+
66+
template <typename FormatContext>
67+
auto format(const PGPool& pool, FormatContext& ctx)
68+
{
69+
return fmt::format_to(ctx.out(),
70+
"{}/{}({})",
71+
pool.id,
72+
pool.name,
73+
pool.info);
74+
}
75+
};
76+
6077
struct PeeringCtx;
6178

6279
// [primary only] content recovery state
@@ -2136,7 +2153,7 @@ class PeeringState : public MissingLoc::MappingInfo {
21362153
return last_rollback_info_trimmed_to_applied;
21372154
}
21382155
/// Returns stable reference to internal pool structure
2139-
const PGPool &get_pool() const {
2156+
const PGPool &get_pgpool() const {
21402157
return pool;
21412158
}
21422159
/// Returns reference to current osdmap

0 commit comments

Comments
 (0)