@@ -86,67 +86,51 @@ class TooBigForSlab : public OutOfMemory {
8686using namespace Data_Namespace ;
8787
8888namespace Buffer_Namespace {
89-
90- class SlabFreeBufIndex {
91- public:
92- SlabFreeBufIndex (BufferList& list_to_index) : list_to_index_(list_to_index) {
93- for (BufferList::iterator it = list_to_index_.begin (); it != list_to_index_.end ();
94- ++it) {
95- if (it->mem_status == MemStatus::FREE) {
96- insert (it);
89+ struct Slab {
90+ private:
91+ static bool iterator_page_count_cmp_l (const SegmentList::iterator& lhs,
92+ const size_t num_pages) {
93+ return lhs->num_pages < num_pages;
94+ }
95+ struct SegmentListIterCmp {
96+ bool operator ()(const SegmentList::iterator& lhs,
97+ const SegmentList::iterator& rhs) const {
98+ if (lhs->num_pages < rhs->num_pages ) {
99+ return true ;
100+ }
101+ if (lhs->num_pages > rhs->num_pages ) {
102+ return false ;
97103 }
104+ return (lhs->start_page < rhs->start_page );
98105 }
99- CHECK_GT (free_buffs_.size (), 0 );
100- }
106+ };
101107
102- BufferList::iterator getFreeBuff (const size_t num_requested_pages);
108+ std::set<SegmentList::iterator, SegmentListIterCmp> free_segment_index_;
109+ SegmentList segments_;
103110
104- void insert (BufferList::iterator& slab_buffer_pos);
111+ public:
112+ Slab (const size_t page_count) : segments_(SegmentList{BufferSeg (0 , page_count)}) {
113+ free_segment_index_.insert (segments_.begin ());
114+ }
105115
106- void remove (BufferList ::iterator& slab_buffer_pos );
116+ SegmentList ::iterator getFreeSegment ( const size_t num_requested_pages );
107117
108- void verify () const ;
118+ SegmentList::iterator insert (SegmentList::iterator& slab_buffer_pos,
119+ BufferSeg& data_seg);
109120
110- const std::vector<BufferList::iterator>& getFreeBuffs () const { return free_buffs_; };
111- const BufferList& getListToIndex () const { return list_to_index_; };
121+ SegmentList::iterator remove (SegmentList::iterator slab_buffer_pos);
112122
113- private:
114- static bool iterator_cmp (const BufferList::iterator& lhs,
115- const BufferList::iterator& rhs) {
116- return lhs->num_pages < rhs->num_pages ;
117- }
118- static bool iterator_page_count_cmp_l (const BufferList::iterator& lhs,
119- const size_t num_pages) {
120- return lhs->num_pages < num_pages;
121- }
122- static bool iterator_page_count_cmp_u (const size_t num_pages,
123- const BufferList::iterator& lhs) {
124- return lhs->num_pages < num_pages;
125- }
126- std::vector<BufferList::iterator>::iterator findExact (
127- BufferList::iterator& slab_buffer_pos) {
128- auto index_pos = std::lower_bound (
129- free_buffs_.begin (), free_buffs_.end (), slab_buffer_pos, iterator_cmp);
130- while (index_pos != free_buffs_.end () && (*index_pos) != slab_buffer_pos &&
131- (*index_pos)->num_pages == slab_buffer_pos->num_pages ) {
132- index_pos++;
133- }
134- CHECK (index_pos != free_buffs_.end ());
135- CHECK ((*index_pos) == slab_buffer_pos);
136- CHECK_EQ ((*index_pos)->num_pages , slab_buffer_pos->num_pages );
137- return index_pos;
138- }
139- std::vector<BufferList::iterator> free_buffs_;
140- BufferList& list_to_index_;
141- };
123+ void index_insert (SegmentList::iterator& to_insert);
124+ void index_remove (SegmentList::iterator& at);
125+ void verify_index ();
142126
143- struct Slab {
144- Slab (BufferList& buffers) : buffers_(buffers), free_buffs_index_(buffers_) {}
145- Slab (BufferList&& buffers)
146- : buffers_(std::move(buffers)), free_buffs_index_(buffers_) {}
127+ SegmentList::iterator begin () { return segments_.begin (); }
128+ SegmentList::iterator end () { return segments_.end (); }
147129
148- BufferList buffers_;
149- SlabFreeBufIndex free_buffs_index_;
130+ const std::set<SegmentList::iterator, SegmentListIterCmp>& getFreeSegments () const {
131+ return free_segment_index_;
132+ };
133+ const SegmentList& getListToIndex () const { return segments_; };
150134};
151135
152136struct MemoryData {
@@ -194,7 +178,7 @@ class BufferMgr : public AbstractBufferMgr { // implements
194178 void clearSlabs ();
195179 std::string printMap ();
196180 void printSegs ();
197- std::string printSeg (BufferList ::iterator& seg_it);
181+ std::string printSeg (SegmentList ::iterator& seg_it);
198182 std::string keyToString (const ChunkKey& key);
199183 size_t getInUseSize () override ;
200184 size_t getMaxSize () override ;
@@ -203,7 +187,6 @@ class BufferMgr : public AbstractBufferMgr { // implements
203187 size_t getMaxSlabSize ();
204188 size_t getPageSize ();
205189 bool isAllocationCapped () override ;
206- const std::vector<BufferList> getSlabSegments ();
207190
208191 // / Creates a chunk with the specified key and page size.
209192 AbstractBuffer* createBuffer (const ChunkKey& key,
@@ -255,8 +238,8 @@ class BufferMgr : public AbstractBufferMgr { // implements
255238 size_t size ();
256239 size_t getNumChunks () override ;
257240
258- BufferList ::iterator reserveBuffer (BufferList ::iterator& seg_it,
259- const size_t num_bytes);
241+ SegmentList ::iterator reserveBuffer (SegmentList ::iterator& seg_it,
242+ const size_t num_bytes);
260243 void getChunkMetadataVecForKeyPrefix (ChunkMetadataVector& chunk_metadata_vec,
261244 const ChunkKey& key_prefix) override ;
262245
@@ -272,18 +255,18 @@ class BufferMgr : public AbstractBufferMgr { // implements
272255 const size_t page_size_;
273256 std::vector<int8_t *> slabs_; // / vector of beginning memory addresses for each
274257 // / allocation of the buffer pool
275- std::list <Slab> slab_segments_;
258+ std::vector <Slab> slab_segments_;
276259
277260 private:
278261 BufferMgr (const BufferMgr&); // private copy constructor
279262 BufferMgr& operator =(const BufferMgr&); // private assignment
280- void removeSegment (BufferList ::iterator& seg_it);
281- BufferList ::iterator findFreeBufferInSlab (const size_t slab_num,
282- const size_t num_pages_requested);
263+ void removeSegment (SegmentList ::iterator& seg_it);
264+ SegmentList ::iterator findFreeSegmentInSlab (const size_t slab_num,
265+ const size_t num_pages_requested);
283266 int getBufferId ();
284267 virtual void addSlab (const size_t slab_size) = 0;
285268 virtual void freeAllMem () = 0;
286- virtual void allocateBuffer (BufferList ::iterator seg_it,
269+ virtual void allocateBuffer (SegmentList ::iterator seg_it,
287270 const size_t page_size,
288271 const size_t num_bytes) = 0;
289272 virtual AbstractBuffer* allocateZeroCopyBuffer (
@@ -303,7 +286,7 @@ class BufferMgr : public AbstractBufferMgr { // implements
303286 // to this map should be synced throug chunk_index_mutex_.
304287 std::map<ChunkKey, std::shared_ptr<std::condition_variable>> in_progress_buffer_cvs_;
305288
306- std::map<ChunkKey, BufferList ::iterator> chunk_index_;
289+ std::map<ChunkKey, SegmentList ::iterator> chunk_index_;
307290 size_t max_buffer_pool_num_pages_; // max number of pages for buffer pool
308291 size_t num_pages_allocated_;
309292 size_t min_num_pages_per_slab_;
@@ -314,13 +297,12 @@ class BufferMgr : public AbstractBufferMgr { // implements
314297 int max_buffer_id_;
315298 unsigned int buffer_epoch_;
316299
317- BufferList unsized_segs_;
300+ SegmentList unsized_segs_;
318301
319- BufferList ::iterator evict (BufferList ::iterator& evict_start,
320- const size_t num_pages_requested,
321- const int slab_num);
302+ SegmentList ::iterator evict (SegmentList ::iterator& evict_start,
303+ const size_t num_pages_requested,
304+ const int slab_num);
322305
323- Slab& getSlab (const size_t slab_num);
324306 /* *
325307 * @brief Gets a buffer of required size and returns an iterator to it
326308 *
@@ -334,7 +316,7 @@ class BufferMgr : public AbstractBufferMgr { // implements
334316 * USED if applicable
335317 *
336318 */
337- BufferList ::iterator findFreeBuffer (size_t num_bytes);
319+ SegmentList ::iterator findFreeSegment (size_t num_bytes);
338320};
339321
340322} // namespace Buffer_Namespace
0 commit comments