@@ -5431,11 +5431,21 @@ getRecordTimestamp(XLogRecord *record, TimestampTz *recordXtime)
5431
5431
* recordXtime = ((xl_xact_commit * ) XLogRecGetData (record ))-> xact_time ;
5432
5432
return true;
5433
5433
}
5434
+ if (record -> xl_rmid == RM_XACT_ID && record_info == XLOG_XACT_COMMIT_PREPARED )
5435
+ {
5436
+ * recordXtime = ((xl_xact_commit_prepared * ) XLogRecGetData (record ))-> crec .xact_time ;
5437
+ return true;
5438
+ }
5434
5439
if (record -> xl_rmid == RM_XACT_ID && record_info == XLOG_XACT_ABORT )
5435
5440
{
5436
5441
* recordXtime = ((xl_xact_abort * ) XLogRecGetData (record ))-> xact_time ;
5437
5442
return true;
5438
5443
}
5444
+ if (record -> xl_rmid == RM_XACT_ID && record_info == XLOG_XACT_ABORT_PREPARED )
5445
+ {
5446
+ * recordXtime = ((xl_xact_abort_prepared * ) XLogRecGetData (record ))-> arec .xact_time ;
5447
+ return true;
5448
+ }
5439
5449
return false;
5440
5450
}
5441
5451
@@ -5454,6 +5464,7 @@ recoveryStopsBefore(XLogRecord *record)
5454
5464
uint8 record_info ;
5455
5465
bool isCommit ;
5456
5466
TimestampTz recordXtime = 0 ;
5467
+ TransactionId recordXid ;
5457
5468
5458
5469
/* Check if we should stop as soon as reaching consistency */
5459
5470
if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE && reachedConsistency )
@@ -5472,10 +5483,27 @@ recoveryStopsBefore(XLogRecord *record)
5472
5483
if (record -> xl_rmid != RM_XACT_ID )
5473
5484
return false;
5474
5485
record_info = record -> xl_info & ~XLR_INFO_MASK ;
5486
+
5475
5487
if (record_info == XLOG_XACT_COMMIT_COMPACT || record_info == XLOG_XACT_COMMIT )
5488
+ {
5489
+ isCommit = true;
5490
+ recordXid = record -> xl_xid ;
5491
+ }
5492
+ if (record_info == XLOG_XACT_COMMIT_PREPARED )
5493
+ {
5476
5494
isCommit = true;
5495
+ recordXid = ((xl_xact_commit_prepared * ) XLogRecGetData (record ))-> xid ;
5496
+ }
5477
5497
else if (record_info == XLOG_XACT_ABORT )
5498
+ {
5499
+ isCommit = false;
5500
+ recordXid = record -> xl_xid ;
5501
+ }
5502
+ else if (record_info == XLOG_XACT_ABORT_PREPARED )
5503
+ {
5478
5504
isCommit = false;
5505
+ recordXid = ((xl_xact_abort_prepared * ) XLogRecGetData (record ))-> xid ;
5506
+ }
5479
5507
else
5480
5508
return false;
5481
5509
@@ -5490,7 +5518,7 @@ recoveryStopsBefore(XLogRecord *record)
5490
5518
* they complete. A higher numbered xid will complete before you about
5491
5519
* 50% of the time...
5492
5520
*/
5493
- stopsHere = (record -> xl_xid == recoveryTargetXid );
5521
+ stopsHere = (recordXid == recoveryTargetXid );
5494
5522
}
5495
5523
5496
5524
if (recoveryTarget == RECOVERY_TARGET_TIME &&
@@ -5510,7 +5538,7 @@ recoveryStopsBefore(XLogRecord *record)
5510
5538
if (stopsHere )
5511
5539
{
5512
5540
recoveryStopAfter = false;
5513
- recoveryStopXid = record -> xl_xid ;
5541
+ recoveryStopXid = recordXid ;
5514
5542
recoveryStopTime = recordXtime ;
5515
5543
recoveryStopName [0 ] = '\0' ;
5516
5544
@@ -5576,12 +5604,24 @@ recoveryStopsAfter(XLogRecord *record)
5576
5604
if (record -> xl_rmid == RM_XACT_ID &&
5577
5605
(record_info == XLOG_XACT_COMMIT_COMPACT ||
5578
5606
record_info == XLOG_XACT_COMMIT ||
5579
- record_info == XLOG_XACT_ABORT ))
5607
+ record_info == XLOG_XACT_COMMIT_PREPARED ||
5608
+ record_info == XLOG_XACT_ABORT ||
5609
+ record_info == XLOG_XACT_ABORT_PREPARED ))
5580
5610
{
5611
+ TransactionId recordXid ;
5612
+
5581
5613
/* Update the last applied transaction timestamp */
5582
5614
if (getRecordTimestamp (record , & recordXtime ))
5583
5615
SetLatestXTime (recordXtime );
5584
5616
5617
+ /* Extract the XID of the committed/aborted transaction */
5618
+ if (record_info == XLOG_XACT_COMMIT_PREPARED )
5619
+ recordXid = ((xl_xact_commit_prepared * ) XLogRecGetData (record ))-> xid ;
5620
+ else if (record_info == XLOG_XACT_ABORT_PREPARED )
5621
+ recordXid = ((xl_xact_abort_prepared * ) XLogRecGetData (record ))-> xid ;
5622
+ else
5623
+ recordXid = record -> xl_xid ;
5624
+
5585
5625
/*
5586
5626
* There can be only one transaction end record with this exact
5587
5627
* transactionid
@@ -5592,21 +5632,24 @@ recoveryStopsAfter(XLogRecord *record)
5592
5632
* 50% of the time...
5593
5633
*/
5594
5634
if (recoveryTarget == RECOVERY_TARGET_XID && recoveryTargetInclusive &&
5595
- record -> xl_xid == recoveryTargetXid )
5635
+ recordXid == recoveryTargetXid )
5596
5636
{
5597
5637
recoveryStopAfter = true;
5598
- recoveryStopXid = record -> xl_xid ;
5638
+ recoveryStopXid = recordXid ;
5599
5639
recoveryStopTime = recordXtime ;
5600
5640
recoveryStopName [0 ] = '\0' ;
5601
5641
5602
- if (record_info == XLOG_XACT_COMMIT_COMPACT || record_info == XLOG_XACT_COMMIT )
5642
+ if (record_info == XLOG_XACT_COMMIT_COMPACT ||
5643
+ record_info == XLOG_XACT_COMMIT ||
5644
+ record_info == XLOG_XACT_COMMIT_PREPARED )
5603
5645
{
5604
5646
ereport (LOG ,
5605
5647
(errmsg ("recovery stopping after commit of transaction %u, time %s" ,
5606
5648
recoveryStopXid ,
5607
5649
timestamptz_to_str (recoveryStopTime ))));
5608
5650
}
5609
- else if (record_info == XLOG_XACT_ABORT )
5651
+ else if (record_info == XLOG_XACT_ABORT ||
5652
+ record_info == XLOG_XACT_ABORT_PREPARED )
5610
5653
{
5611
5654
ereport (LOG ,
5612
5655
(errmsg ("recovery stopping after abort of transaction %u, time %s" ,
@@ -5719,7 +5762,8 @@ recoveryApplyDelay(XLogRecord *record)
5719
5762
record_info = record -> xl_info & ~XLR_INFO_MASK ;
5720
5763
if (!(record -> xl_rmid == RM_XACT_ID &&
5721
5764
(record_info == XLOG_XACT_COMMIT_COMPACT ||
5722
- record_info == XLOG_XACT_COMMIT )))
5765
+ record_info == XLOG_XACT_COMMIT ||
5766
+ record_info == XLOG_XACT_COMMIT_PREPARED )))
5723
5767
return false;
5724
5768
5725
5769
if (!getRecordTimestamp (record , & xtime ))
0 commit comments