From: Radoslaw Zarzynski Date: Fri, 2 Aug 2019 11:46:20 +0000 (+0200) Subject: crimson/osd: implement cls_cxx_stat(). X-Git-Tag: v15.1.0~1774^2~18 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aaadbe6df7381be5f23f1156a09db577b8d57527;p=ceph.git crimson/osd: implement cls_cxx_stat(). Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/objclass.cc b/src/crimson/osd/objclass.cc index 024c0999b068..e8a716010302 100644 --- a/src/crimson/osd/objclass.cc +++ b/src/crimson/osd/objclass.cc @@ -7,6 +7,9 @@ #include "common/config.h" #include "common/debug.h" +#include "crimson/osd/exceptions.h" +#include "crimson/osd/pg_backend.h" + #include "objclass/objclass.h" #include "osd/ClassHandler.h" @@ -63,6 +66,31 @@ int cls_cxx_remove(cls_method_context_t hctx) int cls_cxx_stat(cls_method_context_t hctx, uint64_t *size, time_t *mtime) { + OSDOp op;//{CEPH_OSD_OP_STAT}; + op.op.op = CEPH_OSD_OP_STAT; + + // we're blocking here which presumes execution in Seastar's thread. + try { + hctx.backend->stat(*hctx.os, op).get(); + } catch (ceph::osd::error& e) { + return -e.code().value(); + } + + utime_t ut; + uint64_t s; + try { + auto iter = op.outdata.cbegin(); + decode(s, iter); + decode(ut, iter); + } catch (buffer::error& err) { + return -EIO; + } + if (size) { + *size = s; + } + if (mtime) { + *mtime = ut.sec(); + } return 0; } diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index e539544bed35..4a6bbc07334a 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -257,7 +257,7 @@ seastar::future<> PGBackend::stat( encode(os.oi.mtime, osd_op.outdata); } else { logger().debug("stat object does not exist"); - throw ::object_not_found(); + throw ceph::osd::object_not_found{}; } return seastar::now(); // TODO: ctx->delta_stats.num_rd++; @@ -451,9 +451,9 @@ seastar::future<> PGBackend::call( #endif - return seastar::async([&osd_op, method, indata=std::move(indata)]() mutable { + return seastar::async([this,&os,&osd_op, method, indata=std::move(indata)]() mutable { ceph::bufferlist outdata; - const auto ret = method->exec((cls_method_context_t)&osd_op, indata, outdata); + const auto ret = method->exec(cls_method_context_t{this, &os}, indata, outdata); if (ret < 0) { throw ceph::osd::make_error(ret); } diff --git a/src/include/rados/objclass.h b/src/include/rados/objclass.h index 80ae69d2511c..16224b6a4102 100644 --- a/src/include/rados/objclass.h +++ b/src/include/rados/objclass.h @@ -57,7 +57,14 @@ typedef void *cls_method_handle_t; * * A context for the method of the object class. */ +#ifdef WITH_SEASTAR +typedef struct { + class PGBackend *backend = nullptr; + class ObjectState *os = nullptr; +} cls_method_context_t; +#else typedef void* cls_method_context_t; +#endif // WITH_SEASTAR /*class utils*/ extern int cls_log(int level, const char *format, ...)