From ce89a705c080e8c8a9972c191f65df4f49181b04 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 17 Jan 2018 21:24:32 -0800 Subject: [PATCH] ircd::db: Add remaining environment stubs. --- include/ircd/db/database/env.h | 91 +++++++ ircd/db.cc | 435 +++++++++++++++++++++++++++++++-- 2 files changed, 499 insertions(+), 27 deletions(-) diff --git a/include/ircd/db/database/env.h b/include/ircd/db/database/env.h index aa5047ecb..bdad9a60b 100644 --- a/include/ircd/db/database/env.h +++ b/include/ircd/db/database/env.h @@ -33,6 +33,11 @@ struct ircd::db::database::env final :rocksdb::Env { struct writable_file; + struct sequential_file; + struct random_access_file; + struct random_rw_file; + struct directory; + struct file_lock; using Status = rocksdb::Status; using EnvOptions = rocksdb::EnvOptions; @@ -128,3 +133,89 @@ struct ircd::db::database::env::writable_file final writable_file(database *const &d, const std::string &name, const EnvOptions &, std::unique_ptr defaults); ~writable_file() noexcept; }; + +struct ircd::db::database::env::sequential_file final +:rocksdb::SequentialFile +{ + using Status = rocksdb::Status; + using Slice = rocksdb::Slice; + + database &d; + std::unique_ptr defaults; + + bool use_direct_io() const override; + size_t GetRequiredBufferAlignment() const override; + Status InvalidateCache(size_t offset, size_t length) override; + Status PositionedRead(uint64_t offset, size_t n, Slice *result, char *scratch) override; + Status Read(size_t n, Slice *result, char *scratch) override; + Status Skip(uint64_t size) override; + + sequential_file(database *const &d, const std::string &name, const EnvOptions &, std::unique_ptr defaults); + ~sequential_file() noexcept; +}; + +struct ircd::db::database::env::random_access_file final +:rocksdb::RandomAccessFile +{ + using Status = rocksdb::Status; + using Slice = rocksdb::Slice; + + database &d; + std::unique_ptr defaults; + + bool use_direct_io() const override; + size_t GetRequiredBufferAlignment() const override; + size_t GetUniqueId(char* id, size_t max_size) const override; + void Hint(AccessPattern pattern) override; + Status InvalidateCache(size_t offset, size_t length) override; + Status Read(uint64_t offset, size_t n, Slice *result, char *scratch) const override; + Status Prefetch(uint64_t offset, size_t n) override; + + random_access_file(database *const &d, const std::string &name, const EnvOptions &, std::unique_ptr defaults); + ~random_access_file() noexcept; +}; + +struct ircd::db::database::env::random_rw_file final +:rocksdb::RandomRWFile +{ + using Status = rocksdb::Status; + using Slice = rocksdb::Slice; + + database &d; + std::unique_ptr defaults; + + bool use_direct_io() const override; + size_t GetRequiredBufferAlignment() const override; + Status Read(uint64_t offset, size_t n, Slice *result, char *scratch) const override; + Status Write(uint64_t offset, const Slice &data) override; + Status Flush() override; + Status Sync() override; + Status Fsync() override; + Status Close() override; + + random_rw_file(database *const &d, const std::string &name, const EnvOptions &, std::unique_ptr defaults); + ~random_rw_file() noexcept; +}; + +struct ircd::db::database::env::directory final +:rocksdb::Directory +{ + using Status = rocksdb::Status; + + database &d; + std::unique_ptr defaults; + + Status Fsync() override; + + directory(database *const &d, const std::string &name, std::unique_ptr defaults); + ~directory() noexcept; +}; + +struct ircd::db::database::env::file_lock final +:rocksdb::FileLock +{ + database &d; + + file_lock(database *const &d); + ~file_lock() noexcept; +}; diff --git a/ircd/db.cc b/ircd/db.cc index d80e73d59..f42b681e0 100644 --- a/ircd/db.cc +++ b/ircd/db.cc @@ -52,6 +52,7 @@ namespace ircd::db string_view reflect(const rocksdb::Env::Priority &p); string_view reflect(const rocksdb::Env::IOPriority &p); + string_view reflect(const rocksdb::RandomAccessFile::AccessPattern &p); const std::string &reflect(const rocksdb::Tickers &); const std::string &reflect(const rocksdb::Histograms &); rocksdb::Slice slice(const string_view &); @@ -1192,7 +1193,14 @@ ircd::db::database::env::NewSequentialFile(const std::string& name, name, &options); - return defaults.NewSequentialFile(name, r, options); + std::unique_ptr defaults; + const auto ret + { + this->defaults.NewSequentialFile(name, &defaults, options) + }; + + *r = std::make_unique(&d, name, options, std::move(defaults)); + return ret; } rocksdb::Status @@ -1205,7 +1213,15 @@ ircd::db::database::env::NewRandomAccessFile(const std::string& name, name, &options); - return defaults.NewRandomAccessFile(name, r, options); + std::unique_ptr defaults; + const auto ret + { + this->defaults.NewRandomAccessFile(name, &defaults, options) + }; + + *r = std::make_unique(&d, name, options, std::move(defaults)); + return ret; + } rocksdb::Status @@ -1228,6 +1244,44 @@ ircd::db::database::env::NewWritableFile(const std::string& name, return ret; } +rocksdb::Status +ircd::db::database::env::NewRandomRWFile(const std::string& name, + std::unique_ptr* result, + const EnvOptions& options) +{ + log.debug("'%s': new random read/write file '%s' options:%p", + d.name, + name, + &options); + + std::unique_ptr defaults; + const auto ret + { + this->defaults.NewRandomRWFile(name, &defaults, options) + }; + + *result = std::make_unique(&d, name, options, std::move(defaults)); + return ret; +} + +rocksdb::Status +ircd::db::database::env::NewDirectory(const std::string& name, + std::unique_ptr* result) +{ + log.debug("'%s': new directory '%s'", + d.name, + name); + + std::unique_ptr defaults; + const auto ret + { + this->defaults.NewDirectory(name, &defaults) + }; + + *result = std::make_unique(&d, name, std::move(defaults)); + return ret; +} + rocksdb::Status ircd::db::database::env::ReopenWritableFile(const std::string& name, std::unique_ptr* result, @@ -1256,30 +1310,6 @@ ircd::db::database::env::ReuseWritableFile(const std::string& name, return defaults.ReuseWritableFile(name, old_name, r, options); } -rocksdb::Status -ircd::db::database::env::NewRandomRWFile(const std::string& name, - std::unique_ptr* result, - const EnvOptions& options) -{ - log.debug("'%s': new random read/write file '%s' options:%p", - d.name, - name, - &options); - - return defaults.NewRandomRWFile(name, result, options); -} - -rocksdb::Status -ircd::db::database::env::NewDirectory(const std::string& name, - std::unique_ptr* result) -{ - log.debug("'%s': new directory '%s'", - d.name, - name); - - return defaults.NewDirectory(name, result); -} - rocksdb::Status ircd::db::database::env::FileExists(const std::string& f) { @@ -1781,12 +1811,13 @@ void ircd::db::database::env::writable_file::PrepareWrite(size_t offset, size_t length) { +/* log.debug("'%s': wfile:%p prepare write offset:%zu length:%zu", d.name, this, offset, length); - +*/ defaults->PrepareWrite(offset, length); } @@ -1816,6 +1847,341 @@ ircd::db::database::env::writable_file::RangeSync(uint64_t offset, return defaults->RangeSync(offset, length); } +// +// sequential_file +// + +ircd::db::database::env::sequential_file::sequential_file(database *const &d, + const std::string &name, + const EnvOptions &opts, + std::unique_ptr defaults) +:d{*d} +,defaults{std::move(defaults)} +{ +} + +ircd::db::database::env::sequential_file::~sequential_file() +noexcept +{ +} + +rocksdb::Status +ircd::db::database::env::sequential_file::Read(size_t length, + Slice *result, + char *scratch) +{ +/* + log.debug("'%s': seqfile:%p read:%p length:%zu scratch:%p", + d.name, + this, + result, + length, + scratch); +*/ + return defaults->Read(length, result, scratch); +} + +rocksdb::Status +ircd::db::database::env::sequential_file::PositionedRead(uint64_t offset, + size_t length, + Slice *result, + char *scratch) +{ +/* + log.debug("'%s': seqfile:%p read:%p length:%zu offset:%zu scratch:%p", + d.name, + this, + result, + length, + offset, + scratch); +*/ + return defaults->PositionedRead(offset, length, result, scratch); +} + +rocksdb::Status +ircd::db::database::env::sequential_file::Skip(uint64_t size) +{ + log.debug("'%s': seqfile:%p skip:%zu", + d.name, + this, + size); + + return defaults->Skip(size); +} + +rocksdb::Status +ircd::db::database::env::sequential_file::InvalidateCache(size_t offset, + size_t length) +{ + log.debug("'%s': seqfile:%p invalidate cache offset:%zu length:%zu", + d.name, + this, + offset, + length); + + return defaults->InvalidateCache(offset, length); +} + +bool +ircd::db::database::env::sequential_file::use_direct_io() +const +{ + return defaults->use_direct_io(); +} + +size_t +ircd::db::database::env::sequential_file::GetRequiredBufferAlignment() +const +{ + return defaults->GetRequiredBufferAlignment(); +} + +// +// random_access_file +// + +ircd::db::database::env::random_access_file::random_access_file(database *const &d, + const std::string &name, + const EnvOptions &opts, + std::unique_ptr defaults) +:d{*d} +,defaults{std::move(defaults)} +{ +} + +ircd::db::database::env::random_access_file::~random_access_file() +noexcept +{ +} + +rocksdb::Status +ircd::db::database::env::random_access_file::Prefetch(uint64_t offset, + size_t length) +{ + log.debug("'%s': rfile:%p prefetch offset:%zu length:%zu", + d.name, + this, + offset, + length); + + return defaults->Prefetch(offset, length); +} + +rocksdb::Status +ircd::db::database::env::random_access_file::Read(uint64_t offset, + size_t length, + Slice *result, + char *scratch) +const +{ + log.debug("'%s': rfile:%p read:%p offset:%zu length:%zu scratch:%p", + d.name, + this, + result, + offset, + length, + scratch); + + return defaults->Read(offset, length, result, scratch); +} + +rocksdb::Status +ircd::db::database::env::random_access_file::InvalidateCache(size_t offset, + size_t length) +{ + log.debug("'%s': rfile:%p invalidate cache offset:%zu length:%zu", + d.name, + this, + offset, + length); + + return defaults->InvalidateCache(offset, length); +} + +size_t +ircd::db::database::env::random_access_file::GetUniqueId(char* id, + size_t max_size) +const +{ + log.debug("'%s': rfile:%p get unique id:%p max_size:%zu", + d.name, + this, + id, + max_size); + + return defaults->GetUniqueId(id, max_size); +} + +void +ircd::db::database::env::random_access_file::Hint(AccessPattern pattern) +{ + log.debug("'%s': rfile:%p hint %s", + d.name, + this, + reflect(pattern)); + + return defaults->Hint(pattern); +} + +bool +ircd::db::database::env::random_access_file::use_direct_io() +const +{ + return defaults->use_direct_io(); +} + +size_t +ircd::db::database::env::random_access_file::GetRequiredBufferAlignment() +const +{ + return defaults->GetRequiredBufferAlignment(); +} + +// +// random_rw_file +// + +ircd::db::database::env::random_rw_file::random_rw_file(database *const &d, + const std::string &name, + const EnvOptions &opts, + std::unique_ptr defaults) +:d{*d} +,defaults{std::move(defaults)} +{ +} + +ircd::db::database::env::random_rw_file::~random_rw_file() +noexcept +{ +} + +rocksdb::Status +ircd::db::database::env::random_rw_file::Close() +{ + log.debug("'%s': rwfile:%p closec", + d.name, + this); + + return defaults->Close(); +} + +rocksdb::Status +ircd::db::database::env::random_rw_file::Fsync() +{ + log.debug("'%s': rwfile:%p fsync", + d.name, + this); + + return defaults->Fsync(); +} + +rocksdb::Status +ircd::db::database::env::random_rw_file::Sync() +{ + log.debug("'%s': rwfile:%p sync", + d.name, + this); + + return defaults->Sync(); +} + +rocksdb::Status +ircd::db::database::env::random_rw_file::Flush() +{ + log.debug("'%s': rwfile:%p flush", + d.name, + this); + + return defaults->Flush(); +} + +rocksdb::Status +ircd::db::database::env::random_rw_file::Read(uint64_t offset, + size_t length, + Slice *result, + char *scratch) +const +{ + log.debug("'%s': rwfile:%p read:%p offset:%zu length:%zu scratch:%p", + d.name, + this, + result, + offset, + length, + scratch); + + return defaults->Read(offset, length, result, scratch); +} + +rocksdb::Status +ircd::db::database::env::random_rw_file::Write(uint64_t offset, + const Slice &slice) +{ + log.debug("'%s': rwfile:%p write:%p offset:%zu length:%zu", + d.name, + this, + data(slice), + offset, + size(slice)); + + return defaults->Write(offset, slice); +} + +bool +ircd::db::database::env::random_rw_file::use_direct_io() +const +{ + return defaults->use_direct_io(); +} + +size_t +ircd::db::database::env::random_rw_file::GetRequiredBufferAlignment() +const +{ + return defaults->GetRequiredBufferAlignment(); +} + +// +// directory +// + +ircd::db::database::env::directory::directory(database *const &d, + const std::string &name, + std::unique_ptr defaults) +:d{*d} +,defaults{std::move(defaults)} +{ +} + +ircd::db::database::env::directory::~directory() +noexcept +{ +} + +rocksdb::Status +ircd::db::database::env::directory::Fsync() +{ + log.debug("'%s': directory:%p fsync", + d.name, + this); + + return defaults->Fsync(); +} + +// +// file_lock +// + +ircd::db::database::env::file_lock::file_lock(database *const &d) +:d{*d} +{ +} + +ircd::db::database::env::file_lock::~file_lock() +noexcept +{ +} /////////////////////////////////////////////////////////////////////////////// // @@ -4629,6 +4995,21 @@ ircd::db::reflect(const rocksdb::Env::IOPriority &p) return "IO_????"_sv; } +ircd::string_view +ircd::db::reflect(const rocksdb::RandomAccessFile::AccessPattern &p) +{ + switch(p) + { + case rocksdb::RandomAccessFile::AccessPattern::NORMAL: return "NORMAL"_sv; + case rocksdb::RandomAccessFile::AccessPattern::RANDOM: return "RANDOM"_sv; + case rocksdb::RandomAccessFile::AccessPattern::SEQUENTIAL: return "SEQUENTIAL"_sv; + case rocksdb::RandomAccessFile::AccessPattern::WILLNEED: return "WILLNEED"_sv; + case rocksdb::RandomAccessFile::AccessPattern::DONTNEED: return "DONTNEED"_sv; + } + + return "??????"_sv; +} + bool ircd::db::value_required(const op &op) {