view: Add view_update_generator -> sharded<storage_proxy> dependency

The generator will be responsible for spreading view updates with the
help of mutate_MV helper. The latter needs storage proxy to operate, so
the generator gets this dependency in advance.

There's no need to change start/stop order at the moment, generator
already starts after and stops before proxy. Also, services that have
generator as dependency are not required by proxy (even indirectly) so
no circular dependency is produced at this point.

Signed-off-by: Pavel Emelyanov <xemul@scylladb.com>
This commit is contained in:
Pavel Emelyanov
2023-03-28 11:01:43 +03:00
parent 6525209983
commit 3fd12d6a0e
4 changed files with 13 additions and 4 deletions

View File

@@ -90,9 +90,13 @@ public:
} }
}; };
view_update_generator::view_update_generator(replica::database& db) : _db(db), _progress_tracker(std::make_unique<progress_tracker>()) { view_update_generator::view_update_generator(replica::database& db, sharded<service::storage_proxy>& proxy)
: _db(db)
, _proxy(proxy)
, _progress_tracker(std::make_unique<progress_tracker>()) {
setup_metrics(); setup_metrics();
discover_staging_sstables(); discover_staging_sstables();
(void)_proxy;
} }
view_update_generator::~view_update_generator() {} view_update_generator::~view_update_generator() {}

View File

@@ -22,6 +22,10 @@ class database;
class table; class table;
} }
namespace service {
class storage_proxy;
}
namespace db::view { namespace db::view {
class view_update_generator { class view_update_generator {
@@ -30,6 +34,7 @@ public:
private: private:
replica::database& _db; replica::database& _db;
sharded<service::storage_proxy>& _proxy;
seastar::abort_source _as; seastar::abort_source _as;
future<> _started = make_ready_future<>(); future<> _started = make_ready_future<>();
seastar::condition_variable _pending_sstables; seastar::condition_variable _pending_sstables;
@@ -40,7 +45,7 @@ private:
class progress_tracker; class progress_tracker;
std::unique_ptr<progress_tracker> _progress_tracker; std::unique_ptr<progress_tracker> _progress_tracker;
public: public:
view_update_generator(replica::database& db); view_update_generator(replica::database& db, sharded<service::storage_proxy>& proxy);
~view_update_generator(); ~view_update_generator();
future<> start(); future<> start();

View File

@@ -1269,7 +1269,7 @@ To start the scylla server proper, simply invoke as: scylla server (or just scyl
replica::distributed_loader::init_non_system_keyspaces(db, proxy, sys_ks).get(); replica::distributed_loader::init_non_system_keyspaces(db, proxy, sys_ks).get();
supervisor::notify("starting view update generator"); supervisor::notify("starting view update generator");
view_update_generator.start(std::ref(db)).get(); view_update_generator.start(std::ref(db), std::ref(proxy)).get();
supervisor::notify("starting commit log"); supervisor::notify("starting commit log");
auto cl = db.local().commitlog(); auto cl = db.local().commitlog();

View File

@@ -839,7 +839,7 @@ public:
raft_gr.invoke_on_all(&service::raft_group_registry::drain_on_shutdown).get(); raft_gr.invoke_on_all(&service::raft_group_registry::drain_on_shutdown).get();
}); });
view_update_generator.start(std::ref(db)).get(); view_update_generator.start(std::ref(db), std::ref(proxy)).get();
view_update_generator.invoke_on_all(&db::view::view_update_generator::start).get(); view_update_generator.invoke_on_all(&db::view::view_update_generator::start).get();
auto stop_view_update_generator = defer([&view_update_generator] { auto stop_view_update_generator = defer([&view_update_generator] {
view_update_generator.stop().get(); view_update_generator.stop().get();