|
2 | 2 | // vim: ts=8 sw=2 smarttab |
3 | 3 |
|
4 | 4 | #include "crimson/common/log.h" |
| 5 | +#include "crimson/common/coroutine.h" |
5 | 6 | #include "crimson/osd/pg.h" |
6 | 7 | #include "crimson/osd/osd_connection_priv.h" |
7 | 8 | #include "messages/MOSDRepScrubMap.h" |
@@ -144,50 +145,40 @@ ScrubScan::ifut<> ScrubScan::run(PG &pg) |
144 | 145 | ret.valid_through = pg.get_info().last_update; |
145 | 146 |
|
146 | 147 | DEBUGDPP("begin: {}, end: {}", pg, begin, end); |
147 | | - return interruptor::make_interruptible( |
| 148 | + auto [objects, _] = co_await interruptor::make_interruptible( |
148 | 149 | pg.shard_services.get_store().list_objects( |
149 | 150 | pg.get_collection_ref(), |
150 | 151 | ghobject_t(begin, ghobject_t::NO_GEN, pg.get_pgid().shard), |
151 | 152 | ghobject_t(end, ghobject_t::NO_GEN, pg.get_pgid().shard), |
152 | 153 | std::numeric_limits<uint64_t>::max()) |
153 | | - ).then_interruptible([FNAME, this, &pg](auto &&result) { |
154 | | - DEBUGDPP("listed {} objects", pg, std::get<0>(result).size()); |
155 | | - return seastar::do_with( |
156 | | - std::move(std::get<0>(result)), |
157 | | - [this, &pg](auto &objects) { |
158 | | - return interruptor::do_for_each( |
159 | | - objects, |
160 | | - [this, &pg](auto &obj) { |
161 | | - if (obj.is_pgmeta() || obj.hobj.is_temp()) { |
162 | | - return interruptor::now(); |
163 | | - } else { |
164 | | - return scan_object(pg, obj); |
165 | | - } |
166 | | - }); |
167 | | - }); |
168 | | - }).then_interruptible([FNAME, this, &pg] { |
169 | | - if (local) { |
170 | | - DEBUGDPP("complete, submitting local event", pg); |
171 | | - pg.scrubber.handle_event( |
172 | | - scrub::ScrubContext::scan_range_complete_t( |
173 | | - pg.get_pg_whoami(), |
174 | | - std::move(ret))); |
175 | | - return seastar::now(); |
176 | | - } else { |
177 | | - DEBUGDPP("complete, sending response to primary", pg); |
178 | | - auto m = crimson::make_message<MOSDRepScrubMap>( |
179 | | - spg_t(pg.get_pgid().pgid, pg.get_primary().shard), |
180 | | - pg.get_osdmap_epoch(), |
181 | | - pg.get_pg_whoami()); |
182 | | - encode(ret, m->get_data()); |
183 | | - pg.scrubber.handle_event( |
184 | | - scrub::ScrubContext::generate_and_submit_chunk_result_complete_t{}); |
185 | | - return pg.shard_services.send_to_osd( |
| 154 | + ); |
| 155 | + |
| 156 | + DEBUGDPP("listed {} objects", pg, objects); |
| 157 | + for (const auto &object: objects) { |
| 158 | + co_await scan_object(pg, object); |
| 159 | + } |
| 160 | + |
| 161 | + if (local) { |
| 162 | + DEBUGDPP("complete, submitting local event", pg); |
| 163 | + pg.scrubber.handle_event( |
| 164 | + scrub::ScrubContext::scan_range_complete_t( |
| 165 | + pg.get_pg_whoami(), |
| 166 | + std::move(ret))); |
| 167 | + } else { |
| 168 | + DEBUGDPP("complete, sending response to primary", pg); |
| 169 | + auto m = crimson::make_message<MOSDRepScrubMap>( |
| 170 | + spg_t(pg.get_pgid().pgid, pg.get_primary().shard), |
| 171 | + pg.get_osdmap_epoch(), |
| 172 | + pg.get_pg_whoami()); |
| 173 | + encode(ret, m->get_data()); |
| 174 | + pg.scrubber.handle_event( |
| 175 | + scrub::ScrubContext::generate_and_submit_chunk_result_complete_t{}); |
| 176 | + co_await interruptor::make_interruptible( |
| 177 | + pg.shard_services.send_to_osd( |
186 | 178 | pg.get_primary().osd, |
187 | 179 | std::move(m), |
188 | | - pg.get_osdmap_epoch()); |
189 | | - } |
190 | | - }); |
| 180 | + pg.get_osdmap_epoch())); |
| 181 | + } |
191 | 182 | } |
192 | 183 |
|
193 | 184 | ScrubScan::ifut<> ScrubScan::scan_object( |
|
0 commit comments