From b91c768c575de9a949877aad44087153e99a676e Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Tue, 12 May 2020 18:19:58 -0700 Subject: [PATCH] ircd::m::vm::eval: Remove sequence_shared state. --- include/ircd/m/vm.h | 1 - matrix/vm.cc | 7 +++--- matrix/vm_execute.cc | 51 ++++++++++++++++++++++++-------------------- modules/console.cc | 4 ++-- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/include/ircd/m/vm.h b/include/ircd/m/vm.h index e193aed20..4f86884c2 100644 --- a/include/ircd/m/vm.h +++ b/include/ircd/m/vm.h @@ -81,7 +81,6 @@ struct ircd::m::vm::eval vm::eval *child {nullptr}; uint64_t id {++id_ctr}; uint64_t sequence {0}; - uint64_t sequence_shared[2] {0}; // min, max std::shared_ptr txn; vector_view pdus; diff --git a/matrix/vm.cc b/matrix/vm.cc index 4a8360b84..32c8518cc 100644 --- a/matrix/vm.cc +++ b/matrix/vm.cc @@ -127,14 +127,15 @@ ircd::m::vm::loghead(const mutable_buffer &buf, { return fmt::sprintf { - buf, "vm:%lu:%lu:%lu eval:%lu seq:%lu share:%lu:%lu %s", + buf, "vm:%lu:%lu:%lu eval:%lu seq:%lu parent:%lu %s", sequence::retired, sequence::committed, sequence::uncommitted, eval.id, sequence::get(eval), - eval.sequence_shared[0], - eval.sequence_shared[1], + eval.parent? + eval.parent->id: + 0UL, eval.event_? string_view{eval.event_->event_id}: ""_sv, diff --git a/matrix/vm_execute.cc b/matrix/vm_execute.cc index 79d00d9c3..5fab81bd6 100644 --- a/matrix/vm_execute.cc +++ b/matrix/vm_execute.cc @@ -669,12 +669,6 @@ ircd::m::vm::execute_pdu(eval &eval, // Obtain sequence number here. const auto *const &top(eval::seqmax()); - const scope_restore sequence_shared[2] - { - { eval.sequence_shared[0], 0UL }, - { eval.sequence_shared[1], 0UL }, - }; - eval.sequence = { top? @@ -719,11 +713,13 @@ ircd::m::vm::execute_pdu(eval &eval, } assert(eval.sequence != 0); - assert(sequence::uncommitted <= sequence::get(eval)); - assert(sequence::committed < sequence::get(eval)); - assert(sequence::retired < sequence::get(eval)); assert(eval::sequnique(sequence::get(eval))); - sequence::uncommitted = sequence::get(eval); + assert(eval.parent || sequence::uncommitted <= sequence::get(eval)); + assert(eval.parent || sequence::committed < sequence::get(eval)); + assert(eval.parent || sequence::retired < sequence::get(eval)); + sequence::uncommitted = !eval.parent? + sequence::get(eval): + sequence::uncommitted; const scope_restore eval_phase_commit { @@ -733,7 +729,10 @@ ircd::m::vm::execute_pdu(eval &eval, // Wait until this is the lowest sequence number sequence::dock.wait([&eval] { - return eval::seqnext(sequence::committed) == &eval; + return false + || eval.parent + || eval::seqnext(sequence::committed) == &eval + ; }); // Reevaluation of auth against the present state of the room. @@ -758,10 +757,6 @@ ircd::m::vm::execute_pdu(eval &eval, call_hook(eval_hook, eval, event, eval); } - assert(sequence::committed < sequence::get(eval)); - assert(sequence::retired < sequence::get(eval)); - sequence::committed = sequence::get(eval); - // Allocate transaction; discover shared-sequenced evals. if(likely(opts.phase[phase::INDEX])) { @@ -780,6 +775,12 @@ ircd::m::vm::execute_pdu(eval &eval, write_append(eval, event); } + assert(eval.parent || sequence::committed < sequence::get(eval)); + assert(eval.parent || sequence::retired < sequence::get(eval)); + sequence::committed = !eval.parent? + sequence::get(eval): + sequence::committed; + // Generate post-eval/pre-notify effects. This function may conduct // an entire eval of several more events recursively before returning. if(likely(opts.phase[phase::POST])) @@ -793,7 +794,7 @@ ircd::m::vm::execute_pdu(eval &eval, } // Commit the transaction to database iff this eval is at the stack base. - if(likely(opts.phase[phase::WRITE]) && !eval.sequence_shared[0]) + if(likely(opts.phase[phase::WRITE] && !eval.parent)) { const scope_restore eval_phase { @@ -805,7 +806,7 @@ ircd::m::vm::execute_pdu(eval &eval, // Wait for sequencing only if this is the stack base, otherwise we'll // never return back to that stack base. - if(likely(!eval.sequence_shared[0])) + if(likely(!eval.parent)) { const scope_restore eval_phase { @@ -817,9 +818,16 @@ ircd::m::vm::execute_pdu(eval &eval, return eval::seqnext(sequence::retired) == std::addressof(eval); }); + const auto next + { + eval::seqnext(eval.sequence) + }; + const auto highest { - std::max(eval.sequence_shared[1], sequence::get(eval)) + next? + sequence::get(*next): + sequence::get(eval) }; const auto retire @@ -872,8 +880,6 @@ ircd::m::vm::write_prepare(eval &eval, if(sequence::get(other) <= sequence::retired) return true; - other.sequence_shared[1] = std::max(other.sequence_shared[1], sequence::get(eval)); - eval.sequence_shared[0] = sequence::get(other); eval.txn = other.txn; return false; }}; @@ -984,7 +990,7 @@ ircd::m::vm::write_commit(eval &eval) { assert(eval.txn); assert(eval.txn.use_count() == 1); - assert(eval.sequence_shared[0] == 0); + assert(!eval.parent); auto &txn { *eval.txn @@ -1001,10 +1007,9 @@ ircd::m::vm::write_commit(eval &eval) log::debug { - log, "%s | wrote %lu:%lu | db seq %lu:%lu %zu cells in %zu bytes to events database ...", + log, "%s | wrote %lu | db seq %lu:%lu %zu cells in %zu bytes to events database ...", loghead(eval), sequence::get(eval), - eval.sequence_shared[1], db_seq_before, db_seq_after, txn.size(), diff --git a/modules/console.cc b/modules/console.cc index 8dbd5e392..8e2cbcd12 100644 --- a/modules/console.cc +++ b/modules/console.cc @@ -14924,8 +14924,8 @@ console_cmd__vm(opt &out, const string_view &line) << std::left << std::setw(24) << "USER" << " " << std::right << std::setw(5) << "PDUS" << " " << std::right << std::setw(5) << "DONE" << " " + << std::right << std::setw(8) << "PARENT" << " " << std::right << std::setw(9) << "SEQUENCE" << " " - << std::right << std::setw(9) << "SEQSHARE" << " " << std::left << std::setw(4) << "HOOK" << " " << std::left << std::setw(10) << "PHASE" << " " << std::right << std::setw(6) << "SIZE" << " " @@ -14962,8 +14962,8 @@ console_cmd__vm(opt &out, const string_view &line) << std::left << std::setw(24) << trunc(eval->opts->node_id?: eval->opts->user_id, 24) << " " << std::right << std::setw(5) << eval->pdus.size() << " " << std::right << std::setw(5) << done << " " + << std::right << std::setw(8) << (eval->parent? eval->parent->id : 0UL) << " " << std::right << std::setw(9) << eval->sequence << " " - << std::right << std::setw(9) << std::max(eval->sequence_shared[0], eval->sequence_shared[1]) << " " << std::right << std::setw(4) << (eval->hook? eval->hook->id(): 0U) << " " << std::left << std::setw(10) << trunc(reflect(eval->phase), 10) << " " << std::right << std::setw(6) << (eval->txn? eval->txn->bytes() : 0UL) << " "