Skip to content

Commit

Permalink
os/bluestore:Fix size calculation in bitallocator
Browse files Browse the repository at this point in the history
Signed-off-by: Ramesh Chander <Ramesh.Chander@sandisk.com>
  • Loading branch information
chhabaramesh committed Jul 21, 2016
1 parent 278ea12 commit 95ef59b
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 20 deletions.
2 changes: 1 addition & 1 deletion src/os/bluestore/BitAllocator.h
Expand Up @@ -529,7 +529,7 @@ class BitAllocator:public BitMapAreaIN{
void free_blocks_dis(int64_t num_blocks, ExtentList *block_list);
bool is_allocated_dis(ExtentList *blocks, int64_t num_blocks);

int64_t size() {
int64_t total_blocks() {
return m_total_blocks - m_extra_blocks;
}
int64_t get_used_blocks() {
Expand Down
8 changes: 4 additions & 4 deletions src/os/bluestore/BitMapAllocator.cc
Expand Up @@ -86,7 +86,7 @@ int BitMapAllocator::reserve(uint64_t need)
assert(!(need % m_block_size));
dout(10) << __func__ << " instance " << (uint64_t) this
<< " num_used " << m_bit_alloc->get_used_blocks()
<< " total " << m_bit_alloc->size()
<< " total " << m_bit_alloc->total_blocks()
<< dendl;

if (!m_bit_alloc->reserve_blocks(nblks)) {
Expand All @@ -103,7 +103,7 @@ void BitMapAllocator::unreserve(uint64_t unused)
dout(10) << __func__ << " instance " << (uint64_t) this
<< " unused " << nblks
<< " num used " << m_bit_alloc->get_used_blocks()
<< " total " << m_bit_alloc->size()
<< " total " << m_bit_alloc->total_blocks()
<< dendl;

m_bit_alloc->unreserve_blocks(nblks);
Expand Down Expand Up @@ -244,9 +244,9 @@ int BitMapAllocator::release(

uint64_t BitMapAllocator::get_free()
{
assert(m_bit_alloc->size() >= m_bit_alloc->get_used_blocks());
assert(m_bit_alloc->total_blocks() >= m_bit_alloc->get_used_blocks());
return ((
m_bit_alloc->size() - m_bit_alloc->get_used_blocks()) *
m_bit_alloc->total_blocks() - m_bit_alloc->get_used_blocks()) *
m_block_size);
}

Expand Down
31 changes: 16 additions & 15 deletions src/test/objectstore/BitAllocator_test.cc
Expand Up @@ -420,28 +420,29 @@ TEST(BitAllocator, test_bmap_alloc)
alloc->free_blocks(i, 1);
}

int64_t blk_size = 1024;
std::vector<AllocExtent> extents = std::vector<AllocExtent>
(alloc->size(), AllocExtent(-1, -1));
int64_t blk_size = 1024;
auto extents = std::vector<AllocExtent>
(alloc->size(), AllocExtent(-1, -1));

ExtentList *block_list = new ExtentList(&extents, blk_size);
ExtentList *block_list = new ExtentList(&extents, blk_size);

allocated = alloc->alloc_blocks_dis(alloc->size()/2, block_list);
bmap_test_assert(allocated == alloc->size() / 2);
allocated = alloc->alloc_blocks_dis(alloc->size()/2, block_list);
ASSERT_EQ(alloc->size()/2, allocated);

block_list->reset();
allocated = alloc->alloc_blocks_dis(1, block_list);
bmap_test_assert(allocated == 0);
block_list->reset();
allocated = alloc->alloc_blocks_dis(1, block_list);
bmap_test_assert(allocated == 0);

alloc->free_blocks(alloc->size()/2, 1);
alloc->free_blocks(alloc->size()/2, 1);

block_list->reset();
allocated = alloc->alloc_blocks_dis(1, block_list);
bmap_test_assert(allocated == 1);
block_list->reset();
allocated = alloc->alloc_blocks_dis(1, block_list);
bmap_test_assert(allocated == 1);

bmap_test_assert((int64_t) extents[0].offset == alloc->size()/2 * blk_size);
bmap_test_assert((int64_t) extents[0].offset == alloc->size()/2 * blk_size);

delete alloc;
delete block_list;
delete alloc;

// unaligned zones
total_blocks = zone_size * 2 + 11;
Expand Down

0 comments on commit 95ef59b

Please sign in to comment.