0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-17 17:38:22 +02:00

ircd::db: Add remaining environment stubs.

This commit is contained in:
Jason Volk 2018-01-17 21:24:32 -08:00
parent 8f3483391e
commit ce89a705c0
2 changed files with 499 additions and 27 deletions

View file

@ -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<WritableFile> 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<SequentialFile> 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<SequentialFile> 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<RandomAccessFile> 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<RandomAccessFile> 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<RandomRWFile> 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<RandomRWFile> defaults);
~random_rw_file() noexcept;
};
struct ircd::db::database::env::directory final
:rocksdb::Directory
{
using Status = rocksdb::Status;
database &d;
std::unique_ptr<Directory> defaults;
Status Fsync() override;
directory(database *const &d, const std::string &name, std::unique_ptr<Directory> defaults);
~directory() noexcept;
};
struct ircd::db::database::env::file_lock final
:rocksdb::FileLock
{
database &d;
file_lock(database *const &d);
~file_lock() noexcept;
};

View file

@ -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<SequentialFile> defaults;
const auto ret
{
this->defaults.NewSequentialFile(name, &defaults, options)
};
*r = std::make_unique<sequential_file>(&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<RandomAccessFile> defaults;
const auto ret
{
this->defaults.NewRandomAccessFile(name, &defaults, options)
};
*r = std::make_unique<random_access_file>(&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<RandomRWFile>* result,
const EnvOptions& options)
{
log.debug("'%s': new random read/write file '%s' options:%p",
d.name,
name,
&options);
std::unique_ptr<RandomRWFile> defaults;
const auto ret
{
this->defaults.NewRandomRWFile(name, &defaults, options)
};
*result = std::make_unique<random_rw_file>(&d, name, options, std::move(defaults));
return ret;
}
rocksdb::Status
ircd::db::database::env::NewDirectory(const std::string& name,
std::unique_ptr<Directory>* result)
{
log.debug("'%s': new directory '%s'",
d.name,
name);
std::unique_ptr<Directory> defaults;
const auto ret
{
this->defaults.NewDirectory(name, &defaults)
};
*result = std::make_unique<directory>(&d, name, std::move(defaults));
return ret;
}
rocksdb::Status
ircd::db::database::env::ReopenWritableFile(const std::string& name,
std::unique_ptr<WritableFile>* 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<RandomRWFile>* 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<Directory>* 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<SequentialFile> 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<RandomAccessFile> 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<RandomRWFile> 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<Directory> 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)
{