void DtxContextInfo_CreateOnMaster(DtxContextInfo *dtxContextInfo, DistributedSnapshotWithLocalMapping *dslm, CommandId curcid, int txnOptions) { int i; DtxContextInfo_Reset(dtxContextInfo); dtxContextInfo->distributedXid = getDistributedTransactionId(); if (dtxContextInfo->distributedXid != InvalidDistributedTransactionId) { if (syncCacheXid == dtxContextInfo->distributedXid) dtxContextInfo->segmateSync = ++syncCount; else { syncCacheXid = dtxContextInfo->distributedXid; dtxContextInfo->segmateSync = syncCount = 1; } dtxContextInfo->distributedTimeStamp = getDtxStartTime(); getDistributedTransactionIdentifier(dtxContextInfo->distributedId); dtxContextInfo->curcid = curcid; } else { elog((Debug_print_full_dtm ? LOG : DEBUG5), "DtxContextInfo_CreateOnMaster Gp_role is DISPATCH and distributed transaction is InvalidDistributedTransactionId"); syncCacheXid = dtxContextInfo->distributedXid; dtxContextInfo->segmateSync = syncCount = 1; } dtxContextInfo->nestingLevel = GetCurrentTransactionNestLevel(); elog((Debug_print_full_dtm ? LOG : DEBUG5), "DtxContextInfo_CreateOnMaster: created dtxcontext with dxid %u/%u nestingLevel %d segmateSync %u/%u (current/cached)", dtxContextInfo->distributedXid, syncCacheXid, dtxContextInfo->nestingLevel, dtxContextInfo->segmateSync, syncCount); if (dslm == NULL) dtxContextInfo->haveDistributedSnapshot = false; else { DtxContextInfo_CopyDistributedSnapshot(&dtxContextInfo->distributedSnapshot, dslm); dtxContextInfo->haveDistributedSnapshot = true; } dtxContextInfo->distributedTxnOptions = txnOptions; if (DEBUG5 >= log_min_messages || Debug_print_full_dtm) { char gid[TMGIDSIZE]; DistributedSnapshot *ds = &dtxContextInfo->distributedSnapshot; if (!getDistributedTransactionIdentifier(gid)) memcpy(gid, "<empty>", 8); elog((Debug_print_full_dtm ? LOG : DEBUG5), "DtxContextInfo_CreateOnMaster Gp_role is DISPATCH and have currentGxact = %s, gxid = %u --> have distributed snapshot", gid, getDistributedTransactionId()); elog((Debug_print_full_dtm ? LOG : DEBUG5), "DtxContextInfo_CreateOnMaster distributedXid = %u, " "distributedSnapshotHeader (xminAllDistributedSnapshots %u, xmin = %u, xmax = %u, count = %d, maxCount %d)", dtxContextInfo->distributedXid, ds->header.xminAllDistributedSnapshots, ds->header.xmin, ds->header.xmax, ds->header.count, ds->header.maxCount); for (i = 0; i < ds->header.count; i++) { elog((Debug_print_full_dtm ? LOG : DEBUG5), ".... distributedSnapshotData->xip[%d] = %u", i, ds->inProgressXidArray[i]); } elog((Debug_print_full_dtm ? LOG : DEBUG5), "DtxContextInfo_CreateOnMaster curcid = %u", dtxContextInfo->curcid); elog((Debug_print_full_dtm ? LOG : DEBUG5), "DtxContextInfo_CreateOnMaster txnOptions = 0x%x, needTwoPhase = %s, explicitBegin = %s, isoLevel = %s, readOnly = %s.", txnOptions, (isMppTxOptions_NeedTwoPhase(txnOptions) ? "true" : "false"), (isMppTxOptions_ExplicitBegin(txnOptions) ? "true" : "false"), IsoLevelAsUpperString(mppTxOptions_IsoLevel(txnOptions)), (isMppTxOptions_ReadOnly(txnOptions) ? "true" : "false")); } }
int smgrGetAppendOnlyMirrorResyncEofs(EndXactRecKind endXactRecKind, PersistentEndXactAppendOnlyMirrorResyncEofs **ptr) { int nestLevel = GetCurrentTransactionNestLevel(); int nentries; PersistentEndXactAppendOnlyMirrorResyncEofs *rptr; HASH_SEQ_STATUS iterateStatus; AppendOnlyMirrorResyncEofs *entry; int entryIndex; if (endXactRecKind == EndXactRecKind_Abort) { /* * No Append-Only Mirror Resync EOF information needed on abort. */ *ptr = NULL; return 0; } nentries = 0; if (AppendOnlyMirrorResyncEofsTable != NULL) { hash_seq_init(&iterateStatus, AppendOnlyMirrorResyncEofsTable); while ((entry = hash_seq_search(&iterateStatus)) != NULL) { if (entry->key.nestLevel >= nestLevel) nentries++; } } if (nentries == 0) { *ptr = NULL; return 0; } if (Debug_persistent_print || Debug_persistent_appendonly_commit_count_print) elog(Persistent_DebugPrintLevel(), "Storage Manager: Get Append-Only mirror resync eofs list entries (current transaction nest level %d, Append-Only commit work system count %d)", nestLevel, FileRepPrimary_GetAppendOnlyCommitWorkCount()); rptr = (PersistentEndXactAppendOnlyMirrorResyncEofs *) palloc(nentries * sizeof(PersistentEndXactAppendOnlyMirrorResyncEofs)); *ptr = rptr; entryIndex = 0; hash_seq_init(&iterateStatus, AppendOnlyMirrorResyncEofsTable); while ((entry = hash_seq_search(&iterateStatus)) != NULL) { MIRRORED_LOCK_DECLARE; bool returned; int resultSystemAppendOnlyCommitCount; returned = false; if (entry->key.nestLevel >= nestLevel) { MIRRORED_LOCK; MirroredAppendOnly_EndXactCatchup(entryIndex, &entry->key.relFileNode, entry->key.segmentFileNum, entry->key.nestLevel, entry->relationName, &entry->persistentTid, entry->persistentSerialNum, &mirroredLockLocalVars, entry->mirrorCatchupRequired, entry->mirrorDataLossTrackingState, entry->mirrorDataLossTrackingSessionNum, entry->mirrorNewEof); /* * See if the mirror situation for this Append-Only segment file * has changed since we flushed it to disk. */ rptr->relFileNode = entry->key.relFileNode; rptr->segmentFileNum = entry->key.segmentFileNum; rptr->persistentTid = entry->persistentTid; rptr->persistentSerialNum = entry->persistentSerialNum; if (entry->mirrorCatchupRequired) { rptr->mirrorLossEof = INT64CONST(-1); } else { rptr->mirrorLossEof = entry->mirrorNewEof; } rptr->mirrorNewEof = entry->mirrorNewEof; rptr++; returned = true; START_CRIT_SECTION(); LWLockAcquire(FileRepAppendOnlyCommitCountLock, LW_EXCLUSIVE); resultSystemAppendOnlyCommitCount = FileRepPrimary_IntentAppendOnlyCommitWork(); /* Set this inside the Critical Section. */ entry->didIncrementCommitCount = true; if (endXactRecKind == EndXactRecKind_Prepare) { char gid[TMGIDSIZE]; if (!getDistributedTransactionIdentifier(gid)) elog(ERROR, "Unable to obtain gid during prepare"); PrepareIntentAppendOnlyCommitWork(gid); entry->isDistributedTransaction = true; memcpy(entry->gid, gid, TMGIDSIZE); } pendingAppendOnlyMirrorResyncIntentCount++; } else { MIRRORED_LOCK; START_CRIT_SECTION(); LWLockAcquire(FileRepAppendOnlyCommitCountLock, LW_EXCLUSIVE); resultSystemAppendOnlyCommitCount = FileRepPrimary_GetAppendOnlyCommitWorkCount(); } if (Debug_persistent_print || Debug_persistent_appendonly_commit_count_print) { if (entry->relationName == NULL) elog(Persistent_DebugPrintLevel(), "Storage Manager: Get Append-Only mirror resync eofs list entry #%d: %u/%u/%u, segment file #%d " "(returned %s, result system Append-Only commit count %d, transaction nest level %d, persistent TID %s, persistent serial number " INT64_FORMAT ", mirror catchup required %s, mirror new EOF " INT64_FORMAT ")", entryIndex, entry->key.relFileNode.spcNode, entry->key.relFileNode.dbNode, entry->key.relFileNode.relNode, entry->key.segmentFileNum, (returned ? "true" : "false"), resultSystemAppendOnlyCommitCount, entry->key.nestLevel, ItemPointerToString(&entry->persistentTid), entry->persistentSerialNum, (entry->mirrorCatchupRequired ? "true" : "false"), entry->mirrorNewEof); else elog(Persistent_DebugPrintLevel(), "Storage Manager: Get Append-Only mirror resync eofs list entry #%d: %u/%u/%u, segment file #%d, relation name '%s' " "(returned %s, result system Append-Only commit count %d, transaction nest level %d, persistent TID %s, persistent serial number " INT64_FORMAT ", mirror catchup required %s, mirror new EOF " INT64_FORMAT ")", entryIndex, entry->key.relFileNode.spcNode, entry->key.relFileNode.dbNode, entry->key.relFileNode.relNode, entry->key.segmentFileNum, entry->relationName, (returned ? "true" : "false"), resultSystemAppendOnlyCommitCount, entry->key.nestLevel, ItemPointerToString(&entry->persistentTid), entry->persistentSerialNum, (entry->mirrorCatchupRequired ? "true" : "false"), entry->mirrorNewEof); } LWLockRelease(FileRepAppendOnlyCommitCountLock); END_CRIT_SECTION(); MIRRORED_UNLOCK; entryIndex++; } return nentries; }