mirror of
https://github.com/matrix-construct/construct
synced 2024-11-19 00:10:59 +01:00
ircd::db: Add WAL information interface w/ console cmd.
This commit is contained in:
parent
c3560d4890
commit
8d6c7e3576
6 changed files with 184 additions and 0 deletions
|
@ -26,6 +26,7 @@ namespace ircd::db
|
||||||
const std::vector<std::string> &errors(const database &);
|
const std::vector<std::string> &errors(const database &);
|
||||||
std::vector<std::string> files(const database &, uint64_t &msz);
|
std::vector<std::string> files(const database &, uint64_t &msz);
|
||||||
std::vector<std::string> files(const database &);
|
std::vector<std::string> files(const database &);
|
||||||
|
std::vector<std::string> wals(const database &);
|
||||||
size_t file_count(const database &);
|
size_t file_count(const database &);
|
||||||
size_t bytes(const database &);
|
size_t bytes(const database &);
|
||||||
|
|
||||||
|
@ -86,6 +87,7 @@ struct ircd::db::database
|
||||||
struct env;
|
struct env;
|
||||||
struct cache;
|
struct cache;
|
||||||
struct sst;
|
struct sst;
|
||||||
|
struct wal;
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
uint64_t checkpoint;
|
uint64_t checkpoint;
|
||||||
|
|
|
@ -37,6 +37,7 @@ namespace rocksdb
|
||||||
struct SstFileMetaData;
|
struct SstFileMetaData;
|
||||||
struct SstFileWriter;
|
struct SstFileWriter;
|
||||||
struct TableProperties;
|
struct TableProperties;
|
||||||
|
struct LogFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
42
include/ircd/db/database/wal.h
Normal file
42
include/ircd/db/database/wal.h
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
// Matrix Construct
|
||||||
|
//
|
||||||
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
||||||
|
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice is present in all copies. The
|
||||||
|
// full license for this software is available in the LICENSE file.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#define HAVE_IRCD_DB_DATABASE_WAL_H
|
||||||
|
|
||||||
|
struct ircd::db::database::wal
|
||||||
|
{
|
||||||
|
struct info;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Get info about a WAL file
|
||||||
|
///
|
||||||
|
struct ircd::db::database::wal::info
|
||||||
|
{
|
||||||
|
struct vector;
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
uint64_t number {0};
|
||||||
|
uint64_t seq {0};
|
||||||
|
size_t size {0};
|
||||||
|
bool alive {false};
|
||||||
|
|
||||||
|
info(const database &, const string_view &filename);
|
||||||
|
info() = default;
|
||||||
|
|
||||||
|
info &operator=(const rocksdb::LogFile &);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ircd::db::database::wal::info::vector
|
||||||
|
:std::vector<info>
|
||||||
|
{
|
||||||
|
vector() = default;
|
||||||
|
explicit vector(const database &);
|
||||||
|
};
|
|
@ -70,6 +70,7 @@ namespace ircd::db
|
||||||
#include "database/options.h"
|
#include "database/options.h"
|
||||||
#include "database/snapshot.h"
|
#include "database/snapshot.h"
|
||||||
#include "database/sst.h"
|
#include "database/sst.h"
|
||||||
|
#include "database/wal.h"
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "opts.h"
|
#include "opts.h"
|
||||||
#include "column.h"
|
#include "column.h"
|
||||||
|
|
89
ircd/db.cc
89
ircd/db.cc
|
@ -594,6 +594,31 @@ ircd::db::file_count(const database &d)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the list of WAL (Write Ahead Log) files.
|
||||||
|
std::vector<std::string>
|
||||||
|
ircd::db::wals(const database &cd)
|
||||||
|
{
|
||||||
|
auto &d
|
||||||
|
{
|
||||||
|
const_cast<database &>(cd)
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<std::unique_ptr<rocksdb::LogFile>> vec;
|
||||||
|
throw_on_error
|
||||||
|
{
|
||||||
|
d.d->GetSortedWalFiles(vec)
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<std::string> ret(vec.size());
|
||||||
|
std::transform(begin(vec), end(vec), begin(ret), []
|
||||||
|
(const auto &file)
|
||||||
|
{
|
||||||
|
return file->PathName();
|
||||||
|
});
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the live file list for db; see overlord documentation.
|
/// Get the live file list for db; see overlord documentation.
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
ircd::db::files(const database &d)
|
ircd::db::files(const database &d)
|
||||||
|
@ -3204,6 +3229,70 @@ ircd::db::database::sst::info::operator=(rocksdb::TableProperties &&tp)
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// database::wal
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// wal::info::vector
|
||||||
|
//
|
||||||
|
|
||||||
|
ircd::db::database::wal::info::vector::vector(const database &d_)
|
||||||
|
{
|
||||||
|
auto &d{const_cast<database &>(d_)};
|
||||||
|
std::vector<std::unique_ptr<rocksdb::LogFile>> vec;
|
||||||
|
throw_on_error
|
||||||
|
{
|
||||||
|
d.d->GetSortedWalFiles(vec)
|
||||||
|
};
|
||||||
|
|
||||||
|
this->resize(vec.size());
|
||||||
|
for(size_t i(0); i < vec.size(); ++i)
|
||||||
|
this->at(i).operator=(*vec.at(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// wal::info::info
|
||||||
|
//
|
||||||
|
|
||||||
|
ircd::db::database::wal::info::info(const database &d_,
|
||||||
|
const string_view &filename)
|
||||||
|
{
|
||||||
|
auto &d{const_cast<database &>(d_)};
|
||||||
|
std::vector<std::unique_ptr<rocksdb::LogFile>> vec;
|
||||||
|
throw_on_error
|
||||||
|
{
|
||||||
|
d.d->GetSortedWalFiles(vec)
|
||||||
|
};
|
||||||
|
|
||||||
|
for(const auto &ptr : vec)
|
||||||
|
if(ptr->PathName() == filename)
|
||||||
|
{
|
||||||
|
this->operator=(*ptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw not_found
|
||||||
|
{
|
||||||
|
"No file named '%s' is live in database '%s'",
|
||||||
|
filename,
|
||||||
|
d.name
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::db::database::wal::info &
|
||||||
|
ircd::db::database::wal::info::operator=(const rocksdb::LogFile &lf)
|
||||||
|
{
|
||||||
|
name = lf.PathName();
|
||||||
|
number = lf.LogNumber();
|
||||||
|
seq = lf.StartSequence();
|
||||||
|
size = lf.SizeFileBytes();
|
||||||
|
alive = lf.Type() == rocksdb::WalFileType::kAliveLogFile;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// database::env
|
// database::env
|
||||||
|
|
|
@ -2581,6 +2581,55 @@ console_cmd__db__sst__dump(opt &out, const string_view &line)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
console_cmd__db__wal(opt &out, const string_view &line)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const params param{line, " ",
|
||||||
|
{
|
||||||
|
"dbname",
|
||||||
|
}};
|
||||||
|
|
||||||
|
const auto dbname
|
||||||
|
{
|
||||||
|
param.at("dbname")
|
||||||
|
};
|
||||||
|
|
||||||
|
auto &database
|
||||||
|
{
|
||||||
|
db::database::get(dbname)
|
||||||
|
};
|
||||||
|
|
||||||
|
const db::database::wal::info::vector vec
|
||||||
|
{
|
||||||
|
database
|
||||||
|
};
|
||||||
|
|
||||||
|
out
|
||||||
|
<< std::setw(12) << std::left << "PATH" << " "
|
||||||
|
<< std::setw(8) << std::left << "ID" << " "
|
||||||
|
<< std::setw(12) << std::right << "START SEQ" << " "
|
||||||
|
<< std::setw(20) << std::left << "SIZE" << " "
|
||||||
|
<< std::setw(8) << std::left << "STATUS" << " "
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
for(const auto &info : vec)
|
||||||
|
out
|
||||||
|
<< std::setw(12) << std::left << info.name << " "
|
||||||
|
<< std::setw(8) << std::left << info.number << " "
|
||||||
|
<< std::setw(12) << std::right << info.seq << " "
|
||||||
|
<< std::setw(20) << std::left << pretty(iec(info.size)) << " "
|
||||||
|
<< std::setw(8) << std::left << (info.alive? "LIVE"_sv : "ARCHIVE"_sv) << " "
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch(const std::out_of_range &e)
|
||||||
|
{
|
||||||
|
out << "No open database by that name" << std::endl;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
console_cmd__db__files(opt &out, const string_view &line)
|
console_cmd__db__files(opt &out, const string_view &line)
|
||||||
try
|
try
|
||||||
|
|
Loading…
Reference in a new issue