From f21c08fb19b525f59f79c53ab4959d845cb5eb45 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 6 Feb 2019 17:49:29 -0800 Subject: [PATCH] modules/m_event: Add event refs rebuild util w/ console cmd. --- modules/console.cc | 14 +++++++++++ modules/m_event.cc | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/modules/console.cc b/modules/console.cc index 16d007ea8..d06fcdb8c 100644 --- a/modules/console.cc +++ b/modules/console.cc @@ -5852,6 +5852,20 @@ console_cmd__event__refs(opt &out, const string_view &line) return true; } +bool +console_cmd__event__refs__rebuild(opt &out, const string_view &line) +{ + using prototype = void (); + static mods::import rebuild + { + "m_event", "event_refs__rebuild" + }; + + rebuild(); + out << "done" << std::endl; + return true; +} + // // state // diff --git a/modules/m_event.cc b/modules/m_event.cc index ad483a7b5..ae679b5a0 100644 --- a/modules/m_event.cc +++ b/modules/m_event.cc @@ -556,3 +556,64 @@ pretty_oneline__prev(std::ostream &s, s << unquote(prev_event[0]) << " "; s << "] "; } + +extern "C" void +event_refs__rebuild() +{ + static const size_t pool_size{64}; + static const size_t log_interval{8192}; + + db::txn txn + { + *m::dbs::events + }; + + auto &column + { + dbs::event_json + }; + + auto it + { + column.begin() + }; + + ctx::dock dock; + ctx::pool pool; + pool.min(pool_size); + size_t i(0), j(0); + for(; it; ++it) + { + std::string event{it->second}; + const m::event::idx event_idx + { + byte_view(it->first) + }; + + pool([&txn, &dock, &i, &j, event(std::move(event)), event_idx] + { + m::dbs::write_opts wopts; + wopts.event_idx = event_idx; + m::dbs::_index_event_refs(txn, json::object{event}, wopts); + if(++j % log_interval == 0) log::info + { + m::log, "Refs builder @%zu:%zu of %lu (@idx: %lu)", + i, + j, + m::vm::current_sequence, + event_idx + }; + + dock.notify_one(); + }); + + ++i; + } + + dock.wait([&i, &j] + { + return i == j; + }); + + txn(); +}