void Allocator::release(const PExtentVector& release_vec)
{
- interval_set<uint64_t> release_set;
+ release_set_t release_set;
for (auto e : release_vec) {
release_set.insert(e.offset, e.length);
}
#include "include/ceph_assert.h"
#include "bluestore_types.h"
+typedef interval_set<uint64_t> release_set_t;
+typedef release_set_t::value_type release_set_entry_t;
+
class Allocator {
+
public:
Allocator(std::string_view name,
int64_t _capacity,
/* Bulk release. Implementations may override this method to handle the whole
* set at once. This could save e.g. unnecessary mutex dance. */
- virtual void release(const interval_set<uint64_t>& release_set) = 0;
+ virtual void release(const release_set_t& release_set) = 0;
void release(const PExtentVector& release_set);
virtual void dump() = 0;
return 0;
}
-void AvlAllocator::_release(const interval_set<uint64_t>& release_set)
+void AvlAllocator::_release(const release_set_t& release_set)
{
for (auto p = release_set.begin(); p != release_set.end(); ++p) {
const auto offset = p.get_start();
return _allocate(want, unit, max_alloc_size, hint, extents);
}
-void AvlAllocator::release(const interval_set<uint64_t>& release_set) {
+void AvlAllocator::release(const release_set_t& release_set) {
std::lock_guard l(lock);
_release(release_set);
}
uint64_t max_alloc_size,
int64_t hint,
PExtentVector *extents) override;
- void release(const interval_set<uint64_t>& release_set) override;
+ void release(const release_set_t& release_set) override;
uint64_t get_free() override;
double get_fragmentation() override;
void shutdown() override;
private:
+ CephContext* cct;
+ std::mutex lock;
+
// pick a range by search from cursor forward
uint64_t _pick_block_after(
uint64_t *cursor,
// called when extent to be released/marked free
virtual void _add_to_tree(uint64_t start, uint64_t size);
-protected:
- CephContext* cct;
- std::mutex lock;
+ CephContext* get_context() { return cct; }
+
+ std::mutex& get_lock() {
+ return lock;
+ }
double _get_fragmentation() const {
auto free_blocks = p2align(num_free, (uint64_t)block_size) / block_size;
uint64_t _lowest_size_available() {
auto rs = range_size_tree.begin();
- return rs != range_size_tree.end() ? rs->length() : 0;
+ return rs != range_size_tree.end() ? rs->length() : std::numeric_limits<uint16_t>::max();
}
int64_t _allocate(
int64_t hint,
PExtentVector *extents);
- void _release(const interval_set<uint64_t>& release_set);
+ void _release(const release_set_t& release_set);
void _release(const PExtentVector& release_set);
void _shutdown();