mirror of https://github.com/citusdata/citus.git
Add citus.skip_advisory_lock_permission_checks (#6293)
parent
1c5b8588fe
commit
bd13836648
|
@ -2076,6 +2076,20 @@ RegisterCitusConfigVariables(void)
|
||||||
ShowShardsForAppNamePrefixesAssignHook,
|
ShowShardsForAppNamePrefixesAssignHook,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
DefineCustomBoolVariable(
|
||||||
|
"citus.skip_advisory_lock_permission_checks",
|
||||||
|
gettext_noop("Postgres would normally enforce some "
|
||||||
|
"ownership checks while acquiring locks. "
|
||||||
|
"When this setting is 'off', Citus skips"
|
||||||
|
"ownership checks on internal advisory "
|
||||||
|
"locks."),
|
||||||
|
NULL,
|
||||||
|
&SkipAdvisoryLockPermissionChecks,
|
||||||
|
false,
|
||||||
|
GUC_SUPERUSER_ONLY,
|
||||||
|
GUC_NO_SHOW_ALL,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
|
||||||
DefineCustomBoolVariable(
|
DefineCustomBoolVariable(
|
||||||
"citus.skip_jsonb_validation_in_copy",
|
"citus.skip_jsonb_validation_in_copy",
|
||||||
gettext_noop("Skip validation of JSONB columns on the coordinator during COPY "
|
gettext_noop("Skip validation of JSONB columns on the coordinator during COPY "
|
||||||
|
|
|
@ -109,6 +109,8 @@ PG_FUNCTION_INFO_V1(lock_relation_if_exists);
|
||||||
|
|
||||||
/* Config variable managed via guc.c */
|
/* Config variable managed via guc.c */
|
||||||
bool EnableAcquiringUnsafeLockFromWorkers = false;
|
bool EnableAcquiringUnsafeLockFromWorkers = false;
|
||||||
|
bool SkipAdvisoryLockPermissionChecks = false;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* lock_shard_metadata allows the shard distribution metadata to be locked
|
* lock_shard_metadata allows the shard distribution metadata to be locked
|
||||||
|
@ -248,7 +250,10 @@ lock_shard_resources(PG_FUNCTION_ARGS)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!SkipAdvisoryLockPermissionChecks)
|
||||||
|
{
|
||||||
EnsureTablePermissions(relationId, aclMask);
|
EnsureTablePermissions(relationId, aclMask);
|
||||||
|
}
|
||||||
|
|
||||||
LockShardResource(shardId, lockMode);
|
LockShardResource(shardId, lockMode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,6 +149,7 @@ enum DistLockConfigs
|
||||||
DIST_LOCK_NOWAIT = 2
|
DIST_LOCK_NOWAIT = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Lock shard/relation metadata for safe modifications */
|
/* Lock shard/relation metadata for safe modifications */
|
||||||
extern void LockShardDistributionMetadata(int64 shardId, LOCKMODE lockMode);
|
extern void LockShardDistributionMetadata(int64 shardId, LOCKMODE lockMode);
|
||||||
extern void LockPlacementCleanup(void);
|
extern void LockPlacementCleanup(void);
|
||||||
|
@ -194,5 +195,6 @@ extern void AcquireDistributedLockOnRelations(List *relationList, LOCKMODE lockM
|
||||||
extern void PreprocessLockStatement(LockStmt *stmt, ProcessUtilityContext context);
|
extern void PreprocessLockStatement(LockStmt *stmt, ProcessUtilityContext context);
|
||||||
|
|
||||||
extern bool EnableAcquiringUnsafeLockFromWorkers;
|
extern bool EnableAcquiringUnsafeLockFromWorkers;
|
||||||
|
extern bool SkipAdvisoryLockPermissionChecks;
|
||||||
|
|
||||||
#endif /* RESOURCE_LOCK_H */
|
#endif /* RESOURCE_LOCK_H */
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
CREATE SCHEMA adv_lock_permission;
|
||||||
|
SET search_path to adv_lock_permission;
|
||||||
|
-- do not cache any connections, we change some settings and don't want old ones cached
|
||||||
|
SET citus.max_cached_conns_per_worker TO 0;
|
||||||
|
CREATE ROLE user_1 WITH LOGIN;
|
||||||
|
CREATE TABLE reference_table_1 (A int);
|
||||||
|
SELECT create_reference_table('reference_table_1');
|
||||||
|
create_reference_table
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
CREATE TABLE reference_table_2 (A int);
|
||||||
|
SELECT create_reference_table('reference_table_2');
|
||||||
|
create_reference_table
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
GRANT USAGE ON SCHEMA adv_lock_permission TO user_1;
|
||||||
|
GRANT SELECT ON reference_table_1 TO user_1;
|
||||||
|
GRANT INSERT, UPDATE ON reference_table_2 TO user_1;
|
||||||
|
SET ROLE user_1;
|
||||||
|
-- do not cache any connections, we change some settings and don't want old ones cached
|
||||||
|
SET citus.max_cached_conns_per_worker TO 0;
|
||||||
|
SET search_path to adv_lock_permission;
|
||||||
|
INSERT INTO reference_table_2 SELECT * FROM reference_table_1;
|
||||||
|
ERROR: permission denied for table reference_table_1
|
||||||
|
CONTEXT: while executing command on localhost:xxxxx
|
||||||
|
SET ROLE postgres;
|
||||||
|
-- do not cache any connections, we change some settings and don't want old ones cached
|
||||||
|
SET citus.max_cached_conns_per_worker TO 0;
|
||||||
|
-- change the role so that it can skip permission checks
|
||||||
|
ALTER ROLE user_1 SET citus.skip_advisory_lock_permission_checks TO on;
|
||||||
|
SET ROLE user_1;
|
||||||
|
SET citus.max_cached_conns_per_worker TO 0;
|
||||||
|
INSERT INTO reference_table_2 SELECT * FROM reference_table_1;
|
||||||
|
SET ROLE postgres;
|
||||||
|
SET client_min_messages TO ERROR;
|
||||||
|
DROP SCHEMA adv_lock_permission CASCADE;
|
||||||
|
DROP ROLE user_1;
|
|
@ -86,7 +86,7 @@ test: multi_agg_type_conversion multi_count_type_conversion recursive_relation_p
|
||||||
test: multi_partition_pruning single_hash_repartition_join unsupported_lateral_subqueries
|
test: multi_partition_pruning single_hash_repartition_join unsupported_lateral_subqueries
|
||||||
test: multi_join_pruning multi_hash_pruning intermediate_result_pruning
|
test: multi_join_pruning multi_hash_pruning intermediate_result_pruning
|
||||||
test: multi_null_minmax_value_pruning cursors
|
test: multi_null_minmax_value_pruning cursors
|
||||||
test: modification_correctness
|
test: modification_correctness adv_lock_permission
|
||||||
test: multi_query_directory_cleanup
|
test: multi_query_directory_cleanup
|
||||||
test: multi_task_assignment_policy multi_cross_shard
|
test: multi_task_assignment_policy multi_cross_shard
|
||||||
test: multi_utility_statements
|
test: multi_utility_statements
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
CREATE SCHEMA adv_lock_permission;
|
||||||
|
SET search_path to adv_lock_permission;
|
||||||
|
|
||||||
|
-- do not cache any connections, we change some settings and don't want old ones cached
|
||||||
|
SET citus.max_cached_conns_per_worker TO 0;
|
||||||
|
|
||||||
|
CREATE ROLE user_1 WITH LOGIN;
|
||||||
|
|
||||||
|
CREATE TABLE reference_table_1 (A int);
|
||||||
|
SELECT create_reference_table('reference_table_1');
|
||||||
|
|
||||||
|
CREATE TABLE reference_table_2 (A int);
|
||||||
|
SELECT create_reference_table('reference_table_2');
|
||||||
|
|
||||||
|
GRANT USAGE ON SCHEMA adv_lock_permission TO user_1;
|
||||||
|
GRANT SELECT ON reference_table_1 TO user_1;
|
||||||
|
GRANT INSERT, UPDATE ON reference_table_2 TO user_1;
|
||||||
|
|
||||||
|
SET ROLE user_1;
|
||||||
|
|
||||||
|
-- do not cache any connections, we change some settings and don't want old ones cached
|
||||||
|
SET citus.max_cached_conns_per_worker TO 0;
|
||||||
|
SET search_path to adv_lock_permission;
|
||||||
|
|
||||||
|
INSERT INTO reference_table_2 SELECT * FROM reference_table_1;
|
||||||
|
|
||||||
|
SET ROLE postgres;
|
||||||
|
-- do not cache any connections, we change some settings and don't want old ones cached
|
||||||
|
SET citus.max_cached_conns_per_worker TO 0;
|
||||||
|
|
||||||
|
-- change the role so that it can skip permission checks
|
||||||
|
ALTER ROLE user_1 SET citus.skip_advisory_lock_permission_checks TO on;
|
||||||
|
|
||||||
|
SET ROLE user_1;
|
||||||
|
|
||||||
|
SET citus.max_cached_conns_per_worker TO 0;
|
||||||
|
INSERT INTO reference_table_2 SELECT * FROM reference_table_1;
|
||||||
|
|
||||||
|
SET ROLE postgres;
|
||||||
|
SET client_min_messages TO ERROR;
|
||||||
|
DROP SCHEMA adv_lock_permission CASCADE;
|
||||||
|
DROP ROLE user_1;
|
Loading…
Reference in New Issue