27 #define BOOST_STACKTRACE_GNU_SOURCE_NOT_REQUIRED 1
34 #include <boost/stacktrace.hpp>
45 VLOG(1) <<
"Failed to allocate " << num_bytes <<
" bytes";
46 VLOG(1) << boost::stacktrace::stacktrace();
50 VLOG(1) <<
"Failed with OutOfMemory, condition " << err;
51 VLOG(1) << boost::stacktrace::stacktrace();
56 VLOG(1) <<
"Failed to allocate " << num_bytes <<
" bytes with condition " << err;
57 VLOG(1) << boost::stacktrace::stacktrace();
63 return err +
": Failed to allocate " +
std::to_string(num_bytes) +
" bytes";
65 return "Failed to allocate memory with condition " + err;
73 :
OutOfMemory(
"FailedToCreateFirstSlab", num_bytes) {}
86 using namespace Data_Namespace;
88 namespace Buffer_Namespace {
102 const size_t max_buffer_size,
103 const size_t min_slab_size,
104 const size_t max_slab_size,
105 const size_t page_size,
106 AbstractBufferMgr* parent_mgr = 0);
114 std::string printSlab(
size_t slab_num);
115 std::string printSlabs()
override;
116 void clearSlabs()
override;
117 std::string printMap();
119 std::string printSeg(BufferList::iterator& seg_it);
120 std::string keyToString(
const ChunkKey& key);
121 size_t getInUseSize()
override;
122 size_t getMaxSize()
override;
123 size_t getAllocated()
override;
124 size_t getMaxBufferSize();
125 size_t getMaxSlabSize();
126 size_t getPageSize();
127 bool isAllocationCapped()
override;
128 const std::vector<BufferList>& getSlabSegments();
132 const size_t page_size = 0,
133 const size_t initial_size = 0)
override;
136 void deleteBuffer(
const ChunkKey& key,
const bool purge =
true)
override;
137 void deleteBuffersWithPrefix(
const ChunkKey& key_prefix,
138 const bool purge =
true)
override;
149 bool isBufferOnDevice(
const ChunkKey& key)
override;
150 void fetchBuffer(
const ChunkKey& key,
152 const size_t num_bytes = 0)
override;
155 const size_t num_bytes = 0)
override;
156 void checkpoint()
override;
157 void checkpoint(
const int db_id,
const int tb_id)
override;
158 void removeTableRelatedDS(
const int db_id,
const int table_id)
override;
166 size_t getNumChunks()
override;
168 BufferList::iterator reserveBuffer(BufferList::iterator& seg_it,
169 const size_t num_bytes);
171 const ChunkKey& key_prefix)
override;
177 const size_t max_slab_size_;
179 const size_t page_size_;
182 std::vector<BufferList> slab_segments_;
188 void removeSegment(BufferList::iterator& seg_it);
189 BufferList::iterator findFreeBufferInSlab(
const size_t slab_num,
190 const size_t num_pages_requested);
192 virtual void addSlab(
const size_t slab_size) = 0;
193 virtual void freeAllMem() = 0;
194 virtual void allocateBuffer(BufferList::iterator seg_it,
195 const size_t page_size,
196 const size_t num_bytes) = 0;
216 BufferList::iterator evict(BufferList::iterator& evict_start,
217 const size_t num_pages_requested,
232 BufferList::iterator findFreeBuffer(
size_t num_bytes);
size_t max_buffer_pool_num_pages_
size_t min_num_pages_per_slab_
std::string parse_error_str(const std::string &err, const size_t num_bytes=0)
AbstractBufferMgr * parent_mgr_
std::vector< int > ChunkKey
const size_t max_buffer_pool_size_
size_t max_num_pages_per_slab_
size_t num_pages_allocated_
unsigned int buffer_epoch_
OutOfMemory(size_t num_bytes)
std::map< ChunkKey, BufferList::iterator > chunk_index_
const size_t min_slab_size_
max number of bytes allocated for the buffer pool
Note(s): Forbid Copying Idiom 4.1.
OutOfMemory(const std::string &err)
TooBigForSlab(size_t num_bytes)
An AbstractBuffer is a unit of data management for a data manager.
OutOfMemory(const std::string &err, size_t num_bytes)
std::mutex buffer_id_mutex_
std::mutex sized_segs_mutex_
std::mutex unsized_segs_mutex_
FailedToCreateFirstSlab(size_t num_bytes)
size_t current_max_slab_page_size_
FailedToCreateSlab(size_t num_bytes)
std::mutex chunk_index_mutex_
std::vector< int8_t * > slabs_
std::list< BufferSeg > BufferList