f(osd) \
f(bluestore_meta_onode) \
f(bluestore_meta_other) \
+ f(bluestore_alloc) \
f(bluefs)
// give them integer ids
*/
virtual int alloc_extents(uint64_t want_size, uint64_t alloc_unit,
uint64_t max_alloc_size, int64_t hint,
- std::vector<AllocExtent> *extents, int *count) = 0;
+ AllocExtentVector *extents, int *count) = 0;
int alloc_extents(uint64_t want_size, uint64_t alloc_unit,
- int64_t hint, std::vector<AllocExtent> *extents, int *count) {
+ int64_t hint, AllocExtentVector *extents, int *count) {
return alloc_extents(want_size, alloc_unit, want_size, hint, extents, count);
}
virtual int release(
uint64_t offset, uint64_t length) = 0;
- virtual int release_extents(std::vector<AllocExtent> *extents, int count) {
+ virtual int release_extents(AllocExtentVector *extents, int count) {
int res = 0;
for (int i = 0; i < count; i++) {
res = release((*extents)[i].offset, (*extents)[i].length);
#include <assert.h>
#include <math.h>
+MEMPOOL_DEFINE_OBJECT_FACTORY(BitMapArea, BitMapArea, bluestore_alloc);
+MEMPOOL_DEFINE_OBJECT_FACTORY(BitMapAreaIN, BitMapAreaIN, bluestore_alloc);
+MEMPOOL_DEFINE_OBJECT_FACTORY(BitMapAreaLeaf, BitMapAreaLeaf, bluestore_alloc);
+MEMPOOL_DEFINE_OBJECT_FACTORY(BitMapZone, BitMapZone, bluestore_alloc);
+MEMPOOL_DEFINE_OBJECT_FACTORY(BmapEntry, BmapEntry, bluestore_alloc);
+MEMPOOL_DEFINE_OBJECT_FACTORY(BitAllocator, BitAllocator, bluestore_alloc);
+
int64_t BitMapAreaLeaf::count = 0;
int64_t BitMapZone::count = 0;
int64_t BitMapZone::total_blocks = 0;
alloc_assert(total_blocks < std::numeric_limits<int32_t>::max());
alloc_assert(!(total_blocks % BmapEntry::size()));
- std::vector<BmapEntry> *bmaps = new std::vector<BmapEntry> (num_bmaps, BmapEntry(def));
+ BmapEntryVector *bmaps = new BmapEntryVector(num_bmaps, BmapEntry(def));
m_bmap_list = bmaps;
incr_count();
}
#define alloc_dbg_assert(x) (static_cast<void> (0))
#endif
+
class BitAllocatorStats {
public:
std::atomic<int64_t> m_total_alloc_calls;
template <class BitMapEntity>
class BitMapEntityIter {
- std::vector<BitMapEntity> *m_list;
+ typedef mempool::bluestore_alloc::vector<BitMapEntity> BitMapEntityVector;
+ BitMapEntityVector *m_list;
int64_t m_start_idx;
int64_t m_cur_idx;
bool m_wrap;
bool m_end;
public:
- void init(std::vector<BitMapEntity> *list, bool wrap, int64_t start_idx) {
+ void init(BitMapEntityVector *list, bool wrap, int64_t start_idx) {
m_list = list;
m_wrap = wrap;
m_start_idx = start_idx;
m_end = false;
}
- BitMapEntityIter(std::vector<BitMapEntity> *list, int64_t start_idx) {
+ BitMapEntityIter(BitMapEntityVector *list, int64_t start_idx) {
init(list, false, start_idx);
}
- BitMapEntityIter(std::vector<BitMapEntity> *list, int64_t start_idx, bool wrap) {
+ BitMapEntityIter(BitMapEntityVector *list, int64_t start_idx, bool wrap) {
init(list, wrap, start_idx);
}
bmap_t m_bits;
public:
+ MEMPOOL_CLASS_HELPERS();
static bmap_t full_bmask();
static int64_t size();
static bmap_t empty_bmask();
bmap_area_type_t m_type;
public:
+ MEMPOOL_CLASS_HELPERS();
static int64_t get_zone_size();
static int64_t get_span_size();
bmap_area_type_t level_to_type(int level);
void decr_idx();
};
+typedef mempool::bluestore_alloc::vector<BmapEntry> BmapEntryVector;
+
class BitMapZone: public BitMapArea{
private:
std::atomic<int32_t> m_used_blocks;
- std::vector <BmapEntry> *m_bmap_list;
+ BmapEntryVector *m_bmap_list;
std::mutex m_lock;
public:
+ MEMPOOL_CLASS_HELPERS();
static int64_t count;
static int64_t total_blocks;
static void incr_count() { count++;}
int64_t blk_off, ExtentList *block_list);
public:
+ MEMPOOL_CLASS_HELPERS();
BitMapAreaIN();
BitMapAreaIN(int64_t zone_num, int64_t total_blocks);
BitMapAreaIN(int64_t zone_num, int64_t total_blocks, bool def);
bool def);
public:
+ MEMPOOL_CLASS_HELPERS();
static int64_t count;
static void incr_count() { count++;}
BitMapAreaLeaf() { }
int64_t hint, int64_t area_blk_off, ExtentList *block_list);
public:
+ MEMPOOL_CLASS_HELPERS();
BitAllocator(int64_t total_blocks, int64_t zone_size_block, bmap_alloc_mode_t mode);
BitAllocator(int64_t total_blocks, int64_t zone_size_block, bmap_alloc_mode_t mode, bool def);
int BitMapAllocator::alloc_extents(
uint64_t want_size, uint64_t alloc_unit, uint64_t max_alloc_size,
- int64_t hint, std::vector<AllocExtent> *extents, int *count)
+ int64_t hint, mempool::bluestore_alloc::vector<AllocExtent> *extents, int *count)
{
assert(!(alloc_unit % m_block_size));
assert(alloc_unit);
*/
int BitMapAllocator::alloc_extents_cont(
uint64_t want_size, uint64_t alloc_unit, uint64_t max_alloc_size, int64_t hint,
- std::vector<AllocExtent> *extents, int *count)
+ mempool::bluestore_alloc::vector<AllocExtent> *extents, int *count)
{
*count = 0;
assert(alloc_unit);
int BitMapAllocator::alloc_extents_dis(
uint64_t want_size, uint64_t alloc_unit, uint64_t max_alloc_size,
- int64_t hint, std::vector<AllocExtent> *extents, int *count)
+ int64_t hint, mempool::bluestore_alloc::vector<AllocExtent> *extents, int *count)
{
ExtentList block_list = ExtentList(extents, m_block_size, max_alloc_size);
int64_t nblks = (want_size + m_block_size - 1) / m_block_size;
void insert_free(uint64_t offset, uint64_t len);
int alloc_extents_cont(uint64_t want_size, uint64_t alloc_unit, uint64_t max_alloc_size,
- int64_t hint, std::vector<AllocExtent> *extents, int *count);
+ int64_t hint, mempool::bluestore_alloc::vector<AllocExtent> *extents, int *count);
int alloc_extents_dis(uint64_t want_size, uint64_t alloc_unit, uint64_t max_alloc_size,
- int64_t hint, std::vector<AllocExtent> *extents, int *count);
+ int64_t hint, mempool::bluestore_alloc::vector<AllocExtent> *extents, int *count);
public:
BitMapAllocator();
int alloc_extents(
uint64_t want_size, uint64_t alloc_unit, uint64_t max_alloc_size,
- int64_t hint, std::vector<AllocExtent> *extents, int *count);
+ int64_t hint, mempool::bluestore_alloc::vector<AllocExtent> *extents, int *count);
int release(
uint64_t offset, uint64_t length);
}
int count = 0;
- std::vector<AllocExtent> extents =
- std::vector<AllocExtent>(left / min_alloc_size);
+ AllocExtentVector extents = AllocExtentVector(left / min_alloc_size);
r = alloc[id]->alloc_extents(left, min_alloc_size,
hint, &extents, &count);
}
int count = 0;
- std::vector<AllocExtent> extents =
- std::vector<AllocExtent>(final_length / min_alloc_size);
+ AllocExtentVector extents = AllocExtentVector(final_length / min_alloc_size);
int r = alloc->alloc_extents(final_length, min_alloc_size, max_alloc_size,
hint, &extents, &count);
}
int StupidAllocator::alloc_extents(
- uint64_t want_size, uint64_t alloc_unit, uint64_t max_alloc_size,
- int64_t hint, std::vector<AllocExtent> *extents, int *count)
+ uint64_t want_size,
+ uint64_t alloc_unit,
+ uint64_t max_alloc_size,
+ int64_t hint,
+ mempool::bluestore_alloc::vector<AllocExtent> *extents,
+ int *count)
{
uint64_t allocated_size = 0;
uint64_t offset = 0;
int alloc_extents(
uint64_t want_size, uint64_t alloc_unit, uint64_t max_alloc_size,
- int64_t hint, std::vector<AllocExtent> *extents, int *count);
+ int64_t hint, mempool::bluestore_alloc::vector<AllocExtent> *extents, int *count);
int allocate(
uint64_t want_size, uint64_t alloc_unit, int64_t hint,
};
WRITE_CLASS_DENC(bluestore_cnode_t)
+class AllocExtent;
+typedef mempool::bluestore_alloc::vector<AllocExtent> AllocExtentVector;
class AllocExtent {
public:
uint64_t offset;
};
class ExtentList {
- std::vector<AllocExtent> *m_extents;
+ AllocExtentVector *m_extents;
int64_t m_num_extents;
int64_t m_block_size;
uint64_t m_max_alloc_size;
public:
- void init(std::vector<AllocExtent> *extents, int64_t block_size, uint64_t max_alloc_size) {
+ void init(AllocExtentVector *extents, int64_t block_size, uint64_t max_alloc_size) {
m_extents = extents;
m_num_extents = 0;
m_block_size = block_size;
m_max_alloc_size = max_alloc_size;
}
- ExtentList(std::vector<AllocExtent> *extents, int64_t block_size) {
+ ExtentList(AllocExtentVector *extents, int64_t block_size) {
init(extents, block_size, 0);
}
- ExtentList(std::vector<AllocExtent> *extents, int64_t block_size, uint64_t max_alloc_size) {
+ ExtentList(AllocExtentVector *extents, int64_t block_size, uint64_t max_alloc_size) {
init(extents, block_size, max_alloc_size);
}
void add_extents(int64_t start, int64_t count);
- std::vector<AllocExtent> *get_extents() {
+ AllocExtentVector *get_extents() {
return m_extents;
}
{
alloc->init_add_free(0, block_size * 4);
EXPECT_EQ(alloc->reserve(block_size * 4), 0);
- std::vector<AllocExtent> extents = std::vector<AllocExtent>
+ AllocExtentVector extents = AllocExtentVector
(4, AllocExtent(0, 0));
EXPECT_EQ(alloc->alloc_extents(4 * (uint64_t)block_size, (uint64_t) block_size,
alloc->init_add_free(0, block_size * 2);
alloc->init_add_free(3 * block_size, block_size * 2);
EXPECT_EQ(alloc->reserve(block_size * 4), 0);
- std::vector<AllocExtent> extents = std::vector<AllocExtent>
+ AllocExtentVector extents = AllocExtentVector
(4, AllocExtent(0, 0));
EXPECT_EQ(alloc->alloc_extents(4 * (uint64_t)block_size, (uint64_t) block_size,
{
alloc->init_add_free(0, block_size * 4);
EXPECT_EQ(alloc->reserve(block_size * 4), 0);
- std::vector<AllocExtent> extents = std::vector<AllocExtent>
+ AllocExtentVector extents = AllocExtentVector
(4, AllocExtent(0, 0));
EXPECT_EQ(alloc->alloc_extents(4 * (uint64_t)block_size, (uint64_t) block_size,
{
alloc->init_add_free(0, block_size * 4);
EXPECT_EQ(alloc->reserve(block_size * 4), 0);
- std::vector<AllocExtent> extents = std::vector<AllocExtent>
+ AllocExtentVector extents = AllocExtentVector
(2, AllocExtent(0, 0));
EXPECT_EQ(alloc->alloc_extents(4 * (uint64_t)block_size, (uint64_t) block_size,
{
alloc->init_add_free(0, block_size * 16);
EXPECT_EQ(alloc->reserve(block_size * 16), 0);
- std::vector<AllocExtent> extents = std::vector<AllocExtent>
+ AllocExtentVector extents = AllocExtentVector
(8, AllocExtent(0, 0));
EXPECT_EQ(alloc->alloc_extents(16 * (uint64_t)block_size, (uint64_t) block_size,
alloc->init_add_free(block_size * 512, block_size * 256);
EXPECT_EQ(alloc->reserve(block_size * 512), 0);
- std::vector<AllocExtent> extents = std::vector<AllocExtent>
+ AllocExtentVector extents = AllocExtentVector
(4, AllocExtent(0, 0));
EXPECT_EQ(alloc->alloc_extents(512 * (uint64_t)block_size, (uint64_t) block_size * 256,
init_alloc(blocks, 1);
alloc->init_add_free(0, blocks);
- auto extents = std::vector<AllocExtent>
+ auto extents = AllocExtentVector
(zone_size * 4, AllocExtent(-1, -1));
alloc->reserve(blocks);
};
BmapEntityTmp *obj = NULL;
int i = 0;
- std::vector<BmapEntityTmp> *arr = new std::vector<BmapEntityTmp>(num_items);
+ mempool::bstore_balloc::vector<BmapEntityTmp> *arr = new mempool::bstore_balloc::vector<BmapEntityTmp>(num_items);
for (i = 0; i < num_items; i++) {
(*arr)[i].init(i);
}
num_items = 4;
off = num_items - 1;
- arr = new std::vector<BmapEntityTmp>(num_items);
+ arr = new mempool::bstore_balloc::vector<BmapEntityTmp>(num_items);
for (i = 0; i < num_items; i++) {
(*arr)[i].init(i);
}
}
int64_t blk_size = 1024;
- std::vector<AllocExtent> extents = std::vector<AllocExtent>
+ AllocExtentVector extents = AllocExtentVector
(zone->size() / 2, AllocExtent(-1, -1));
ExtentList *block_list = new ExtentList(&extents, blk_size);
{
int64_t blk_size = 1024;
- std::vector<AllocExtent> extents = std::vector<AllocExtent>
+ AllocExtentVector extents = AllocExtentVector
(zone->size() / 2, AllocExtent(-1, -1));
ExtentList *block_list = new ExtentList(&extents, blk_size);
}
int64_t blk_size = 1024;
- auto extents = std::vector<AllocExtent>
+ auto extents = AllocExtentVector
(alloc->size(), AllocExtent(-1, -1));
ExtentList *block_list = new ExtentList(&extents, blk_size);
int64_t allocated = 0;
int64_t verified = 0;
int64_t count = 0;
- std::vector<AllocExtent> extents = std::vector<AllocExtent>
+ AllocExtentVector extents = AllocExtentVector
(total_alloc, AllocExtent(-1, -1));
ExtentList *block_list = new ExtentList(&extents, blk_size, max_alloc);
int64_t alloced = 0;
int64_t num_blocks = alloc->size() / NUM_THREADS;
- std::vector<AllocExtent> extents = std::vector<AllocExtent>
+ AllocExtentVector extents = AllocExtentVector
(num_blocks, AllocExtent(-1, -1));
ExtentList *block_list = new ExtentList(&extents, 4096);