mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 01:25:21 +00:00
Add allow_distributed_ddl_queries option to the cluster config
This commit is contained in:
parent
bc2b6257f2
commit
0ac9dcd723
@ -141,6 +141,10 @@ Clusters are configured in the [server configuration file](../../../operations/c
|
|||||||
be used as current user for the query.
|
be used as current user for the query.
|
||||||
-->
|
-->
|
||||||
<!-- <secret></secret> -->
|
<!-- <secret></secret> -->
|
||||||
|
|
||||||
|
<!-- Optional. Whether distributed DDL queries (ON CLUSTER clause) are allowed for this cluster. Default: true (allowed). -->
|
||||||
|
<!-- <allow_distributed_ddl_queries>true</allow_distributed_ddl_queries> -->
|
||||||
|
|
||||||
<shard>
|
<shard>
|
||||||
<!-- Optional. Shard weight when writing data. Default: 1. -->
|
<!-- Optional. Shard weight when writing data. Default: 1. -->
|
||||||
<weight>1</weight>
|
<weight>1</weight>
|
||||||
|
@ -396,6 +396,9 @@ Cluster::Cluster(const Poco::Util::AbstractConfiguration & config,
|
|||||||
secret = config.getString(config_prefix + "secret", "");
|
secret = config.getString(config_prefix + "secret", "");
|
||||||
boost::range::remove_erase(config_keys, "secret");
|
boost::range::remove_erase(config_keys, "secret");
|
||||||
|
|
||||||
|
allow_distributed_ddl_queries = config.getBool(config_prefix + "allow_distributed_ddl_queries", true);
|
||||||
|
boost::range::remove_erase(config_keys, "allow_distributed_ddl_queries");
|
||||||
|
|
||||||
if (config_keys.empty())
|
if (config_keys.empty())
|
||||||
throw Exception(ErrorCodes::SHARD_HAS_NO_CONNECTIONS, "No cluster elements (shard, node) specified in config at path {}", config_prefix);
|
throw Exception(ErrorCodes::SHARD_HAS_NO_CONNECTIONS, "No cluster elements (shard, node) specified in config at path {}", config_prefix);
|
||||||
|
|
||||||
|
@ -256,6 +256,9 @@ public:
|
|||||||
/// NOTE: true does not mean, that it's actually a cross-replication cluster.
|
/// NOTE: true does not mean, that it's actually a cross-replication cluster.
|
||||||
bool maybeCrossReplication() const;
|
bool maybeCrossReplication() const;
|
||||||
|
|
||||||
|
/// Are distributed DDL Queries (ON CLUSTER Clause) allowed for this cluster
|
||||||
|
bool areDistributedDDLQueriesAllowed() const { return allow_distributed_ddl_queries; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SlotToShard slot_to_shard;
|
SlotToShard slot_to_shard;
|
||||||
|
|
||||||
@ -287,6 +290,8 @@ private:
|
|||||||
/// An array of shards. For each shard, an array of replica addresses (servers that are considered identical).
|
/// An array of shards. For each shard, an array of replica addresses (servers that are considered identical).
|
||||||
AddressesWithFailover addresses_with_failover;
|
AddressesWithFailover addresses_with_failover;
|
||||||
|
|
||||||
|
bool allow_distributed_ddl_queries = true;
|
||||||
|
|
||||||
size_t remote_shard_count = 0;
|
size_t remote_shard_count = 0;
|
||||||
size_t local_shard_count = 0;
|
size_t local_shard_count = 0;
|
||||||
|
|
||||||
|
@ -92,6 +92,9 @@ BlockIO executeDDLQueryOnCluster(const ASTPtr & query_ptr_, ContextPtr context,
|
|||||||
|
|
||||||
span.addAttribute("clickhouse.cluster", query->cluster);
|
span.addAttribute("clickhouse.cluster", query->cluster);
|
||||||
|
|
||||||
|
if (!cluster->areDistributedDDLQueriesAllowed())
|
||||||
|
throw Exception(ErrorCodes::QUERY_IS_PROHIBITED, "Distributed DDL queries are prohibited for the cluster");
|
||||||
|
|
||||||
/// TODO: support per-cluster grant
|
/// TODO: support per-cluster grant
|
||||||
context->checkAccess(AccessType::CLUSTER);
|
context->checkAccess(AccessType::CLUSTER);
|
||||||
|
|
||||||
|
@ -89,5 +89,16 @@
|
|||||||
</shard>
|
</shard>
|
||||||
</cluster_no_replicas>
|
</cluster_no_replicas>
|
||||||
|
|
||||||
|
<!-- Cluster with disabled distributed DDL queries -->
|
||||||
|
<cluster_disabled_ddl>
|
||||||
|
<allow_distributed_ddl_queries>false</allow_distributed_ddl_queries>
|
||||||
|
<shard>
|
||||||
|
<replica>
|
||||||
|
<host>ch1</host>
|
||||||
|
<port>9000</port>
|
||||||
|
</replica>
|
||||||
|
</shard>
|
||||||
|
</cluster_disabled_ddl>
|
||||||
|
|
||||||
</remote_servers>
|
</remote_servers>
|
||||||
</clickhouse>
|
</clickhouse>
|
||||||
|
@ -102,5 +102,16 @@
|
|||||||
</shard>
|
</shard>
|
||||||
</cluster_no_replicas>
|
</cluster_no_replicas>
|
||||||
|
|
||||||
|
<!-- Cluster with disabled distributed DDL queries -->
|
||||||
|
<cluster_disabled_ddl>
|
||||||
|
<allow_distributed_ddl_queries>false</allow_distributed_ddl_queries>
|
||||||
|
<shard>
|
||||||
|
<replica>
|
||||||
|
<host>ch1</host>
|
||||||
|
<port>9000</port>
|
||||||
|
</replica>
|
||||||
|
</shard>
|
||||||
|
</cluster_disabled_ddl>
|
||||||
|
|
||||||
</remote_servers>
|
</remote_servers>
|
||||||
</clickhouse>
|
</clickhouse>
|
||||||
|
@ -585,6 +585,17 @@ def test_replicated_without_arguments(test_cluster):
|
|||||||
test_cluster.pm_random_drops.push_rules(rules)
|
test_cluster.pm_random_drops.push_rules(rules)
|
||||||
|
|
||||||
|
|
||||||
|
def test_disabled_distributed_ddl(test_cluster):
|
||||||
|
instance = test_cluster.instances["ch1"]
|
||||||
|
|
||||||
|
assert (
|
||||||
|
"Distributed DDL queries are prohibited for the cluster"
|
||||||
|
in instance.query_and_get_error(
|
||||||
|
"CREATE DATABASE IF NOT EXISTS test ON CLUSTER 'cluster_disabled_ddl'"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
with contextmanager(test_cluster)() as ctx_cluster:
|
with contextmanager(test_cluster)() as ctx_cluster:
|
||||||
for name, instance in list(ctx_cluster.instances.items()):
|
for name, instance in list(ctx_cluster.instances.items()):
|
||||||
|
Loading…
Reference in New Issue
Block a user