Skip to content

Commit 9d6c888

Browse files
authored
Merge pull request ceph#55101 from Matan-B/wip-matanb-crimson-snaptrim_event-cleanup
crimson/osd/osd_operations: snaptrim_event cleanup Reviewed-by: Samuel Just <[email protected]>
2 parents aacb91f + a59e708 commit 9d6c888

File tree

7 files changed

+86
-81
lines changed

7 files changed

+86
-81
lines changed

src/crimson/common/subop_blocker.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2+
// vim: ts=8 sw=2 smarttab
3+
4+
#pragma once
5+
6+
#include "osd/osd_op_util.h"
7+
#include "crimson/osd/osd_operation.h"
8+
9+
namespace crimson::osd {
10+
11+
using interruptor =
12+
::crimson::interruptible::interruptor<
13+
::crimson::osd::IOInterruptCondition>;
14+
15+
// bases on 998cb8c141bb89aafae298a9d5e130fbd78fe5f2
16+
template <typename T>
17+
struct SubOpBlocker : crimson::BlockerT<SubOpBlocker<T>> {
18+
static constexpr const char* type_name = "CompoundOpBlocker";
19+
20+
using id_done_t = std::pair<crimson::OperationRef, T>;
21+
22+
void dump_detail(Formatter *f) const final {
23+
f->open_array_section("dependent_operations");
24+
{
25+
for (const auto &kv : subops) {
26+
f->dump_unsigned("op_id", kv.first->get_id());
27+
}
28+
}
29+
f->close_section();
30+
}
31+
32+
template <class... Args>
33+
void emplace_back(Args&&... args) {
34+
subops.emplace_back(std::forward<Args>(args)...);
35+
};
36+
37+
T interruptible_wait_completion() {
38+
return interruptor::do_for_each(subops, [](auto&& kv) {
39+
return std::move(kv.second);
40+
});
41+
}
42+
43+
T wait_completion() {
44+
return seastar::do_for_each(subops, [](auto&& kv) {
45+
return std::move(kv.second);
46+
});
47+
}
48+
49+
private:
50+
std::vector<id_done_t> subops;
51+
};
52+
53+
} // namespace crimson::osd

src/crimson/osd/osd_operations/background_recovery.cc

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,6 @@
1212
#include "crimson/osd/osd_operation_external_tracking.h"
1313
#include "crimson/osd/osd_operations/background_recovery.h"
1414

