diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index dc528d69fd3..73ca64a8a44 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -185,6 +185,7 @@ OSDService::OSDService(OSD *osd) : scrub_finalize_wq(osd->scrub_finalize_wq), rep_scrub_wq(osd->rep_scrub_wq), push_wq("push_wq", cct->_conf->osd_recovery_thread_timeout, &osd->recovery_tp), + gen_wq("gen_wq", cct->_conf->osd_recovery_thread_timeout, &osd->recovery_tp), class_handler(osd->class_handler), publish_lock("OSDService::publish_lock"), pre_publish_lock("OSDService::pre_publish_lock"), diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 7d5f10efd76..3ba78b1cdae 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -312,6 +312,7 @@ public: ThreadPool::WorkQueue &scrub_finalize_wq; ThreadPool::WorkQueue &rep_scrub_wq; GenContextWQ push_wq; + GenContextWQ gen_wq; ClassHandler *&class_handler; void dequeue_pg(PG *pg, list *dequeued); diff --git a/src/osd/PGBackend.h b/src/osd/PGBackend.h index 66456320926..0b750420519 100644 --- a/src/osd/PGBackend.h +++ b/src/osd/PGBackend.h @@ -416,6 +416,19 @@ virtual int objects_get_attrs( const hobject_t &hoid, map *out) = 0; + + virtual int objects_read_sync( + const hobject_t &hoid, + uint64_t off, + uint64_t len, + bufferlist *bl) = 0; + + virtual void objects_read_async( + const hobject_t &hoid, + uint64_t off, + uint64_t len, + bufferlist *bl, + Context *on_complete) = 0; }; #endif diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index 56335f1e817..60236541625 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -324,6 +324,41 @@ int ReplicatedBackend::objects_get_attrs( *out); } +int ReplicatedBackend::objects_read_sync( + const hobject_t &hoid, + uint64_t off, + uint64_t len, + bufferlist *bl) +{ + return osd->store->read(coll, hoid, off, len, *bl); +} + +struct AsyncReadCallback : public GenContext { + int r; + Context *c; + AsyncReadCallback(int r, Context *c) : r(r), c(c) {} + void finish(ThreadPool::TPHandle&) { + c->complete(r); + c = NULL; + } + ~AsyncReadCallback() { + delete c; + } +}; +void ReplicatedBackend::objects_read_async( + const hobject_t &hoid, + uint64_t off, + uint64_t len, + bufferlist *bl, + Context *on_complete) +{ + int r = osd->store->read(coll, hoid, off, len, *bl); + osd->gen_wq.queue( + get_parent()->bless_gencontext( + new AsyncReadCallback(r, on_complete))); +} + + class RPGTransaction : public PGBackend::PGTransaction { coll_t coll; coll_t temp_coll; diff --git a/src/osd/ReplicatedBackend.h b/src/osd/ReplicatedBackend.h index 84eacec10a6..e967d7dbcbd 100644 --- a/src/osd/ReplicatedBackend.h +++ b/src/osd/ReplicatedBackend.h @@ -176,6 +176,19 @@ public: const hobject_t &hoid, map *out); + int objects_read_sync( + const hobject_t &hoid, + uint64_t off, + uint64_t len, + bufferlist *bl); + + void objects_read_async( + const hobject_t &hoid, + uint64_t off, + uint64_t len, + bufferlist *bl, + Context *on_complete); + private: // push struct PushInfo {