From 04a4167a8a25c3752780fa41d013fee3ac4e587a Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Thu, 24 Dec 2020 19:47:40 +0300 Subject: [PATCH 1/2] Implement GetPgDependTuplesForDependingObjects --- src/backend/distributed/metadata/dependency.c | 63 +++++++++++++------ src/include/distributed/metadata/dependency.h | 2 + 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/backend/distributed/metadata/dependency.c b/src/backend/distributed/metadata/dependency.c index 6ffffb98f..9951904e8 100644 --- a/src/backend/distributed/metadata/dependency.c +++ b/src/backend/distributed/metadata/dependency.c @@ -1068,25 +1068,13 @@ BuildViewDependencyGraph(Oid relationId, HTAB *nodeMap) node->remainingDependencyCount = 0; node->dependingNodes = NIL; - ObjectAddress target = { 0 }; - ObjectAddressSet(target, RelationRelationId, relationId); + Oid targetObjectClassId = RelationRelationId; + Oid targetObjectId = relationId; + List *dependencyTupleList = GetPgDependTuplesForDependingObjects(targetObjectClassId, + targetObjectId); - ScanKeyData key[2]; HeapTuple depTup = NULL; - - /* - * iterate the actual pg_depend catalog - */ - Relation depRel = table_open(DependRelationId, AccessShareLock); - - ScanKeyInit(&key[0], Anum_pg_depend_refclassid, BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(target.classId)); - ScanKeyInit(&key[1], Anum_pg_depend_refobjid, BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(target.objectId)); - SysScanDesc depScan = systable_beginscan(depRel, DependReferenceIndexId, - true, NULL, 2, key); - - while (HeapTupleIsValid(depTup = systable_getnext(depScan))) + foreach_ptr(depTup, dependencyTupleList) { Form_pg_depend pg_depend = (Form_pg_depend) GETSTRUCT(depTup); @@ -1101,13 +1089,48 @@ BuildViewDependencyGraph(Oid relationId, HTAB *nodeMap) } } - systable_endscan(depScan); - relation_close(depRel, AccessShareLock); - return node; } +/* + * GetPgDependTuplesForDependingObjects scans pg_depend for given object and + * returns a list of heap tuples for the objects depending on it. + */ +List * +GetPgDependTuplesForDependingObjects(Oid targetObjectClassId, Oid targetObjectId) +{ + List *dependencyTupleList = NIL; + + Relation pgDepend = table_open(DependRelationId, AccessShareLock); + + ScanKeyData key[2]; + int scanKeyCount = 2; + + ScanKeyInit(&key[0], Anum_pg_depend_refclassid, BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(targetObjectClassId)); + ScanKeyInit(&key[1], Anum_pg_depend_refobjid, BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(targetObjectId)); + + bool useIndex = true; + SysScanDesc depScan = systable_beginscan(pgDepend, DependReferenceIndexId, + useIndex, NULL, scanKeyCount, key); + + HeapTuple dependencyTuple = NULL; + while (HeapTupleIsValid(dependencyTuple = systable_getnext(depScan))) + { + /* copy the tuple first */ + dependencyTuple = heap_copytuple(dependencyTuple); + dependencyTupleList = lappend(dependencyTupleList, dependencyTuple); + } + + systable_endscan(depScan); + relation_close(pgDepend, AccessShareLock); + + return dependencyTupleList; +} + + /* * GetDependingViews takes a relation id, finds the views that depend on the relation * and returns list of the oids of those views. It recurses on the pg_depend table to diff --git a/src/include/distributed/metadata/dependency.h b/src/include/distributed/metadata/dependency.h index d7ccf34bc..66ae30fd3 100644 --- a/src/include/distributed/metadata/dependency.h +++ b/src/include/distributed/metadata/dependency.h @@ -21,6 +21,8 @@ extern List * GetUniqueDependenciesList(List *objectAddressesList); extern List * GetDependenciesForObject(const ObjectAddress *target); extern List * OrderObjectAddressListInDependencyOrder(List *objectAddressList); extern bool SupportedDependencyByCitus(const ObjectAddress *address); +extern List * GetPgDependTuplesForDependingObjects(Oid targetObjectClassId, + Oid targetObjectId); extern List * GetDependingViews(Oid relationId); #endif /* CITUS_DEPENDENCY_H */ From feda8bdd3787af2d21ae1401b40c09748a9256f8 Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Thu, 24 Dec 2020 19:48:23 +0300 Subject: [PATCH 2/2] Now that we use tuples after closing pg_depend, don't release lock --- src/backend/distributed/metadata/dependency.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/distributed/metadata/dependency.c b/src/backend/distributed/metadata/dependency.c index 9951904e8..b92f316dc 100644 --- a/src/backend/distributed/metadata/dependency.c +++ b/src/backend/distributed/metadata/dependency.c @@ -1125,7 +1125,7 @@ GetPgDependTuplesForDependingObjects(Oid targetObjectClassId, Oid targetObjectId } systable_endscan(depScan); - relation_close(pgDepend, AccessShareLock); + relation_close(pgDepend, NoLock); return dependencyTupleList; }