bool ChangeTracking_PrintRelationChangeInfo( RmgrId xl_rmid, uint8 xl_info, void *data, XLogRecPtr *loc, bool weAreGeneratingXLogNow, bool printSkipIssuesOnly) { bool atLeastOneSkipIssue = false; int relationChangeInfoArrayCount; int i; int arrlen = ChangeTracking_GetInfoArrayDesiredMaxLength(xl_rmid, xl_info); RelationChangeInfo relationChangeInfoArray[arrlen]; ChangeTracking_GetRelationChangeInfoFromXlog( xl_rmid, xl_info, data, relationChangeInfoArray, &relationChangeInfoArrayCount, arrlen); for (i = 0; i < relationChangeInfoArrayCount; i++) { RelationChangeInfo *relationChangeInfo; int64 maxPersistentSerialNum; bool skip; bool zeroTid = false; bool invalidTid = false; bool zeroSerialNum = false; bool invalidSerialNum = false; bool skipIssue = false; relationChangeInfo = &relationChangeInfoArray[i]; if (weAreGeneratingXLogNow) maxPersistentSerialNum = PersistentRelfile_MyHighestSerialNum(); else maxPersistentSerialNum = PersistentRelfile_CurrentMaxSerialNum(); skip = GpPersistent_SkipXLogInfo(relationChangeInfo->relFileNode.relNode); if (!skip) { zeroTid = PersistentStore_IsZeroTid(&relationChangeInfo->persistentTid); if (!zeroTid) invalidTid = !ItemPointerIsValid(&relationChangeInfo->persistentTid); zeroSerialNum = (relationChangeInfo->persistentSerialNum == 0); if (!zeroSerialNum) { invalidSerialNum = (relationChangeInfo->persistentSerialNum < 0); /* * If we have'nt done the scan yet... do not do upper range check. */ if (maxPersistentSerialNum != 0 && relationChangeInfo->persistentSerialNum > maxPersistentSerialNum) invalidSerialNum = true; } skipIssue = (zeroTid || invalidTid || zeroSerialNum || invalidSerialNum); } if (!printSkipIssuesOnly || skipIssue) elog(LOG, "ChangeTracking_PrintRelationChangeInfo: [%d] xl_rmid %d, xl_info 0x%X, %u/%u/%u, block number %u, LSN %s, persistent serial num " INT64_FORMAT ", TID %s, maxPersistentSerialNum " INT64_FORMAT ", skip %s, zeroTid %s, invalidTid %s, zeroSerialNum %s, invalidSerialNum %s, skipIssue %s", i, xl_rmid, xl_info, relationChangeInfo->relFileNode.spcNode, relationChangeInfo->relFileNode.dbNode, relationChangeInfo->relFileNode.relNode, relationChangeInfo->blockNumber, XLogLocationToString(loc), relationChangeInfo->persistentSerialNum, ItemPointerToString(&relationChangeInfo->persistentTid), maxPersistentSerialNum, (skip ? "true" : "false"), (zeroTid ? "true" : "false"), (invalidTid ? "true" : "false"), (zeroSerialNum ? "true" : "false"), (invalidSerialNum ? "true" : "false"), (skipIssue ? "true" : "false")); if (skipIssue) atLeastOneSkipIssue = true; } return atLeastOneSkipIssue; }
void PersistentRelation_MarkBufPoolRelationForScanIncrementalResync( RelFileNode *relFileNode, /* The tablespace, database, and relation OIDs for the created relation. */ ItemPointer persistentTid, /* TID of the gp_persistent_rel_files tuple for the relation. */ int64 persistentSerialNum) /* Serial number for the relation. Distinquishes the uses of the tuple. */ { PersistentFileSysObjName fsObjName; if(RelFileNode_IsEmpty(relFileNode)) elog(ERROR, "Invalid RelFileNode (0,0,0)"); if (GpPersistent_SkipXLogInfo(relFileNode->relNode)) { if (Debug_persistent_print) elog(Persistent_DebugPrintLevel(), "Skipping persistent relation '%s' because it is special", relpath(*relFileNode)); return; // Resynchronize will always handle these relations as 'Scan Incremental'.. } if (IsBootstrapProcessingMode()) { if (Debug_persistent_print) elog(Persistent_DebugPrintLevel(), "Skipping persistent relation '%s' because we are in bootstrap mode", relpath(*relFileNode)); return; // The initdb process will load the persistent table once we out of bootstrap mode. } if (Persistent_BeforePersistenceWork()) { if (Debug_persistent_print) elog(Persistent_DebugPrintLevel(), "Skipping persistent relation '%s' because we are before persistence work", relpath(*relFileNode)); return; // The initdb process will load the persistent table once we out of bootstrap mode. } PersistentRelation_VerifyInitScan(); PersistentFileSysObjName_SetRelationFile( &fsObjName, relFileNode, /* segmentFileNum */ 0); // Do this check after skipping out if in bootstrap mode. if (PersistentStore_IsZeroTid(persistentTid)) elog(ERROR, "TID for persistent '%s' tuple for mark physically truncated is invalid (0,0)", PersistentFileSysObjName_TypeAndObjectName(&fsObjName)); if (persistentSerialNum == 0) elog(ERROR, "Persistent '%s' serial number for mark physcially truncated is invalid (0)", PersistentFileSysObjName_TypeAndObjectName(&fsObjName)); PersistentFileSysObj_MarkBufPoolRelationForScanIncrementalResync( &fsObjName, persistentTid, persistentSerialNum, /* flushToXlog */ true); if (Debug_persistent_print) elog(Persistent_DebugPrintLevel(), "Persistent relation: '%s' marked physically truncated, serial number " INT64_FORMAT " at TID %s", PersistentFileSysObjName_ObjectName(&fsObjName), persistentSerialNum, ItemPointerToString(persistentTid)); }