diff --git a/gpMgmt/bin/gppylib/data/4.3.json b/gpMgmt/bin/gppylib/data/4.3.json index 7741cc9a38f3ec55b4726cdf1bcf488bc9854bdd..b5fd093181204233e4343ca68d017e60c445973a 100644 --- a/gpMgmt/bin/gppylib/data/4.3.json +++ b/gpMgmt/bin/gppylib/data/4.3.json @@ -1,6 +1,6 @@ { "__comment" : "Generated by process_foreign_keys.pl", - "__info" : { "CATALOG_VERSION_NO" : "301612081" }, + "__info" : { "CATALOG_VERSION_NO" : "301612161" }, "gp_distribution_policy" : { "foreign_keys" : [ [ ["localoid"], "pg_class", ["oid"] ] @@ -11,11 +11,6 @@ [ ["objid"], "pg_class", ["oid"] ] ] }, - "gp_relation_node" : { - "foreign_keys" : [ - [ ["relfilenode_oid"], "pg_class", ["oid"] ] - ] - }, "pg_aggregate" : { "foreign_keys" : [ [ ["aggfnoid"], "pg_proc", ["oid"] ], diff --git a/src/backend/access/aocs/aocs_compaction.c b/src/backend/access/aocs/aocs_compaction.c index 32dfc5e14664f57cb21750a989c9811a9082a81a..fa889bcce6c77f58bc655a8afdab519c479417bf 100644 --- a/src/backend/access/aocs/aocs_compaction.c +++ b/src/backend/access/aocs/aocs_compaction.c @@ -53,10 +53,11 @@ AOCSCompaction_DropSegmentFile(Relation aorel, pseudoSegNo = (col*AOTupleId_MultiplierSegmentFileNum) + segno; if (!ReadGpRelationNode( - aorel->rd_node.relNode, - pseudoSegNo, - &persistentTid, - &persistentSerialNum)) + aorel->rd_rel->reltablespace, + aorel->rd_rel->relfilenode, + pseudoSegNo, + &persistentTid, + &persistentSerialNum)) { /* There is nothing to drop */ return; diff --git a/src/backend/access/aocs/aocsam.c b/src/backend/access/aocs/aocsam.c index 6c4ef7c046ad805e7efd4d09a27216ec30ceb40e..4ca180036290b0f66db4c65ed8455d8071d8faa8 100644 --- a/src/backend/access/aocs/aocsam.c +++ b/src/backend/access/aocs/aocsam.c @@ -688,10 +688,12 @@ static void OpenAOCSDatumStreams(AOCSInsertDesc desc) for (int i=0; i < nvp; i++) { if (desc->cur_segno > 0 && - ReadGpRelationNode(desc->aoi_rel->rd_node.relNode, - (i * AOTupleId_MultiplierSegmentFileNum) + desc->cur_segno, - &persistentTid, - &persistentSerialNum)) + ReadGpRelationNode( + desc->aoi_rel->rd_rel->reltablespace, + desc->aoi_rel->rd_rel->relfilenode, + (i * AOTupleId_MultiplierSegmentFileNum) + desc->cur_segno, + &persistentTid, + &persistentSerialNum)) { elog(ERROR, "Found gp_relation_node entry for relation name %s, " "relation Oid %u, relfilenode %u, segment file #%d " diff --git a/src/backend/access/aocs/aocssegfiles.c b/src/backend/access/aocs/aocssegfiles.c index a465bc8cd8e1be1ed38d096fe900b90070551e9e..2d10568db9bbb9c91842118b15623599da79ea04 100644 --- a/src/backend/access/aocs/aocssegfiles.c +++ b/src/backend/access/aocs/aocssegfiles.c @@ -1885,6 +1885,7 @@ CheckCOConsistencyWithGpRelationNode( Snapshot snapshot, Relation rel, int total snapshot, gp_relation_node, rel->rd_id, + rel->rd_rel->reltablespace, rel->rd_rel->relfilenode, &gpRelationNodeScan); while ((NULL != GpRelationNodeGetNext( diff --git a/src/backend/access/appendonly/aomd.c b/src/backend/access/appendonly/aomd.c index 3b50a0469cb94326496091a4fbaa448172661806..5bc40401eb122e5038cf9fac690874588484f589 100644 --- a/src/backend/access/appendonly/aomd.c +++ b/src/backend/access/appendonly/aomd.c @@ -138,10 +138,11 @@ OpenAOSegmentFile( int primaryError; if (!ReadGpRelationNode( - rel->rd_node.relNode, - segmentFileNum, - &persistentTid, - &persistentSerialNum)) + rel->rd_rel->reltablespace, + rel->rd_rel->relfilenode, + segmentFileNum, + &persistentTid, + &persistentSerialNum)) { if (logicalEof == 0) return false; diff --git a/src/backend/access/appendonly/aosegfiles.c b/src/backend/access/appendonly/aosegfiles.c index 1f031e2815b13839dddd45fba149096e813744d5..eb115550daae3a1462bb052846412211007c2117 100644 --- a/src/backend/access/appendonly/aosegfiles.c +++ b/src/backend/access/appendonly/aosegfiles.c @@ -2187,6 +2187,7 @@ CheckAOConsistencyWithGpRelationNode( Snapshot snapshot, Relation rel, int total snapshot, gp_relation_node, rel->rd_id, + rel->rd_rel->reltablespace, rel->rd_rel->relfilenode, &gpRelationNodeScan); while ((NULL != GpRelationNodeGetNext( diff --git a/src/backend/access/appendonly/appendonly_compaction.c b/src/backend/access/appendonly/appendonly_compaction.c index 868087dc9720ffd4779a1c30b9d5259383fbe3de..8336eec551bc46d780ce58581393dc4128e03a51 100644 --- a/src/backend/access/appendonly/appendonly_compaction.c +++ b/src/backend/access/appendonly/appendonly_compaction.c @@ -57,10 +57,11 @@ AppendOnlyCompaction_DropSegmentFile(Relation aorel, int64 persistentSerialNum; if (!ReadGpRelationNode( - aorel->rd_node.relNode, - segno, - &persistentTid, - &persistentSerialNum)) + aorel->rd_rel->reltablespace, + aorel->rd_rel->relfilenode, + segno, + &persistentTid, + &persistentSerialNum)) { /* There is nothing to drop */ return; diff --git a/src/backend/access/appendonly/appendonlyam.c b/src/backend/access/appendonly/appendonlyam.c index 6215d5a5726e547cf9d8027d99266fd6f0a844e9..588192a0b80a6cfffbd885908e2a863ce479e230 100755 --- a/src/backend/access/appendonly/appendonlyam.c +++ b/src/backend/access/appendonly/appendonlyam.c @@ -498,10 +498,12 @@ SetCurrentFileSegForWrite(AppendOnlyInsertDesc aoInsertDesc) */ if (gp_appendonly_verify_eof && aoInsertDesc->cur_segno > 0 && - ReadGpRelationNode(aoInsertDesc->aoi_rel->rd_node.relNode, - aoInsertDesc->cur_segno, - &persistentTid, - &persistentSerialNum)) + ReadGpRelationNode( + aoInsertDesc->aoi_rel->rd_rel->reltablespace, + aoInsertDesc->aoi_rel->rd_rel->relfilenode, + aoInsertDesc->cur_segno, + &persistentTid, + &persistentSerialNum)) { elog(ERROR, "Found gp_relation_node entry for relation name %s, " "relation Oid %u, relfilenode %u, segment file #%d " @@ -547,19 +549,21 @@ SetCurrentFileSegForWrite(AppendOnlyInsertDesc aoInsertDesc) else { if (!ReadGpRelationNode( - aoInsertDesc->aoi_rel->rd_node.relNode, - aoInsertDesc->cur_segno, - &persistentTid, - &persistentSerialNum)) + aoInsertDesc->aoi_rel->rd_rel->reltablespace, + aoInsertDesc->aoi_rel->rd_rel->relfilenode, + aoInsertDesc->cur_segno, + &persistentTid, + &persistentSerialNum)) { elog(ERROR, "Did not find gp_relation_node entry for relation name" - " %s, relation id %u, relfilenode %u, segment file #%d," + " %s, relation id %u, tablespace %u, relfilenode %u, segment file #%d," " logical eof " INT64_FORMAT, - aoInsertDesc->aoi_rel->rd_rel->relname.data, - aoInsertDesc->aoi_rel->rd_id, - aoInsertDesc->aoi_rel->rd_node.relNode, - aoInsertDesc->cur_segno, - eof); + aoInsertDesc->aoi_rel->rd_rel->relname.data, + aoInsertDesc->aoi_rel->rd_id, + aoInsertDesc->aoi_rel->rd_rel->reltablespace, + aoInsertDesc->aoi_rel->rd_rel->relfilenode, + aoInsertDesc->cur_segno, + eof); } } diff --git a/src/backend/catalog/gp_persistent.c b/src/backend/catalog/gp_persistent.c index 71ea7822802df4a6208ffe1cd5adf2c0e44d5a45..c03ed354291758375985115d17649cab9e8ff8df 100755 --- a/src/backend/catalog/gp_persistent.c +++ b/src/backend/catalog/gp_persistent.c @@ -659,13 +659,16 @@ void GpRelationNode_GetValues( void GpRelationNode_SetDatumValues( Datum *values, - + Oid tablespaceOid, Oid relfilenodeOid, int32 segmentFileNum, int64 createMirrorDataLossTrackingSessionNum, ItemPointer persistentTid, int64 persistentSerialNum) { + values[Anum_gp_relation_node_tablespace_oid - 1] = + ObjectIdGetDatum(tablespaceOid); + values[Anum_gp_relation_node_relfilenode_oid - 1] = ObjectIdGetDatum(relfilenodeOid); diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 0e59f94834e4181a0c07a37de6c705fde52afd88..49b72fd4ea14b886ca15ae3e140584c0684a2cf5 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -1234,6 +1234,7 @@ InsertGpRelationNodeTuple( Relation gp_relation_node, Oid relationId, char *relname, + Oid tablespaceOid, Oid relfilenode, int32 segmentFileNum, bool updateIndex, @@ -1269,8 +1270,15 @@ InsertGpRelationNodeTuple( persistentSerialNum, ItemPointerToString(persistentTid)); + /* + * gp_relation_node stores tablespaceOId in pg_class fashion, which means + * defaultTablespace is represented as "0". + */ + Assert (tablespaceOid != MyDatabaseTableSpace); + GpRelationNode_SetDatumValues( values, + tablespaceOid, relfilenode, segmentFileNum, /* createMirrorDataLossTrackingSessionNum */ 0, @@ -1295,6 +1303,7 @@ void UpdateGpRelationNodeTuple( Relation gp_relation_node, HeapTuple tuple, + Oid tablespaceOid, Oid relfilenode, int32 segmentFileNum, ItemPointer persistentTid, @@ -1327,6 +1336,9 @@ UpdateGpRelationNodeTuple( memset(repl_null, false, sizeof(repl_null)); memset(repl_repl, false, sizeof(repl_null)); + repl_repl[Anum_gp_relation_node_tablespace_oid - 1] = true; + repl_val[Anum_gp_relation_node_tablespace_oid - 1] = ObjectIdGetDatum(tablespaceOid); + repl_repl[Anum_gp_relation_node_relfilenode_oid - 1] = true; repl_val[Anum_gp_relation_node_relfilenode_oid - 1] = ObjectIdGetDatum(relfilenode); @@ -1362,6 +1374,7 @@ AddNewRelationNodeTuple( gp_relation_node, new_rel->rd_id, new_rel->rd_rel->relname.data, + new_rel->rd_rel->reltablespace, new_rel->rd_rel->relfilenode, /* segmentFileNum */ 0, /* updateIndex */ true, @@ -2323,6 +2336,7 @@ remove_gp_relation_node_and_schedule_drop(Relation rel) SnapshotNow, relNodeRelation, rel->rd_id, + rel->rd_rel->reltablespace, rel->rd_rel->relfilenode, &gpRelationNodeScan); diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 8e1561cc7a1cc9b7b28655eaa9333982ec3b1695..2c2f5b71e116a7f4003659ca303fdd4f275edd45 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -730,6 +730,7 @@ index_create(Oid heapRelationId, gp_relation_node, indexRelation->rd_id, indexRelation->rd_rel->relname.data, + indexRelation->rd_rel->reltablespace, indexRelation->rd_rel->relfilenode, /* segmentFileNum */ 0, /* updateIndex */ true, @@ -1549,6 +1550,7 @@ setNewRelfilenode(Relation relation, TransactionId freezeXid) gp_relation_node, relation->rd_id, NameStr(relation->rd_rel->relname), + relation->rd_rel->reltablespace, newrelfilenode, /* segmentFileNum */ 0, /* updateIndex */ !is_gp_relation_node_index, diff --git a/src/backend/cdb/cdbappendonlystoragewrite.c b/src/backend/cdb/cdbappendonlystoragewrite.c index 751d76ef282c85ee93932ab0435a23899d88d496..78fd2bb95d5de0997364201c831b7127db306e60 100755 --- a/src/backend/cdb/cdbappendonlystoragewrite.c +++ b/src/backend/cdb/cdbappendonlystoragewrite.c @@ -269,10 +269,12 @@ AppendOnlyStorageWrite_TransactionCreateFile(AppendOnlyStorageWrite *storageWrit /* * We may or may not have a gp_relation_node entry when the EOF is 0. */ - if (ReadGpRelationNode(relFileNode->relNode, - segmentFileNum, - persistentTid, - persistentSerialNum)) + if (ReadGpRelationNode( + (relFileNode->spcNode == MyDatabaseTableSpace) ? 0:relFileNode->spcNode, + relFileNode->relNode, + segmentFileNum, + persistentTid, + persistentSerialNum)) { /* * UNDONE: Verify the gp_persistent_relation_node Append-Only EOFs are @@ -296,6 +298,7 @@ AppendOnlyStorageWrite_TransactionCreateFile(AppendOnlyStorageWrite *storageWrit * currently only used * for tracing... */ storageWrite->relationName, + (relFileNode->spcNode == MyDatabaseTableSpace) ? 0:relFileNode->spcNode, relFileNode->relNode, segmentFileNum, /* updateIndex */ true, diff --git a/src/backend/cdb/cdbpersistentbuild.c b/src/backend/cdb/cdbpersistentbuild.c index 90dca502784157fc437914a5044e3bfe5a5d5ff4..19d2415869bcd17718dfad0de109a426a09fc517 100755 --- a/src/backend/cdb/cdbpersistentbuild.c +++ b/src/backend/cdb/cdbpersistentbuild.c @@ -163,6 +163,7 @@ static void PersistentBuild_ScanGpPersistentRelationNodeForGlobal( gp_relation_node, relFileNode.relNode, // pg_class OID /* relationName */ NULL, // Optional. + (relFileNode.spcNode == MyDatabaseTableSpace) ? 0:relFileNode.spcNode, relFileNode.relNode, // pg_class relfilenode /* segmentFileNum */ 0, /* updateIndex */ false, @@ -279,6 +280,7 @@ static void PersistentBuild_PopulateGpRelationNode( gp_relation_node, dbInfoRel->relationOid, // pg_class OID dbInfoRel->relname, + (dbInfoRel->reltablespace == MyDatabaseTableSpace) ? 0:dbInfoRel->reltablespace, relFileNode.relNode, // pg_class relfilenode /* segmentFileNum */ 0, /* updateIndex */ false, @@ -398,6 +400,7 @@ static void PersistentBuild_PopulateGpRelationNode( gp_relation_node, dbInfoRel->relationOid, // pg_class OID dbInfoRel->relname, + (dbInfoRel->reltablespace == MyDatabaseTableSpace) ? 0:dbInfoRel->reltablespace, relFileNode.relNode, // pg_class relfilenode physicalSegmentFileNum, /* updateIndex */ false, @@ -448,6 +451,7 @@ static void PersistentBuild_PopulateGpRelationNode( indexInfo->ii_NumIndexAttrs = Natts_gp_relation_node_index; indexInfo->ii_KeyAttrNumbers[0] = 1; indexInfo->ii_KeyAttrNumbers[1] = 2; + indexInfo->ii_KeyAttrNumbers[2] = 3; indexInfo->ii_Unique = true; if (Debug_persistent_print) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 7327c64ac9b93aaad61fa277fb4727c95f1346fe..00c847f98be7f88259330d0fd9141d321f0750dd 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -9525,8 +9525,6 @@ ATExecSetTableSpace_AppendOnly( Relation gp_relation_node, RelFileNode *newRelFileNode) { - Oid oldTablespace; - char *buffer; GpRelationNodeScan gpRelationNodeScan; @@ -9550,8 +9548,6 @@ ATExecSetTableSpace_AppendOnly( int segmentCount; - oldTablespace = rel->rd_rel->reltablespace ? rel->rd_rel->reltablespace : MyDatabaseTableSpace; - if (Debug_persistent_print) elog(Persistent_DebugPrintLevel(), "ALTER TABLE SET TABLESPACE: Append-Only " @@ -9589,6 +9585,7 @@ ATExecSetTableSpace_AppendOnly( SnapshotNow, gp_relation_node, tableOid, + rel->rd_rel->reltablespace, rel->rd_rel->relfilenode, &gpRelationNodeScan); segmentCount = 0; @@ -9631,6 +9628,7 @@ ATExecSetTableSpace_AppendOnly( UpdateGpRelationNodeTuple( gp_relation_node, tupleCopy, + (newRelFileNode->spcNode == MyDatabaseTableSpace) ? 0:newRelFileNode->spcNode, newRelFileNode->relNode, segmentFileNum, &newPersistentTid, @@ -9822,6 +9820,7 @@ ATExecSetTableSpace_BufferPool( /* Fetch relation's gp_relation_node row */ nodeTuple = FetchGpRelationNodeTuple( gp_relation_node, + rel->rd_rel->reltablespace, rel->rd_rel->relfilenode, /* segmentFileNum */ 0, &oldPersistentTid, @@ -9889,6 +9888,7 @@ ATExecSetTableSpace_BufferPool( UpdateGpRelationNodeTuple( gp_relation_node, nodeTuple, + (newRelFileNode->spcNode == MyDatabaseTableSpace) ? 0:newRelFileNode->spcNode, newRelFileNode->relNode, /* segmentFileNum */ 0, &newPersistentTid, diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 3c1f607af79d04687d7cbe73d8274cba7256cf03..a9aec46f8f9a3dbdd2091b479b8a65b385e473ea 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -520,6 +520,7 @@ DefineQueryRewrite(char *rulename, SnapshotNow, relNodeRelation, event_relation->rd_id, + event_relation->rd_rel->reltablespace, event_relation->rd_rel->relfilenode, &gpRelationNodeScan); diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 75de82adc4be72bad24f56ecd7be95cb88dec0bf..ec5908b1d219432938eac2b3e19ea1d00b007623 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -313,6 +313,7 @@ GpRelationNodeBeginScan( Snapshot snapshot, Relation gp_relation_node, Oid relationId, + Oid tablespaceOid, Oid relfilenode, GpRelationNodeScan *gpRelationNodeScan) { @@ -323,25 +324,18 @@ GpRelationNodeBeginScan( /* * form a scan key */ - /* XXX XXX: break this out -- find callers - jic 2011/12/09 */ - /* maybe it's ok - return a cql context ? */ - - /* XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX */ - /* no json defs for persistent tables ? */ -/* - cqxx("SELECT * FROM gp_relation_node_relfilenode " - " WHERE oid = :1 ", - ObjectIdGetDatum(relfilenode)); -*/ - /* XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX */ - ScanKeyInit(&gpRelationNodeScan->scankey[0], + Anum_gp_relation_node_tablespace_oid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(tablespaceOid)); + + ScanKeyInit(&gpRelationNodeScan->scankey[1], Anum_gp_relation_node_relfilenode_oid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(relfilenode)); /* - * Open pg_class and fetch a tuple. Force heap scan if we haven't yet + * Open gp_relation_node and fetch a tuple. Force heap scan if we haven't yet * built the critical relcache entries (this includes initdb and startup * without a pg_internal.init file). The caller can also force a heap * scan by setting indexOK == false. @@ -350,11 +344,12 @@ GpRelationNodeBeginScan( systable_beginscan(gp_relation_node, GpRelationNodeOidIndexId, /* indexOK */ true, snapshot, - /* nKeys */ 1, + /* nKeys */ 2, gpRelationNodeScan->scankey); gpRelationNodeScan->gp_relation_node = gp_relation_node; gpRelationNodeScan->relationId = relationId; + gpRelationNodeScan->tablespaceOid = tablespaceOid; gpRelationNodeScan->relfilenode = relfilenode; } @@ -397,8 +392,9 @@ GpRelationNodeGetNext( persistentSerialNum); if (actualRelationNode != gpRelationNodeScan->relfilenode) elog(FATAL, "Index on gp_relation_node broken." - "Mismatch in node tuple for gp_relation_node for relation %u, relfilenode %u, relation node %u", - gpRelationNodeScan->relationId, + "Mismatch in node tuple for gp_relation_node for relation %u, tablespace %u, relfilenode %u, relation node %u", + gpRelationNodeScan->relationId, + gpRelationNodeScan->tablespaceOid, gpRelationNodeScan->relfilenode, actualRelationNode); @@ -417,40 +413,35 @@ GpRelationNodeEndScan( static HeapTuple ScanGpRelationNodeTuple( Relation gp_relation_node, + Oid tablespaceOid, Oid relfilenode, int32 segmentFileNum) { HeapTuple tuple; SysScanDesc scan; - ScanKeyData key[2]; + ScanKeyData key[3]; + Assert (tablespaceOid != MyDatabaseTableSpace); Assert (relfilenode != 0); /* * form a scan key */ - - /* XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX */ -/* - cqxx("SELECT * FROM gp_relation_node " - " WHERE relfilenode_oid = :1 " - " AND segment_file_num = :2 ", - ObjectIdGetDatum(relfilenode), - Int32GetDatum(segmentFileNum)); -*/ - /* XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX */ - ScanKeyInit(&key[0], + Anum_gp_relation_node_tablespace_oid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(tablespaceOid)); + ScanKeyInit(&key[1], Anum_gp_relation_node_relfilenode_oid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(relfilenode)); - ScanKeyInit(&key[1], + ScanKeyInit(&key[2], Anum_gp_relation_node_segment_file_num, BTEqualStrategyNumber, F_INT4EQ, Int32GetDatum(segmentFileNum)); /* - * Open pg_class and fetch a tuple. Force heap scan if we haven't yet + * Open gp_relation_node and fetch a tuple. Force heap scan if we haven't yet * built the critical relcache entries (this includes initdb and startup * without a pg_internal.init file). The caller can also force a heap * scan by setting indexOK == false. @@ -458,7 +449,7 @@ ScanGpRelationNodeTuple( scan = systable_beginscan(gp_relation_node, GpRelationNodeOidIndexId, /* indexOK */ true, SnapshotNow, - 2, key); + 3, key); tuple = systable_getnext(scan); @@ -477,6 +468,7 @@ ScanGpRelationNodeTuple( HeapTuple FetchGpRelationNodeTuple( Relation gp_relation_node, + Oid tablespaceOid, Oid relfilenode, int32 segmentFileNum, ItemPointer persistentTid, @@ -492,10 +484,16 @@ FetchGpRelationNodeTuple( int64 createMirrorDataLossTrackingSessionNum; + /* + * gp_relation_node stores tablespaceOId in pg_class fashion, hence need + * to fetch the similar way. + */ + Assert (tablespaceOid != MyDatabaseTableSpace); Assert (relfilenode != 0); tuple = ScanGpRelationNodeTuple( gp_relation_node, + tablespaceOid, relfilenode, segmentFileNum); @@ -547,14 +545,16 @@ DeleteGpRelationNodeTuple( gp_relation_node = heap_open(GpRelationNodeRelationId, RowExclusiveLock); tuple = FetchGpRelationNodeTuple(gp_relation_node, - relation->rd_rel->relfilenode, - segmentFileNum, - &persistentTid, - &persistentSerialNum); + relation->rd_rel->reltablespace, + relation->rd_rel->relfilenode, + segmentFileNum, + &persistentTid, + &persistentSerialNum); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "could not find node tuple for relation %u, relation file node %u, segment file #%d", + elog(ERROR, "could not find node tuple for relation %u, tablespace %u, relation file node %u, segment file #%d", RelationGetRelid(relation), + relation->rd_rel->reltablespace, relation->rd_rel->relfilenode, segmentFileNum); @@ -567,12 +567,10 @@ DeleteGpRelationNodeTuple( bool ReadGpRelationNode( + Oid tablespaceOid, Oid relfilenode, - int32 segmentFileNum, - ItemPointer persistentTid, - int64 *persistentSerialNum) { Relation gp_relation_node; @@ -586,6 +584,7 @@ ReadGpRelationNode( tuple = FetchGpRelationNodeTuple( gp_relation_node, + tablespaceOid, relfilenode, segmentFileNum, persistentTid, @@ -611,7 +610,8 @@ ReadGpRelationNode( tupleVisibilitySummaryString = GetTupleVisibilitySummaryString(&tupleVisibilitySummary); elog(Persistent_DebugPrintLevel(), - "ReadGpRelationNode: For relfilenode %u, segment file #%d found persistent serial number " INT64_FORMAT ", TID %s (gp_relation_node tuple visibility: %s)", + "ReadGpRelationNode: For tablespace %u relfilenode %u, segment file #%d found persistent serial number " INT64_FORMAT ", TID %s (gp_relation_node tuple visibility: %s)", + tablespaceOid, relfilenode, segmentFileNum, *persistentSerialNum, @@ -647,15 +647,17 @@ RelationFetchSegFile0GpRelationNode( } if (!ReadGpRelationNode( - relation->rd_node.relNode, - /* segmentFileNum */ 0, - &relation->rd_segfile0_relationnodeinfo.persistentTid, - &relation->rd_segfile0_relationnodeinfo.persistentSerialNum)) + relation->rd_rel->reltablespace, + relation->rd_rel->relfilenode, + /* segmentFileNum */ 0, + &relation->rd_segfile0_relationnodeinfo.persistentTid, + &relation->rd_segfile0_relationnodeinfo.persistentSerialNum)) { - elog(ERROR, "Did not find gp_relation_node entry for relation name %s, relation id %u, relfilenode %u", + elog(ERROR, "Did not find gp_relation_node entry for relation name %s, relation id %u, tablespaceOid %u, relfilenode %u", relation->rd_rel->relname.data, relation->rd_id, - relation->rd_node.relNode); + relation->rd_rel->reltablespace, + relation->rd_rel->relfilenode); } Assert(!Persistent_BeforePersistenceWork()); @@ -686,15 +688,19 @@ RelationFetchSegFile0GpRelationNode( int64 persistentSerialNum; if (!ReadGpRelationNode( - relation->rd_node.relNode, - /* segmentFileNum */ 0, - &persistentTid, - &persistentSerialNum)) + relation->rd_rel->reltablespace, + relation->rd_rel->relfilenode, + /* segmentFileNum */ 0, + &persistentTid, + &persistentSerialNum)) { elog(ERROR, "did not find gp_relation_node entry for relation name %s, " - "relation id %u, relfilenode %u", relation->rd_rel->relname.data, - relation->rd_id, relation->rd_node.relNode); + "relation id %u, tablespace %u, relfilenode %u", + relation->rd_rel->relname.data, + relation->rd_id, + relation->rd_rel->reltablespace, + relation->rd_rel->relfilenode); } if (ItemPointerCompare(&persistentTid, diff --git a/src/backend/utils/datumstream/datumstream.c b/src/backend/utils/datumstream/datumstream.c index b25f4715d157b44b3c93b9637c928df7527ad735..1211f9aa63fcad44c31503abc4721670630a2b94 100644 --- a/src/backend/utils/datumstream/datumstream.c +++ b/src/backend/utils/datumstream/datumstream.c @@ -806,10 +806,11 @@ datumstreamwrite_open_file(DatumStreamWrite * ds, char *fn, int64 eof, int64 eof else { if (!ReadGpRelationNode( - relFileNode.relNode, - segmentFileNum, - &persistentTid, - &persistentSerialNum)) + (relFileNode.spcNode == MyDatabaseTableSpace) ? 0:relFileNode.spcNode, + relFileNode.relNode, + segmentFileNum, + &persistentTid, + &persistentSerialNum)) { elog(ERROR, "Did not find gp_relation_node entry for relfilenode %u, segment file #%d, logical eof " INT64_FORMAT, relFileNode.relNode, diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 3a17c4a09bf29bbfb15adc92edfea11e9c42ed85..bcdc215454ad6b3f4086eb2dca15ac18ea327481 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -56,6 +56,6 @@ */ /* 3yyymmddN */ -#define CATALOG_VERSION_NO 301611021 +#define CATALOG_VERSION_NO 301612161 #endif diff --git a/src/include/catalog/gp_persistent.h b/src/include/catalog/gp_persistent.h index 228599fb31f3b1000e30395fbbfcab878d9c2052..2b13d0c1a8dec8abd2e975e231c65c1204e3a83d 100755 --- a/src/include/catalog/gp_persistent.h +++ b/src/include/catalog/gp_persistent.h @@ -134,6 +134,7 @@ typedef FormData_gp_persistent_relation_node *Form_gp_persistent_relation_node; CATALOG(gp_relation_node,5094) BKI_WITHOUT_OIDS { + Oid tablespace_oid; Oid relfilenode_oid; int4 segment_file_num; int8 create_mirror_data_loss_tracking_session_num; @@ -141,16 +142,14 @@ CATALOG(gp_relation_node,5094) BKI_WITHOUT_OIDS int8 persistent_serial_num; } FormData_gp_relation_node; -/* GPDB added foreign key definitions for gpcheckcat. */ -FOREIGN_KEY(relfilenode_oid REFERENCES pg_class(oid)); +#define Natts_gp_relation_node 6 +#define Anum_gp_relation_node_tablespace_oid 1 +#define Anum_gp_relation_node_relfilenode_oid 2 +#define Anum_gp_relation_node_segment_file_num 3 +#define Anum_gp_relation_node_create_mirror_data_loss_tracking_session_num 4 +#define Anum_gp_relation_node_persistent_tid 5 +#define Anum_gp_relation_node_persistent_serial_num 6 -#define Natts_gp_relation_node 5 -#define Anum_gp_relation_node_relfilenode_oid 1 -#define Anum_gp_relation_node_segment_file_num 2 -#define Anum_gp_relation_node_create_mirror_data_loss_tracking_session_num 3 -#define Anum_gp_relation_node_persistent_tid 4 -#define Anum_gp_relation_node_persistent_serial_num 5 - typedef FormData_gp_relation_node *Form_gp_relation_node; /* @@ -160,11 +159,12 @@ typedef FormData_gp_relation_node *Form_gp_relation_node; * pg_attribute.h] */ #define Schema_gp_relation_node \ -{ GpRelationNodeRelationId, {"relfilenode_oid"}, 26, -1, 4, 1, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \ -{ GpRelationNodeRelationId, {"segment_file_num"}, 23, -1, 4, 2, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \ -{ GpRelationNodeRelationId, {"create_mirror_data_loss_tracking_session_num"}, 20, -1, 8, 3, 0, -1, -1, true, 'p', 'd', true, false, false, true, 0 }, \ -{ GpRelationNodeRelationId, {"persistent_tid"}, 27, -1, 6, 4, 0, -1, -1, false, 'p', 's', true, false, false, true, 0 }, \ -{ GpRelationNodeRelationId, {"persistent_serial_num"}, 20, -1, 8, 5, 0, -1, -1, true, 'p', 'd', true, false, false, true, 0 } +{ GpRelationNodeRelationId, {"tablespace_oid"}, 26, -1, 4, 1, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \ +{ GpRelationNodeRelationId, {"relfilenode_oid"}, 26, -1, 4, 2, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \ +{ GpRelationNodeRelationId, {"segment_file_num"}, 23, -1, 4, 3, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }, \ +{ GpRelationNodeRelationId, {"create_mirror_data_loss_tracking_session_num"}, 20, -1, 8, 4, 0, -1, -1, true, 'p', 'd', true, false, false, true, 0 }, \ +{ GpRelationNodeRelationId, {"persistent_tid"}, 27, -1, 6, 5, 0, -1, -1, false, 'p', 's', true, false, false, true, 0 }, \ +{ GpRelationNodeRelationId, {"persistent_serial_num"}, 20, -1, 8, 6, 0, -1, -1, true, 'p', 'd', true, false, false, true, 0 } /* * gp_relation_node table values for FormData_pg_class. @@ -178,7 +178,7 @@ typedef FormData_gp_relation_node *Form_gp_relation_node; /* * gp_relation_node's index. */ -#define Natts_gp_relation_node_index 2 +#define Natts_gp_relation_node_index 3 /* * gp_relation_node_index table values for FormData_pg_attribute. @@ -187,8 +187,9 @@ typedef FormData_gp_relation_node *Form_gp_relation_node; * pg_attribute.h] */ #define Schema_gp_relation_node_index \ -{ GpRelationNodeRelationId, {"relfilenode_oid"}, 26, -1, 4, 1, 0, -1, -1, true, 'p', 'i', false, false, false, true, 0 }, \ -{ GpRelationNodeRelationId, {"segment_file_num"}, 23, -1, 4, 2, 0, -1, -1, true, 'p', 'i', false, false, false, true, 0 }, +{ GpRelationNodeRelationId, {"tablespace_oid"}, 26, -1, 4, 1, 0, -1, -1, true, 'p', 'i', false, false, false, true, 0 }, \ +{ GpRelationNodeRelationId, {"relfilenode_oid"}, 26, -1, 4, 2, 0, -1, -1, true, 'p', 'i', false, false, false, true, 0 }, \ +{ GpRelationNodeRelationId, {"segment_file_num"}, 23, -1, 4, 3, 0, -1, -1, true, 'p', 'i', false, false, false, true, 0 }, /* * gp_relation_node_index index values for FormData_pg_class. @@ -221,10 +222,10 @@ typedef FormData_gp_relation_node *Form_gp_relation_node; GpRelationNodeOidIndexId, GpRelationNodeRelationId, Natts_gp_relation_node_index, true, false, false, true, false, true, {Init_int2vector}, {Init_oidvector}, {Init_oidvector}, {Init_text}, {Init_text} #define IndKey_gp_relation_node_index \ - 1, 2 + 1, 2, 3 #define IndClass_gp_relation_node_index \ - OID_BTREE_OPS_OID, INT4_BTREE_OPS_OID + OID_BTREE_OPS_OID, OID_BTREE_OPS_OID, INT4_BTREE_OPS_OID /* * Defines for gp_persistent_database_node table @@ -613,7 +614,7 @@ extern void GpRelationNode_GetValues( extern void GpRelationNode_SetDatumValues( Datum *values, - + Oid tablespaceOid, Oid relfilenodeOid, int32 segmentFileNum, int64 createMirrorDataLossTrackingSessionNum, diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h index 809feb9bbe0ac34052d15513b77cabd560b5c5d9..fde8e7129cde25acd242f14e7432dbfb43d75229 100644 --- a/src/include/catalog/heap.h +++ b/src/include/catalog/heap.h @@ -76,6 +76,7 @@ extern void InsertGpRelationNodeTuple( Relation gp_relation_node, Oid relationId, char *relname, + Oid tablespaceOid, Oid relation, int32 segmentFileNum, bool updateIndex, @@ -84,6 +85,7 @@ extern void InsertGpRelationNodeTuple( extern void UpdateGpRelationNodeTuple( Relation gp_relation_node, HeapTuple tuple, + Oid tablespaceOid, Oid relation, int32 segmentFileNum, ItemPointer persistentTid, diff --git a/src/include/catalog/indexing.h b/src/include/catalog/indexing.h index efa171b662d840e2500a155b1545fef9d4986dd1..f733795d9bf1c38230d8bbd8464d9553b7e784b6 100644 --- a/src/include/catalog/indexing.h +++ b/src/include/catalog/indexing.h @@ -275,7 +275,7 @@ DECLARE_UNIQUE_INDEX(pg_appendonly_relid_index, 5007, on pg_appendonly using btr DECLARE_UNIQUE_INDEX(gp_fastsequence_objid_objmod_index, 6067, on gp_fastsequence using btree(objid oid_ops, objmod int8_ops)); #define FastSequenceObjidObjmodIndexId 6067 -DECLARE_UNIQUE_INDEX(gp_relation_node_index, 5095, on gp_relation_node using btree(relfilenode_oid oid_ops, segment_file_num int4_ops)); +DECLARE_UNIQUE_INDEX(gp_relation_node_index, 5095, on gp_relation_node using btree(tablespace_oid oid_ops, relfilenode_oid oid_ops, segment_file_num int4_ops)); #define GpRelationNodeOidIndexId 5095 /* MPP-6929: metadata tracking */ diff --git a/src/include/utils/relationnode.h b/src/include/utils/relationnode.h index baff09553fb79bad7a570de9a92348e3266de628..da848422581a2bfc771d6cf76568ea4337638b42 100644 --- a/src/include/utils/relationnode.h +++ b/src/include/utils/relationnode.h @@ -20,8 +20,9 @@ typedef struct GpRelationNodeScan { Relation gp_relation_node; Oid relationId; + Oid tablespaceOid; Oid relfilenode; - ScanKeyData scankey[1]; + ScanKeyData scankey[2]; struct SysScanDescData *scan; } GpRelationNodeScan; @@ -30,6 +31,7 @@ GpRelationNodeBeginScan( Snapshot snapshot, Relation gp_relation_node, Oid relationId, + Oid tablespaceOid, Oid relfilenode, GpRelationNodeScan *gpRelationNodeScan); @@ -46,11 +48,13 @@ GpRelationNodeEndScan( extern HeapTuple FetchGpRelationNodeTuple( Relation gp_relation_node, + Oid tablespaceOid, Oid relationNode, int32 segmentFileNum, ItemPointer persistentTid, int64 *persistentSerialNum); extern bool ReadGpRelationNode( + Oid tablespaceOid, Oid relfilenode, int32 segmentFileNum, ItemPointer persistentTid,