diff --git a/src/include/homestore/chunk_selector.h b/src/include/homestore/chunk_selector.h index 818ea5e69..5c3a21a20 100644 --- a/src/include/homestore/chunk_selector.h +++ b/src/include/homestore/chunk_selector.h @@ -21,9 +21,9 @@ class Chunk; class ChunkSelector { public: ChunkSelector() = default; - virtual void add_chunk(VChunk chunk) = 0; - virtual void foreach_chunks(std::function< void(VChunk&) >&& cb) = 0; - virtual Chunk* select_chunk(blk_count_t nblks, const blk_alloc_hints& hints) = 0; + virtual void add_chunk(cshared< Chunk >&) = 0; + virtual void foreach_chunks(std::function< void(cshared< Chunk >&) >&& cb) = 0; + virtual cshared< Chunk > select_chunk(blk_count_t nblks, const blk_alloc_hints& hints) = 0; virtual ~ChunkSelector() = default; }; diff --git a/src/include/homestore/vchunk.h b/src/include/homestore/vchunk.h index a6ff0eb48..ed58a99a3 100644 --- a/src/include/homestore/vchunk.h +++ b/src/include/homestore/vchunk.h @@ -31,7 +31,7 @@ class VChunk { const uint8_t* get_user_private() const; blk_cap_t available_blks() const; uint32_t get_pdev_id() const; - cshared< Chunk > get_internal_chunk () const; + cshared< Chunk > get_internal_chunk() const; private: cshared< Chunk > internalChunk; diff --git a/src/lib/device/round_robin_chunk_selector.cpp b/src/lib/device/round_robin_chunk_selector.cpp index 3edc9ae3a..aa73f7b56 100644 --- a/src/lib/device/round_robin_chunk_selector.cpp +++ b/src/lib/device/round_robin_chunk_selector.cpp @@ -20,14 +20,14 @@ RoundRobinChunkSelector::RoundRobinChunkSelector(bool dynamic_chunk_add) : m_dyn "Dynamically adding chunk to chunkselector is not supported, need RCU to make it thread safe"); } -void RoundRobinChunkSelector::add_chunk(VChunk chunk) { m_chunks.push_back(chunk); } +void RoundRobinChunkSelector::add_chunk(cshared< Chunk >& chunk) { m_chunks.emplace_back(std::move(chunk)); } -Chunk* RoundRobinChunkSelector::select_chunk(blk_count_t, const blk_alloc_hints&) { +cshared< Chunk > RoundRobinChunkSelector::select_chunk(blk_count_t, const blk_alloc_hints&) { if (*m_next_chunk_index >= m_chunks.size()) { *m_next_chunk_index = 0; } - return m_chunks[(*m_next_chunk_index)++].get_internal_chunk().get(); + return m_chunks[(*m_next_chunk_index)++]; } -void RoundRobinChunkSelector::foreach_chunks(std::function< void(VChunk&) >&& cb) { +void RoundRobinChunkSelector::foreach_chunks(std::function< void(cshared< Chunk >&) >&& cb) { for (auto& chunk : m_chunks) { cb(chunk); } diff --git a/src/lib/device/round_robin_chunk_selector.h b/src/lib/device/round_robin_chunk_selector.h index cc916c9d3..5a8f7a530 100644 --- a/src/lib/device/round_robin_chunk_selector.h +++ b/src/lib/device/round_robin_chunk_selector.h @@ -24,8 +24,6 @@ #include "device/chunk.h" namespace homestore { -class Chunk; - class RoundRobinChunkSelector : public ChunkSelector { public: RoundRobinChunkSelector(bool dynamic_chunk_add = false); @@ -35,12 +33,12 @@ class RoundRobinChunkSelector : public ChunkSelector { RoundRobinChunkSelector& operator=(RoundRobinChunkSelector&&) noexcept = delete; ~RoundRobinChunkSelector() = default; - void add_chunk(VChunk chunk) override; - Chunk* select_chunk(blk_count_t nblks, const blk_alloc_hints& hints) override; - void foreach_chunks(std::function< void(VChunk&) >&& cb) override; + void add_chunk(cshared< Chunk >&) override; + cshared< Chunk > select_chunk(blk_count_t nblks, const blk_alloc_hints& hints) override; + void foreach_chunks(std::function< void(cshared< Chunk >&) >&& cb) override; private: - std::vector< VChunk > m_chunks; + std::vector< shared< Chunk > > m_chunks; folly::ThreadLocal< uint32_t > m_next_chunk_index; bool m_dynamic_chunk_add; // Can we add chunk dynamically }; diff --git a/src/lib/device/virtual_dev.cpp b/src/lib/device/virtual_dev.cpp index cedf21e64..0d771d4ab 100644 --- a/src/lib/device/virtual_dev.cpp +++ b/src/lib/device/virtual_dev.cpp @@ -197,7 +197,7 @@ BlkAllocStatus VirtualDev::do_alloc_blk(blk_count_t nblks, const blk_alloc_hints size_t attempt{0}; do { - chunk = m_chunk_selector->select_chunk(nblks, hints); + chunk = m_chunk_selector->select_chunk(nblks, hints).get(); if (chunk == nullptr) { status = BlkAllocStatus::SPACE_FULL; } status = alloc_blk_from_chunk(nblks, hints, out_blkid, chunk);