@@ -8308,6 +8308,21 @@ pg_start_backup(PG_FUNCTION_ARGS)
8308
8308
text * backupid = PG_GETARG_TEXT_P (0 );
8309
8309
bool fast = PG_GETARG_BOOL (1 );
8310
8310
char * backupidstr ;
8311
+ XLogRecPtr startpoint ;
8312
+ char startxlogstr [MAXFNAMELEN ];
8313
+
8314
+ backupidstr = text_to_cstring (backupid );
8315
+
8316
+ startpoint = do_pg_start_backup (backupidstr , fast );
8317
+
8318
+ snprintf (startxlogstr , sizeof (startxlogstr ), "%X/%X" ,
8319
+ startpoint .xlogid , startpoint .xrecoff );
8320
+ PG_RETURN_TEXT_P (cstring_to_text (startxlogstr ));
8321
+ }
8322
+
8323
+ XLogRecPtr
8324
+ do_pg_start_backup (const char * backupidstr , bool fast )
8325
+ {
8311
8326
XLogRecPtr checkpointloc ;
8312
8327
XLogRecPtr startpoint ;
8313
8328
pg_time_t stamp_time ;
@@ -8335,8 +8350,6 @@ pg_start_backup(PG_FUNCTION_ARGS)
8335
8350
errmsg ("WAL level not sufficient for making an online backup" ),
8336
8351
errhint ("wal_level must be set to \"archive\" or \"hot_standby\" at server start." )));
8337
8352
8338
- backupidstr = text_to_cstring (backupid );
8339
-
8340
8353
/*
8341
8354
* Mark backup active in shared memory. We must do full-page WAL writes
8342
8355
* during an on-line backup even if not doing so at other times, because
@@ -8459,9 +8472,7 @@ pg_start_backup(PG_FUNCTION_ARGS)
8459
8472
/*
8460
8473
* We're done. As a convenience, return the starting WAL location.
8461
8474
*/
8462
- snprintf (xlogfilename , sizeof (xlogfilename ), "%X/%X" ,
8463
- startpoint .xlogid , startpoint .xrecoff );
8464
- PG_RETURN_TEXT_P (cstring_to_text (xlogfilename ));
8475
+ return startpoint ;
8465
8476
}
8466
8477
8467
8478
/* Error cleanup callback for pg_start_backup */
@@ -8489,6 +8500,19 @@ pg_start_backup_callback(int code, Datum arg)
8489
8500
*/
8490
8501
Datum
8491
8502
pg_stop_backup (PG_FUNCTION_ARGS )
8503
+ {
8504
+ XLogRecPtr stoppoint ;
8505
+ char stopxlogstr [MAXFNAMELEN ];
8506
+
8507
+ stoppoint = do_pg_stop_backup ();
8508
+
8509
+ snprintf (stopxlogstr , sizeof (stopxlogstr ), "%X/%X" ,
8510
+ stoppoint .xlogid , stoppoint .xrecoff );
8511
+ PG_RETURN_TEXT_P (cstring_to_text (stopxlogstr ));
8512
+ }
8513
+
8514
+ XLogRecPtr
8515
+ do_pg_stop_backup (void )
8492
8516
{
8493
8517
XLogRecPtr startpoint ;
8494
8518
XLogRecPtr stoppoint ;
@@ -8699,9 +8723,35 @@ pg_stop_backup(PG_FUNCTION_ARGS)
8699
8723
/*
8700
8724
* We're done. As a convenience, return the ending WAL location.
8701
8725
*/
8702
- snprintf (stopxlogfilename , sizeof (stopxlogfilename ), "%X/%X" ,
8703
- stoppoint .xlogid , stoppoint .xrecoff );
8704
- PG_RETURN_TEXT_P (cstring_to_text (stopxlogfilename ));
8726
+ return stoppoint ;
8727
+ }
8728
+
8729
+
8730
+ /*
8731
+ * do_pg_abort_backup: abort a running backup
8732
+ *
8733
+ * This does just the most basic steps of pg_stop_backup(), by taking the
8734
+ * system out of backup mode, thus making it a lot more safe to call from
8735
+ * an error handler.
8736
+ */
8737
+ void
8738
+ do_pg_abort_backup (void )
8739
+ {
8740
+ /*
8741
+ * OK to clear forcePageWrites
8742
+ */
8743
+ LWLockAcquire (WALInsertLock , LW_EXCLUSIVE );
8744
+ XLogCtl -> Insert .forcePageWrites = false;
8745
+ LWLockRelease (WALInsertLock );
8746
+
8747
+ /*
8748
+ * Remove backup label file
8749
+ */
8750
+ if (unlink (BACKUP_LABEL_FILE ) != 0 )
8751
+ ereport (ERROR ,
8752
+ (errcode_for_file_access (),
8753
+ errmsg ("could not remove file \"%s\": %m" ,
8754
+ BACKUP_LABEL_FILE )));
8705
8755
}
8706
8756
8707
8757
/*
0 commit comments