/* * Copyright (C) 2017-present ScyllaDB */ /* * SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0 */ #pragma once #include #include #include #include #include #include "types/types.hh" #include "service/raft/raft_group0_client.hh" #include "timeout_config.hh" using namespace std::chrono_literals; namespace replica { class database; } namespace service { class migration_manager; class query_state; } namespace cql3 { class query_processor; } namespace auth { namespace meta { namespace legacy { extern constinit const std::string_view AUTH_KS; extern constinit const std::string_view USERS_CF; } // namespace legacy constexpr std::string_view DEFAULT_SUPERUSER_NAME("cassandra"); extern constinit const std::string_view AUTH_PACKAGE_NAME; } // namespace meta constexpr std::string_view PERMISSIONS_CF = "role_permissions"; constexpr std::string_view ROLE_MEMBERS_CF = "role_members"; constexpr std::string_view ROLE_ATTRIBUTES_CF = "role_attributes"; // This is a helper to check whether auth-v2 is on. bool legacy_mode(cql3::query_processor& qp); // We have legacy implementation using different keyspace // and need to parametrize depending on runtime feature. std::string_view get_auth_ks_name(cql3::query_processor& qp); template future<> once_among_shards(Task&& f) { if (this_shard_id() == 0u) { return f(); } return make_ready_future<>(); } // Func must support being invoked more than once. future<> do_after_system_ready(seastar::abort_source& as, seastar::noncopyable_function()> func); future<> create_legacy_metadata_table_if_missing( std::string_view table_name, cql3::query_processor&, std::string_view cql, ::service::migration_manager&) noexcept; /// /// Time-outs for internal, non-local CQL queries. /// ::service::query_state& internal_distributed_query_state() noexcept; ::service::raft_timeout get_raft_timeout() noexcept; // Execute update query via group0 mechanism, mutations will be applied on all nodes. // Use this function when need to perform read before write on a single guard or if // you have more than one mutation and potentially exceed single command size limit. using start_operation_func_t = std::function(abort_source&)>; future<> announce_mutations_with_batching( ::service::raft_group0_client& group0_client, // since we can operate also in topology coordinator context where we need stronger // guarantees than start_operation from group0_client gives we allow to inject custom // function here start_operation_func_t start_operation_func, std::function<::service::mutations_generator(api::timestamp_type t)> gen, seastar::abort_source& as, std::optional<::service::raft_timeout> timeout); // Execute update query via group0 mechanism, mutations will be applied on all nodes. future<> announce_mutations( cql3::query_processor& qp, ::service::raft_group0_client& group0_client, const sstring query_string, std::vector values, seastar::abort_source& as, std::optional<::service::raft_timeout> timeout); // Appends mutations to a collector, they will be applied later on all nodes via group0 mechanism. future<> collect_mutations( cql3::query_processor& qp, ::service::group0_batch& collector, const sstring query_string, std::vector values); }