@@ -28,7 +28,8 @@ SegmentedOolWriter::SegmentedOolWriter(
2828{
2929}
3030
31- void SegmentedOolWriter::write_record (
31+ SegmentedOolWriter::alloc_write_ertr::future<>
32+ SegmentedOolWriter::write_record (
3233 Transaction& t,
3334 record_t && record,
3435 std::list<LogicalCachedExtentRef>&& extents,
@@ -62,20 +63,15 @@ void SegmentedOolWriter::write_record(
6263 extent_addr = extent_addr.as_seg_paddr ().add_offset (
6364 extent->get_length ());
6465 }
65- // t might be destructed inside write_future
66- auto write_future = seastar::with_gate (write_guard,
67- [this , FNAME, tid=t.get_trans_id (),
68- record_base=ret.record_base_regardless_md ,
69- submit_fut=std::move (ret.future )]() mutable {
70- return std::move (submit_fut
71- ).safe_then ([this , FNAME, tid, record_base](record_locator_t ret) {
72- TRACE (" trans.{} {} finish {}=={}" ,
73- tid, segment_allocator.get_name (), ret, record_base);
74- // ool won't write metadata, so the paddrs must be equal
75- assert (ret.record_block_base == record_base.offset );
76- });
66+ return std::move (ret.future
67+ ).safe_then ([this , FNAME, &t,
68+ record_base=ret.record_base_regardless_md
69+ ](record_locator_t ret) {
70+ TRACET (" {} finish {}=={}" ,
71+ t, segment_allocator.get_name (), ret, record_base);
72+ // ool won't write metadata, so the paddrs must be equal
73+ assert (ret.record_block_base == record_base.offset );
7774 });
78- t.get_handle ().add_write_future (std::move (write_future));
7975}
8076
8177SegmentedOolWriter::alloc_write_iertr::future<>
@@ -112,15 +108,19 @@ SegmentedOolWriter::do_write(
112108 DEBUGT (" {} extents={} submit {} extents and roll, unavailable ..." ,
113109 t, segment_allocator.get_name (),
114110 extents.size (), num_extents);
111+ auto fut_write = alloc_write_ertr::now ();
115112 if (num_extents > 0 ) {
116113 assert (record_submitter.check_action (record.size ) !=
117114 action_t ::ROLL);
118- write_record (
115+ fut_write = write_record (
119116 t, std::move (record), std::move (pending_extents),
120117 true /* with_atomic_roll_segment */ );
121118 }
122119 return trans_intr::make_interruptible (
123- record_submitter.roll_segment ()
120+ record_submitter.roll_segment (
121+ ).safe_then ([fut_write=std::move (fut_write)]() mutable {
122+ return std::move (fut_write);
123+ })
124124 ).si_then ([this , &t, &extents] {
125125 return do_write (t, extents);
126126 });
@@ -151,12 +151,15 @@ SegmentedOolWriter::do_write(
151151 DEBUGT (" {} extents={} submit {} extents ..." ,
152152 t, segment_allocator.get_name (),
153153 extents.size (), pending_extents.size ());
154- write_record (t, std::move (record), std::move (pending_extents));
155- if (!extents.empty ()) {
156- return do_write (t, extents);
157- } else {
158- return alloc_write_iertr::now ();
159- }
154+ return trans_intr::make_interruptible (
155+ write_record (t, std::move (record), std::move (pending_extents))
156+ ).si_then ([this , &t, &extents] {
157+ if (!extents.empty ()) {
158+ return do_write (t, extents);
159+ } else {
160+ return alloc_write_iertr::now ();
161+ }
162+ });
160163 }
161164 // SUBMIT_NOT_FULL: evaluate the next extent
162165 }
@@ -166,8 +169,8 @@ SegmentedOolWriter::do_write(
166169 t, segment_allocator.get_name (),
167170 num_extents);
168171 assert (num_extents > 0 );
169- write_record (t, std::move (record), std::move (pending_extents));
170- return alloc_write_iertr::now ( );
172+ return trans_intr::make_interruptible (
173+ write_record (t, std::move (record), std::move (pending_extents)) );
171174}
172175
173176SegmentedOolWriter::alloc_write_iertr::future<>
@@ -983,11 +986,13 @@ RandomBlockOolWriter::alloc_write_ool_extents(
983986 if (extents.empty ()) {
984987 return alloc_write_iertr::now ();
985988 }
986- do_write (t, extents);
987- return alloc_write_iertr::now ();
989+ return seastar::with_gate (write_guard, [this , &t, &extents] {
990+ return do_write (t, extents);
991+ });
988992}
989993
990- void RandomBlockOolWriter::do_write (
994+ RandomBlockOolWriter::alloc_write_iertr::future<>
995+ RandomBlockOolWriter::do_write (
991996 Transaction& t,
992997 std::list<CachedExtentRef>& extents)
993998{
@@ -1040,10 +1045,8 @@ void RandomBlockOolWriter::do_write(
10401045 }
10411046 }
10421047
1043- // t might be destructed inside write_future
1044- auto write_future = seastar::with_gate (write_guard,
1045- [writes=std::move (writes)]() mutable {
1046- return seastar::do_with (std::move (writes),
1048+ return trans_intr::make_interruptible (
1049+ seastar::do_with (std::move (writes),
10471050 [](auto & writes) {
10481051 return crimson::do_for_each (writes,
10491052 [](auto & info) {
@@ -1054,9 +1057,8 @@ void RandomBlockOolWriter::do_write(
10541057 " Invalid error when writing record" }
10551058 );
10561059 });
1057- });
1058- });
1059- t.get_handle ().add_write_future (std::move (write_future));
1060+ })
1061+ );
10601062}
10611063
10621064}
0 commit comments