diff --git a/include/ircd/m/homeserver.h b/include/ircd/m/homeserver.h index 6ffeb7236..795abc10e 100644 --- a/include/ircd/m/homeserver.h +++ b/include/ircd/m/homeserver.h @@ -84,6 +84,7 @@ struct ircd::m::homeserver static homeserver *init(const struct opts *); static void fini(homeserver *) noexcept; static bool rehash(homeserver *); + static bool refresh(homeserver *); }; struct ircd::m::homeserver::key diff --git a/include/ircd/m/vm/seq.h b/include/ircd/m/vm/seq.h index 6387f630f..1ed16466d 100644 --- a/include/ircd/m/vm/seq.h +++ b/include/ircd/m/vm/seq.h @@ -13,6 +13,8 @@ namespace ircd::m::vm::sequence { + struct refresh; + extern ctx::dock dock; extern uint64_t retired; // already written; always monotonic extern uint64_t committed; // pending write; usually monotonic @@ -25,3 +27,12 @@ namespace ircd::m::vm::sequence uint64_t max(); uint64_t min(); } + +struct ircd::m::vm::sequence::refresh +{ + uint64_t database[2] {0, 0}; + uint64_t retired[2] {0, 0}; + m::event::id::buf event_id; + + refresh(); +}; diff --git a/matrix/homeserver.cc b/matrix/homeserver.cc index ab69ee95f..76e92f80b 100644 --- a/matrix/homeserver.cc +++ b/matrix/homeserver.cc @@ -227,6 +227,41 @@ ircd::m::homeserver::rehash(homeserver *const homeserver) return true; } +bool +IRCD_MODULE_EXPORT +ircd::m::homeserver::refresh(homeserver *const homeserver) +try +{ + if(!homeserver) + return false; + + const ctx::uninterruptible::nothrow ui; + const vm::sequence::refresh refresh; + if(ircd::debugmode) + log::logf + { + log, log::level::DEBUG, + "refreshed events[%12lu -> %-12lu] vm[%10lu -> %-10lu] %s", + refresh.database[0], + refresh.database[1], + refresh.retired[0], + refresh.retired[1], + string_view{refresh.event_id}, + }; + + return true; +} +catch(const std::exception &e) +{ + log::error + { + log, "refresh :%s", + e.what(), + }; + + return false; +} + // // homeserver::homeserver::homeserver // diff --git a/matrix/vm_seq.cc b/matrix/vm_seq.cc index 0775d6116..f7b1284bf 100644 --- a/matrix/vm_seq.cc +++ b/matrix/vm_seq.cc @@ -20,6 +20,34 @@ ircd::m::vm::sequence::committed; decltype(ircd::m::vm::sequence::uncommitted) ircd::m::vm::sequence::uncommitted; +// +// refresh::refresh +// + +ircd::m::vm::sequence::refresh::refresh() +{ + auto &database + { + db::database::get("events") + }; + + if(!database.slave) + return; + + this->database[0] = db::sequence(database); + this->retired[0] = sequence::retired; + + db::refresh(database); + sequence::retired = sequence::get(this->event_id); + + this->database[1] = db::sequence(database); + this->retired[1] = sequence::retired; +} + +// +// tools +// + uint64_t ircd::m::vm::sequence::min() {