// vim: ts=8 sw=2 smarttab
#include "crimson/common/log.h"
+#include "crimson/common/coroutine.h"
#include "crimson/osd/pg.h"
#include "crimson/osd/osd_connection_priv.h"
#include "messages/MOSDRepScrubMap.h"
ret.valid_through = pg.get_info().last_update;
DEBUGDPP("begin: {}, end: {}", pg, begin, end);
- return interruptor::make_interruptible(
+ auto [objects, _] = co_await interruptor::make_interruptible(
pg.shard_services.get_store().list_objects(
pg.get_collection_ref(),
ghobject_t(begin, ghobject_t::NO_GEN, pg.get_pgid().shard),
ghobject_t(end, ghobject_t::NO_GEN, pg.get_pgid().shard),
std::numeric_limits<uint64_t>::max())
- ).then_interruptible([FNAME, this, &pg](auto &&result) {
- DEBUGDPP("listed {} objects", pg, std::get<0>(result).size());
- return seastar::do_with(
- std::move(std::get<0>(result)),
- [this, &pg](auto &objects) {
- return interruptor::do_for_each(
- objects,
- [this, &pg](auto &obj) {
- if (obj.is_pgmeta() || obj.hobj.is_temp()) {
- return interruptor::now();
- } else {
- return scan_object(pg, obj);
- }
- });
- });
- }).then_interruptible([FNAME, this, &pg] {
- if (local) {
- DEBUGDPP("complete, submitting local event", pg);
- pg.scrubber.handle_event(
- scrub::ScrubContext::scan_range_complete_t(
- pg.get_pg_whoami(),
- std::move(ret)));
- return seastar::now();
- } else {
- DEBUGDPP("complete, sending response to primary", pg);
- auto m = crimson::make_message<MOSDRepScrubMap>(
- spg_t(pg.get_pgid().pgid, pg.get_primary().shard),
- pg.get_osdmap_epoch(),
- pg.get_pg_whoami());
- encode(ret, m->get_data());
- pg.scrubber.handle_event(
- scrub::ScrubContext::generate_and_submit_chunk_result_complete_t{});
- return pg.shard_services.send_to_osd(
+ );
+
+ DEBUGDPP("listed {} objects", pg, objects);
+ for (const auto &object: objects) {
+ co_await scan_object(pg, object);
+ }
+
+ if (local) {
+ DEBUGDPP("complete, submitting local event", pg);
+ pg.scrubber.handle_event(
+ scrub::ScrubContext::scan_range_complete_t(
+ pg.get_pg_whoami(),
+ std::move(ret)));
+ } else {
+ DEBUGDPP("complete, sending response to primary", pg);
+ auto m = crimson::make_message<MOSDRepScrubMap>(
+ spg_t(pg.get_pgid().pgid, pg.get_primary().shard),
+ pg.get_osdmap_epoch(),
+ pg.get_pg_whoami());
+ encode(ret, m->get_data());
+ pg.scrubber.handle_event(
+ scrub::ScrubContext::generate_and_submit_chunk_result_complete_t{});
+ co_await interruptor::make_interruptible(
+ pg.shard_services.send_to_osd(
pg.get_primary().osd,
std::move(m),
- pg.get_osdmap_epoch());
- }
- });
+ pg.get_osdmap_epoch()));
+ }
}
ScrubScan::ifut<> ScrubScan::scan_object(