From 8936543b8058a57804ea47b545f4f2b96d56153d Mon Sep 17 00:00:00 2001 From: Ahmet Gedemenli Date: Mon, 17 Jan 2022 15:35:40 +0300 Subject: [PATCH 1/3] Create wrapper function CreateObjectAddressDependencyDefList (#5623) --- src/backend/distributed/metadata/dependency.c | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/backend/distributed/metadata/dependency.c b/src/backend/distributed/metadata/dependency.c index ba3681f3e..0b15dcafd 100644 --- a/src/backend/distributed/metadata/dependency.c +++ b/src/backend/distributed/metadata/dependency.c @@ -123,6 +123,7 @@ typedef struct ViewDependencyNode static List * GetRelationTriggerFunctionDepencyList(Oid relationId); static List * GetRelationStatsSchemaDependencyList(Oid relationId); static DependencyDefinition * CreateObjectAddressDependencyDef(Oid classId, Oid objectId); +static List * CreateObjectAddressDependencyDefList(Oid classId, List *objectIdList); static ObjectAddress DependencyDefinitionObjectAddress(DependencyDefinition *definition); /* forward declarations for functions to interact with the ObjectAddressCollector */ @@ -1003,18 +1004,9 @@ ExpandCitusSupportedTypes(ObjectAddressCollector *collector, ObjectAddress targe static List * GetRelationStatsSchemaDependencyList(Oid relationId) { - List *dependencyList = NIL; - List *schemaIds = GetExplicitStatisticsSchemaIdList(relationId); - Oid schemaId = InvalidOid; - foreach_oid(schemaId, schemaIds) - { - DependencyDefinition *dependency = - CreateObjectAddressDependencyDef(NamespaceRelationId, schemaId); - dependencyList = lappend(dependencyList, dependency); - } - return dependencyList; + return CreateObjectAddressDependencyDefList(NamespaceRelationId, schemaIds); } @@ -1056,6 +1048,27 @@ CreateObjectAddressDependencyDef(Oid classId, Oid objectId) } +/* + * CreateObjectAddressDependencyDefList is a wrapper function for + * CreateObjectAddressDependencyDef to operate on a list of relation oids, + * instead of a single oid. + */ +static List * +CreateObjectAddressDependencyDefList(Oid classId, List *objectIdList) +{ + List *dependencyList = NIL; + Oid objectId = InvalidOid; + foreach_oid(objectId, objectIdList) + { + DependencyDefinition *dependency = + CreateObjectAddressDependencyDef(classId, objectId); + dependencyList = lappend(dependencyList, dependency); + } + + return dependencyList; +} + + /* * DependencyDefinitionObjectAddress returns the object address of the dependency defined * by the dependency definition, irregardless what the source of the definition is From e564220dd534cabaa54a1b3a7d38756c68c4b7d7 Mon Sep 17 00:00:00 2001 From: Ahmet Gedemenli Date: Mon, 17 Jan 2022 18:17:07 +0300 Subject: [PATCH 2/3] Fix typo: GetRelationTriggerFunctionDependencyList (#5626) --- src/backend/distributed/metadata/dependency.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/distributed/metadata/dependency.c b/src/backend/distributed/metadata/dependency.c index 0b15dcafd..0118b6433 100644 --- a/src/backend/distributed/metadata/dependency.c +++ b/src/backend/distributed/metadata/dependency.c @@ -120,7 +120,7 @@ typedef struct ViewDependencyNode }ViewDependencyNode; -static List * GetRelationTriggerFunctionDepencyList(Oid relationId); +static List * GetRelationTriggerFunctionDependencyList(Oid relationId); static List * GetRelationStatsSchemaDependencyList(Oid relationId); static DependencyDefinition * CreateObjectAddressDependencyDef(Oid classId, Oid objectId); static List * CreateObjectAddressDependencyDefList(Oid classId, List *objectIdList); @@ -972,7 +972,7 @@ ExpandCitusSupportedTypes(ObjectAddressCollector *collector, ObjectAddress targe */ Oid relationId = target.objectId; List *triggerFunctionDepencyList = - GetRelationTriggerFunctionDepencyList(relationId); + GetRelationTriggerFunctionDependencyList(relationId); result = list_concat(result, triggerFunctionDepencyList); /* @@ -1011,11 +1011,11 @@ GetRelationStatsSchemaDependencyList(Oid relationId) /* - * GetRelationTriggerFunctionDepencyList returns a list of DependencyDefinition + * GetRelationTriggerFunctionDependencyList returns a list of DependencyDefinition * objects for the functions that triggers of the relation with relationId depends. */ static List * -GetRelationTriggerFunctionDepencyList(Oid relationId) +GetRelationTriggerFunctionDependencyList(Oid relationId) { List *dependencyList = NIL; From d98500ac22d7a6072c3e2d0fe6f300e54516dd13 Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Mon, 17 Jan 2022 20:26:30 +0300 Subject: [PATCH 3/3] Fix a flaky test related with temp columnar table cleanup (#5599) Wait until old backend to expire to make sure that temp table cleanup is complete. --- src/test/regress/expected/columnar_create.out | 9 +++++++++ src/test/regress/expected/columnar_test_helpers.out | 8 ++++++++ src/test/regress/sql/columnar_create.sql | 7 +++++++ src/test/regress/sql/columnar_test_helpers.sql | 9 +++++++++ 4 files changed, 33 insertions(+) diff --git a/src/test/regress/expected/columnar_create.out b/src/test/regress/expected/columnar_create.out index 704c0d932..9cb025336 100644 --- a/src/test/regress/expected/columnar_create.out +++ b/src/test/regress/expected/columnar_create.out @@ -76,7 +76,16 @@ CREATE TEMPORARY TABLE columnar_temp(i int) USING columnar; INSERT INTO columnar_temp SELECT i FROM generate_series(1,5) i; SELECT columnar_test_helpers.columnar_relation_storageid(oid) AS columnar_temp_storage_id FROM pg_class WHERE relname='columnar_temp' \gset +SELECT pg_backend_pid() AS val INTO old_backend_pid; \c - - - :master_port +-- wait until old backend to expire to make sure that temp table cleanup is complete +SELECT columnar_test_helpers.pg_waitpid(val) FROM old_backend_pid; + pg_waitpid +--------------------------------------------------------------------- + +(1 row) + +DROP TABLE old_backend_pid; -- show that temporary table itself and it's metadata is removed SELECT COUNT(*)=0 FROM pg_class WHERE relname='columnar_temp'; ?column? diff --git a/src/test/regress/expected/columnar_test_helpers.out b/src/test/regress/expected/columnar_test_helpers.out index 8736919ea..f5142a431 100644 --- a/src/test/regress/expected/columnar_test_helpers.out +++ b/src/test/regress/expected/columnar_test_helpers.out @@ -118,3 +118,11 @@ BEGIN END LOOP; RETURN false; END; $$ language plpgsql; +CREATE OR REPLACE FUNCTION pg_waitpid(p_pid integer) +RETURNS VOID AS $$ +BEGIN + WHILE EXISTS (SELECT * FROM pg_stat_activity WHERE pid=p_pid) + LOOP + PERFORM pg_sleep(0.001); + END LOOP; +END; $$ language plpgsql; diff --git a/src/test/regress/sql/columnar_create.sql b/src/test/regress/sql/columnar_create.sql index f83b1c2a8..a5861bb45 100644 --- a/src/test/regress/sql/columnar_create.sql +++ b/src/test/regress/sql/columnar_create.sql @@ -63,8 +63,15 @@ INSERT INTO columnar_temp SELECT i FROM generate_series(1,5) i; SELECT columnar_test_helpers.columnar_relation_storageid(oid) AS columnar_temp_storage_id FROM pg_class WHERE relname='columnar_temp' \gset +SELECT pg_backend_pid() AS val INTO old_backend_pid; + \c - - - :master_port +-- wait until old backend to expire to make sure that temp table cleanup is complete +SELECT columnar_test_helpers.pg_waitpid(val) FROM old_backend_pid; + +DROP TABLE old_backend_pid; + -- show that temporary table itself and it's metadata is removed SELECT COUNT(*)=0 FROM pg_class WHERE relname='columnar_temp'; SELECT columnar_test_helpers.columnar_metadata_has_storage_id(:columnar_temp_storage_id); diff --git a/src/test/regress/sql/columnar_test_helpers.sql b/src/test/regress/sql/columnar_test_helpers.sql index 0340c06f9..f96dcdbf6 100644 --- a/src/test/regress/sql/columnar_test_helpers.sql +++ b/src/test/regress/sql/columnar_test_helpers.sql @@ -128,3 +128,12 @@ BEGIN END LOOP; RETURN false; END; $$ language plpgsql; + +CREATE OR REPLACE FUNCTION pg_waitpid(p_pid integer) +RETURNS VOID AS $$ +BEGIN + WHILE EXISTS (SELECT * FROM pg_stat_activity WHERE pid=p_pid) + LOOP + PERFORM pg_sleep(0.001); + END LOOP; +END; $$ language plpgsql;