forked from vitalif/vitastor
Add inode space usage statistics tracking to blockstore
parent
0422d94a70
commit
9998b50c7e
|
@ -43,6 +43,11 @@ std::unordered_map<object_id, uint64_t> & blockstore_t::get_unstable_writes()
|
||||||
return impl->unstable_writes;
|
return impl->unstable_writes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::map<uint64_t, int64_t> & blockstore_t::get_inode_space_stats()
|
||||||
|
{
|
||||||
|
return impl->inode_space_stats;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t blockstore_t::get_block_size()
|
uint32_t blockstore_t::get_block_size()
|
||||||
{
|
{
|
||||||
return impl->get_block_size();
|
return impl->get_block_size();
|
||||||
|
|
|
@ -183,6 +183,9 @@ public:
|
||||||
// Unstable writes are added here (map of object_id -> version)
|
// Unstable writes are added here (map of object_id -> version)
|
||||||
std::unordered_map<object_id, uint64_t> & get_unstable_writes();
|
std::unordered_map<object_id, uint64_t> & get_unstable_writes();
|
||||||
|
|
||||||
|
// Get per-inode space usage statistics
|
||||||
|
std::map<uint64_t, int64_t> & get_inode_space_stats();
|
||||||
|
|
||||||
// FIXME rename to object_size
|
// FIXME rename to object_size
|
||||||
uint32_t get_block_size();
|
uint32_t get_block_size();
|
||||||
uint64_t get_block_count();
|
uint64_t get_block_count();
|
||||||
|
|
|
@ -326,6 +326,9 @@ public:
|
||||||
// Unstable writes are added here (map of object_id -> version)
|
// Unstable writes are added here (map of object_id -> version)
|
||||||
std::unordered_map<object_id, uint64_t> unstable_writes;
|
std::unordered_map<object_id, uint64_t> unstable_writes;
|
||||||
|
|
||||||
|
// Space usage statistics
|
||||||
|
std::map<uint64_t, int64_t> inode_space_stats;
|
||||||
|
|
||||||
inline uint32_t get_block_size() { return block_size; }
|
inline uint32_t get_block_size() { return block_size; }
|
||||||
inline uint64_t get_block_count() { return block_count; }
|
inline uint64_t get_block_count() { return block_count; }
|
||||||
inline uint64_t get_free_block_count() { return data_alloc->get_free_count(); }
|
inline uint64_t get_free_block_count() { return data_alloc->get_free_count(); }
|
||||||
|
|
|
@ -115,6 +115,10 @@ void blockstore_init_meta::handle_entries(void* entries, unsigned count, int blo
|
||||||
#endif
|
#endif
|
||||||
bs->data_alloc->set(clean_it->second.location >> block_order, false);
|
bs->data_alloc->set(clean_it->second.location >> block_order, false);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bs->inode_space_stats[entry->oid.inode] += bs->block_size;
|
||||||
|
}
|
||||||
entries_loaded++;
|
entries_loaded++;
|
||||||
#ifdef BLOCKSTORE_DEBUG
|
#ifdef BLOCKSTORE_DEBUG
|
||||||
printf("Allocate block (clean entry) %lu: %lx:%lx v%lu\n", done_cnt+i, entry->oid.inode, entry->oid.stripe, entry->version);
|
printf("Allocate block (clean entry) %lu: %lx:%lx v%lu\n", done_cnt+i, entry->oid.inode, entry->oid.stripe, entry->version);
|
||||||
|
@ -705,7 +709,7 @@ int blockstore_init_journal::handle_journal_part(void *buf, uint64_t done_pos, u
|
||||||
printf("je_delete oid=%lx:%lx ver=%lu\n", je->del.oid.inode, je->del.oid.stripe, je->del.version);
|
printf("je_delete oid=%lx:%lx ver=%lu\n", je->del.oid.inode, je->del.oid.stripe, je->del.version);
|
||||||
#endif
|
#endif
|
||||||
auto clean_it = bs->clean_db.find(je->del.oid);
|
auto clean_it = bs->clean_db.find(je->del.oid);
|
||||||
if (clean_it == bs->clean_db.end() ||
|
if (clean_it != bs->clean_db.end() &&
|
||||||
clean_it->second.version < je->del.version)
|
clean_it->second.version < je->del.version)
|
||||||
{
|
{
|
||||||
// oid, version
|
// oid, version
|
||||||
|
|
|
@ -163,10 +163,7 @@ void blockstore_impl_t::mark_rolled_back(const obj_ver_id & ov)
|
||||||
auto rm_start = it;
|
auto rm_start = it;
|
||||||
auto rm_end = it;
|
auto rm_end = it;
|
||||||
it--;
|
it--;
|
||||||
while (it->first.oid == ov.oid &&
|
while (1)
|
||||||
it->first.version > ov.version &&
|
|
||||||
!IS_IN_FLIGHT(it->second.state) &&
|
|
||||||
!IS_STABLE(it->second.state))
|
|
||||||
{
|
{
|
||||||
if (it->first.oid != ov.oid)
|
if (it->first.oid != ov.oid)
|
||||||
break;
|
break;
|
||||||
|
@ -176,7 +173,7 @@ void blockstore_impl_t::mark_rolled_back(const obj_ver_id & ov)
|
||||||
max_unstable = it->first.version;
|
max_unstable = it->first.version;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (IS_STABLE(it->second.state))
|
else if (IS_IN_FLIGHT(it->second.state) || IS_STABLE(it->second.state))
|
||||||
break;
|
break;
|
||||||
// Remove entry
|
// Remove entry
|
||||||
rm_start = it;
|
rm_start = it;
|
||||||
|
@ -187,14 +184,14 @@ void blockstore_impl_t::mark_rolled_back(const obj_ver_id & ov)
|
||||||
if (rm_start != rm_end)
|
if (rm_start != rm_end)
|
||||||
{
|
{
|
||||||
erase_dirty(rm_start, rm_end, UINT64_MAX);
|
erase_dirty(rm_start, rm_end, UINT64_MAX);
|
||||||
}
|
auto unstab_it = unstable_writes.find(ov.oid);
|
||||||
auto unstab_it = unstable_writes.find(ov.oid);
|
if (unstab_it != unstable_writes.end())
|
||||||
if (unstab_it != unstable_writes.end())
|
{
|
||||||
{
|
if (max_unstable == 0)
|
||||||
if (max_unstable == 0)
|
unstable_writes.erase(unstab_it);
|
||||||
unstable_writes.erase(unstab_it);
|
else
|
||||||
else
|
unstab_it->second = max_unstable;
|
||||||
unstab_it->second = max_unstable;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -186,6 +186,15 @@ void blockstore_impl_t::mark_stable(const obj_ver_id & v)
|
||||||
if ((dirty_it->second.state & BS_ST_WORKFLOW_MASK) == BS_ST_SYNCED)
|
if ((dirty_it->second.state & BS_ST_WORKFLOW_MASK) == BS_ST_SYNCED)
|
||||||
{
|
{
|
||||||
dirty_it->second.state = (dirty_it->second.state & ~BS_ST_WORKFLOW_MASK) | BS_ST_STABLE;
|
dirty_it->second.state = (dirty_it->second.state & ~BS_ST_WORKFLOW_MASK) | BS_ST_STABLE;
|
||||||
|
// Allocations and deletions are counted when they're stabilized
|
||||||
|
if (IS_BIG_WRITE(dirty_it->second.state))
|
||||||
|
{
|
||||||
|
inode_space_stats[dirty_it->first.oid.inode] += block_size;
|
||||||
|
}
|
||||||
|
else if (IS_DELETE(dirty_it->second.state))
|
||||||
|
{
|
||||||
|
inode_space_stats[dirty_it->first.oid.inode] -= block_size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (IS_STABLE(dirty_it->second.state))
|
else if (IS_STABLE(dirty_it->second.state))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue