Skip to content

Commit 356ebd3

Browse files
committed
Add checksums database support.
1 parent 6cb6b3a commit 356ebd3

File tree

6 files changed

+34
-3
lines changed

6 files changed

+34
-3
lines changed

backup.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ do_backup(pgBackupOption bkupopt)
461461
current.wal_block_size = XLOG_BLCKSZ;
462462
current.recovery_xid = 0;
463463
current.recovery_time = (time_t) 0;
464+
current.checksum_version = get_data_checksum_version(true);
464465

465466
/* create backup directory and backup.ini */
466467
if (!check)

catalog.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ pgBackupWriteResultSection(FILE *out, pgBackup *backup)
329329
backup->data_bytes);
330330
fprintf(out, "BLOCK_SIZE=%u\n", backup->block_size);
331331
fprintf(out, "XLOG_BLOCK_SIZE=%u\n", backup->wal_block_size);
332+
fprintf(out, "CHECKSUM_VERSION=%u\n", backup->checksum_version);
332333

333334
fprintf(out, "STATUS=%s\n", status2str(backup->status));
334335
}
@@ -383,6 +384,7 @@ catalog_read_ini(const char *path)
383384
{ 'I', 0, "data-bytes" , NULL, SOURCE_ENV },
384385
{ 'u', 0, "block-size" , NULL, SOURCE_ENV },
385386
{ 'u', 0, "xlog-block-size" , NULL, SOURCE_ENV },
387+
{ 'u', 0, "checksum_version" , NULL, SOURCE_ENV },
386388
{ 's', 0, "status" , NULL, SOURCE_ENV },
387389
{ 0 }
388390
};
@@ -405,6 +407,7 @@ catalog_read_ini(const char *path)
405407
options[i++].var = &backup->data_bytes;
406408
options[i++].var = &backup->block_size;
407409
options[i++].var = &backup->wal_block_size;
410+
options[i++].var = &backup->checksum_version;
408411
options[i++].var = &status;
409412
Assert(i == lengthof(options) - 1);
410413

data.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "libpq/pqsignal.h"
1818
#include "storage/block.h"
1919
#include "storage/bufpage.h"
20+
#include "storage/checksum_impl.h"
2021

2122
typedef struct BackupPageHeader
2223
{
@@ -299,7 +300,8 @@ backup_data_file(const char *from_root, const char *to_root,
299300
void
300301
restore_data_file(const char *from_root,
301302
const char *to_root,
302-
pgFile *file)
303+
pgFile *file,
304+
pgBackup *backup)
303305
{
304306
char to_path[MAXPGPATH];
305307
FILE *in;
@@ -386,6 +388,10 @@ restore_data_file(const char *from_root,
386388
blknum, file->path, strerror(errno));
387389
}
388390

391+
/* update checksum because we are not save whole */
392+
if(backup->checksum_version)
393+
((PageHeader) page.data)->pd_checksum = pg_checksum_page(page.data, header.block);
394+
389395
/*
390396
* Seek and write the restored page. Backup might have holes in
391397
* differential backups.

pg_arman.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "datapagemap.h"
2424
#include "storage/bufpage.h"
2525
#include "storage/block.h"
26+
#include "storage/checksum.h"
2627

2728
/* Query to fetch current transaction ID */
2829
#define TXID_CURRENT_SQL "SELECT txid_current();"
@@ -140,6 +141,7 @@ typedef struct pgBackup
140141
/* data/wal block size for compatibility check */
141142
uint32 block_size;
142143
uint32 wal_block_size;
144+
uint32 checksum_version;
143145
} pgBackup;
144146

145147
typedef struct pgBackupOption
@@ -288,7 +290,7 @@ extern int pgFileCompareMtimeDesc(const void *f1, const void *f2);
288290
extern bool backup_data_file(const char *from_root, const char *to_root,
289291
pgFile *file, const XLogRecPtr *lsn);
290292
extern void restore_data_file(const char *from_root, const char *to_root,
291-
pgFile *file);
293+
pgFile *file, pgBackup *backup);
292294
extern bool copy_file(const char *from_root, const char *to_root,
293295
pgFile *file);
294296

@@ -306,6 +308,7 @@ extern const char *status2str(BackupStatus status);
306308
extern void remove_trailing_space(char *buf, int comment_mark);
307309
extern void remove_not_digit(char *buf, size_t len, const char *str);
308310
extern XLogRecPtr get_last_ptrack_lsn(void);
311+
extern uint32 get_data_checksum_version(bool safe);
309312

310313
/* in status.c */
311314
extern bool is_pg_running(void);

restore.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ restore_files(void *arg)
437437

438438
/* restore file */
439439
if (!check)
440-
restore_data_file(from_root, pgdata, file);
440+
restore_data_file(from_root, pgdata, file, arguments->backup);
441441

442442
/* print size of restored file */
443443
if (!check)

util.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,24 @@ get_current_timeline(bool safe)
111111
return ControlFile.checkPointCopy.ThisTimeLineID;
112112
}
113113

114+
uint32
115+
get_data_checksum_version(bool safe)
116+
{
117+
ControlFileData ControlFile;
118+
char *buffer;
119+
size_t size;
120+
121+
/* First fetch file... */
122+
buffer = slurpFile(pgdata, "global/pg_control", &size, safe);
123+
if (buffer == NULL)
124+
return 0;
125+
digestControlFile(&ControlFile, buffer, size);
126+
pg_free(buffer);
127+
128+
return ControlFile.data_checksum_version;
129+
}
130+
131+
114132
/*
115133
* Convert time_t value to ISO-8601 format string
116134
*/

0 commit comments

Comments
 (0)