From: Frank S. Filz Date: Wed, 4 May 2022 20:35:44 +0000 (-0700) Subject: ObjectCacher: Prepare file_write path for non-blocking I/O X-Git-Tag: v19.0.0~814^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bf98aec6d3ecff17125b71590f000c704e89c306;p=ceph.git ObjectCacher: Prepare file_write path for non-blocking I/O For non-blocking I/O, we will want to be able to override block_writes_upfront so rename the member cfg_block_writes_upfront and add an option to pass block_writes_upfront as a parameter along with a member access method so caller can pass cfg_block_writes_upfront. Signed-off-by: Frank S. Filz --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 6a68ce81c7d7..971a4839d085 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -11027,7 +11027,8 @@ int64_t Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf, r = objectcacher->file_write(&in->oset, &in->layout, in->snaprealm->get_snap_context(), offset, size, bl, ceph::real_clock::now(), - 0); + 0, nullptr, + objectcacher->CFG_block_writes_upfront()); put_cap_ref(in, CEPH_CAP_FILE_BUFFER); if (r < 0) diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index f2b6d9736749..e850f9a7cb0f 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -685,7 +685,7 @@ ObjectCacher::ObjectCacher(CephContext *cct_, string name, max_dirty(max_dirty), target_dirty(target_dirty), max_size(max_bytes), max_objects(max_objects), max_dirty_age(ceph::make_timespan(max_dirty_age)), - block_writes_upfront(block_writes_upfront), + cfg_block_writes_upfront(block_writes_upfront), trace_endpoint("ObjectCacher"), flush_set_callback(flush_callback), flush_set_callback_arg(flush_callback_arg), @@ -1722,7 +1722,8 @@ void ObjectCacher::retry_waiting_reads() } int ObjectCacher::writex(OSDWrite *wr, ObjectSet *oset, Context *onfreespace, - ZTracer::Trace *parent_trace) + ZTracer::Trace *parent_trace, + bool block_writes_upfront) { ceph_assert(ceph_mutex_is_locked(lock)); ceph::real_time now = ceph::real_clock::now(); @@ -1813,7 +1814,8 @@ int ObjectCacher::writex(OSDWrite *wr, ObjectSet *oset, Context *onfreespace, } } - int r = _wait_for_write(wr, bytes_written, oset, &trace, onfreespace); + int r = _wait_for_write(wr, bytes_written, oset, &trace, onfreespace, + block_writes_upfront); delete wr; finish_contexts(cct, wait_for_reads, 0); @@ -1893,7 +1895,8 @@ void ObjectCacher::_maybe_wait_for_writeback(uint64_t len, // blocking wait for write. int ObjectCacher::_wait_for_write(OSDWrite *wr, uint64_t len, ObjectSet *oset, - ZTracer::Trace *trace, Context *onfreespace) + ZTracer::Trace *trace, Context *onfreespace, + bool block_writes_upfront) { ceph_assert(ceph_mutex_is_locked(lock)); ceph_assert(trace != nullptr); diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 2101692e1405..68f796c32832 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -410,7 +410,7 @@ class ObjectCacher { uint64_t max_dirty, target_dirty, max_size, max_objects; ceph::timespan max_dirty_age; - bool block_writes_upfront; + bool cfg_block_writes_upfront; ZTracer::Endpoint trace_endpoint; @@ -567,6 +567,7 @@ class ObjectCacher { void retry_waiting_reads(); public: + bool CFG_block_writes_upfront(void) { return cfg_block_writes_upfront; } void bh_read_finish(int64_t poolid, sobject_t oid, ceph_tid_t tid, loff_t offset, uint64_t length, ceph::buffer::list &bl, int r, @@ -616,14 +617,20 @@ class ObjectCacher { int readx(OSDRead *rd, ObjectSet *oset, Context *onfinish, ZTracer::Trace *parent_trace = nullptr); int writex(OSDWrite *wr, ObjectSet *oset, Context *onfreespace, - ZTracer::Trace *parent_trace = nullptr); + ZTracer::Trace *parent_trace, + bool block_writes_upfront); + int writex(OSDWrite *wr, ObjectSet *oset, Context *onfreespace, + ZTracer::Trace *parent_trace = nullptr) { + return writex(wr, oset, onfreespace, parent_trace, cfg_block_writes_upfront); + } bool is_cached(ObjectSet *oset, std::vector& extents, snapid_t snapid); private: // write blocking int _wait_for_write(OSDWrite *wr, uint64_t len, ObjectSet *oset, - ZTracer::Trace *trace, Context *onfreespace); + ZTracer::Trace *trace, Context *onfreespace, + bool block_writes_upfront); void _maybe_wait_for_writeback(uint64_t len, ZTracer::Trace *trace); bool _flush_set_finish(C_GatherBuilder *gather, Context *onfinish); @@ -700,11 +707,12 @@ public: int file_write(ObjectSet *oset, file_layout_t *layout, const SnapContext& snapc, loff_t offset, uint64_t len, - ceph::buffer::list& bl, ceph::real_time mtime, int flags) { + ceph::buffer::list& bl, ceph::real_time mtime, int flags, + Context *onfreespace, bool block_writes_upfront) { OSDWrite *wr = prepare_write(snapc, bl, mtime, flags, 0); Striper::file_to_extents(cct, oset->ino, layout, offset, len, oset->truncate_size, wr->extents); - return writex(wr, oset, nullptr); + return writex(wr, oset, onfreespace, nullptr, block_writes_upfront); } bool file_flush(ObjectSet *oset, file_layout_t *layout,