Skip to content

Commit 7a2db2f

Browse files
committed
crimson/osd/pg: introduce projected_log
Signed-off-by: Matan Breizman <[email protected]>
1 parent 9eaff51 commit 7a2db2f

File tree

5 files changed

+52
-16
lines changed

5 files changed

+52
-16
lines changed

src/crimson/osd/backfill_facades.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ struct PeeringFacade final : BackfillState::PeeringFacade {
3636
return peering_state.get_info().log_tail;
3737
}
3838

39+
const PGLog& get_pg_log() const override {
40+
return peering_state.get_pg_log();
41+
}
42+
3943
void scan_log_after(eversion_t v, scan_log_func_t f) const override {
4044
peering_state.get_pg_log().get_log().scan_log_after(v, std::move(f));
4145
}
@@ -73,6 +77,10 @@ struct PGFacade final : BackfillState::PGFacade {
7377
return pg.projected_last_update;
7478
}
7579

80+
const PGLog::IndexedLog& get_projected_log() const override {
81+
return pg.projected_log;
82+
}
83+
7684
PGFacade(PG& pg) : pg(pg) {}
7785
};
7886

src/crimson/osd/backfill_state.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ void BackfillState::Enqueuing::maybe_update_range()
125125
logger().info("{}: bi is current", __func__);
126126
ceph_assert(primary_bi.version == pg().get_projected_last_update());
127127
} else if (primary_bi.version >= peering_state().get_log_tail()) {
128-
#if 0
129128
if (peering_state().get_pg_log().get_log().empty() &&
130129
pg().get_projected_log().empty()) {
131130
/* Because we don't move log_tail on split, the log might be
@@ -137,13 +136,11 @@ void BackfillState::Enqueuing::maybe_update_range()
137136
ceph_assert(primary_bi.version == eversion_t());
138137
return;
139138
}
140-
#endif
141139
logger().debug("{}: bi is old, ({}) can be updated with log to {}",
142140
__func__,
143141
primary_bi.version,
144142
pg().get_projected_last_update());
145-
logger().debug("{}: scanning pg log first", __func__);
146-
peering_state().scan_log_after(primary_bi.version,
143+
auto func =
147144
[&](const pg_log_entry_t& e) {
148145
logger().debug("maybe_update_range(lambda): updating from version {}",
149146
e.version);
@@ -160,7 +157,11 @@ void BackfillState::Enqueuing::maybe_update_range()
160157
primary_bi.objects.erase(e.soid);
161158
}
162159
}
163-
});
160+
};
161+
logger().debug("{}: scanning pg log first", __func__);
162+
peering_state().scan_log_after(primary_bi.version, func);
163+
logger().debug("{}: scanning projected log", __func__);
164+
pg().get_projected_log().scan_log_after(primary_bi.version, func);
164165
primary_bi.version = pg().get_projected_last_update();
165166
} else {
166167
ceph_abort_msg(

src/crimson/osd/backfill_state.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <boost/statechart/transition.hpp>
1515

1616
#include "osd/recovery_types.h"
17+
#include "osd/PGLog.h"
1718

1819
namespace crimson::osd {
1920

@@ -367,6 +368,7 @@ struct BackfillState::PeeringFacade {
367368
virtual hobject_t earliest_backfill() const = 0;
368369
virtual const std::set<pg_shard_t>& get_backfill_targets() const = 0;
369370
virtual const hobject_t& get_peer_last_backfill(pg_shard_t peer) const = 0;
371+
virtual const PGLog& get_pg_log() const = 0;
370372
virtual const eversion_t& get_last_update() const = 0;
371373
virtual const eversion_t& get_log_tail() const = 0;
372374

@@ -392,6 +394,8 @@ struct BackfillState::PeeringFacade {
392394
// of behaviour that must be provided by a unit test's mock.
393395
struct BackfillState::PGFacade {
394396
virtual const eversion_t& get_projected_last_update() const = 0;
397+
virtual const PGLog::IndexedLog& get_projected_log() const = 0;
398+
395399
virtual ~PGFacade() {}
396400
};
397401

src/crimson/osd/pg.cc

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,10 @@ PG::submit_transaction(
932932
ceph_assert(log_entries.rbegin()->version >= projected_last_update);
933933
projected_last_update = log_entries.rbegin()->version;
934934

935+
for (const auto& entry: log_entries) {
936+
projected_log.add(entry);
937+
}
938+
935939
auto [submitted, all_completed] = co_await backend->submit_transaction(
936940
peering_state.get_acting_recovery_backfill(),
937941
obc->obs.oi.soid,
@@ -1333,19 +1337,15 @@ void PG::log_operation(
13331337
if (is_primary()) {
13341338
ceph_assert(trim_to <= peering_state.get_pg_committed_to());
13351339
}
1336-
/* TODO: when we add snap mapper and projected log support,
1337-
* we'll likely want to update them here.
1338-
*
1339-
* See src/osd/PrimaryLogPG.h:log_operation for how classic
1340-
* handles these cases.
1341-
*/
1342-
#if 0
13431340
auto last = logv.rbegin();
13441341
if (is_primary() && last != logv.rend()) {
1342+
logger().debug("{} on primary, trimming projected log",
1343+
__func__);
13451344
projected_log.skip_can_rollback_to_to_head();
1346-
projected_log.trim(cct, last->version, nullptr, nullptr, nullptr);
1345+
projected_log.trim(shard_services.get_cct(), last->version,
1346+
nullptr, nullptr, nullptr);
13471347
}
1348-
#endif
1348+
13491349
if (!is_primary()) { // && !is_ec_pg()
13501350
replica_clear_repop_obc(logv);
13511351
}
@@ -1651,8 +1651,8 @@ PG::already_complete(const osd_reqid_t& reqid)
16511651
int ret;
16521652
std::vector<pg_log_op_return_item_t> op_returns;
16531653

1654-
if (peering_state.get_pg_log().get_log().get_request(
1655-
reqid, &version, &user_version, &ret, &op_returns)) {
1654+
if (check_in_progress_op(
1655+
reqid, &version, &user_version, &ret, &op_returns)) {
16561656
complete_op_t dupinfo{
16571657
user_version,
16581658
version,
@@ -1717,4 +1717,19 @@ void PG::C_PG_FinishRecovery::finish(int r) {
17171717
DEBUGDPP("stale recovery finsher", pg);
17181718
}
17191719
}
1720+
bool PG::check_in_progress_op(
1721+
const osd_reqid_t& reqid,
1722+
eversion_t *version,
1723+
version_t *user_version,
1724+
int *return_code,
1725+
std::vector<pg_log_op_return_item_t> *op_returns
1726+
) const
1727+
{
1728+
return (
1729+
projected_log.get_request(reqid, version, user_version, return_code,
1730+
op_returns) ||
1731+
peering_state.get_pg_log().get_log().get_request(
1732+
reqid, version, user_version, return_code, op_returns));
1733+
}
1734+
17201735
}

src/crimson/osd/pg.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ class PG : public boost::intrusive_ref_counter<
376376
void check_blocklisted_watchers() final;
377377
void clear_primary_state() final {
378378
recovery_finisher = nullptr;
379+
projected_log = PGLog::IndexedLog();
379380
}
380381

381382
void queue_check_readable(epoch_t last_peering_reset,
@@ -826,8 +827,15 @@ class PG : public boost::intrusive_ref_counter<
826827
const eversion_t version;
827828
const int err;
828829
};
830+
PGLog::IndexedLog projected_log;
829831
interruptible_future<std::optional<complete_op_t>>
830832
already_complete(const osd_reqid_t& reqid);
833+
bool check_in_progress_op(
834+
const osd_reqid_t& reqid,
835+
eversion_t *version,
836+
version_t *user_version,
837+
int *return_code,
838+
std::vector<pg_log_op_return_item_t> *op_returns) const;
831839
int get_recovery_op_priority() const {
832840
int64_t pri = 0;
833841
get_pgpool().info.opts.get(pool_opts_t::RECOVERY_OP_PRIORITY, &pri);

0 commit comments

Comments
 (0)