Go to the documentation of this file.
16 #ifndef GRAPHSCOPE_UTILS_MMAP_ARRAY_H_
17 #define GRAPHSCOPE_UTILS_MMAP_ARRAY_H_
24 #include <string_view>
27 #include "glog/logging.h"
28 #include "grape/util.h"
31 #define ADDR (void*) (0x8000000000000000UL)
32 #define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED)
34 #define ADDR (void*) (0x0UL)
35 #define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB)
38 #define PROTECTION (PROT_READ | PROT_WRITE)
40 #define HUGEPAGE_SIZE (2UL * 1024 * 1024)
41 #define HUGEPAGE_MASK (2UL * 1024 * 1024 - 1UL)
42 #define ROUND_UP(size) (((size) + HUGEPAGE_MASK) & (~HUGEPAGE_MASK))
88 ss <<
"Failed to mummap file [ " <<
filename_ <<
" ] "
90 LOG(ERROR) << ss.str();
91 throw std::runtime_error(ss.str());
98 if (close(
fd_) != 0) {
100 ss <<
"Failed to close file [ " <<
filename_ <<
" ] "
102 LOG(ERROR) << ss.str();
103 throw std::runtime_error(ss.str());
114 if (old_filename !=
"" && std::filesystem::exists(old_filename)) {
115 if (std::filesystem::remove(old_filename) == 0) {
116 std::stringstream ss;
117 ss <<
"Failed to remove file [ " << old_filename <<
" ] "
119 LOG(ERROR) << ss.str();
120 throw std::runtime_error(ss.str());
135 bool creat = !std::filesystem::exists(
filename_);
138 std::stringstream ss;
139 ss <<
"Failed to open file [" <<
filename_ <<
"], " << strerror(errno);
140 LOG(ERROR) << ss.str();
141 throw std::runtime_error(ss.str());
144 std::filesystem::perms readWritePermission =
145 std::filesystem::perms::owner_read |
146 std::filesystem::perms::owner_write;
147 std::error_code errorCode;
148 std::filesystem::permissions(
filename, readWritePermission,
149 std::filesystem::perm_options::add,
152 std::stringstream ss;
153 ss <<
"Failed to set read/write permission for file: " <<
filename
154 <<
" " << errorCode.message() << std::endl;
155 LOG(ERROR) << ss.str();
156 throw std::runtime_error(ss.str());
160 size_t file_size = std::filesystem::file_size(
filename_);
161 size_ = file_size /
sizeof(T);
166 data_ =
reinterpret_cast<T*
>(
167 mmap(NULL,
mmap_size_, PROT_READ | PROT_WRITE, MAP_SHARED,
fd_, 0));
168 if (
data_ == MAP_FAILED) {
169 std::stringstream ss;
170 ss <<
"Failed to mmap file [" <<
filename_ <<
"], "
172 LOG(ERROR) << ss.str();
173 throw std::runtime_error(ss.str());
177 std::stringstream ss;
178 ss <<
"Failed to madvise file [" <<
filename_ <<
"], "
180 LOG(ERROR) << ss.str();
181 throw std::runtime_error(ss.str());
186 size_t file_size = std::filesystem::file_size(
filename_);
189 std::stringstream ss;
190 ss <<
"Failed to open file [" <<
filename_ <<
"], "
192 LOG(ERROR) << ss.str();
193 throw std::runtime_error(ss.str());
195 size_ = file_size /
sizeof(T);
200 data_ =
reinterpret_cast<T*
>(mmap(
201 NULL,
mmap_size_, PROT_READ | PROT_WRITE, MAP_PRIVATE,
fd_, 0));
202 if (
data_ == MAP_FAILED) {
203 std::stringstream ss;
204 ss <<
"Failed to mmap file [" <<
filename_ <<
"], "
206 LOG(ERROR) << ss.str();
207 throw std::runtime_error(ss.str());
218 size_t file_size = std::filesystem::file_size(
filename);
219 size_ = file_size /
sizeof(T);
221 capacity = std::max(capacity,
size_);
224 if (
data_ != MAP_FAILED) {
225 FILE* fin = fopen(
filename.c_str(),
"rb");
227 std::stringstream ss;
228 ss <<
"Failed to open file [ " <<
filename <<
" ], "
230 LOG(ERROR) << ss.str();
231 throw std::runtime_error(ss.str());
234 std::stringstream ss;
235 ss <<
"Failed to fread file [ " <<
filename <<
" ], "
237 LOG(ERROR) << ss.str();
238 throw std::runtime_error(ss.str());
240 if (fclose(fin) != 0) {
241 std::stringstream ss;
242 ss <<
"Failed to fclose file [ " <<
filename <<
" ], "
244 LOG(ERROR) << ss.str();
245 throw std::runtime_error(ss.str());
248 LOG(ERROR) <<
"allocating hugepage failed, " << strerror(errno)
249 <<
", try with normal pages";
263 std::error_code errorCode;
264 std::filesystem::rename(old_filename,
filename, errorCode);
266 std::stringstream ss;
267 ss <<
"Failed to rename file " << old_filename <<
" to " <<
filename
268 <<
" " << errorCode.message() << std::endl;
269 LOG(ERROR) << ss.str();
270 throw std::runtime_error(ss.str());
273 FILE* fout = fopen(
filename.c_str(),
"wb");
275 std::stringstream ss;
276 ss <<
"Failed to open file [ " <<
filename <<
" ], " << strerror(errno);
277 LOG(ERROR) << ss.str();
278 throw std::runtime_error(ss.str());
281 std::stringstream ss;
282 ss <<
"Failed to fwrite file [ " <<
filename <<
" ], "
284 LOG(ERROR) << ss.str();
285 throw std::runtime_error(ss.str());
287 if (fflush(fout) != 0) {
288 std::stringstream ss;
289 ss <<
"Failed to fflush file [ " <<
filename <<
" ], "
291 LOG(ERROR) << ss.str();
292 throw std::runtime_error(ss.str());
294 if (fclose(fout) != 0) {
295 std::stringstream ss;
296 ss <<
"Failed to fclose file [ " <<
filename <<
" ], "
298 LOG(ERROR) << ss.str();
299 throw std::runtime_error(ss.str());
304 std::filesystem::perms readPermission = std::filesystem::perms::owner_read;
306 std::error_code errorCode;
307 std::filesystem::permissions(
filename, readPermission,
308 std::filesystem::perm_options::add, errorCode);
311 std::stringstream ss;
312 ss <<
"Failed to set read permission for file: " <<
filename <<
" "
313 << errorCode.message() << std::endl;
314 LOG(ERROR) << ss.str();
315 throw std::runtime_error(ss.str());
327 std::stringstream ss;
328 ss <<
"Failed to mummap file [ " <<
filename_ <<
" ], "
330 LOG(ERROR) << ss.str();
331 throw std::runtime_error(ss.str());
334 size_t new_mmap_size =
size *
sizeof(T);
335 int rt = ftruncate(
fd_, new_mmap_size);
337 std::stringstream ss;
338 ss <<
"Failed to ftruncate " << rt <<
", " << strerror(errno);
339 LOG(ERROR) << ss.str();
340 throw std::runtime_error(ss.str());
342 if (new_mmap_size == 0) {
345 data_ =
reinterpret_cast<T*
>(mmap(
346 NULL, new_mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED,
fd_, 0));
347 if (
data_ == MAP_FAILED) {
348 std::stringstream ss;
349 ss <<
"Failed to mmap, " << strerror(errno);
350 LOG(ERROR) << ss.str();
351 throw std::runtime_error(ss.str());
357 size_t target_mmap_size =
size *
sizeof(T);
362 size_t new_mmap_size =
size *
sizeof(T);
365 if (new_data == MAP_FAILED) {
366 LOG(ERROR) <<
"mmap with hugepage failed, " << strerror(errno)
367 <<
", try with normal pages";
373 if (new_data == NULL) {
374 new_data =
reinterpret_cast<T*
>(
375 mmap(NULL, new_mmap_size, PROT_READ | PROT_WRITE,
376 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
377 if (new_data == MAP_FAILED) {
378 std::stringstream ss;
379 ss <<
"mmap failed " << strerror(errno);
380 LOG(ERROR) << ss.str();
381 throw std::runtime_error(ss.str());
385 size_t copy_size = std::min(
size,
size_);
386 if (copy_size > 0 &&
data_ != NULL) {
387 memcpy(
reinterpret_cast<void*
>(new_data),
388 reinterpret_cast<void*
>(
data_), copy_size *
sizeof(T));
408 void set(
size_t idx,
const T& val) {
data_[idx] = val; }
410 const T&
get(
size_t idx)
const {
return data_[idx]; }
459 items_.set_hugepage_prefered(val);
460 data_.set_hugepage_prefered(val);
464 items_.open(
filename +
".items", sync_to_file);
469 items_.open_with_hugepages(
filename +
".items");
485 data_.resize(data_size);
488 void set(
size_t idx,
size_t offset,
const std::string_view& val) {
489 items_.set(idx, {offset,
static_cast<uint32_t
>(val.size())});
490 memcpy(
data_.data() + offset, val.data(), val.size());
493 std::string_view
get(
size_t idx)
const {
498 size_t size()
const {
return items_.size(); }
503 items_.swap(rhs.items_);
518 #endif // GRAPHSCOPE_UTILS_MMAP_ARRAY_H_
#define PROTECTION
Definition: mmap_array.h:38
MemoryStrategy
Definition: mmap_array.h:58
void resize(size_t size, size_t data_size)
Definition: mmap_array.h:483
size_t size() const
Definition: mmap_array.h:498
mmap_array< string_item > items_
Definition: mmap_array.h:512
uint32_t length
Definition: mmap_array.h:443
mmap_array(mmap_array &&rhs)
Definition: mmap_array.h:81
~mmap_array()
Definition: mmap_array.h:82
void open(const std::string &filename, bool sync_to_file)
Definition: mmap_array.h:463
void open_with_hugepages(const std::string &filename)
Definition: mmap_array.h:468
size_t data_size() const
Definition: mmap_array.h:500
const T & get(size_t idx) const
Definition: mmap_array.h:410
void * allocate_hugepages(size_t size)
Definition: mmap_array.h:44
const T & operator[](size_t idx) const
Definition: mmap_array.h:412
void resize(size_t size)
Definition: mmap_array.h:319
void set_hugepage_prefered(bool val)
Definition: mmap_array.h:458
bool sync_to_file_
Definition: mmap_array.h:437
Definition: adj_list.h:23
void reset()
Definition: mmap_array.h:453
T * data_
Definition: mmap_array.h:432
void open(const std::string &filename, bool sync_to_file=false)
Definition: mmap_array.h:129
Definition: mmap_array.h:441
void set_hugepage_prefered(bool val)
Definition: mmap_array.h:125
void swap(mmap_array< T > &rhs)
Definition: mmap_array.h:417
T * data()
Definition: mmap_array.h:405
void unlink()
Definition: mmap_array.h:111
size_t size() const
Definition: mmap_array.h:415
void unlink()
Definition: mmap_array.h:506
std::string_view get(size_t idx) const
Definition: mmap_array.h:493
size_t size_
Definition: mmap_array.h:433
const T * data() const
Definition: mmap_array.h:406
#define ADDR
Definition: mmap_array.h:34
#define FLAGS
Definition: mmap_array.h:35
size_t mmap_size_
Definition: mmap_array.h:435
void dump(const std::string &filename)
Definition: mmap_array.h:259
uint64_t offset
Definition: mmap_array.h:442
void dump(const std::string &filename)
Definition: mmap_array.h:478
int fd_
Definition: mmap_array.h:431
void swap(mmap_array &rhs)
Definition: mmap_array.h:502
#define ROUND_UP(size)
Definition: mmap_array.h:42
Definition: mmap_array.h:65
void touch(const std::string &filename)
Definition: mmap_array.h:400
Definition: loading_config.h:232
const std::string & filename() const
Definition: mmap_array.h:427
mmap_array()
Definition: mmap_array.h:449
std::string filename_
Definition: mmap_array.h:430
T & operator[](size_t idx)
Definition: mmap_array.h:413
void open_with_hugepages(const std::string &filename, size_t capacity=0)
Definition: mmap_array.h:214
mmap_array(const mmap_array< T > &rhs)
Definition: mmap_array.h:76
void set(size_t idx, size_t offset, const std::string_view &val)
Definition: mmap_array.h:488
mmap_array< char > data_
Definition: mmap_array.h:513
mmap_array(mmap_array &&rhs)
Definition: mmap_array.h:450
~mmap_array()
Definition: mmap_array.h:451
void touch(const std::string &filename)
Definition: mmap_array.h:473
mmap_array()
Definition: mmap_array.h:67
void reset()
Definition: mmap_array.h:84
void set(size_t idx, const T &val)
Definition: mmap_array.h:408
bool hugepage_prefered_
Definition: mmap_array.h:438
size_t hugepage_round_up(size_t size)
Definition: mmap_array.h:48