From 2ee8c6f595b094b87f8ebce2f7896b52128dcc28 Mon Sep 17 00:00:00 2001 From: Piotr Sarna Date: Mon, 14 Oct 2019 17:13:32 +0200 Subject: [PATCH 1/2] index: add is_global_index() utility The helper function is useful for determining if given schema represents a global index. --- index/secondary_index_manager.cc | 6 ++++++ index/secondary_index_manager.hh | 1 + 2 files changed, 7 insertions(+) diff --git a/index/secondary_index_manager.cc b/index/secondary_index_manager.cc index 5a435ef536..1b7a0dd45d 100644 --- a/index/secondary_index_manager.cc +++ b/index/secondary_index_manager.cc @@ -181,4 +181,10 @@ bool secondary_index_manager::is_index(const schema& s) const { }); } +bool secondary_index_manager::is_global_index(const schema& s) const { + return boost::algorithm::any_of(_indices | boost::adaptors::map_values, [&s] (const index& i) { + return !i.metadata().local() && s.cf_name() == index_table_name(i.metadata().name()); + }); +} + } diff --git a/index/secondary_index_manager.hh b/index/secondary_index_manager.hh index f17cf05721..9c1c20c05c 100644 --- a/index/secondary_index_manager.hh +++ b/index/secondary_index_manager.hh @@ -77,6 +77,7 @@ public: std::vector list_indexes() const; bool is_index(view_ptr) const; bool is_index(const schema& s) const; + bool is_global_index(const schema& s) const; private: void add_index(const index_metadata& im); }; From 9e98b51aaa401fd1960367fb256aba54f145adb2 Mon Sep 17 00:00:00 2001 From: Piotr Sarna Date: Mon, 14 Oct 2019 17:14:19 +0200 Subject: [PATCH 2/2] view: fix view_info select statement for local indexes Calculating the select statement for given view_info structure used to work fine, but once local indexes were introduced, a subtle bug appeared: the legacy token column does not exist in local indexes and a valid clustering key column was omitted instead. That results in potentially incorrect partition slices being used later in read-before-write. There's a long term plan for removing select_statement from view info altogether, but nonetheless the bug needs to be fixed first. --- db/view/view.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/view/view.cc b/db/view/view.cc index c8d6ab8b28..eb681dd63b 100644 --- a/db/view/view.cc +++ b/db/view/view.cc @@ -86,7 +86,7 @@ cql3::statements::select_statement& view_info::select_statement() const { // FIXME(sarna): legacy code, should be removed after "computed_columns" feature is guaranteed // to be available on every node. Then, we won't need to check if this view is backing a secondary index. const column_definition* legacy_token_column = nullptr; - if (service::get_local_storage_service().db().local().find_column_family(base_id()).get_index_manager().is_index(_schema)) { + if (service::get_local_storage_service().db().local().find_column_family(base_id()).get_index_manager().is_global_index(_schema)) { if (!_schema.clustering_key_columns().empty()) { legacy_token_column = &_schema.clustering_key_columns().front(); }