Skip to content

Commit

Permalink
storage_service: register schema version observer before joining grou…
Browse files Browse the repository at this point in the history
…p0 and starting gossiper

The schema version is updated by group0, so if group0 starts before
schema version observer is registered some updates may be missed. Since
the observer is used to update node's gossiper state the gossiper may
contain wrong schema version.

Fix by registering the observer before starting group0 and even before
starting gossiper to avoid a theoretical case that something may pull
schema after start of gossiping and before the observer is registered.

Fixes: scylladb#15078

Message-Id: <ZOYZWhEh6Zyb+FaN@scylladb.com>
  • Loading branch information
Gleb Natapov authored and raphaelsc committed Aug 27, 2023
1 parent 5f650ae commit d38499f
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions service/storage_service.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2485,6 +2485,12 @@ future<> storage_service::join_token_ring(cdc::generation_service& cdc_gen_servi
app_states.emplace(s.first, std::move(s.second));
}

auto schema_change_announce = _db.local().observable_schema_version().observe([this] (table_schema_version schema_version) mutable {
_migration_manager.local().passive_announce(std::move(schema_version));
});

_listeners.emplace_back(make_lw_shared(std::move(schema_change_announce)));

slogger.info("Starting up server gossip");

auto generation_number = gms::generation_type(co_await _sys_ks.local().increment_and_get_generation());
Expand Down Expand Up @@ -2557,10 +2563,6 @@ future<> storage_service::join_token_ring(cdc::generation_service& cdc_gen_servi
}
} ();

auto schema_change_announce = _db.local().observable_schema_version().observe([this] (table_schema_version schema_version) mutable {
_migration_manager.local().passive_announce(std::move(schema_version));
});
_listeners.emplace_back(make_lw_shared(std::move(schema_change_announce)));
co_await _gossiper.wait_for_gossip_to_settle();
// TODO: Look at the group 0 upgrade state and use it to decide whether to attach or not
if (!_raft_topology_change_enabled) {
Expand Down

0 comments on commit d38499f

Please sign in to comment.