void BlueStore::BufferCache::trim(uint64_t keep)
{
+ audit_lru();
lru_list_t::iterator i = lru.end();
if (size) {
assert(i != lru.begin());
}
}
+#ifdef DEBUG_CACHE
+void BlueStore::BufferCache::audit_lru()
+{
+ if (true) {
+ uint64_t s = 0;
+ for (auto i = lru.begin(); i != lru.end(); ++i) {
+ s += i->length;
+ }
+ if (s != size) {
+ derr << __func__ << " size " << size << " actual " << s << dendl;
+ for (auto i = lru.begin(); i != lru.end(); ++i) {
+ derr << __func__ << " " << *i << dendl;
+ }
+ assert(s == size);
+ }
+ dout(20) << __func__ << " size " << size << " ok" << dendl;
+ }
+}
+#endif
+
// BufferSpace
#undef dout_prefix
void BlueStore::BufferSpace::discard(uint64_t offset, uint64_t length)
{
+ cache->audit_lru();
auto i = _data_lower_bound(offset);
uint64_t end = offset + length;
while (i != buffer_map.end()) {
}
cache->size -= b->length - front;
b->truncate(front);
+ cache->audit_lru();
return;
} else {
// drop tail
_add_buffer(new Buffer(this, b->state, b->seq, end, keep));
_rm_buffer(i);
}
+ cache->audit_lru();
return;
}
}
++i;
}
}
+ cache->audit_lru();
}
class FreelistManager;
class BlueFS;
+//#define DEBUG_CACHE
+
enum {
l_bluestore_first = 732430,
l_bluestore_state_prepare_lat,
uint64_t size = 0;
void trim(uint64_t keep);
+
+#ifdef DEBUG_CACHE
+ void audit_lru();
+#else
+ void audit_lru() { /* no-op */ }
+#endif
};
/// map logical extent range (object) onto buffers
if (b->is_writing()) {
writing.push_back(*b);
}
+ cache->audit_lru();
}
void _rm_buffer(Buffer *b) {
_rm_buffer(buffer_map.find(b->offset));
writing.erase(writing.iterator_to(*p->second));
}
buffer_map.erase(p);
+ cache->audit_lru();
}
/// move to top of lru