uint64_t prev_len = 0;
unsigned n = 0;
while (!p.end()) {
- Extent *le = new Extent();
+ Extent *le = new Extent(onode->c->cache);
uint64_t blobid;
small_decode_varint(blobid, p);
if ((blobid & BLOBID_FLAG_CONTIGUOUS) == 0) {
"Sum for onode-lookups hit in the cache");
b.add_u64(l_bluestore_onode_misses, "bluestore_onode_misses",
"Sum for onode-lookups missed in the cache");
+ b.add_u64(l_bluestore_extents, "bluestore_extents",
+ "Number of extents in cache");
+ b.add_u64(l_bluestore_blobs, "bluestore_blobs",
+ "Number of blobs in cache");
b.add_u64(l_bluestore_buffers, "bluestore_buffers",
"Number of buffers in cache");
b.add_u64(l_bluestore_buffer_bytes, "bluestore_buffer_bytes",
void BlueStore::_update_cache_logger()
{
uint64_t num_onodes = 0;
+ uint64_t num_extents = 0;
+ uint64_t num_blobs = 0;
uint64_t num_buffers = 0;
uint64_t num_buffer_bytes = 0;
for (auto c : cache_shards) {
- c->add_stats(&num_onodes, &num_buffers, &num_buffer_bytes);
+ c->add_stats(&num_onodes, &num_extents, &num_blobs,
+ &num_buffers, &num_buffer_bytes);
}
logger->set(l_bluestore_onodes, num_onodes);
+ logger->set(l_bluestore_extents, num_extents);
+ logger->set(l_bluestore_blobs, num_blobs);
logger->set(l_bluestore_buffers, num_buffers);
logger->set(l_bluestore_buffer_bytes, num_buffer_bytes);
}
l_bluestore_onodes,
l_bluestore_onode_hits,
l_bluestore_onode_misses,
+ l_bluestore_extents,
+ l_bluestore_blobs,
l_bluestore_buffers,
l_bluestore_buffer_bytes,
l_bluestore_buffer_hit_bytes,
Cache *cache;
map<uint64_t, state_list_t> writing_map;
- BufferSpace(Cache *c) : cache(c) {}
+ BufferSpace(Cache *c) : cache(c) {
+ if (cache) {
+ cache->add_blob();
+ }
+ }
~BufferSpace() {
assert(buffer_map.empty());
assert(writing_map.empty());
+ if (cache) {
+ cache->rm_blob();
+ }
}
void _add_buffer(Buffer *b, int level, Buffer *near) {
uint8_t blob_depth; /// blob overlapping count
BlobRef blob; ///< the blob with our data
- explicit Extent() {}
- explicit Extent(uint32_t lo) : logical_offset(lo) {}
+ /// ctor for lookup only
+ explicit Extent(uint32_t lo) : logical_offset(lo) { }
+ /// ctor for delayed intitialization (see decode_some())
+ explicit Extent(Cache *cache) {
+ cache->add_extent();
+ }
+ /// ctor for general usage
Extent(uint32_t lo, uint32_t o, uint32_t l, uint8_t bd, BlobRef& b)
- : logical_offset(lo), blob_offset(o), length(l), blob_depth(bd), blob(b){}
+ : logical_offset(lo), blob_offset(o), length(l), blob_depth(bd), blob(b) {
+ if (blob) {
+ blob->shared_blob->bc.cache->add_extent();
+ }
+ }
+ ~Extent() {
+ if (blob) {
+ blob->shared_blob->bc.cache->rm_extent();
+ }
+ }
// comparators for intrusive_set
friend bool operator<(const Extent &a, const Extent &b) {
PerfCounters *logger;
std::recursive_mutex lock; ///< protect lru and other structures
+ std::atomic<uint64_t> num_extents = {0};
+ std::atomic<uint64_t> num_blobs = {0};
+
static Cache *create(string type, PerfCounters *logger);
virtual ~Cache() {}
virtual void _adjust_buffer_size(Buffer *b, int64_t delta) = 0;
virtual void _touch_buffer(Buffer *b) = 0;
+ void add_extent() {
+ ++num_extents;
+ }
+ void rm_extent() {
+ --num_extents;
+ }
+
+ void add_blob() {
+ ++num_blobs;
+ }
+ void rm_blob() {
+ --num_blobs;
+ }
+
virtual void trim(uint64_t onode_max, uint64_t buffer_max) = 0;
- virtual void add_stats(uint64_t *onodes, uint64_t *buffers,
+ virtual void add_stats(uint64_t *onodes, uint64_t *extents,
+ uint64_t *blobs,
+ uint64_t *buffers,
uint64_t *bytes) = 0;
#ifdef DEBUG_CACHE
void trim(uint64_t onode_max, uint64_t buffer_max) override;
- void add_stats(uint64_t *onodes, uint64_t *buffers,
+ void add_stats(uint64_t *onodes, uint64_t *extents,
+ uint64_t *blobs,
+ uint64_t *buffers,
uint64_t *bytes) override {
std::lock_guard<std::recursive_mutex> l(lock);
*onodes += onode_lru.size();
+ *extents += num_extents;
+ *blobs += num_blobs;
*buffers += buffer_lru.size();
*bytes += buffer_size;
}
void trim(uint64_t onode_max, uint64_t buffer_max) override;
- void add_stats(uint64_t *onodes, uint64_t *buffers,
+ void add_stats(uint64_t *onodes, uint64_t *extents,
+ uint64_t *blobs,
+ uint64_t *buffers,
uint64_t *bytes) override {
std::lock_guard<std::recursive_mutex> l(lock);
*onodes += onode_lru.size();
+ *extents += num_extents;
+ *blobs += num_blobs;
*buffers += buffer_hot.size() + buffer_warm_in.size();
*bytes += buffer_bytes;
}