res_intervals.insert(offset, l);
offset += l;
length -= l;
- cache->_touch_buffer(b);
+ if (!b->is_writing()) {
+ cache->_touch_buffer(b);
+ }
continue;
}
if (b->offset > offset) {
offset += gap;
length -= gap;
}
- cache->_touch_buffer(b);
+ if (!b->is_writing()) {
+ cache->_touch_buffer(b);
+ }
if (b->length > length) {
res[offset].substr_of(b->data, 0, length);
res_intervals.insert(offset, length);
} else {
b->state = Buffer::STATE_CLEAN;
writing.erase(i++);
+ cache->_add_buffer(b, 1, nullptr);
}
} else {
++i;
void _add_buffer(Buffer *b, int level, Buffer *near) {
cache->_audit_lru("_add_buffer start");
buffer_map[b->offset].reset(b);
- cache->_add_buffer(b, level, near);
if (b->is_writing()) {
writing.push_back(*b);
+ } else {
+ cache->_add_buffer(b, level, near);
}
cache->_audit_lru("_add_buffer end");
}
}
void _rm_buffer(map<uint64_t,std::unique_ptr<Buffer>>::iterator p) {
cache->_audit_lru("_rm_buffer start");
- cache->_rm_buffer(p->second.get());
if (p->second->is_writing()) {
writing.erase(writing.iterator_to(*p->second));
+ } else {
+ cache->_rm_buffer(p->second.get());
}
buffer_map.erase(p);
cache->_audit_lru("_rm_buffer end");