materialized_views: propagate "view virtual columns" between nodes
db::schema_tables::ALL and db::schema_tables::all_tables() are both supposed to list the same schema tables - the former is the list of their names, and the latter is the list of their schemas. This code duplication makes it easy to forget to update one of them, and indeed recently the new "view_virtual_columns" was added to all_tables() but not to ALL. What this patch does is to make ALL a function instead of constant vector. The newly named all_table_names() function uses all_tables() so the list of schema tables only appears once. So that nobody worries about the performance impact, all_table_names() caches the list in a per-thread vector that is only prepared once per thread. Because after this patch all_table_names() has the "view_virtual_columns" that was previously missing, this patch also fixes #4339, which was about virtual columns in materialized views not being propagated to other nodes. Unfortunately, to test the fix for #4339 we need a test with multiple nodes, so we cannot test it here in a unit test, and will instead use the dtest framework, in a separate patch. Fixes #4339 Branches: 3.0 Tests: all unit tests (release and debug mode), new dtest for #4339. The unit test mutation_reader_test failed in debug mode but not in release mode, but this probably has nothing to do with this patch (?). Signed-off-by: Nadav Har'El <nyh@scylladb.com> Message-Id: <20190320063437.32731-1-nyh@scylladb.com>
This commit is contained in:
committed by
Duarte Nunes
parent
ccf731a820
commit
7c874057f5
@@ -599,7 +599,7 @@ public:
|
||||
|
||||
future<> flush_schemas() {
|
||||
return _qp.proxy().get_db().invoke_on_all([this] (database& db) {
|
||||
return parallel_for_each(db::schema_tables::ALL, [this, &db](const sstring& cf_name) {
|
||||
return parallel_for_each(db::schema_tables::all_table_names(), [this, &db](const sstring& cf_name) {
|
||||
auto& cf = db.find_column_family(db::schema_tables::NAME, cf_name);
|
||||
return cf.flush();
|
||||
});
|
||||
|
||||
@@ -196,8 +196,6 @@ static void prepare_builder_from_table_row(const schema_ctxt&, schema_builder&,
|
||||
|
||||
using namespace v3;
|
||||
|
||||
std::vector<const char*> ALL { KEYSPACES, TABLES, SCYLLA_TABLES, COLUMNS, DROPPED_COLUMNS, TRIGGERS, VIEWS, TYPES, FUNCTIONS, AGGREGATES, INDEXES };
|
||||
|
||||
using days = std::chrono::duration<int, std::ratio<24 * 3600>>;
|
||||
|
||||
future<> save_system_schema(const sstring & ksname) {
|
||||
@@ -205,7 +203,7 @@ future<> save_system_schema(const sstring & ksname) {
|
||||
auto ksm = ks.metadata();
|
||||
|
||||
// delete old, possibly obsolete entries in schema tables
|
||||
return parallel_for_each(ALL, [ksm] (sstring cf) {
|
||||
return parallel_for_each(all_table_names(), [ksm] (sstring cf) {
|
||||
auto deletion_timestamp = schema_creation_timestamp() - 1;
|
||||
return db::execute_cql(format("DELETE FROM {}.{} USING TIMESTAMP {} WHERE keyspace_name = ?", NAME, cf,
|
||||
deletion_timestamp), ksm->name()).discard_result();
|
||||
@@ -600,7 +598,7 @@ future<utils::UUID> calculate_schema_digest(distributed<service::storage_proxy>&
|
||||
}
|
||||
};
|
||||
return do_with(md5_hasher(), [map, reduce] (auto& hash) {
|
||||
return do_for_each(ALL.begin(), ALL.end(), [&hash, map, reduce] (auto& table) {
|
||||
return do_for_each(all_table_names(), [&hash, map, reduce] (auto& table) {
|
||||
return map(table).then([&hash, reduce] (auto&& mutations) {
|
||||
reduce(hash, mutations);
|
||||
});
|
||||
@@ -631,7 +629,7 @@ future<std::vector<frozen_mutation>> convert_schema_to_mutations(distributed<ser
|
||||
std::move(mutations.begin(), mutations.end(), std::back_inserter(result));
|
||||
return std::move(result);
|
||||
};
|
||||
return map_reduce(ALL.begin(), ALL.end(), map, std::vector<frozen_mutation>{}, reduce);
|
||||
return map_reduce(all_table_names(), map, std::vector<frozen_mutation>{}, reduce);
|
||||
}
|
||||
|
||||
future<schema_result>
|
||||
@@ -2697,12 +2695,22 @@ data_type parse_type(sstring str)
|
||||
}
|
||||
|
||||
std::vector<schema_ptr> all_tables() {
|
||||
// Don't forget to update this list when new schema tables are added.
|
||||
// The listed schema tables are the ones synchronized between nodes,
|
||||
// and forgetting one of them in this list can cause bugs like #4339.
|
||||
return {
|
||||
keyspaces(), tables(), scylla_tables(), columns(), dropped_columns(), triggers(),
|
||||
views(), indexes(), types(), functions(), aggregates(), view_virtual_columns()
|
||||
};
|
||||
}
|
||||
|
||||
const std::vector<sstring>& all_table_names() {
|
||||
static thread_local std::vector<sstring> all =
|
||||
boost::copy_range<std::vector<sstring>>(all_tables() |
|
||||
boost::adaptors::transformed([] (auto schema) { return schema->cf_name(); }));
|
||||
return all;
|
||||
}
|
||||
|
||||
namespace legacy {
|
||||
|
||||
table_schema_version schema_mutations::digest() const {
|
||||
|
||||
@@ -129,9 +129,8 @@ using namespace v3;
|
||||
// Replication of schema between nodes with different version is inhibited.
|
||||
extern const sstring version;
|
||||
|
||||
extern std::vector<const char*> ALL;
|
||||
|
||||
std::vector<schema_ptr> all_tables();
|
||||
const std::vector<sstring>& all_table_names();
|
||||
|
||||
// saves/creates "ks" + all tables etc, while first deleting all old schema entries (will be rewritten)
|
||||
future<> save_system_schema(const sstring & ks);
|
||||
|
||||
@@ -192,7 +192,7 @@ future<> service::client_state::has_access(const sstring& ks, auth::permission p
|
||||
for (auto cf : { db::system_keyspace::LOCAL, db::system_keyspace::PEERS }) {
|
||||
tmp.insert(auth::make_data_resource(db::system_keyspace::NAME, cf));
|
||||
}
|
||||
for (auto cf : db::schema_tables::ALL) {
|
||||
for (auto cf : db::schema_tables::all_table_names()) {
|
||||
tmp.insert(auth::make_data_resource(db::schema_tables::NAME, cf));
|
||||
}
|
||||
return tmp;
|
||||
|
||||
Reference in New Issue
Block a user