int r = _allocate(
log_file->fnode.prefer_bdev,
cct->_conf->bluefs_max_log_runway,
- &log_file->fnode.extents);
- log_file->fnode.recalc_allocated();
+ &log_file->fnode);
assert(r == 0);
log_writer = _create_writer(log_file);
{
bluefs_fnode_t fnode;
::decode(fnode, p);
+ fnode.recalc_allocated();
dout(20) << __func__ << " 0x" << std::hex << pos << std::dec
<< ": op_file_update " << " " << fnode << dendl;
if (unlikely(to_stdout)) {
}
file_map.erase(file->fnode.ino);
file->deleted = true;
- file->fnode.recalc_allocated();
+
if (file->dirty_seq) {
assert(file->dirty_seq > log_seq_stable);
assert(dirty_files.count(file->dirty_seq));
dout(20) << __func__ << " need " << need << dendl;
mempool::bluefs::vector<bluefs_extent_t> old_extents;
- old_extents.swap(log_file->fnode.extents);
- log_file->fnode.recalc_allocated();
+ uint64_t old_allocated = 0;
+ log_file->fnode.swap_extents(old_extents, old_allocated);
while (log_file->fnode.get_allocated() < need) {
int r = _allocate(log_file->fnode.prefer_bdev,
need - log_file->fnode.get_allocated(),
- &log_file->fnode.extents);
- log_file->fnode.recalc_allocated();
+ &log_file->fnode);
assert(r == 0);
}
while (log_file->fnode.get_allocated() < need) {
int r = _allocate(log_file->fnode.prefer_bdev,
cct->_conf->bluefs_max_log_runway,
- &log_file->fnode.extents);
+ &log_file->fnode);
assert(r == 0);
- log_file->fnode.recalc_allocated();
}
dout(10) << __func__ << " log extents " << log_file->fnode.extents << dendl;
// allocate
int r = _allocate(BlueFS::BDEV_DB, new_log_jump_to,
- &new_log->fnode.extents);
+ &new_log->fnode);
assert(r == 0);
- new_log->fnode.recalc_allocated();
new_log_writer = _create_writer(new_log);
new_log_writer->append(bl);
if (discarded + e.length <= old_log_jump_to) {
dout(10) << __func__ << " remove old log extent " << e << dendl;
discarded += e.length;
- log_file->fnode.extents.erase(log_file->fnode.extents.begin());
+ log_file->fnode.pop_front_extent();
} else {
dout(10) << __func__ << " remove front of old log extent " << e << dendl;
uint64_t drop = old_log_jump_to - discarded;
}
old_extents.push_back(temp);
}
- new_log->fnode.extents.insert(new_log->fnode.extents.end(),
- log_file->fnode.extents.begin(),
- log_file->fnode.extents.end());
+ auto from = log_file->fnode.extents.begin();
+ auto to = log_file->fnode.extents.end();
+ while (from != to) {
+ new_log->fnode.append_extent(*from);
+ ++from;
+ }
// clear the extents from old log file, they are added to new log
- log_file->fnode.extents.clear();
-
+ log_file->fnode.clear_extents();
// swap the log files. New log file is the log file now.
- log_file->fnode.extents.swap(new_log->fnode.extents);
- log_file->fnode.recalc_allocated();
- new_log->fnode.recalc_allocated();
+ new_log->fnode.swap_extents(log_file->fnode);
+
log_writer->pos = log_writer->file->fnode.size =
log_writer->pos - old_log_jump_to + new_log_jump_to;
}
int r = _allocate(log_writer->file->fnode.prefer_bdev,
cct->_conf->bluefs_max_log_runway,
- &log_writer->file->fnode.extents);
+ &log_writer->file->fnode);
assert(r == 0);
- log_writer->file->fnode.recalc_allocated();
log_t.op_file_update(log_writer->file->fnode);
}
assert(h->file->fnode.ino != 1);
int r = _allocate(h->file->fnode.prefer_bdev,
offset + length - allocated,
- &h->file->fnode.extents);
+ &h->file->fnode);
if (r < 0) {
derr << __func__ << " allocated: 0x" << std::hex << allocated
<< " offset: 0x" << offset << " length: 0x" << length << std::dec
assert(0 == "bluefs enospc");
return r;
}
- h->file->fnode.recalc_allocated();
if (cct->_conf->bluefs_preextend_wal_files &&
h->writer_type == WRITER_WAL) {
// NOTE: this *requires* that rocksdb also has log recycling
}
int BlueFS::_allocate(uint8_t id, uint64_t len,
- mempool::bluefs::vector<bluefs_extent_t> *ev)
+ bluefs_fnode_t* node)
{
dout(10) << __func__ << " len 0x" << std::hex << len << std::dec
<< " from " << (int)id << dendl;
<< "; fallback to bdev " << (int)id + 1
<< std::dec << dendl;
}
- return _allocate(id + 1, len, ev);
+ return _allocate(id + 1, len, node);
}
if (bdev[id])
derr << __func__ << " failed to allocate 0x" << std::hex << left
}
uint64_t hint = 0;
- if (!ev->empty() && ev->back().bdev == id) {
- hint = ev->back().end();
+ if (!node->extents.empty() && node->extents.back().bdev == id) {
+ hint = node->extents.back().end();
}
AllocExtentVector extents;
}
for (auto& p : extents) {
- ev->push_back(bluefs_extent_t(id, p.offset, p.length));
+ node->append_extent(bluefs_extent_t(id, p.offset, p.length));
}
return 0;
uint64_t allocated = f->fnode.get_allocated();
if (off + len > allocated) {
uint64_t want = off + len - allocated;
- int r = _allocate(f->fnode.prefer_bdev, want, &f->fnode.extents);
+ int r = _allocate(f->fnode.prefer_bdev, want, &f->fnode);
if (r < 0)
return r;
- f->fnode.recalc_allocated();
log_t.op_file_update(f->fnode);
}
return 0;
for (auto& p : file->fnode.extents) {
pending_release[p.bdev].insert(p.offset, p.length);
}
- file->fnode.extents.clear();
- file->fnode.recalc_allocated();
+
+ file->fnode.clear_extents();
}
}
assert(file->fnode.ino > 1);