0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-29 10:12:39 +01:00

ircd:Ⓜ️:dbs: Make blacklist a write option rather than API call.

This commit is contained in:
Jason Volk 2019-05-11 14:30:15 -07:00
parent 305e02db7c
commit 838ad51b05
3 changed files with 45 additions and 23 deletions

View file

@ -30,7 +30,6 @@ namespace ircd::m::dbs
// [SET (txn)] Basic write suite
string_view write(db::txn &, const event &, const write_opts &);
void blacklist(db::txn &, const event::id &, const write_opts &);
}
/// Database description

View file

@ -22,7 +22,8 @@ struct ircd::m::dbs::write_opts
/// actual transaction.
db::op op {db::op::SET};
/// Principal's index number. Most codepaths do not permit zero; must set.
/// Principal's index number. Most codepaths do not permit zero. This may
/// be zero for blacklisting, but the blacklist option must be set.
uint64_t event_idx {0};
/// The state btree root to perform the update on.
@ -69,4 +70,15 @@ struct ircd::m::dbs::write_opts
/// made indepdently; this is slow and requires external synchronization
/// to not introduce inconsistent data into the txn.
bool allow_queries {true};
/// Setting to true allows the event_idx to be 0 which allows the insertion
/// of the event_id into a "blacklist" to mark it as unprocessable; this
/// prevents the server from repeatedly trying to process an event.
///
/// Note for now this just creates an entry in _event_idx of 0 for the
/// event_id which also means "not found" for most codepaths, a reasonable
/// default. But for codepaths that must distinguish between "not found"
/// and "blacklist" they must know that `event_id => 0` was *found* to be
/// zero.
bool blacklist {false};
};

View file

@ -204,6 +204,38 @@ ircd::m::dbs::write_opts::appendix_all{[]
// Basic write suite
//
namespace ircd::m::dbs
{
static void blacklist(db::txn &txn, const event::id &, const write_opts &);
}
ircd::string_view
ircd::m::dbs::write(db::txn &txn,
const event &event,
const write_opts &opts)
{
if(opts.event_idx == 0 && opts.blacklist)
{
blacklist(txn, at<"event_id"_>(event), opts);
return {};
}
if(unlikely(opts.event_idx == 0))
throw panic
{
"Cannot write to database: no index specified for event."
};
if(opts.appendix.test(appendix::EVENT))
_index_event(txn, event, opts);
if(opts.appendix.test(appendix::ROOM))
if(json::get<"room_id"_>(event))
return _index_room(txn, event, opts);
return {};
}
void
ircd::m::dbs::blacklist(db::txn &txn,
const event::id &event_id,
@ -232,27 +264,6 @@ ircd::m::dbs::blacklist(db::txn &txn,
};
}
ircd::string_view
ircd::m::dbs::write(db::txn &txn,
const event &event,
const write_opts &opts)
{
if(unlikely(opts.event_idx == 0))
throw panic
{
"Cannot write to database: no index specified for event."
};
if(opts.appendix.test(appendix::EVENT))
_index_event(txn, event, opts);
if(opts.appendix.test(appendix::ROOM))
if(json::get<"room_id"_>(event))
return _index_room(txn, event, opts);
return {};
}
//
// Internal interface
//