static bool PersistentTablespace_ScanTupleCallback( ItemPointer persistentTid, int64 persistentSerialNum, Datum *values) { Oid filespaceOid; Oid tablespaceOid; PersistentFileSysState state; int64 createMirrorDataLossTrackingSessionNum; MirroredObjectExistenceState mirrorExistenceState; int32 reserved; TransactionId parentXid; int64 serialNum; TablespaceDirEntry tablespaceDirEntry; GpPersistentTablespaceNode_GetValues( values, &filespaceOid, &tablespaceOid, &state, &createMirrorDataLossTrackingSessionNum, &mirrorExistenceState, &reserved, &parentXid, &serialNum); /* * Normally we would acquire this lock with the WRITE_TABLESPACE_HASH_LOCK * macro, however, this particular function can be called during startup. * During startup, which executes in a single threaded context, no * PersistentObjLock exists and we cannot assert that we're holding it. */ LWLockAcquire(TablespaceHashLock, LW_EXCLUSIVE); tablespaceDirEntry = PersistentTablespace_CreateEntryUnderLock(filespaceOid, tablespaceOid); tablespaceDirEntry->state = state; tablespaceDirEntry->persistentSerialNum = serialNum; tablespaceDirEntry->persistentTid = *persistentTid; LWLockRelease(TablespaceHashLock); if (Debug_persistent_print) elog(Persistent_DebugPrintLevel(), "PersistentTablespace_ScanTupleCallback: tablespace %u, filespace %u, state %s, TID %s, serial number " INT64_FORMAT, tablespaceOid, filespaceOid, PersistentFileSysObjState_Name(state), ItemPointerToString2(persistentTid), persistentSerialNum); return true; /* Continue. */ }
static inline void GpPersistentTablespaceNodeGetValues(Datum* values, PT_GpPersistentTablespaceNode *tablenode) { GpPersistentTablespaceNode_GetValues( values, &tablenode->filespaceOid, &tablenode->tablespaceOid, &tablenode->persistentState, &tablenode->createMirrorDataLossTrackingSessionNum, &tablenode->mirrorExistenceState, &tablenode->reserved, &tablenode->parentXid, &tablenode->persistentSerialNum, &tablenode->previousFreeTid); }
void GpPersistent_GetCommonValues( PersistentFsObjType fsObjType, Datum *values, PersistentFileSysObjName *fsObjName, PersistentFileSysState *persistentState, MirroredObjectExistenceState *mirrorExistenceState, TransactionId *parentXid, int64 *persistentSerialNum) { int64 createMirrorDataLossTrackingSessionNum; int32 reserved; switch (fsObjType) { case PersistentFsObjType_RelationFile: { RelFileNode relFileNode; int32 segmentFileNum; PersistentFileSysRelStorageMgr relationStorageManager; MirroredRelDataSynchronizationState mirrorDataSynchronizationState; bool mirrorBufpoolMarkedForScanIncrementalResync; int64 mirrorBufpoolResyncChangedPageCount; XLogRecPtr mirrorBufpoolResyncCkptLoc; BlockNumber mirrorBufpoolResyncCkptBlockNum; int64 mirrorAppendOnlyLossEof; int64 mirrorAppendOnlyNewEof; PersistentFileSysRelBufpoolKind relBufpoolKind; GpPersistentRelationNode_GetValues( values, &relFileNode.spcNode, &relFileNode.dbNode, &relFileNode.relNode, &segmentFileNum, &relationStorageManager, persistentState, &createMirrorDataLossTrackingSessionNum, mirrorExistenceState, &mirrorDataSynchronizationState, &mirrorBufpoolMarkedForScanIncrementalResync, &mirrorBufpoolResyncChangedPageCount, &mirrorBufpoolResyncCkptLoc, &mirrorBufpoolResyncCkptBlockNum, &mirrorAppendOnlyLossEof, &mirrorAppendOnlyNewEof, &relBufpoolKind, parentXid, persistentSerialNum); PersistentFileSysObjName_SetRelationFile( fsObjName, &relFileNode, segmentFileNum); } break; case PersistentFsObjType_DatabaseDir: { DbDirNode dbDirNode; GpPersistentDatabaseNode_GetValues( values, &dbDirNode.tablespace, &dbDirNode.database, persistentState, &createMirrorDataLossTrackingSessionNum, mirrorExistenceState, &reserved, parentXid, persistentSerialNum); PersistentFileSysObjName_SetDatabaseDir( fsObjName, dbDirNode.tablespace, dbDirNode.database); } break; case PersistentFsObjType_TablespaceDir: { Oid tablespaceOid; Oid filespaceOid; GpPersistentTablespaceNode_GetValues( values, &filespaceOid, &tablespaceOid, persistentState, &createMirrorDataLossTrackingSessionNum, mirrorExistenceState, &reserved, parentXid, persistentSerialNum); PersistentFileSysObjName_SetTablespaceDir( fsObjName, tablespaceOid); } break; case PersistentFsObjType_FilespaceDir: { Oid filespaceOid; int16 dbId1; char locationBlankPadded1[FilespaceLocationBlankPaddedWithNullTermLen]; int16 dbId2; char locationBlankPadded2[FilespaceLocationBlankPaddedWithNullTermLen]; GpPersistentFilespaceNode_GetValues( values, &filespaceOid, &dbId1, locationBlankPadded1, &dbId2, locationBlankPadded2, persistentState, &createMirrorDataLossTrackingSessionNum, mirrorExistenceState, &reserved, parentXid, persistentSerialNum); PersistentFileSysObjName_SetFilespaceDir( fsObjName, filespaceOid); } break; default: elog(ERROR, "Unexpected persistent file-system object type: %d", fsObjType); } }
void GpPersistent_GetCommonValues( PersistentFsObjType fsObjType, Datum *values, PersistentFileSysObjName *fsObjName, PersistentFileSysState *persistentState, TransactionId *parentXid, int64 *persistentSerialNum) { int32 reserved; ItemPointerData previousFreeTid; bool sharedStorage; switch (fsObjType) { case PersistentFsObjType_RelationFile: { RelFileNode relFileNode; int32 segmentFileNum; PersistentFileSysRelStorageMgr relationStorageManager; PersistentFileSysRelBufpoolKind relBufpoolKind; GpPersistentRelfileNode_GetValues( values, &relFileNode.spcNode, &relFileNode.dbNode, &relFileNode.relNode, &segmentFileNum, &relationStorageManager, persistentState, &relBufpoolKind, parentXid, persistentSerialNum, &previousFreeTid, &sharedStorage); PersistentFileSysObjName_SetRelationFile( fsObjName, &relFileNode, segmentFileNum, NULL); fsObjName->hasInited = true; fsObjName->sharedStorage = sharedStorage; } break; case PersistentFsObjType_RelationDir: { RelFileNode relFileNode; GpPersistentRelationNode_GetValues( values, &relFileNode.spcNode, &relFileNode.dbNode, &relFileNode.relNode, persistentState, &reserved, parentXid, persistentSerialNum, &previousFreeTid, &sharedStorage); PersistentFileSysObjName_SetRelationDir( fsObjName, &relFileNode, NULL); fsObjName->hasInited = true; fsObjName->sharedStorage = sharedStorage; } break; case PersistentFsObjType_DatabaseDir: { DbDirNode dbDirNode; GpPersistentDatabaseNode_GetValues( values, &dbDirNode.tablespace, &dbDirNode.database, persistentState, &reserved, parentXid, persistentSerialNum, &previousFreeTid, &sharedStorage); PersistentFileSysObjName_SetDatabaseDir( fsObjName, dbDirNode.tablespace, dbDirNode.database, NULL); fsObjName->hasInited = true; fsObjName->sharedStorage = sharedStorage; } break; case PersistentFsObjType_TablespaceDir: { Oid tablespaceOid; Oid filespaceOid; GpPersistentTablespaceNode_GetValues( values, &filespaceOid, &tablespaceOid, persistentState, &reserved, parentXid, persistentSerialNum, &previousFreeTid, &sharedStorage); PersistentFileSysObjName_SetTablespaceDir( fsObjName, tablespaceOid, NULL); fsObjName->hasInited = true; fsObjName->sharedStorage = sharedStorage; } break; case PersistentFsObjType_FilespaceDir: { Oid filespaceOid; int16 dbId1; char locationBlankPadded1[FilespaceLocationBlankPaddedWithNullTermLen]; GpPersistentFilespaceNode_GetValues( values, &filespaceOid, &dbId1, locationBlankPadded1, persistentState, &reserved, parentXid, persistentSerialNum, &previousFreeTid, &sharedStorage); PersistentFileSysObjName_SetFilespaceDir( fsObjName, filespaceOid, NULL); fsObjName->hasInited = true; fsObjName->sharedStorage = sharedStorage; } break; default: elog(ERROR, "Unexpected persistent file-system object type: %d", fsObjType); } }