static seastar::future<bool, hobject_t> pgls_filter(
const PGLSFilter& filter,
- PGBackend& backend,
+ const PGBackend& backend,
const hobject_t& sobj)
{
if (const auto xattr = filter.get_xattr(); !xattr.empty()) {
static seastar::future<ceph::bufferlist> do_pgnls_common(
const hobject_t& pg_start,
const hobject_t& pg_end,
- PGBackend& backend,
+ const PGBackend& backend,
const hobject_t& lower_bound,
const std::string& nspace,
const uint64_t limit,
});
}
-seastar::future<> OpsExecuter::do_pgnls(OSDOp& osd_op)
+static seastar::future<> do_pgnls(
+ const PG& pg,
+ const std::string& nspace,
+ OSDOp& osd_op)
{
hobject_t lower_bound;
try {
const auto pg_start = pg.get_pgid().pgid.get_hobj_start();
const auto pg_end = \
pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num());
- return do_pgnls_common(pg_start, pg_end, backend, lower_bound, os->oi.soid.get_namespace(), osd_op.op.pgls.count, nullptr /* no filter */)
+ return do_pgnls_common(pg_start,
+ pg_end,
+ pg.get_backend(),
+ lower_bound,
+ nspace,
+ osd_op.op.pgls.count,
+ nullptr /* no filter */)
.then([&osd_op](bufferlist bl) {
osd_op.outdata = std::move(bl);
return seastar::now();
});
}
-seastar::future<> OpsExecuter::do_pgnls_filtered(OSDOp& osd_op)
+static seastar::future<> do_pgnls_filtered(
+ const PG& pg,
+ const std::string& nspace,
+ OSDOp& osd_op)
{
std::string cname, mname, type;
auto bp = osd_op.indata.cbegin();
__func__, cname, mname, type, lower_bound,
static_cast<const void*>(filter.get()));
return seastar::do_with(std::move(filter),
- [this, &osd_op, lower_bound=std::move(lower_bound)](auto&& filter) {
+ [&, lower_bound=std::move(lower_bound)](auto&& filter) {
const auto pg_start = pg.get_pgid().pgid.get_hobj_start();
- const auto pg_end = \
- pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num());
- return do_pgnls_common(pg_start, pg_end, backend, lower_bound, os->oi.soid.get_namespace(),
- osd_op.op.pgls.count, filter.get())
+ const auto pg_end = pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num());
+ return do_pgnls_common(pg_start,
+ pg_end,
+ pg.get_backend(),
+ lower_bound,
+ nspace,
+ osd_op.op.pgls.count,
+ filter.get())
.then([&osd_op](bufferlist bl) {
osd_op.outdata = std::move(bl);
return seastar::now();
return backend.setxattr(os, osd_op, txn);
});
case CEPH_OSD_OP_PGNLS_FILTER:
- return do_pgnls_filtered(osd_op);
+ return do_pg_op([&osd_op] (const auto& pg, const auto& nspace) {
+ return do_pgnls_filtered(pg, nspace, osd_op);
+ });
case CEPH_OSD_OP_PGNLS:
- return do_pgnls(osd_op);
+ return do_pg_op([&osd_op] (const auto& pg, const auto& nspace) {
+ return do_pgnls(pg, nspace, osd_op);
+ });
case CEPH_OSD_OP_DELETE:
return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
return backend.remove(os, txn);
size_t num_read = 0; ///< count read ops
size_t num_write = 0; ///< count update ops
- seastar::future<> do_pgnls(OSDOp& osd_op);
- seastar::future<> do_pgnls_filtered(OSDOp& osd_op);
-
seastar::future<> do_op_call(class OSDOp& osd_op);
template <class Func>
auto do_const_op(Func&& f) {
// TODO: pass backend as read-only
- return std::forward<Func>(f)(backend, const_cast<const ObjectState&>(*os));
+ return std::forward<Func>(f)(backend, std::as_const(*os));
}
template <class Func>
auto do_read_op(Func&& f) {
++num_read;
// TODO: pass backend as read-only
- return std::forward<Func>(f)(backend, const_cast<const ObjectState&>(*os));
+ return do_const_op(std::forward<Func>(f));
}
template <class Func>
return std::forward<Func>(f)(backend, *os, txn);
}
+ // PG operations are being provided with pg instead of os.
+ template <class Func>
+ auto do_pg_op(Func&& f) {
+ return std::forward<Func>(f)(std::as_const(pg),
+ std::as_const(os->oi.soid.get_namespace()));
+ }
+
public:
OpsExecuter(PGBackend::cached_os_t os, PG& pg)
: os(std::move(os)), pg(pg), backend(pg.get_backend()) {