From 9afd8bc880ac87ce4d0257a0cffa0b09e132a093 Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Wed, 1 Nov 2017 13:55:26 -0700 Subject: [PATCH] os/bluestore: remove ineffective BlueFS fnode extent calculation. Signed-off-by: Igor Fedotov --- src/os/bluestore/BlueFS.cc | 61 +++++++++++++++----------------- src/os/bluestore/BlueFS.h | 2 +- src/os/bluestore/bluefs_types.cc | 1 + src/os/bluestore/bluefs_types.h | 25 +++++++++++++ 4 files changed, 55 insertions(+), 34 deletions(-) diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index 8126f24f95a8..3f6ba2544ea7 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -320,8 +320,7 @@ int BlueFS::mkfs(uuid_d osd_uuid) 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); @@ -842,6 +841,7 @@ int BlueFS::_replay(bool noop, bool to_stdout) { 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)) { @@ -968,7 +968,7 @@ void BlueFS::_drop_link(FileRef file) } 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)); @@ -1226,13 +1226,12 @@ void BlueFS::_compact_log_sync() dout(20) << __func__ << " need " << need << dendl; mempool::bluefs::vector 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); } @@ -1315,9 +1314,8 @@ void BlueFS::_compact_log_async(std::unique_lock& l) 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; @@ -1350,9 +1348,8 @@ void BlueFS::_compact_log_async(std::unique_lock& l) // 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); @@ -1376,7 +1373,7 @@ void BlueFS::_compact_log_async(std::unique_lock& l) 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; @@ -1388,17 +1385,18 @@ void BlueFS::_compact_log_async(std::unique_lock& l) } 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; @@ -1505,9 +1503,8 @@ int BlueFS::_flush_and_sync_log(std::unique_lock& l, } 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); } @@ -1620,7 +1617,7 @@ int BlueFS::_flush_range(FileWriter *h, uint64_t offset, uint64_t length) 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 @@ -1628,7 +1625,6 @@ int BlueFS::_flush_range(FileWriter *h, uint64_t offset, uint64_t length) 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 @@ -1922,7 +1918,7 @@ void BlueFS::flush_bdev() } int BlueFS::_allocate(uint8_t id, uint64_t len, - mempool::bluefs::vector *ev) + bluefs_fnode_t* node) { dout(10) << __func__ << " len 0x" << std::hex << len << std::dec << " from " << (int)id << dendl; @@ -1943,7 +1939,7 @@ int BlueFS::_allocate(uint8_t id, uint64_t len, << "; 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 @@ -1956,8 +1952,8 @@ int BlueFS::_allocate(uint8_t id, uint64_t len, } 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; @@ -1974,7 +1970,7 @@ int BlueFS::_allocate(uint8_t id, uint64_t len, } 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; @@ -1992,10 +1988,9 @@ int BlueFS::_preallocate(FileRef f, uint64_t off, uint64_t len) 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; @@ -2073,8 +2068,8 @@ int BlueFS::open_for_write( 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); diff --git a/src/os/bluestore/BlueFS.h b/src/os/bluestore/BlueFS.h index 4c1f5da5b328..d6ca2dc37072 100644 --- a/src/os/bluestore/BlueFS.h +++ b/src/os/bluestore/BlueFS.h @@ -267,7 +267,7 @@ private: void _drop_link(FileRef f); int _allocate(uint8_t bdev, uint64_t len, - mempool::bluefs::vector *ev); + bluefs_fnode_t* node); int _flush_range(FileWriter *h, uint64_t offset, uint64_t length); int _flush(FileWriter *h, bool force); int _fsync(FileWriter *h, std::unique_lock& l); diff --git a/src/os/bluestore/bluefs_types.cc b/src/os/bluestore/bluefs_types.cc index 93d79ffec484..1058ccebdefc 100644 --- a/src/os/bluestore/bluefs_types.cc +++ b/src/os/bluestore/bluefs_types.cc @@ -127,6 +127,7 @@ ostream& operator<<(ostream& out, const bluefs_fnode_t& file) << " size 0x" << std::hex << file.size << std::dec << " mtime " << file.mtime << " bdev " << (int)file.prefer_bdev + << " allocated " << std::hex << file.allocated << std::dec << " extents " << file.extents << ")"; } diff --git a/src/os/bluestore/bluefs_types.h b/src/os/bluestore/bluefs_types.h index ddd55def0549..0cb075f52603 100644 --- a/src/os/bluestore/bluefs_types.h +++ b/src/os/bluestore/bluefs_types.h @@ -61,11 +61,36 @@ struct bluefs_fnode_t { DENC_FINISH(p); } + void append_extent(const bluefs_extent_t& ext) { + extents.push_back(ext); + allocated += ext.length; + } + + void pop_front_extent() { + auto it = extents.begin(); + allocated -= it->length; + extents.erase(it); + } + + void swap_extents(bluefs_fnode_t& other) { + other.extents.swap(extents); + std::swap(allocated, other.allocated); + } + void swap_extents(mempool::bluefs::vector& swap_to, uint64_t& new_allocated) { + swap_to.swap(extents); + std::swap(allocated, new_allocated); + } + void clear_extents() { + extents.clear(); + allocated = 0; + } + mempool::bluefs::vector::iterator seek( uint64_t off, uint64_t *x_off); void dump(Formatter *f) const; static void generate_test_instances(list& ls); + }; WRITE_CLASS_DENC(bluefs_fnode_t) -- 2.47.3