mirror of https://github.com/citusdata/citus.git
Merge branch 'main' into fix-pipfile-regress
commit
ba60957949
110
CHANGELOG.md
110
CHANGELOG.md
|
@ -1,3 +1,113 @@
|
|||
### citus v12.1.2 (February 12, 2024) ###
|
||||
|
||||
* Fixes the incorrect column count after ALTER TABLE (#7379)
|
||||
|
||||
### citus v12.0.1 (July 11, 2023) ###
|
||||
|
||||
* Fixes incorrect default value assumption for VACUUM(PROCESS_TOAST) #7122)
|
||||
|
||||
* Fixes a bug that causes an unexpected error when adding a column
|
||||
with a NULL constraint (#7093)
|
||||
|
||||
* Fixes a bug that could cause COPY logic to skip data in case of OOM (#7152)
|
||||
|
||||
* Fixes a bug with deleting colocation groups (#6929)
|
||||
|
||||
* Fixes memory and memory contexts leaks in Foreign Constraint Graphs (#7236)
|
||||
|
||||
* Fixes shard size bug with too many shards (#7018)
|
||||
|
||||
* Fixes the incorrect column count after ALTER TABLE (#7379)
|
||||
|
||||
* Improves citus_tables view performance (#7050)
|
||||
|
||||
* Makes sure to disallow creating a replicated distributed table
|
||||
concurrently (#7219)
|
||||
|
||||
* Removes pg_send_cancellation and all references (#7135)
|
||||
|
||||
### citus v11.3.1 (February 12, 2024) ###
|
||||
|
||||
* Disallows MERGE when the query prunes down to zero shards (#6946)
|
||||
|
||||
* Fixes a bug related to non-existent objects in DDL commands (#6984)
|
||||
|
||||
* Fixes a bug that could cause COPY logic to skip data in case of OOM (#7152)
|
||||
|
||||
* Fixes a bug with deleting colocation groups (#6929)
|
||||
|
||||
* Fixes incorrect results on fetching scrollable with hold cursors (#7014)
|
||||
|
||||
* Fixes memory and memory context leaks in Foreign Constraint Graphs (#7236)
|
||||
|
||||
* Fixes replicate reference tables task fail when user is superuser (#6930)
|
||||
|
||||
* Fixes the incorrect column count after ALTER TABLE (#7379)
|
||||
|
||||
* Improves citus_shard_sizes performance (#7050)
|
||||
|
||||
* Makes sure to disallow creating a replicated distributed table
|
||||
concurrently (#7219)
|
||||
|
||||
* Removes pg_send_cancellation and all references (#7135)
|
||||
|
||||
### citus v11.2.2 (February 12, 2024) ###
|
||||
|
||||
* Fixes a bug in background shard rebalancer where the replicate
|
||||
reference tables task fails if the current user is not a superuser (#6930)
|
||||
|
||||
* Fixes a bug related to non-existent objects in DDL commands (#6984)
|
||||
|
||||
* Fixes a bug that could cause COPY logic to skip data in case of OOM (#7152)
|
||||
|
||||
* Fixes a bug with deleting colocation groups (#6929)
|
||||
|
||||
* Fixes incorrect results on fetching scrollable with hold cursors (#7014)
|
||||
|
||||
* Fixes memory and memory context leaks in Foreign Constraint Graphs (#7236)
|
||||
|
||||
* Fixes the incorrect column count after ALTER TABLE (#7379)
|
||||
|
||||
* Improves failure handling of distributed execution (#7090)
|
||||
|
||||
* Makes sure to disallow creating a replicated distributed table
|
||||
concurrently (#7219)
|
||||
|
||||
* Removes pg_send_cancellation (#7135)
|
||||
|
||||
### citus v11.1.7 (February 12, 2024) ###
|
||||
|
||||
* Fixes memory and memory context leaks in Foreign Constraint Graphs (#7236)
|
||||
|
||||
* Fixes a bug related to non-existent objects in DDL commands (#6984)
|
||||
|
||||
* Fixes a bug that could cause COPY logic to skip data in case of OOM (#7152)
|
||||
|
||||
* Fixes a bug with deleting colocation groups (#6929)
|
||||
|
||||
* Fixes incorrect results on fetching scrollable with hold cursors (#7014)
|
||||
|
||||
* Fixes the incorrect column count after ALTER TABLE (#7379)
|
||||
|
||||
* Improves failure handling of distributed execution (#7090)
|
||||
|
||||
* Makes sure to disallow creating a replicated distributed table
|
||||
concurrently (#7219)
|
||||
|
||||
* Removes pg_send_cancellation and all references (#7135)
|
||||
|
||||
### citus v11.0.9 (February 12, 2024) ###
|
||||
|
||||
* Fixes a bug that could cause COPY logic to skip data in case of OOM (#7152)
|
||||
|
||||
* Fixes a bug with deleting colocation groups (#6929)
|
||||
|
||||
* Fixes memory and memory context leaks in Foreign Constraint Graphs (#7236)
|
||||
|
||||
* Fixes the incorrect column count after ALTER TABLE (#7462)
|
||||
|
||||
* Improve failure handling of distributed execution (#7090)
|
||||
|
||||
### citus v12.1.1 (November 9, 2023) ###
|
||||
|
||||
* Fixes leaking of memory and memory contexts in Citus foreign key cache
|
||||
|
|
|
@ -886,6 +886,14 @@ GenerateGrantRoleStmtsOfRole(Oid roleid)
|
|||
{
|
||||
Form_pg_auth_members membership = (Form_pg_auth_members) GETSTRUCT(tuple);
|
||||
|
||||
ObjectAddress *roleAddress = palloc0(sizeof(ObjectAddress));
|
||||
ObjectAddressSet(*roleAddress, AuthIdRelationId, membership->grantor);
|
||||
if (!IsAnyObjectDistributed(list_make1(roleAddress)))
|
||||
{
|
||||
/* we only need to propagate the grant if the grantor is distributed */
|
||||
continue;
|
||||
}
|
||||
|
||||
GrantRoleStmt *grantRoleStmt = makeNode(GrantRoleStmt);
|
||||
grantRoleStmt->is_grant = true;
|
||||
|
||||
|
@ -901,7 +909,11 @@ GenerateGrantRoleStmtsOfRole(Oid roleid)
|
|||
granteeRole->rolename = GetUserNameFromId(membership->member, true);
|
||||
grantRoleStmt->grantee_roles = list_make1(granteeRole);
|
||||
|
||||
grantRoleStmt->grantor = NULL;
|
||||
RoleSpec *grantorRole = makeNode(RoleSpec);
|
||||
grantorRole->roletype = ROLESPEC_CSTRING;
|
||||
grantorRole->location = -1;
|
||||
grantorRole->rolename = GetUserNameFromId(membership->grantor, false);
|
||||
grantRoleStmt->grantor = grantorRole;
|
||||
|
||||
#if PG_VERSION_NUM >= PG_VERSION_16
|
||||
|
||||
|
@ -1241,12 +1253,6 @@ PreprocessGrantRoleStmt(Node *node, const char *queryString,
|
|||
return NIL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Postgres don't seem to use the grantor. Even dropping the grantor doesn't
|
||||
* seem to affect the membership. If this changes, we might need to add grantors
|
||||
* to the dependency resolution too. For now we just don't propagate it.
|
||||
*/
|
||||
stmt->grantor = NULL;
|
||||
stmt->grantee_roles = distributedGranteeRoles;
|
||||
char *sql = DeparseTreeNode((Node *) stmt);
|
||||
stmt->grantee_roles = allGranteeRoles;
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
List *
|
||||
PostprocessSecLabelStmt(Node *node, const char *queryString)
|
||||
{
|
||||
if (!ShouldPropagate())
|
||||
if (!EnableAlterRolePropagation || !ShouldPropagate())
|
||||
{
|
||||
return NIL;
|
||||
}
|
||||
|
@ -59,21 +59,17 @@ PostprocessSecLabelStmt(Node *node, const char *queryString)
|
|||
return NIL;
|
||||
}
|
||||
|
||||
if (!EnableCreateRolePropagation)
|
||||
{
|
||||
return NIL;
|
||||
}
|
||||
|
||||
EnsureCoordinator();
|
||||
EnsurePropagationToCoordinator();
|
||||
EnsureAllObjectDependenciesExistOnAllNodes(objectAddresses);
|
||||
|
||||
const char *sql = DeparseTreeNode((Node *) secLabelStmt);
|
||||
const char *secLabelCommands = DeparseTreeNode((Node *) secLabelStmt);
|
||||
|
||||
List *commandList = list_make3(DISABLE_DDL_PROPAGATION,
|
||||
(void *) sql,
|
||||
(void *) secLabelCommands,
|
||||
ENABLE_DDL_PROPAGATION);
|
||||
|
||||
return NodeDDLTaskList(NON_COORDINATOR_NODES, commandList);
|
||||
return NodeDDLTaskList(REMOTE_NODES, commandList);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -738,6 +738,13 @@ citus_ProcessUtilityInternal(PlannedStmt *pstmt,
|
|||
errhint("Connect to other nodes directly to manually create all"
|
||||
" necessary users and roles.")));
|
||||
}
|
||||
else if (IsA(parsetree, SecLabelStmt) && !EnableAlterRolePropagation)
|
||||
{
|
||||
ereport(NOTICE, (errmsg("not propagating SECURITY LABEL commands to other"
|
||||
" nodes"),
|
||||
errhint("Connect to other nodes directly to manually assign"
|
||||
" necessary labels.")));
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure that on DROP EXTENSION we terminate the background daemon
|
||||
|
|
|
@ -486,7 +486,6 @@ AppendGrantRoleStmt(StringInfo buf, GrantRoleStmt *stmt)
|
|||
appendStringInfo(buf, "%s ", stmt->is_grant ? " TO " : " FROM ");
|
||||
AppendRoleList(buf, stmt->grantee_roles);
|
||||
AppendGrantWithAdminOption(buf, stmt);
|
||||
AppendGrantedByInGrantForRoleSpec(buf, stmt->grantor, stmt->is_grant);
|
||||
AppendGrantRestrictAndCascadeForRoleSpec(buf, stmt->behavior, stmt->is_grant);
|
||||
AppendGrantedByInGrantForRoleSpec(buf, stmt->grantor, stmt->is_grant);
|
||||
appendStringInfo(buf, ";");
|
||||
|
|
|
@ -196,6 +196,7 @@ SELECT roleid::regrole::text AS role, member::regrole::text, grantor::regrole::t
|
|||
(1 row)
|
||||
|
||||
\c - - - :master_port
|
||||
create role test_admin_role;
|
||||
-- test grants with distributed and non-distributed roles
|
||||
SELECT master_remove_node('localhost', :worker_2_port);
|
||||
master_remove_node
|
||||
|
@ -221,29 +222,55 @@ CREATE ROLE non_dist_role_4;
|
|||
NOTICE: not propagating CREATE ROLE/USER commands to other nodes
|
||||
HINT: Connect to other nodes directly to manually create all necessary users and roles.
|
||||
SET citus.enable_create_role_propagation TO ON;
|
||||
grant dist_role_3,dist_role_1 to test_admin_role with admin option;
|
||||
SET ROLE dist_role_1;
|
||||
GRANT non_dist_role_1 TO non_dist_role_2;
|
||||
SET citus.enable_create_role_propagation TO OFF;
|
||||
grant dist_role_1 to non_dist_role_1 with admin option;
|
||||
SET ROLE non_dist_role_1;
|
||||
GRANT dist_role_1 TO dist_role_2;
|
||||
GRANT dist_role_1 TO dist_role_2 granted by non_dist_role_1;
|
||||
RESET ROLE;
|
||||
SET citus.enable_create_role_propagation TO ON;
|
||||
GRANT dist_role_3 TO non_dist_role_3;
|
||||
GRANT dist_role_3 TO non_dist_role_3 granted by test_admin_role;
|
||||
GRANT non_dist_role_4 TO dist_role_4;
|
||||
GRANT dist_role_3 TO dist_role_4 granted by test_admin_role;
|
||||
SELECT 1 FROM master_add_node('localhost', :worker_2_port);
|
||||
?column?
|
||||
---------------------------------------------------------------------
|
||||
1
|
||||
(1 row)
|
||||
|
||||
SELECT roleid::regrole::text AS role, member::regrole::text, (grantor::regrole::text IN ('postgres', 'non_dist_role_1', 'dist_role_1')) AS grantor, admin_option FROM pg_auth_members WHERE roleid::regrole::text LIKE '%dist\_%' ORDER BY 1, 2;
|
||||
SELECT result FROM run_command_on_all_nodes(
|
||||
$$
|
||||
SELECT json_agg(q.* ORDER BY member) FROM (
|
||||
SELECT member::regrole::text, roleid::regrole::text AS role, grantor::regrole::text, admin_option
|
||||
FROM pg_auth_members WHERE roleid::regrole::text = 'dist_role_3'
|
||||
) q;
|
||||
$$
|
||||
);
|
||||
result
|
||||
---------------------------------------------------------------------
|
||||
[{"member":"dist_role_4","role":"dist_role_3","grantor":"test_admin_role","admin_option":false}, +
|
||||
{"member":"non_dist_role_3","role":"dist_role_3","grantor":"test_admin_role","admin_option":false}, +
|
||||
{"member":"test_admin_role","role":"dist_role_3","grantor":"postgres","admin_option":true}]
|
||||
[{"member":"dist_role_4","role":"dist_role_3","grantor":"test_admin_role","admin_option":false}, +
|
||||
{"member":"test_admin_role","role":"dist_role_3","grantor":"postgres","admin_option":true}]
|
||||
[{"member":"dist_role_4","role":"dist_role_3","grantor":"test_admin_role","admin_option":false}, +
|
||||
{"member":"test_admin_role","role":"dist_role_3","grantor":"postgres","admin_option":true}]
|
||||
(3 rows)
|
||||
|
||||
REVOKE dist_role_3 from dist_role_4 granted by test_admin_role;
|
||||
SELECT roleid::regrole::text AS role, member::regrole::text, (grantor::regrole::text IN ('postgres', 'non_dist_role_1', 'dist_role_1','test_admin_role')) AS grantor, admin_option FROM pg_auth_members WHERE roleid::regrole::text LIKE '%dist\_%' ORDER BY 1, 2;
|
||||
role | member | grantor | admin_option
|
||||
---------------------------------------------------------------------
|
||||
dist_role_1 | dist_role_2 | t | f
|
||||
dist_role_1 | non_dist_role_1 | t | t
|
||||
dist_role_1 | test_admin_role | t | t
|
||||
dist_role_3 | non_dist_role_3 | t | f
|
||||
dist_role_3 | test_admin_role | t | t
|
||||
non_dist_role_1 | non_dist_role_2 | t | f
|
||||
non_dist_role_4 | dist_role_4 | t | f
|
||||
(4 rows)
|
||||
(7 rows)
|
||||
|
||||
SELECT objid::regrole FROM pg_catalog.pg_dist_object WHERE classid='pg_authid'::regclass::oid AND objid::regrole::text LIKE '%dist\_%' ORDER BY 1;
|
||||
objid
|
||||
|
@ -255,6 +282,9 @@ SELECT objid::regrole FROM pg_catalog.pg_dist_object WHERE classid='pg_authid'::
|
|||
non_dist_role_4
|
||||
(5 rows)
|
||||
|
||||
REVOKE dist_role_3 from non_dist_role_3 granted by test_admin_role;
|
||||
revoke dist_role_3,dist_role_1 from test_admin_role cascade;
|
||||
drop role test_admin_role;
|
||||
\c - - - :worker_1_port
|
||||
SELECT roleid::regrole::text AS role, member::regrole::text, grantor::regrole::text, admin_option FROM pg_auth_members WHERE roleid::regrole::text LIKE '%dist\_%' ORDER BY 1, 2;
|
||||
role | member | grantor | admin_option
|
||||
|
@ -276,9 +306,8 @@ SELECT rolname FROM pg_authid WHERE rolname LIKE '%dist\_%' ORDER BY 1;
|
|||
SELECT roleid::regrole::text AS role, member::regrole::text, grantor::regrole::text, admin_option FROM pg_auth_members WHERE roleid::regrole::text LIKE '%dist\_%' ORDER BY 1, 2;
|
||||
role | member | grantor | admin_option
|
||||
---------------------------------------------------------------------
|
||||
dist_role_1 | dist_role_2 | postgres | f
|
||||
non_dist_role_4 | dist_role_4 | postgres | f
|
||||
(2 rows)
|
||||
(1 row)
|
||||
|
||||
SELECT rolname FROM pg_authid WHERE rolname LIKE '%dist\_%' ORDER BY 1;
|
||||
rolname
|
||||
|
|
|
@ -115,16 +115,13 @@ DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
|||
SECURITY LABEL ON ROLE user1 IS 'citus_unclassified';
|
||||
NOTICE: issuing SECURITY LABEL ON ROLE user1 IS 'citus_unclassified'
|
||||
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
||||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE "user 2" IS 'citus ''!unclassified';
|
||||
NOTICE: issuing SECURITY LABEL FOR "citus '!tests_label_provider" ON ROLE "user 2" IS 'citus ''!unclassified'
|
||||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE "user 2" IS 'citus_classified';
|
||||
NOTICE: issuing SECURITY LABEL FOR "citus '!tests_label_provider" ON ROLE "user 2" IS 'citus_classified'
|
||||
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
||||
\c - - - :worker_1_port
|
||||
-- command not allowed from worker node
|
||||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE user1 IS 'citus ''!unclassified';
|
||||
ERROR: operation is not allowed on this node
|
||||
HINT: Connect to the coordinator and run it again.
|
||||
\c - - - :master_port
|
||||
RESET citus.log_remote_commands;
|
||||
SET citus.log_remote_commands TO on;
|
||||
SET citus.grep_remote_commands = '%SECURITY LABEL%';
|
||||
-- command from the worker node should be propagated to the coordinator
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
node_type | result
|
||||
---------------------------------------------------------------------
|
||||
|
@ -132,6 +129,33 @@ SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORD
|
|||
worker_1 | {"label": "citus_unclassified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
(2 rows)
|
||||
|
||||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE user1 IS 'citus_classified';
|
||||
NOTICE: issuing SECURITY LABEL FOR "citus '!tests_label_provider" ON ROLE user1 IS 'citus_classified'
|
||||
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
node_type | result
|
||||
---------------------------------------------------------------------
|
||||
coordinator | {"label": "citus_classified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_1 | {"label": "citus_classified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
(2 rows)
|
||||
|
||||
RESET citus.log_remote_commands;
|
||||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE "user 2" IS 'citus ''!unclassified';
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('"user 2"') ORDER BY node_type;
|
||||
node_type | result
|
||||
---------------------------------------------------------------------
|
||||
coordinator | {"label": "citus '!unclassified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_1 | {"label": "citus '!unclassified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
(2 rows)
|
||||
|
||||
\c - - - :master_port
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
node_type | result
|
||||
---------------------------------------------------------------------
|
||||
coordinator | {"label": "citus_classified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_1 | {"label": "citus_classified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
(2 rows)
|
||||
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('"user 2"') ORDER BY node_type;
|
||||
node_type | result
|
||||
---------------------------------------------------------------------
|
||||
|
@ -143,7 +167,7 @@ SELECT node_type, result FROM get_citus_tests_label_provider_labels('"user 2"')
|
|||
SET citus.log_remote_commands TO on;
|
||||
SET citus.grep_remote_commands = '%SECURITY LABEL%';
|
||||
SELECT 1 FROM citus_add_node('localhost', :worker_2_port);
|
||||
NOTICE: issuing SELECT worker_create_or_alter_role('user1', 'CREATE ROLE user1 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1 PASSWORD NULL VALID UNTIL ''infinity''', 'ALTER ROLE user1 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1 PASSWORD NULL VALID UNTIL ''infinity''');SECURITY LABEL FOR "citus '!tests_label_provider" ON ROLE user1 IS 'citus_unclassified'
|
||||
NOTICE: issuing SELECT worker_create_or_alter_role('user1', 'CREATE ROLE user1 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1 PASSWORD NULL VALID UNTIL ''infinity''', 'ALTER ROLE user1 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1 PASSWORD NULL VALID UNTIL ''infinity''');SECURITY LABEL FOR "citus '!tests_label_provider" ON ROLE user1 IS 'citus_classified'
|
||||
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
||||
NOTICE: issuing SELECT worker_create_or_alter_role('user 2', 'CREATE ROLE "user 2" NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1 PASSWORD NULL VALID UNTIL ''infinity''', 'ALTER ROLE "user 2" NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1 PASSWORD NULL VALID UNTIL ''infinity''');SECURITY LABEL FOR "citus '!tests_label_provider" ON ROLE "user 2" IS 'citus ''!unclassified'
|
||||
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
||||
|
@ -155,9 +179,9 @@ DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
|||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
node_type | result
|
||||
---------------------------------------------------------------------
|
||||
coordinator | {"label": "citus_unclassified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_1 | {"label": "citus_unclassified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_2 | {"label": "citus_unclassified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
coordinator | {"label": "citus_classified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_1 | {"label": "citus_classified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_2 | {"label": "citus_classified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
(3 rows)
|
||||
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('"user 2"') ORDER BY node_type;
|
||||
|
@ -168,6 +192,35 @@ SELECT node_type, result FROM get_citus_tests_label_provider_labels('"user 2"')
|
|||
worker_2 | {"label": "citus '!unclassified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
(3 rows)
|
||||
|
||||
-- disable the GUC and check that the command is not propagated
|
||||
SET citus.enable_alter_role_propagation TO off;
|
||||
SECURITY LABEL ON ROLE user1 IS 'citus_unclassified';
|
||||
NOTICE: not propagating SECURITY LABEL commands to other nodes
|
||||
HINT: Connect to other nodes directly to manually assign necessary labels.
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
node_type | result
|
||||
---------------------------------------------------------------------
|
||||
coordinator | {"label": "citus_unclassified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_1 | {"label": "citus_classified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_2 | {"label": "citus_classified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
(3 rows)
|
||||
|
||||
\c - - - :worker_2_port
|
||||
SET citus.log_remote_commands TO on;
|
||||
SET citus.grep_remote_commands = '%SECURITY LABEL%';
|
||||
SET citus.enable_alter_role_propagation TO off;
|
||||
SECURITY LABEL ON ROLE user1 IS 'citus ''!unclassified';
|
||||
NOTICE: not propagating SECURITY LABEL commands to other nodes
|
||||
HINT: Connect to other nodes directly to manually assign necessary labels.
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
node_type | result
|
||||
---------------------------------------------------------------------
|
||||
coordinator | {"label": "citus_unclassified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_1 | {"label": "citus_classified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
worker_2 | {"label": "citus '!unclassified", "objtype": "role", "provider": "citus '!tests_label_provider"}
|
||||
(3 rows)
|
||||
|
||||
RESET citus.enable_alter_role_propagation;
|
||||
-- cleanup
|
||||
RESET citus.log_remote_commands;
|
||||
DROP ROLE user1, "user 2";
|
||||
|
|
|
@ -75,6 +75,8 @@ SELECT roleid::regrole::text AS role, member::regrole::text, grantor::regrole::t
|
|||
|
||||
\c - - - :master_port
|
||||
|
||||
create role test_admin_role;
|
||||
|
||||
-- test grants with distributed and non-distributed roles
|
||||
|
||||
SELECT master_remove_node('localhost', :worker_2_port);
|
||||
|
@ -84,6 +86,8 @@ CREATE ROLE dist_role_2;
|
|||
CREATE ROLE dist_role_3;
|
||||
CREATE ROLE dist_role_4;
|
||||
|
||||
|
||||
|
||||
SET citus.enable_create_role_propagation TO OFF;
|
||||
|
||||
CREATE ROLE non_dist_role_1 SUPERUSER;
|
||||
|
@ -93,28 +97,51 @@ CREATE ROLE non_dist_role_4;
|
|||
|
||||
SET citus.enable_create_role_propagation TO ON;
|
||||
|
||||
|
||||
grant dist_role_3,dist_role_1 to test_admin_role with admin option;
|
||||
|
||||
SET ROLE dist_role_1;
|
||||
|
||||
GRANT non_dist_role_1 TO non_dist_role_2;
|
||||
|
||||
SET citus.enable_create_role_propagation TO OFF;
|
||||
|
||||
grant dist_role_1 to non_dist_role_1 with admin option;
|
||||
SET ROLE non_dist_role_1;
|
||||
|
||||
GRANT dist_role_1 TO dist_role_2;
|
||||
GRANT dist_role_1 TO dist_role_2 granted by non_dist_role_1;
|
||||
|
||||
RESET ROLE;
|
||||
|
||||
SET citus.enable_create_role_propagation TO ON;
|
||||
|
||||
GRANT dist_role_3 TO non_dist_role_3;
|
||||
|
||||
GRANT dist_role_3 TO non_dist_role_3 granted by test_admin_role;
|
||||
GRANT non_dist_role_4 TO dist_role_4;
|
||||
GRANT dist_role_3 TO dist_role_4 granted by test_admin_role;
|
||||
|
||||
|
||||
SELECT 1 FROM master_add_node('localhost', :worker_2_port);
|
||||
|
||||
SELECT roleid::regrole::text AS role, member::regrole::text, (grantor::regrole::text IN ('postgres', 'non_dist_role_1', 'dist_role_1')) AS grantor, admin_option FROM pg_auth_members WHERE roleid::regrole::text LIKE '%dist\_%' ORDER BY 1, 2;
|
||||
SELECT result FROM run_command_on_all_nodes(
|
||||
$$
|
||||
SELECT json_agg(q.* ORDER BY member) FROM (
|
||||
SELECT member::regrole::text, roleid::regrole::text AS role, grantor::regrole::text, admin_option
|
||||
FROM pg_auth_members WHERE roleid::regrole::text = 'dist_role_3'
|
||||
) q;
|
||||
$$
|
||||
);
|
||||
|
||||
REVOKE dist_role_3 from dist_role_4 granted by test_admin_role;
|
||||
|
||||
SELECT roleid::regrole::text AS role, member::regrole::text, (grantor::regrole::text IN ('postgres', 'non_dist_role_1', 'dist_role_1','test_admin_role')) AS grantor, admin_option FROM pg_auth_members WHERE roleid::regrole::text LIKE '%dist\_%' ORDER BY 1, 2;
|
||||
SELECT objid::regrole FROM pg_catalog.pg_dist_object WHERE classid='pg_authid'::regclass::oid AND objid::regrole::text LIKE '%dist\_%' ORDER BY 1;
|
||||
|
||||
REVOKE dist_role_3 from non_dist_role_3 granted by test_admin_role;
|
||||
|
||||
revoke dist_role_3,dist_role_1 from test_admin_role cascade;
|
||||
drop role test_admin_role;
|
||||
|
||||
\c - - - :worker_1_port
|
||||
SELECT roleid::regrole::text AS role, member::regrole::text, grantor::regrole::text, admin_option FROM pg_auth_members WHERE roleid::regrole::text LIKE '%dist\_%' ORDER BY 1, 2;
|
||||
SELECT rolname FROM pg_authid WHERE rolname LIKE '%dist\_%' ORDER BY 1;
|
||||
|
|
|
@ -62,14 +62,20 @@ SET citus.grep_remote_commands = '%SECURITY LABEL%';
|
|||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE user1 IS 'citus_classified';
|
||||
SECURITY LABEL ON ROLE user1 IS NULL;
|
||||
SECURITY LABEL ON ROLE user1 IS 'citus_unclassified';
|
||||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE "user 2" IS 'citus ''!unclassified';
|
||||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE "user 2" IS 'citus_classified';
|
||||
|
||||
\c - - - :worker_1_port
|
||||
-- command not allowed from worker node
|
||||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE user1 IS 'citus ''!unclassified';
|
||||
SET citus.log_remote_commands TO on;
|
||||
SET citus.grep_remote_commands = '%SECURITY LABEL%';
|
||||
-- command from the worker node should be propagated to the coordinator
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE user1 IS 'citus_classified';
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
|
||||
\c - - - :master_port
|
||||
RESET citus.log_remote_commands;
|
||||
SECURITY LABEL for "citus '!tests_label_provider" ON ROLE "user 2" IS 'citus ''!unclassified';
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('"user 2"') ORDER BY node_type;
|
||||
\c - - - :master_port
|
||||
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('"user 2"') ORDER BY node_type;
|
||||
|
@ -82,6 +88,19 @@ SELECT 1 FROM citus_add_node('localhost', :worker_2_port);
|
|||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('"user 2"') ORDER BY node_type;
|
||||
|
||||
-- disable the GUC and check that the command is not propagated
|
||||
SET citus.enable_alter_role_propagation TO off;
|
||||
SECURITY LABEL ON ROLE user1 IS 'citus_unclassified';
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
|
||||
\c - - - :worker_2_port
|
||||
SET citus.log_remote_commands TO on;
|
||||
SET citus.grep_remote_commands = '%SECURITY LABEL%';
|
||||
SET citus.enable_alter_role_propagation TO off;
|
||||
SECURITY LABEL ON ROLE user1 IS 'citus ''!unclassified';
|
||||
SELECT node_type, result FROM get_citus_tests_label_provider_labels('user1') ORDER BY node_type;
|
||||
RESET citus.enable_alter_role_propagation;
|
||||
|
||||
-- cleanup
|
||||
RESET citus.log_remote_commands;
|
||||
DROP ROLE user1, "user 2";
|
||||
|
|
Loading…
Reference in New Issue