Commit e0c5d244 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

Merge branch 'fnordmetric2' of obelix.fnrd.net:paulbox/fnordmetric into fnordmetric2

parents 1f63032b e87ba590
Loading
Loading
Loading
Loading
+34 −14
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include <sys/mman.h>
#include <unistd.h>
#include "pagemanager.h"
#include <fnordmetric/environment.h>
#include <fnordmetric/io/file.h>
#include <fnordmetric/io/fileutil.h>

@@ -94,13 +95,16 @@ MmapPageManager::MmapPageManager(
    PageManager(1, file_size),
    filename_(filename),
    file_size_(file_size),
    current_mapping_(nullptr) {}
    current_mapping_(nullptr) {
  sys_page_size_ = sysconf(_SC_PAGESIZE);
}

MmapPageManager::MmapPageManager(MmapPageManager&& move) :
    PageManager(std::move(move)),
    filename_(move.filename_),
    file_size_(move.file_size_),
    current_mapping_(move.current_mapping_) {
    current_mapping_(move.current_mapping_),
    sys_page_size_(move.sys_page_size_) {
  move.file_size_ = 0;
  move.current_mapping_ = nullptr;
}
@@ -118,12 +122,26 @@ std::unique_ptr<PageManager::PageRef> MmapPageManager::getPage(
  mmap_mutex_.lock();

  if (last_byte > file_size_) {
    // FIXPAUL truncate in larger blocks
    FileUtil::truncate(filename_, last_byte);
    file_size_ = last_byte;
    auto new_size =
        ((last_byte / kMmapSizeMultiplier) + 1) * kMmapSizeMultiplier;

    if (fnordmetric::env()->verbose()) {
      fnordmetric::env()->logger()->printf(
          "DEBUG",
          "Truncating file %s to %lu bytes",
          filename_.c_str(),
          (long unsigned) new_size);
    }

    FileUtil::truncate(filename_, new_size);
    file_size_ = new_size;
  }

  auto page_ref = new MmappedPageRef(page, getMmappedFile(last_byte));
  auto page_ref = new MmappedPageRef(
      page,
      getMmappedFile(last_byte),
      sys_page_size_);

  mmap_mutex_.unlock();

  return std::unique_ptr<PageManager::PageRef>(page_ref);
@@ -185,17 +203,19 @@ void MmapPageManager::MmappedFile::decrRefs() {

MmapPageManager::MmappedPageRef::MmappedPageRef(
    const PageManager::Page& page,
    MmappedFile* file) :
    MmappedFile* file,
    size_t sys_page_size) :
    PageRef(page),
    file_(file) {

    file_(file),
    sys_page_size_(sys_page_size) {
  file_->incrRefs();
}

MmapPageManager::MmappedPageRef::MmappedPageRef(
    MmapPageManager::MmappedPageRef&& move) :
    PageRef(move.page_),
    file_(move.file_) {
    file_(move.file_),
    sys_page_size_(move.sys_page_size_) {
  move.file_ = nullptr;
}

@@ -204,10 +224,10 @@ void* MmapPageManager::MmappedPageRef::getPtr() const {
}

void MmapPageManager::MmappedPageRef::sync(bool async /* = false */) const {
  msync(
      ((char *) getPtr()) + page_.offset,
      page_.size,
      async ? MS_SYNC : MS_ASYNC);
  uintptr_t ptr = (uintptr_t) ((char *) getPtr()) + page_.offset;
  auto sptr = (ptr / (sys_page_size_)) * sys_page_size_;
  auto ssize = page_.size + (ptr - sptr);
  msync((void *) sptr, ssize, async ? MS_SYNC : MS_ASYNC);
}

MmapPageManager::MmappedPageRef::~MmappedPageRef() {
+4 −2
Original line number Diff line number Diff line
@@ -134,13 +134,14 @@ public:

  class MmappedPageRef : public PageManager::PageRef {
  public:
    MmappedPageRef(const PageManager::Page& page, MmappedFile* file);
    MmappedPageRef(const PageManager::Page& page, MmappedFile* file, size_t sys_page_size);
    MmappedPageRef(MmappedPageRef&& move);
    MmappedPageRef(const MmappedPageRef& copy) = delete;
    MmappedPageRef& operator=(const MmappedPageRef& copy) = delete;
    ~MmappedPageRef();
    void sync(bool async = false) const override;
  protected:
    size_t sys_page_size_;
    void* getPtr() const override;
    MmappedFile* file_;
  };
@@ -170,10 +171,11 @@ protected:
   */
  MmappedFile* getMmappedFile(uint64_t last_byte);

  const std::string& filename_;
  const std::string filename_;
  size_t file_size_;
  MmappedFile* current_mapping_;
  std::mutex mmap_mutex_;
  size_t sys_page_size_;
};