* We need to mark our XIDs as committed in pg_clog. This is where we
* durably commit.
*/
- latestXid = RecordTransactionCommit();
+#ifdef XCP
+ if (!IsConnFromDatanode())
+#endif
+ latestXid = RecordTransactionCommit();
}
else
{
* record.
*/
if (!is_parallel_worker)
- latestXid = RecordTransactionAbort(false);
+ {
+#ifdef XCP
+ if (!IsConnFromDatanode())
+#endif
+ latestXid = RecordTransactionAbort(false);
+ }
else
{
latestXid = InvalidTransactionId;
TransactionState s = CurrentTransactionState;
Assert(!GlobalTransactionIdIsValid(s->transactionId) ||
GlobalTransactionIdEquals(s->transactionId, xid));
- XactTopTransactionId = s->transactionId = xid;
- elog(DEBUG2, "Assigning XID received from the remote node - %d", xid);
+
+ if (!IsConnFromDatanode())
+ {
+ XactTopTransactionId = s->transactionId = xid;
+ elog(DEBUG2, "Assigning XID received from the remote node - %d", xid);
+ }
+ else if (!TransactionIdIsValid(GetNextTransactionId()))
+ {
+ SetNextTransactionId(xid);
+ if (whereToSendOutput == DestRemote)
+ pq_putmessage('x', (const char *) &xid, sizeof (GlobalTransactionId));
+ }
}
#endif
#endif
if (conn->ck_resp_rollback)
{
conn->ck_resp_rollback = false;
+
+ if (conn->state != DN_CONNECTION_STATE_IDLE)
+ {
+ ereport(WARNING,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("Error while PREPARING transaction %s on "
+ "node %s. Administrative action may be required "
+ "to abort this transaction on the node",
+ prepareGID, conn->nodename)));
+ continue;
+ }
+
/* sanity checks */
Assert(conn->sock != NO_SOCKET);
- Assert(conn->state == DN_CONNECTION_STATE_IDLE);
/* Send down abort prepared command */
if (pgxc_node_send_gxid(conn, auxXid))
{
if (conn->ck_resp_rollback)
{
conn->ck_resp_rollback = false;
+
+ if (conn->state != DN_CONNECTION_STATE_IDLE)
+ {
+ ereport(WARNING,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("Error while PREPARING transaction %s on "
+ "node %s. Administrative action may be required "
+ "to abort this transaction on the node",
+ prepareGID, conn->nodename)));
+ continue;
+ }
+
/* sanity checks */
Assert(conn->sock != NO_SOCKET);
- Assert(conn->state == DN_CONNECTION_STATE_IDLE);
/* Send down abort prepared command */
if (pgxc_node_send_gxid(conn, auxXid))
{
* anyone else's calculation of a snapshot. We might change their
* estimate of global xmin, but that's OK.
*/
+#ifdef XCP
+ if (IsConnFromDatanode())
+ allPgXact[proc->pgprocno].xid = InvalidTransactionId;
+#endif
Assert(!TransactionIdIsValid(allPgXact[proc->pgprocno].xid));
proc->lxid = InvalidLocalTransactionId;
void
ProcArrayCheckXminConsistency(TransactionId global_xmin)
{
- ProcArrayStruct *arrayP = procArray;
+ volatile ProcArrayStruct *arrayP = procArray;
int index;
for (index = 0; index < arrayP->numProcs; index++)