]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ObjectCacher: Prepare file_write path for non-blocking I/O
authorFrank S. Filz <ffilzlnx@mindspring.com>
Wed, 4 May 2022 20:35:44 +0000 (13:35 -0700)
committerFrank S. Filz <ffilzlnx@mindspring.com>
Mon, 24 Jul 2023 18:49:02 +0000 (11:49 -0700)
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 <ffilzlnx@mindspring.com>
src/client/Client.cc
src/osdc/ObjectCacher.cc
src/osdc/ObjectCacher.h

index 6a68ce81c7d7f42b1bd0e26585d8f0f69df7cafe..971a4839d0851cd0ec752e20096ddf06e67686fe 100644 (file)
@@ -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)
index f2b6d9736749f0941556dfe76dca57d42f2c3e06..e850f9a7cb0f38df43899c504d0ad16518e19781 100644 (file)
@@ -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);
index 2101692e14054311ae1b510139cfb19bfe09cad8..68f796c32832c962fc1a5efb92f9f462e0562a71 100644 (file)
@@ -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<ObjectExtent>& 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,