15-
namespace {
16-
seastar::logger& logger() {
17-
return crimson::get_logger(ceph_subsys_osd);
18-
}
19-
}
20-
2115
namespace crimson {
2216
template <>
2317
struct EventBackendRegistry<osd::UrgentRecovery> {

src/crimson/osd/osd_operations/pg_advance_map.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ namespace {
2121
namespace crimson::osd {
2222

2323
PGAdvanceMap::PGAdvanceMap(
24-
ShardServices &shard_services, Ref<PG> pg, epoch_t to,
24+
Ref<PG> pg, ShardServices &shard_services, epoch_t to,
2525
PeeringCtx &&rctx, bool do_init)
26-
: shard_services(shard_services), pg(pg), to(to),
26+
: pg(pg), shard_services(shard_services), to(to),
2727
rctx(std::move(rctx)), do_init(do_init)
2828
{
2929
logger().debug("{}: created", *this);

src/crimson/osd/osd_operations/pg_advance_map.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ class PGAdvanceMap : public PhasedOperationT<PGAdvanceMap> {
2525
static constexpr OperationTypeCode type = OperationTypeCode::pg_advance_map;
2626

2727
protected:
28-
ShardServices &shard_services;
2928
Ref<PG> pg;
29+
ShardServices &shard_services;
3030
PipelineHandle handle;
3131

3232
std::optional<epoch_t> from;
@@ -37,7 +37,7 @@ class PGAdvanceMap : public PhasedOperationT<PGAdvanceMap> {
3737

3838
public:
3939
PGAdvanceMap(
40-
ShardServices &shard_services, Ref<PG> pg, epoch_t to,
40+
Ref<PG> pg, ShardServices &shard_services, epoch_t to,
4141
PeeringCtx &&rctx, bool do_init);
4242
~PGAdvanceMap();
4343

src/crimson/osd/osd_operations/snaptrim_event.cc

Lines changed: 14 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -39,31 +39,6 @@ PG::BackgroundProcessLock::lock_with_op(SnapTrimEvent &st_event) noexcept
3939
});
4040
}
4141

42-
void SnapTrimEvent::SubOpBlocker::dump_detail(Formatter *f) const
43-
{
44-
f->open_array_section("dependent_operations");
45-
{
46-
for (const auto &kv : subops) {
47-
f->dump_unsigned("op_id", kv.first->get_id());
48-
}
49-
}
50-
f->close_section();
51-
}
52-
53-
template <class... Args>
54-
void SnapTrimEvent::SubOpBlocker::emplace_back(Args&&... args)
55-
{
56-
subops.emplace_back(std::forward<Args>(args)...);
57-
};
58-
59-
SnapTrimEvent::remove_or_update_iertr::future<>
60-
SnapTrimEvent::SubOpBlocker::wait_completion()
61-
{
62-
return interruptor::do_for_each(subops, [](auto&& kv) {
63-
return std::move(kv.second);
64-
});
65-
}
66-
6742
void SnapTrimEvent::print(std::ostream &lhs) const
6843
{
6944
lhs << "SnapTrimEvent("
@@ -85,19 +60,11 @@ CommonPGPipeline& SnapTrimEvent::client_pp()
8560
return pg->request_pg_pipeline;
8661
}
8762

88-
SnapTrimEvent::snap_trim_ertr::future<seastar::stop_iteration>
63+
SnapTrimEvent::snap_trim_event_ret_t
8964
SnapTrimEvent::start()
9065
{
9166
ShardServices &shard_services = pg->get_shard_services();
92-
IRef ref = this;
93-
return interruptor::with_interruption(
94-
// SnapTrimEvent is a background operation,
95-
// it's lifetime is not guarnteed since the caller
96-
// returned future is being ignored. We should capture
97-
// a self reference thourhgout the entire execution
98-
// progress (not only on finally() continuations).
99-
// See: PG::on_active_actmap()
100-
[&shard_services, this, ref] {
67+
return interruptor::with_interruption([&shard_services, this] {
10168
return enter_stage<interruptor>(
10269
client_pp().wait_for_active
10370
).then_interruptible([this] {
@@ -154,22 +121,19 @@ SnapTrimEvent::start()
154121
return [&shard_services, this](const auto &to_trim) {
155122
for (const auto& object : to_trim) {
156123
logger().debug("{}: trimming {}", *this, object);
157-
auto [op, fut] = shard_services.start_operation_may_interrupt<
158-
interruptor, SnapTrimObjSubEvent>(
159-
pg,
160-
object,
161-
snapid);
162124
subop_blocker.emplace_back(
163-
std::move(op),
164-
std::move(fut)
165-
);
125+
shard_services.start_operation_may_interrupt<
126+
interruptor, SnapTrimObjSubEvent>(
127+
pg,
128+
object,
129+
snapid));
166130
}
167131
return interruptor::now();
168132
}(to_trim).then_interruptible([this] {
169133
return enter_stage<interruptor>(wait_subop);
170134
}).then_interruptible([this] {
171135
logger().debug("{}: awaiting completion", *this);
172-
return subop_blocker.wait_completion();
136+
return subop_blocker.interruptible_wait_completion();
173137
}).finally([this] {
174138
pg->background_process_lock.unlock();
175139
}).si_then([this] {
@@ -200,11 +164,12 @@ SnapTrimEvent::start()
200164
});
201165
});
202166
});
203-
}, [this, ref]
204-
(std::exception_ptr eptr) -> snap_trim_ertr::future<seastar::stop_iteration> {
167+
}, [this](std::exception_ptr eptr) -> snap_trim_event_ret_t {
205168
logger().debug("{}: interrupted {}", *this, eptr);
206169
return crimson::ct_error::eagain::make();
207-
}, pg).finally([this, ref=std::move(ref)] {
170+
}, pg).finally([this] {
171+
// This SnapTrimEvent op lifetime is maintained within
172+
// PerShardState::start_operation() implementation.
208173
logger().debug("{}: exit", *this);
209174
handle.exit();
210175
});
@@ -216,7 +181,7 @@ CommonPGPipeline& SnapTrimObjSubEvent::client_pp()
216181
return pg->request_pg_pipeline;
217182
}
218183

219-
SnapTrimObjSubEvent::remove_or_update_iertr::future<>
184+
SnapTrimObjSubEvent::snap_trim_obj_subevent_ret_t
220185
SnapTrimObjSubEvent::remove_clone(
221186
ObjectContextRef obc,
222187
ObjectContextRef head_obc,
@@ -463,7 +428,7 @@ SnapTrimObjSubEvent::remove_or_update(
463428
});
464429
}
465430

466-
SnapTrimObjSubEvent::remove_or_update_iertr::future<>
431+
SnapTrimObjSubEvent::snap_trim_obj_subevent_ret_t
467432
SnapTrimObjSubEvent::start()
468433
{
469434
return enter_stage<interruptor>(

src/crimson/osd/osd_operations/snaptrim_event.h

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "crimson/osd/osdmap_gate.h"
1010
#include "crimson/osd/osd_operation.h"
11+
#include "crimson/common/subop_blocker.h"
1112
#include "crimson/osd/osd_operations/common/pg_pipeline.h"
1213
#include "crimson/osd/pg.h"
1314
#include "crimson/osd/pg_activation_blocker.h"
@@ -38,6 +39,10 @@ class SnapTrimEvent final : public PhasedOperationT<SnapTrimEvent> {
3839
crimson::ct_error::eagain>;
3940
using snap_trim_iertr = remove_or_update_iertr::extend<
4041
crimson::ct_error::eagain>;
42+
using snap_trim_event_ret_t =
43+
snap_trim_ertr::future<seastar::stop_iteration>;
44+
using snap_trim_obj_subevent_ret_t =
45+
remove_or_update_iertr::future<>;
4146

4247
static constexpr OperationTypeCode type = OperationTypeCode::snaptrim_event;
4348

@@ -52,27 +57,12 @@ class SnapTrimEvent final : public PhasedOperationT<SnapTrimEvent> {
5257

5358
void print(std::ostream &) const final;
5459
void dump_detail(ceph::Formatter* f) const final;
55-
snap_trim_ertr::future<seastar::stop_iteration> start();
60+
snap_trim_event_ret_t start();
5661

5762
private:
5863
CommonPGPipeline& client_pp();
5964

60-
// bases on 998cb8c141bb89aafae298a9d5e130fbd78fe5f2
61-
struct SubOpBlocker : crimson::BlockerT<SubOpBlocker> {
62-
static constexpr const char* type_name = "CompoundOpBlocker";
63-
64-
using id_done_t = std::pair<crimson::OperationRef,
65-
remove_or_update_iertr::future<>>;
66-
67-
void dump_detail(Formatter *f) const final;
68-
69-
template <class... Args>
70-
void emplace_back(Args&&... args);
71-
72-
remove_or_update_iertr::future<> wait_completion();
73-
private:
74-
std::vector<id_done_t> subops;
75-
} subop_blocker;
65+
SubOpBlocker<snap_trim_obj_subevent_ret_t> subop_blocker;
7666

7767
// we don't need to synchronize with other instances of SnapTrimEvent;
7868
// it's here for the sake of op tracking.
@@ -87,8 +77,8 @@ class SnapTrimEvent final : public PhasedOperationT<SnapTrimEvent> {
8777
static constexpr auto type_name = "SnapTrimEvent::wait_trim_timer";
8878
} wait_trim_timer;
8979

90-
PipelineHandle handle;
9180
Ref<PG> pg;
81+
PipelineHandle handle;
9282
SnapMapper& snap_mapper;
9383
const snapid_t snapid;
9484
const bool needs_pause;
@@ -122,6 +112,8 @@ class SnapTrimObjSubEvent : public PhasedOperationT<SnapTrimObjSubEvent> {
122112
using remove_or_update_iertr =
123113
crimson::interruptible::interruptible_errorator<
124114
IOInterruptCondition, remove_or_update_ertr>;
115+
using snap_trim_obj_subevent_ret_t =
116+
remove_or_update_iertr::future<>;
125117

126118
static constexpr OperationTypeCode type =
127119
OperationTypeCode::snaptrimobj_subevent;
@@ -137,7 +129,7 @@ class SnapTrimObjSubEvent : public PhasedOperationT<SnapTrimObjSubEvent> {
137129

138130
void print(std::ostream &) const final;
139131
void dump_detail(ceph::Formatter* f) const final;
140-
remove_or_update_iertr::future<> start();
132+
snap_trim_obj_subevent_ret_t start();
141133

142134
CommonPGPipeline& client_pp();
143135

@@ -146,7 +138,7 @@ class SnapTrimObjSubEvent : public PhasedOperationT<SnapTrimObjSubEvent> {
146138
* https://tracker.ceph.com/issues/63307 */
147139
object_stat_sum_t delta_stats;
148140

149-
remove_or_update_iertr::future<> remove_clone(
141+
snap_trim_obj_subevent_ret_t remove_clone(
150142
ObjectContextRef obc,
151143
ObjectContextRef head_obc,
152144
ceph::os::Transaction& txn);

src/crimson/osd/shard_services.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,9 @@ seastar::future<> PerShardState::broadcast_map_to_pgs(
9797
pgs.begin(), pgs.end(),
9898
[=, &shard_services](auto& pg) {
9999
return shard_services.start_operation<PGAdvanceMap>(
100+
pg.second,
100101
shard_services,
101-
pg.second, epoch,
102+
epoch,
102103
PeeringCtx{}, false).second;
103104
});
104105
}
@@ -689,7 +690,7 @@ seastar::future<Ref<PG>> ShardServices::handle_pg_create_info(
689690
rctx.transaction);
690691

691692
return start_operation<PGAdvanceMap>(
692-
*this, pg, get_map()->get_epoch(), std::move(rctx), true
693+
pg, *this, get_map()->get_epoch(), std::move(rctx), true
693694
).second.then([pg=pg] {
694695
return seastar::make_ready_future<Ref<PG>>(pg);
695696
});

0 commit comments

Comments
 (0)