Skip to content

Commit 44b51db

Browse files
authored
Merge pull request ceph#61561 from athanatos/sjust/wip-crimson-recovery-69412
crimson: take obc lock during push commit on primary Reviewed-by: Matan Breizman <[email protected]>
2 parents afcfc4a + 6093f91 commit 44b51db

File tree

5 files changed

+363
-335
lines changed

5 files changed

+363
-335
lines changed

src/crimson/osd/object_context_loader.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ class ObjectContextLoader {
163163
return *this;
164164
}
165165

166+
void lock_excl_sync() {
167+
target_state.lock_excl_sync();
168+
}
169+
166170
ObjectContextRef &get_obc() {
167171
ceph_assert(!target_state.is_empty());
168172
ceph_assert(target_state.obc->is_loaded());
@@ -219,6 +223,12 @@ class ObjectContextLoader {
219223
return ret;
220224
}
221225

226+
Manager get_obc_manager(ObjectContextRef obc) {
227+
Manager ret = get_obc_manager(obc->obs.oi.soid, false);
228+
ret.set_state_obc(ret.target_state, obc);
229+
return ret;
230+
}
231+
222232
Manager get_obc_manager(
223233
Orderer &orderer, const hobject_t &oid, bool resolve_clone = true) {
224234
Manager ret = get_obc_manager(oid, resolve_clone);

src/crimson/osd/recovery_backend.cc

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "crimson/common/coroutine.h"
77
#include "crimson/common/exception.h"
8+
#include "crimson/common/log.h"
89
#include "crimson/osd/recovery_backend.h"
910
#include "crimson/osd/pg.h"
1011
#include "crimson/osd/pg_backend.h"
@@ -13,23 +14,20 @@
1314
#include "messages/MOSDFastDispatchOp.h"
1415
#include "osd/osd_types.h"
1516

16-
namespace {
17-
seastar::logger& logger() {
18-
return crimson::get_logger(ceph_subsys_osd);
19-
}
20-
}
17+
SET_SUBSYS(osd);
2118

2219
hobject_t RecoveryBackend::get_temp_recovery_object(
2320
const hobject_t& target,
2421
eversion_t version) const
2522
{
23+
LOG_PREFIX(RecoveryBackend::get_temp_recovery_object);
2624
hobject_t hoid =
2725
target.make_temp_hobject(fmt::format("temp_recovering_{}_{}_{}_{}",
2826
pg.get_info().pgid,
2927
version,
3028
pg.get_info().history.same_interval_since,
3129
target.snap));
32-
logger().debug("{} {}", __func__, hoid);
30+
DEBUGDPP("{}", pg, hoid);
3331
return hoid;
3432
}
3533

@@ -123,7 +121,8 @@ void RecoveryBackend::handle_backfill_finish(
123121
MOSDPGBackfill& m,
124122
crimson::net::ConnectionXcoreRef conn)
125123
{
126-
logger().debug("{}", __func__);
124+
LOG_PREFIX(RecoveryBackend::handle_backfill_finish);
125+
DEBUGDPP("", pg);
127126
ceph_assert(!pg.is_primary());
128127
ceph_assert(crimson::common::local_conf()->osd_kill_backfill_at != 1);
129128
auto reply = crimson::make_message<MOSDPGBackfill>(
@@ -146,7 +145,8 @@ RecoveryBackend::interruptible_future<>
146145
RecoveryBackend::handle_backfill_progress(
147146
MOSDPGBackfill& m)
148147
{
149-
logger().debug("{}", __func__);
148+
LOG_PREFIX(RecoveryBackend::handle_backfill_progress);
149+
DEBUGDPP("", pg);
150150
ceph_assert(!pg.is_primary());
151151
ceph_assert(crimson::common::local_conf()->osd_kill_backfill_at != 2);
152152

@@ -156,7 +156,7 @@ RecoveryBackend::handle_backfill_progress(
156156
m.stats,
157157
m.op == MOSDPGBackfill::OP_BACKFILL_PROGRESS,
158158
t);
159-
logger().debug("RecoveryBackend::handle_backfill_progress: do_transaction...");
159+
DEBUGDPP("submitting transaction", pg);
160160
return shard_services.get_store().do_transaction(
161161
pg.get_collection_ref(), std::move(t)).or_terminate();
162162
}
@@ -165,7 +165,8 @@ RecoveryBackend::interruptible_future<>
165165
RecoveryBackend::handle_backfill_finish_ack(
166166
MOSDPGBackfill& m)
167167
{
168-
logger().debug("{}", __func__);
168+
LOG_PREFIX(RecoveryBackend::handle_backfill_finish_ack);
169+
DEBUGDPP("", pg);
169170
ceph_assert(pg.is_primary());
170171
ceph_assert(crimson::common::local_conf()->osd_kill_backfill_at != 3);
171172
auto recovery_handler = pg.get_recovery_handler();
@@ -178,9 +179,10 @@ RecoveryBackend::handle_backfill(
178179
MOSDPGBackfill& m,
179180
crimson::net::ConnectionXcoreRef conn)
180181
{
181-
logger().debug("{}", __func__);
182+
LOG_PREFIX(RecoveryBackend::handle_backfill);
183+
DEBUGDPP("", pg);
182184
if (pg.old_peering_msg(m.map_epoch, m.query_epoch)) {
183-
logger().debug("{}: discarding {}", __func__, m);
185+
DEBUGDPP("discarding {}", pg, m);
184186
return seastar::now();
185187
}
186188
switch (m.op) {
@@ -201,7 +203,8 @@ RecoveryBackend::interruptible_future<>
201203
RecoveryBackend::handle_backfill_remove(
202204
MOSDPGBackfillRemove& m)
203205
{
204-
logger().debug("{} m.ls={}", __func__, m.ls);
206+
LOG_PREFIX(RecoveryBackend::handle_backfill_remove);
207+
DEBUGDPP("m.ls={}", pg, m.ls);
205208
assert(m.get_type() == MSG_OSD_PG_BACKFILL_REMOVE);
206209

207210
ObjectStore::Transaction t;
@@ -211,7 +214,7 @@ RecoveryBackend::handle_backfill_remove(
211214
pg.remove_maybe_snapmapped_object(t, soid);
212215
});
213216
}
214-
logger().debug("RecoveryBackend::handle_backfill_remove: do_transaction...");
217+
DEBUGDPP("submitting transaction", pg);
215218
co_await interruptor::make_interruptible(
216219
shard_services.get_store().do_transaction(
217220
pg.get_collection_ref(), std::move(t)).or_terminate());
@@ -223,25 +226,26 @@ RecoveryBackend::scan_for_backfill(
223226
[[maybe_unused]] const std::int64_t min,
224227
const std::int64_t max)
225228
{
226-
logger().debug("{} starting from {}", __func__, start);
229+
LOG_PREFIX(RecoveryBackend::scan_for_backfill);
230+
DEBUGDPP("starting from {}", pg, start);
227231
auto version_map = seastar::make_lw_shared<std::map<hobject_t, eversion_t>>();
228232
return backend->list_objects(start, max).then_interruptible(
229-
[this, start, version_map] (auto&& ret) {
233+
[FNAME, this, start, version_map] (auto&& ret) {
230234
auto&& [objects, next] = std::move(ret);
231235
return seastar::do_with(
232236
std::move(objects),
233-
[this, version_map](auto &objects) {
237+
[FNAME, this, version_map](auto &objects) {
234238
return interruptor::parallel_for_each(objects,
235-
[this, version_map] (const hobject_t& object)
239+
[FNAME, this, version_map] (const hobject_t& object)
236240
-> interruptible_future<> {
237241
crimson::osd::ObjectContextRef obc;
238242
if (pg.is_primary()) {
239243
obc = pg.obc_registry.maybe_get_cached_obc(object);
240244
}
241245
if (obc) {
242246
if (obc->obs.exists) {
243-
logger().debug("scan_for_backfill found (primary): {} {}",
244-
object, obc->obs.oi.version);
247+
DEBUGDPP("found (primary): {} {}",
248+
pg, object, obc->obs.oi.version);
245249
version_map->emplace(object, obc->obs.oi.version);
246250
} else {
247251
// if the object does not exist here, it must have been removed
@@ -251,25 +255,25 @@ RecoveryBackend::scan_for_backfill(
251255
return seastar::now();
252256
} else {
253257
return backend->load_metadata(object).safe_then_interruptible(
254-
[version_map, object] (auto md) {
258+
[FNAME, this, version_map, object] (auto md) {
255259
if (md->os.exists) {
256-
logger().debug("scan_for_backfill found: {} {}",
257-
object, md->os.oi.version);
260+
DEBUGDPP("found: {} {}", pg,
261+
object, md->os.oi.version);
258262
version_map->emplace(object, md->os.oi.version);
259263
}
260264
return seastar::now();
261265
}, PGBackend::load_metadata_ertr::assert_all{});
262266
}
263267
});
264-
}).then_interruptible([version_map, start=std::move(start), next=std::move(next), this] {
268+
}).then_interruptible([FNAME, this, version_map, start=std::move(start), next=std::move(next)] {
265269
BackfillInterval bi;
266270
bi.begin = std::move(start);
267271
bi.end = std::move(next);
268272
bi.version = pg.get_info().last_update;
269273
bi.objects = std::move(*version_map);
270-
logger().debug("{} BackfillInterval filled, leaving, {}",
271-
"scan_for_backfill",
272-
bi);
274+
DEBUGDPP("{} BackfillInterval filled, leaving, {}",
275+
"scan_for_backfill",
276+
pg, bi);
273277
return seastar::make_ready_future<BackfillInterval>(std::move(bi));
274278
});
275279
});
@@ -280,7 +284,8 @@ RecoveryBackend::handle_scan_get_digest(
280284
MOSDPGScan& m,
281285
crimson::net::ConnectionXcoreRef conn)
282286
{
283-
logger().debug("{}", __func__);
287+
LOG_PREFIX(RecoveryBackend::handle_scan_get_digest);
288+
DEBUGDPP("", pg);
284289
if (false /* FIXME: check for backfill too full */) {
285290
std::ignore = shard_services.start_operation<crimson::osd::LocalPeeringEvent>(
286291
// TODO: abstract start_background_recovery
@@ -316,7 +321,8 @@ RecoveryBackend::interruptible_future<>
316321
RecoveryBackend::handle_scan_digest(
317322
MOSDPGScan& m)
318323
{
319-
logger().debug("{}", __func__);
324+
LOG_PREFIX(RecoveryBackend::handle_scan_digest);
325+
DEBUGDPP("", pg);
320326
// Check that from is in backfill_targets vector
321327
ceph_assert(pg.is_backfill_target(m.from));
322328

@@ -342,9 +348,10 @@ RecoveryBackend::handle_scan(
342348
MOSDPGScan& m,
343349
crimson::net::ConnectionXcoreRef conn)
344350
{
345-
logger().debug("{}", __func__);
351+
LOG_PREFIX(RecoveryBackend::handle_scan);
352+
DEBUGDPP("", pg);
346353
if (pg.old_peering_msg(m.map_epoch, m.query_epoch)) {
347-
logger().debug("{}: discarding {}", __func__, m);
354+
DEBUGDPP("discarding {}", pg, m);
348355
return seastar::now();
349356
}
350357
switch (m.op) {
@@ -360,7 +367,7 @@ RecoveryBackend::handle_scan(
360367
}
361368

362369
RecoveryBackend::interruptible_future<>
363-
RecoveryBackend::handle_recovery_op(
370+
RecoveryBackend::handle_backfill_op(
364371
Ref<MOSDFastDispatchOp> m,
365372
crimson::net::ConnectionXcoreRef conn)
366373
{

src/crimson/osd/recovery_backend.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class RecoveryBackend {
7777

7878
virtual interruptible_future<> handle_recovery_op(
7979
Ref<MOSDFastDispatchOp> m,
80-
crimson::net::ConnectionXcoreRef conn);
80+
crimson::net::ConnectionXcoreRef conn) = 0;
8181

8282
virtual interruptible_future<> recover_object(
8383
const hobject_t& soid,
@@ -268,6 +268,10 @@ class RecoveryBackend {
268268

269269
void clean_up(ceph::os::Transaction& t, interrupt_cause_t why);
270270
virtual seastar::future<> on_stop() = 0;
271+
272+
virtual interruptible_future<> handle_backfill_op(
273+
Ref<MOSDFastDispatchOp> m,
274+
crimson::net::ConnectionXcoreRef conn);
271275
private:
272276
void handle_backfill_finish(
273277
MOSDPGBackfill& m,

0 commit comments

Comments
 (0)