1
0
mirror of https://github.com/postgrespro/pg_probackup.git synced 2025-07-16 07:14:15 +02:00

if WAL segment required to create pagemap is absent, throw an ERROR

This commit is contained in:
Anastasia
2017-05-23 20:51:58 +03:00
parent 8c74cf7cb3
commit 0dba271511
2 changed files with 35 additions and 17 deletions

View File

@ -123,6 +123,7 @@ extractPageMap(const char *archivedir, XLogRecPtr startpoint, TimeLineID tli,
do
{
record = XLogReadRecord(xlogreader, startpoint, &errormsg);
if (record == NULL)
{
XLogRecPtr errptr;
@ -130,12 +131,23 @@ extractPageMap(const char *archivedir, XLogRecPtr startpoint, TimeLineID tli,
errptr = startpoint ? startpoint : xlogreader->EndRecPtr;
if (errormsg)
elog(ERROR, "could not read WAL record at %X/%X: %s",
elog(WARNING, "could not read WAL record at %X/%X: %s",
(uint32) (errptr >> 32), (uint32) (errptr),
errormsg);
else
elog(ERROR, "could not read WAL record at %X/%X",
elog(WARNING, "could not read WAL record at %X/%X",
(uint32) (errptr >> 32), (uint32) (errptr));
/*
* If we don't have all WAL files from prev backup start_lsn to current
* start_lsn, we won't be able to build page map and PAGE backup will
* be incorrect. Stop it and throw an error.
*/
if (!xlogexists)
elog(ERROR, "WAL segment \"%s\" is absent", xlogfpath);
else if (xlogreadfd != -1)
elog(ERROR, "Possible WAL CORRUPTION."
"Error has occured during reading WAL segment \"%s\"", xlogfpath);
}
extractPageInfo(xlogreader);
@ -143,7 +155,6 @@ extractPageMap(const char *archivedir, XLogRecPtr startpoint, TimeLineID tli,
startpoint = InvalidXLogRecPtr; /* continue reading at next record */
XLByteToSeg(xlogreader->EndRecPtr, nextSegNo);
} while (nextSegNo <= endSegNo && xlogreader->EndRecPtr != endpoint);
XLogReaderFree(xlogreader);
@ -228,6 +239,8 @@ validate_wal(pgBackup *backup,
startpoint = InvalidXLogRecPtr; /* continue reading at next record */
}
/* TODO Add comment */
if (last_time > 0)
time2iso(last_timestamp, lengthof(last_timestamp),
timestamptz_to_time_t(last_time));
@ -237,33 +250,37 @@ validate_wal(pgBackup *backup,
if (last_xid == InvalidTransactionId)
last_xid = backup->recovery_xid;
/* There are all need WAL records */
/* There are all needed WAL records */
if (all_wal)
elog(INFO, "backup validation completed successfully on time %s and xid " XID_FMT,
last_timestamp, last_xid);
/* There are not need WAL records */
/* Some needed WAL records are absent */
else
{
if (xlogfpath[0] != 0)
{
/* Update backup status */
backup->status = BACKUP_STATUS_CORRUPT;
pgBackupWriteBackupControlFile(backup);
/* XLOG reader couldnt read WAL segment */
/* XLOG reader couldn't read WAL segment.
* We throw a WARNING here to be able to update backup status below.
*/
if (!xlogexists)
{
elog(WARNING, "WAL segment \"%s\" is absent", xlogfpath);
}
else if (xlogreadfd != -1)
elog(ERROR, "Possible WAL CORRUPTION."
"Error has occured during reading WAL segment \"%s\"", xlogfpath);
{
elog(WARNING, "Possible WAL CORRUPTION."
"Error has occured during reading WAL segment \"%s\"", xlogfpath);
}
}
if (!got_endpoint)
{
/* Update backup status */
/*
* If we don't have WAL between start_lsn and stop_lsn,
* the backup is definitely corrupted. Update its status.
*/
backup->status = BACKUP_STATUS_CORRUPT;
pgBackupWriteBackupControlFile(backup);
elog(ERROR, "there are not enough WAL records to restore from %X/%X to %X/%X",
(uint32) (backup->start_lsn >> 32),
(uint32) (backup->start_lsn),

View File

@ -17,8 +17,8 @@ class ValidateTest(ProbackupTest, unittest.TestCase):
def tearDownClass(cls):
stop_all()
# @unittest.skip("skip")
# @unittest.expectedFailure
#@unittest.skip("skip")
#@unittest.expectedFailure
def test_validate_wal_unreal_values(self):
"""recovery to latest from full backup"""
fname = self.id().split('.')[3]
@ -177,6 +177,7 @@ class ValidateTest(ProbackupTest, unittest.TestCase):
self.assertEqual('CORRUPT', self.show_pb(node, id=backup_id)['status'], 'Backup STATUS should be "CORRUPT"')
node.stop()
@unittest.skip("skip")
def test_validate_wal_lost_segment_1(self):
"""Loose segment which belong to some backup"""
fname = self.id().split('.')[3]
@ -245,5 +246,5 @@ class ValidateTest(ProbackupTest, unittest.TestCase):
self.backup_pb(node, backup_type='page')
self.assertEqual(1, 0, "Expecting Error in PAGE backup because of wal segment disappearance")
except ProbackupException, e:
self.assertEqual(True, 'could not read WAL record' in e.message)
self.assertEqual(True, 'is absent' in e.message)
node.stop()