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:
parent
8f3483391e
commit
ce89a705c0
|
@ -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;
|
||||
};
|
||||
|
|
435
ircd/db.cc
435
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<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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue