virtual void release(
uint64_t offset, uint64_t length) = 0;
+ /* Bulk release. Implementations may override this method to handle the whole
+ * set at once. This could save e.g. unnecessary mutex dance. */
+ virtual void release(const interval_set<uint64_t>& release_set) {
+ /* TODO(rzarzynski): make this pure virtual and eradicate the single-op
+ * release() after switching all allocators. */
+ for (interval_set<uint64_t>::const_iterator p = release_set.begin();
+ p != release_set.end();
+ ++p) {
+ release(p.get_start(), p.get_len());
+ }
+ }
+
virtual void dump() = 0;
virtual void init_add_free(uint64_t offset, uint64_t length) = 0;
// update allocator with full released set
if (!cct->_conf->bluestore_debug_no_reuse_blocks) {
dout(10) << __func__ << " " << txc << " " << txc->released << dendl;
- for (interval_set<uint64_t>::iterator p = txc->released.begin();
- p != txc->released.end();
- ++p) {
- alloc->release(p.get_start(), p.get_len());
- }
+ alloc->release(txc->released);
}
txc->allocated.clear();
if (!bluefs_gift_extents.empty()) {
_commit_bluefs_freespace(bluefs_gift_extents);
}
- for (auto p = bluefs_extents_reclaiming.begin();
- p != bluefs_extents_reclaiming.end();
- ++p) {
- dout(20) << __func__ << " releasing old bluefs 0x" << std::hex
- << p.get_start() << "~" << p.get_len() << std::dec
- << dendl;
- alloc->release(p.get_start(), p.get_len());
- }
+ dout(20) << __func__ << " releasing old bluefs 0x" << std::hex
+ << bluefs_extents_reclaiming << std::dec << dendl;
+ alloc->release(bluefs_extents_reclaiming);
bluefs_extents_reclaiming.clear();
}