cache/rwl/LogEntry.cc
cache/rwl/LogMap.cc
cache/rwl/LogOperation.cc
+ cache/rwl/ReadRequest.cc
cache/rwl/Request.cc
cache/rwl/SyncPoint.cc
cache/rwl/Types.cc
#include "librbd/asio/ContextWQ.h"
#include "librbd/cache/rwl/ImageCacheState.h"
#include "librbd/cache/rwl/LogEntry.h"
+#include "librbd/cache/rwl/ReadRequest.h"
#include "librbd/cache/rwl/Types.h"
#include <map>
#include <vector>
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "ReadRequest.h"
+
+#define dout_subsys ceph_subsys_rbd_rwl
+#undef dout_prefix
+#define dout_prefix *_dout << "librbd::cache::rwl::ReadRequest: " << this << " " \
+ << __func__ << ": "
+
+namespace librbd {
+namespace cache {
+namespace rwl {
+
+void C_ReadRequest::finish(int r) {
+ ldout(m_cct, 20) << "(" << get_name() << "): r=" << r << dendl;
+ int hits = 0;
+ int misses = 0;
+ int hit_bytes = 0;
+ int miss_bytes = 0;
+ if (r >= 0) {
+ /*
+ * At this point the miss read has completed. We'll iterate through
+ * read_extents and produce *m_out_bl by assembling pieces of miss_bl
+ * and the individual hit extent bufs in the read extents that represent
+ * hits.
+ */
+ uint64_t miss_bl_offset = 0;
+ for (auto &extent : read_extents) {
+ if (extent.m_bl.length()) {
+ /* This was a hit */
+ ceph_assert(extent.second == extent.m_bl.length());
+ ++hits;
+ hit_bytes += extent.second;
+ m_out_bl->claim_append(extent.m_bl);
+ } else {
+ /* This was a miss. */
+ ++misses;
+ miss_bytes += extent.second;
+ bufferlist miss_extent_bl;
+ miss_extent_bl.substr_of(miss_bl, miss_bl_offset, extent.second);
+ /* Add this read miss bufferlist to the output bufferlist */
+ m_out_bl->claim_append(miss_extent_bl);
+ /* Consume these bytes in the read miss bufferlist */
+ miss_bl_offset += extent.second;
+ }
+ }
+ }
+ ldout(m_cct, 20) << "(" << get_name() << "): r=" << r << " bl=" << *m_out_bl << dendl;
+ utime_t now = ceph_clock_now();
+ ceph_assert((int)m_out_bl->length() == hit_bytes + miss_bytes);
+ m_on_finish->complete(r);
+ m_perfcounter->inc(l_librbd_rwl_rd_bytes, hit_bytes + miss_bytes);
+ m_perfcounter->inc(l_librbd_rwl_rd_hit_bytes, hit_bytes);
+ m_perfcounter->tinc(l_librbd_rwl_rd_latency, now - m_arrived_time);
+ if (!misses) {
+ m_perfcounter->inc(l_librbd_rwl_rd_hit_req, 1);
+ m_perfcounter->tinc(l_librbd_rwl_rd_hit_latency, now - m_arrived_time);
+ } else {
+ if (hits) {
+ m_perfcounter->inc(l_librbd_rwl_rd_part_hit_req, 1);
+ }
+ }
+}
+
+} // namespace rwl
+} // namespace cache
+} // namespace librbd
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_LIBRBD_CACHE_RWL_READ_REQUEST_H
+#define CEPH_LIBRBD_CACHE_RWL_READ_REQUEST_H
+
+#include "include/Context.h"
+#include "librbd/cache/rwl/Types.h"
+
+namespace librbd {
+namespace cache {
+namespace rwl {
+
+typedef std::vector<rwl::ImageExtentBuf> ImageExtentBufs;
+
+class C_ReadRequest : public Context {
+public:
+ io::Extents miss_extents; // move back to caller
+ ImageExtentBufs read_extents;
+ bufferlist miss_bl;
+
+ C_ReadRequest(CephContext *cct, utime_t arrived, PerfCounters *perfcounter, bufferlist *out_bl, Context *on_finish)
+ : m_cct(cct), m_on_finish(on_finish), m_out_bl(out_bl),
+ m_arrived_time(arrived), m_perfcounter(perfcounter) {}
+ ~C_ReadRequest() {}
+
+ void finish(int r) override;
+
+ const char *get_name() const {
+ return "C_ReadRequest";
+ }
+
+private:
+ CephContext *m_cct;
+ Context *m_on_finish;
+ bufferlist *m_out_bl;
+ utime_t m_arrived_time;
+ PerfCounters *m_perfcounter;
+};
+
+} // namespace rwl
+} // namespace cache
+} // namespace librbd
+
+#endif // CEPH_LIBRBD_CACHE_RWL_READ_REQUEST_H
return os;
}
-void C_ReadRequest::finish(int r) {
- ldout(m_cct, 20) << "(" << get_name() << "): r=" << r << dendl;
- int hits = 0;
- int misses = 0;
- int hit_bytes = 0;
- int miss_bytes = 0;
- if (r >= 0) {
- /*
- * At this point the miss read has completed. We'll iterate through
- * read_extents and produce *m_out_bl by assembling pieces of miss_bl
- * and the individual hit extent bufs in the read extents that represent
- * hits.
- */
- uint64_t miss_bl_offset = 0;
- for (auto &extent : read_extents) {
- if (extent.m_bl.length()) {
- /* This was a hit */
- ceph_assert(extent.second == extent.m_bl.length());
- ++hits;
- hit_bytes += extent.second;
- m_out_bl->claim_append(extent.m_bl);
- } else {
- /* This was a miss. */
- ++misses;
- miss_bytes += extent.second;
- bufferlist miss_extent_bl;
- miss_extent_bl.substr_of(miss_bl, miss_bl_offset, extent.second);
- /* Add this read miss bufferlist to the output bufferlist */
- m_out_bl->claim_append(miss_extent_bl);
- /* Consume these bytes in the read miss bufferlist */
- miss_bl_offset += extent.second;
- }
- }
- }
- ldout(m_cct, 20) << "(" << get_name() << "): r=" << r << " bl=" << *m_out_bl << dendl;
- utime_t now = ceph_clock_now();
- ceph_assert((int)m_out_bl->length() == hit_bytes + miss_bytes);
- m_on_finish->complete(r);
- m_perfcounter->inc(l_librbd_rwl_rd_bytes, hit_bytes + miss_bytes);
- m_perfcounter->inc(l_librbd_rwl_rd_hit_bytes, hit_bytes);
- m_perfcounter->tinc(l_librbd_rwl_rd_latency, now - m_arrived_time);
- if (!misses) {
- m_perfcounter->inc(l_librbd_rwl_rd_hit_req, 1);
- m_perfcounter->tinc(l_librbd_rwl_rd_hit_latency, now - m_arrived_time);
- } else {
- if (hits) {
- m_perfcounter->inc(l_librbd_rwl_rd_part_hit_req, 1);
- }
- }
-}
-
template <typename T>
C_DiscardRequest<T>::C_DiscardRequest(T &rwl, const utime_t arrived, io::Extents &&image_extents,
uint32_t discard_granularity_bytes, ceph::mutex &lock,
return os;
}
-std::ostream &operator<<(std::ostream &os,
- const BlockGuardReqState &r) {
- os << "barrier=" << r.barrier << ", "
- << "current_barrier=" << r.current_barrier << ", "
- << "detained=" << r.detained << ", "
- << "queued=" << r.queued;
- return os;
-}
-
-GuardedRequestFunctionContext::GuardedRequestFunctionContext(boost::function<void(GuardedRequestFunctionContext&)> &&callback)
- : m_callback(std::move(callback)){ }
-
-GuardedRequestFunctionContext::~GuardedRequestFunctionContext(void) { }
-
-void GuardedRequestFunctionContext::finish(int r) {
- ceph_assert(cell);
- m_callback(*this);
-}
-
-std::ostream &operator<<(std::ostream &os,
- const GuardedRequest &r) {
- os << "guard_ctx->state=[" << r.guard_ctx->state << "], "
- << "block_extent.block_start=" << r.block_extent.block_start << ", "
- << "block_extent.block_start=" << r.block_extent.block_end;
- return os;
-}
-
} // namespace rwl
} // namespace cache
} // namespace librbd
const C_FlushRequest<U> &req);
};
-class C_ReadRequest : public Context {
-public:
- io::Extents miss_extents; // move back to caller
- ImageExtentBufs read_extents;
- bufferlist miss_bl;
-
- C_ReadRequest(CephContext *cct, utime_t arrived, PerfCounters *perfcounter, bufferlist *out_bl, Context *on_finish)
- : m_cct(cct), m_on_finish(on_finish), m_out_bl(out_bl),
- m_arrived_time(arrived), m_perfcounter(perfcounter) {}
- ~C_ReadRequest() {}
-
- void finish(int r) override;
-
- const char *get_name() const {
- return "C_ReadRequest";
- }
-
-private:
- CephContext *m_cct;
- Context *m_on_finish;
- bufferlist *m_out_bl;
- utime_t m_arrived_time;
- PerfCounters *m_perfcounter;
-};
-
/**
* This is the custodian of the BlockGuard cell for this discard. As in the
* case of write, the block guard is not released until the discard persists
bool detained = false;
bool queued = false; /* Queued for barrier */
friend std::ostream &operator<<(std::ostream &os,
- const BlockGuardReqState &r);
+ const BlockGuardReqState &r) {
+ os << "barrier=" << r.barrier << ", "
+ << "current_barrier=" << r.current_barrier << ", "
+ << "detained=" << r.detained << ", "
+ << "queued=" << r.queued;
+ return os;
+ }
};
class GuardedRequestFunctionContext : public Context {
public:
BlockGuardCell *cell = nullptr;
BlockGuardReqState state;
- GuardedRequestFunctionContext(boost::function<void(GuardedRequestFunctionContext&)> &&callback);
- ~GuardedRequestFunctionContext(void) override;
+ GuardedRequestFunctionContext(boost::function<void(GuardedRequestFunctionContext&)> &&callback)
+ : m_callback(std::move(callback)){ }
+ ~GuardedRequestFunctionContext(void) override { };
GuardedRequestFunctionContext(const GuardedRequestFunctionContext&) = delete;
GuardedRequestFunctionContext &operator=(const GuardedRequestFunctionContext&) = delete;
private:
boost::function<void(GuardedRequestFunctionContext&)> m_callback;
- void finish(int r) override;
+ void finish(int r) override {
+ ceph_assert(cell);
+ m_callback(*this);
+ }
};
class GuardedRequest {
guard_ctx->state.barrier = barrier;
}
friend std::ostream &operator<<(std::ostream &os,
- const GuardedRequest &r);
+ const GuardedRequest &r) {
+ os << "guard_ctx->state=[" << r.guard_ctx->state << "], "
+ << "block_extent.block_start=" << r.block_extent.block_start << ", "
+ << "block_extent.block_start=" << r.block_extent.block_end;
+ return os;
+ }
};
} // namespace rwl