mirror of
https://github.com/matrix-construct/construct
synced 2024-11-26 00:32:35 +01:00
ircd:Ⓜ️:dbs: Add event_horizon resolver.
This commit is contained in:
parent
56b63be2aa
commit
2d209388c1
4 changed files with 123 additions and 0 deletions
|
@ -54,6 +54,9 @@ enum ircd::m::dbs::appendix::index
|
||||||
/// properly complete the event_refs graph to all the referencing events.
|
/// properly complete the event_refs graph to all the referencing events.
|
||||||
EVENT_HORIZON,
|
EVENT_HORIZON,
|
||||||
|
|
||||||
|
/// Resolves unresolved references for this event left in event_horizon.
|
||||||
|
EVENT_HORIZON_RESOLVE,
|
||||||
|
|
||||||
/// Involves the event_sender column (reverse index on the event sender).
|
/// Involves the event_sender column (reverse index on the event sender).
|
||||||
EVENT_SENDER,
|
EVENT_SENDER,
|
||||||
|
|
||||||
|
@ -108,6 +111,7 @@ namespace ircd::m::dbs
|
||||||
string_view _index_room(db::txn &, const event &, const write_opts &);
|
string_view _index_room(db::txn &, const event &, const write_opts &);
|
||||||
void _index_event_type(db::txn &, const event &, const write_opts &);
|
void _index_event_type(db::txn &, const event &, const write_opts &);
|
||||||
void _index_event_sender(db::txn &, const event &, const write_opts &);
|
void _index_event_sender(db::txn &, const event &, const write_opts &);
|
||||||
|
void _index_event_horizon_resolve(db::txn &, const event &, const write_opts &);
|
||||||
void _index_event_horizon(db::txn &, const event &, const write_opts &, const id::event &);
|
void _index_event_horizon(db::txn &, const event &, const write_opts &, const id::event &);
|
||||||
void _index_event_refs_m_room_redaction(db::txn &, const event &, const write_opts &);
|
void _index_event_refs_m_room_redaction(db::txn &, const event &, const write_opts &);
|
||||||
void _index_event_refs_m_receipt_m_read(db::txn &, const event &, const write_opts &);
|
void _index_event_refs_m_receipt_m_read(db::txn &, const event &, const write_opts &);
|
||||||
|
|
|
@ -41,6 +41,10 @@ struct ircd::m::dbs::write_opts
|
||||||
/// by clearing a bit.
|
/// by clearing a bit.
|
||||||
std::bitset<256> event_refs {event_refs_all};
|
std::bitset<256> event_refs {event_refs_all};
|
||||||
|
|
||||||
|
/// Selection of what reference types to resolve and delete from the
|
||||||
|
/// event_horizon for this event.
|
||||||
|
std::bitset<256> horizon_resolve {event_refs_all};
|
||||||
|
|
||||||
/// Whether the present state table `room_state` should be updated by
|
/// Whether the present state table `room_state` should be updated by
|
||||||
/// this operation if appropriate.
|
/// this operation if appropriate.
|
||||||
bool present {true};
|
bool present {true};
|
||||||
|
|
|
@ -271,6 +271,9 @@ ircd::m::dbs::_index_event(db::txn &txn,
|
||||||
if(opts.appendix.test(appendix::EVENT_JSON))
|
if(opts.appendix.test(appendix::EVENT_JSON))
|
||||||
_index_event_json(txn, event, opts);
|
_index_event_json(txn, event, opts);
|
||||||
|
|
||||||
|
if(opts.appendix.test(appendix::EVENT_HORIZON_RESOLVE) && opts.horizon_resolve.any())
|
||||||
|
_index_event_horizon_resolve(txn, event, opts);
|
||||||
|
|
||||||
if(opts.appendix.test(appendix::EVENT_REFS) && opts.event_refs.any())
|
if(opts.appendix.test(appendix::EVENT_REFS) && opts.event_refs.any())
|
||||||
_index_event_refs(txn, event, opts);
|
_index_event_refs(txn, event, opts);
|
||||||
|
|
||||||
|
@ -827,6 +830,7 @@ ircd::m::dbs::_index_event_horizon(db::txn &txn,
|
||||||
const m::event::id &unresolved_id)
|
const m::event::id &unresolved_id)
|
||||||
{
|
{
|
||||||
thread_local char buf[EVENT_HORIZON_KEY_MAX_SIZE];
|
thread_local char buf[EVENT_HORIZON_KEY_MAX_SIZE];
|
||||||
|
assert(opts.appendix.test(appendix::EVENT_HORIZON));
|
||||||
assert(opts.event_idx != 0 && unresolved_id);
|
assert(opts.event_idx != 0 && unresolved_id);
|
||||||
const string_view &key
|
const string_view &key
|
||||||
{
|
{
|
||||||
|
@ -842,6 +846,75 @@ ircd::m::dbs::_index_event_horizon(db::txn &txn,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::m::dbs::_index_event_horizon_resolve(db::txn &txn,
|
||||||
|
const event &event,
|
||||||
|
const write_opts &opts)
|
||||||
|
{
|
||||||
|
thread_local char buf[EVENT_HORIZON_KEY_MAX_SIZE];
|
||||||
|
assert(opts.appendix.test(appendix::EVENT_HORIZON_RESOLVE));
|
||||||
|
assert(opts.event_idx != 0);
|
||||||
|
const string_view &key
|
||||||
|
{
|
||||||
|
event_horizon_key(buf, at<"event_id"_>(event), 0UL)
|
||||||
|
};
|
||||||
|
|
||||||
|
auto it
|
||||||
|
{
|
||||||
|
dbs::event_horizon.begin(key)
|
||||||
|
};
|
||||||
|
|
||||||
|
for(; it; ++it)
|
||||||
|
{
|
||||||
|
const auto parts
|
||||||
|
{
|
||||||
|
event_horizon_key(it->first)
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto &event_idx
|
||||||
|
{
|
||||||
|
std::get<0>(parts)
|
||||||
|
};
|
||||||
|
|
||||||
|
assert(event_idx != opts.event_idx);
|
||||||
|
const event::fetch _event
|
||||||
|
{
|
||||||
|
event_idx, std::nothrow
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!_event.valid)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Make the references on behalf of the future event
|
||||||
|
write_opts _opts;
|
||||||
|
_opts.op = opts.op;
|
||||||
|
_opts.event_idx = event_idx;
|
||||||
|
_opts.appendix.reset();
|
||||||
|
_opts.appendix.set(appendix::EVENT);
|
||||||
|
_opts.appendix.set(appendix::EVENT_REFS);
|
||||||
|
_opts.event_refs = opts.horizon_resolve;
|
||||||
|
write(txn, _event, _opts);
|
||||||
|
|
||||||
|
// Delete the event_horizon entry after resolving.
|
||||||
|
thread_local char buf[EVENT_HORIZON_KEY_MAX_SIZE];
|
||||||
|
const string_view &key
|
||||||
|
{
|
||||||
|
event_horizon_key(buf, at<"event_id"_>(event), event_idx)
|
||||||
|
};
|
||||||
|
|
||||||
|
db::txn::append
|
||||||
|
{
|
||||||
|
txn, dbs::event_horizon,
|
||||||
|
{
|
||||||
|
opts.op == db::op::SET?
|
||||||
|
db::op::DELETE:
|
||||||
|
db::op::SET,
|
||||||
|
key
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ircd::m::dbs::_index_event_sender(db::txn &txn,
|
ircd::m::dbs::_index_event_sender(db::txn &txn,
|
||||||
const event &event,
|
const event &event,
|
||||||
|
|
|
@ -6416,6 +6416,48 @@ console_cmd__event__bad(opt &out, const string_view &line)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
console_cmd__event__horizon(opt &out, const string_view &line)
|
||||||
|
{
|
||||||
|
const params param{line, " ",
|
||||||
|
{
|
||||||
|
"event_id",
|
||||||
|
}};
|
||||||
|
|
||||||
|
const m::event::id &event_id
|
||||||
|
{
|
||||||
|
param.at("event_id")
|
||||||
|
};
|
||||||
|
|
||||||
|
char buf[m::dbs::EVENT_HORIZON_KEY_MAX_SIZE];
|
||||||
|
const string_view &key
|
||||||
|
{
|
||||||
|
m::dbs::event_horizon_key(buf, event_id, 0UL)
|
||||||
|
};
|
||||||
|
|
||||||
|
for(auto it(m::dbs::event_horizon.begin(key)); it; ++it)
|
||||||
|
{
|
||||||
|
const auto &event_idx
|
||||||
|
{
|
||||||
|
std::get<0>(m::dbs::event_horizon_key(it->first))
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto _event_id
|
||||||
|
{
|
||||||
|
m::event_id(event_idx, std::nothrow)
|
||||||
|
};
|
||||||
|
|
||||||
|
out << event_id
|
||||||
|
<< " -> "
|
||||||
|
<< event_idx
|
||||||
|
<< " "
|
||||||
|
<< _event_id
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
console_cmd__event__cached(opt &out, const string_view &line)
|
console_cmd__event__cached(opt &out, const string_view &line)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue