}
}
-void BlueStore::BufferSpace::_discard(uint64_t offset, uint64_t length)
+int BlueStore::BufferSpace::_discard(uint64_t offset, uint64_t length)
{
+ // note: we already hold cache->lock
+ int cache_private = 0;
cache->_audit("discard start");
auto i = _data_lower_bound(offset);
uint64_t end = offset + length;
if (b->offset >= end) {
break;
}
+ if (b->cache_private > cache_private) {
+ cache_private = b->cache_private;
+ }
if (b->offset < offset) {
int64_t front = offset - b->offset;
if (b->end() > end) {
cache->_adjust_buffer_size(b, front - (int64_t)b->length);
b->truncate(front);
cache->_audit("discard end 1");
- return;
+ break;
} else {
// drop tail
cache->_adjust_buffer_size(b, front - (int64_t)b->length);
_rm_buffer(i);
}
cache->_audit("discard end 2");
- return;
+ break;
}
+ return cache_private;
}
void BlueStore::BufferSpace::read(
}
BufferSpace *space;
- uint32_t state; ///< STATE_*
- uint32_t flags; ///< FLAG_*
+ uint16_t state; ///< STATE_*
+ uint16_t cache_private = 0; ///< opaque (to us) value used by Cache impl
+ uint32_t flags; ///< FLAG_*
uint64_t seq;
uint64_t offset, length;
bufferlist data;
// must be called under protection of the Cache lock
void _clear();
- void discard(uint64_t offset, uint64_t length) {
+ // return value is the highest cache_private of a trimmed buffer, or 0.
+ int discard(uint64_t offset, uint64_t length) {
std::lock_guard<std::mutex> l(cache->lock);
- _discard(offset, length);
+ return _discard(offset, length);
}
- void _discard(uint64_t offset, uint64_t length);
+ int _discard(uint64_t offset, uint64_t length);
void write(uint64_t seq, uint64_t offset, bufferlist& bl, unsigned flags) {
std::lock_guard<std::mutex> l(cache->lock);
- _discard(offset, bl.length());
- _add_buffer(new Buffer(this, Buffer::STATE_WRITING, seq, offset, bl,
- flags),
- (flags & Buffer::FLAG_NOCACHE) ? 0 : 1, nullptr);
+ Buffer *b = new Buffer(this, Buffer::STATE_WRITING, seq, offset, bl,
+ flags);
+ b->cache_private = _discard(offset, bl.length());
+ _add_buffer(b, (flags & Buffer::FLAG_NOCACHE) ? 0 : 1, nullptr);
}
void finish_write(uint64_t seq);
void did_read(uint64_t offset, bufferlist& bl) {