0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-17 23:40:57 +01:00

ircd::db: Add closure on manual compaction arguments.

This commit is contained in:
Jason Volk 2018-09-19 16:36:01 -07:00
parent 9afac08e40
commit 7427ec991c
3 changed files with 38 additions and 10 deletions

View file

@ -59,8 +59,8 @@ namespace ircd::db
// [SET] Other operations
void setopt(column &, const string_view &key, const string_view &val);
void compact(column &, const std::pair<string_view, string_view> &, const int &to_level = -1);
void compact(column &, const int &level = -1);
void compact(column &, const std::pair<string_view, string_view> &, const compactor & = {});
void compact(column &, const int &level = -1, const compactor & = {});
void sort(column &, const bool &blocking = false);
}

View file

@ -40,7 +40,7 @@ namespace ircd::db
void fdeletions(database &, const bool &enable, const bool &force = false);
uint64_t checkpoint(database &);
void check(database &);
void compact(database &);
void compact(database &, const compactor & = {});
void sort(database &, const bool &blocking = true);
void flush(database &, const bool &sync = false);
void sync(database &);

View file

@ -347,7 +347,8 @@ ircd::db::sort(database &d,
}
void
ircd::db::compact(database &d)
ircd::db::compact(database &d,
const compactor &cb)
{
static const std::pair<string_view, string_view> range
{
@ -357,8 +358,8 @@ ircd::db::compact(database &d)
for(const auto &c : d.columns)
{
db::column column{*c};
compact(column, range, -1);
compact(column, -1);
compact(column, range, cb);
compact(column, -1, cb);
}
}
@ -7350,7 +7351,8 @@ ircd::db::sort(column &column,
void
ircd::db::compact(column &column,
const int &level_)
const int &level_,
const compactor &cb)
{
database::column &c(column);
database &d(*c.d);
@ -7382,6 +7384,19 @@ ircd::db::compact(column &column,
ctx::interruption_point();
const ctx::uninterruptible::nothrow ui;
const std::lock_guard<decltype(write_mutex)> lock{write_mutex};
// Save and restore the existing filter callback so we can allow our
// caller to use theirs. Note that this manual compaction should be
// exclusive for this column (no background compaction should be
// occurring, at least one relying on this filter).
auto their_filter(std::move(c.cfilter.user));
const unwind unfilter{[&c, &their_filter]
{
c.cfilter.user = std::move(their_filter);
}};
c.cfilter.user = cb;
log::debug
{
log, "'%s':'%s' COMPACT level:%d files:%zu size:%zu",
@ -7402,7 +7417,7 @@ ircd::db::compact(column &column,
void
ircd::db::compact(column &column,
const std::pair<string_view, string_view> &range,
const int &to_level)
const compactor &cb)
{
database &d(column);
database::column &c(column);
@ -7421,11 +7436,24 @@ ircd::db::compact(column &column,
rocksdb::CompactRangeOptions opts;
opts.change_level = true;
opts.target_level = to_level;
opts.target_level = -1;
opts.allow_write_stall = true;
const ctx::uninterruptible::nothrow ui;
const std::lock_guard<decltype(write_mutex)> lock{write_mutex};
// Save and restore the existing filter callback so we can allow our
// caller to use theirs. Note that this manual compaction should be
// exclusive for this column (no background compaction should be
// occurring, at least one relying on this filter).
auto their_filter(std::move(c.cfilter.user));
const unwind unfilter{[&c, &their_filter]
{
c.cfilter.user = std::move(their_filter);
}};
c.cfilter.user = cb;
log::debug
{
log, "'%s':'%s' @%lu COMPACT [%s, %s] to level %d",
@ -7434,7 +7462,7 @@ ircd::db::compact(column &column,
sequence(d),
range.first,
range.second,
to_level
opts.target_level
};
throw_on_error