Skip to content

Commit c363de2

Browse files
committed
Merge branch 'release_2_4' into issue_205
2 parents 1475a5d + bc8b26a commit c363de2

File tree

10 files changed

+100
-80
lines changed

10 files changed

+100
-80
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
[![Build Status](https://travis-ci.com/postgrespro/pg_probackup.svg?branch=master)](https://travis-ci.com/postgrespro/pg_probackup)
2+
[![GitHub release](https://img.shields.io/github/v/release/postgrespro/pg_probackup?include_prereleases)](https://github.com/postgrespro/pg_probackup/releases/latest)
23

34
# pg_probackup
45

doc/pgprobackup.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,20 +1168,20 @@ CREATE EXTENSION ptrack;
11681168
</listitem>
11691169
<listitem>
11701170
<para>
1171-
To enable tracking page updates, set <varname>ptrack_map_size</varname>
1171+
To enable tracking page updates, set <varname>ptrack.map_size</varname>
11721172
parameter to a positive integer and restart the server.
11731173
</para>
11741174
<para>
11751175
For optimal performance, it is recommended to set
1176-
<varname>ptrack_map_size</varname> to
1176+
<varname>ptrack.map_size</varname> to
11771177
<literal><replaceable>N</replaceable> / 1024</literal>, where
11781178
<replaceable>N</replaceable> is the size of the
11791179
<productname>PostgreSQL</productname> cluster, in MB. If you set this
11801180
parameter to a lower value, PTRACK is more likely to map several blocks
11811181
together, which leads to false-positive results when tracking changed
11821182
blocks and increases the incremental backup size as unchanged blocks
11831183
can also be copied into the incremental backup.
1184-
Setting <varname>ptrack_map_size</varname> to a higher value
1184+
Setting <varname>ptrack.map_size</varname> to a higher value
11851185
does not affect PTRACK operation. The maximum allowed value is 1024.
11861186
</para>
11871187
</listitem>
@@ -1201,11 +1201,11 @@ GRANT EXECUTE ON FUNCTION pg_ptrack_get_block(oid, oid, oid, bigint) TO backup;
12011201

12021202
<note>
12031203
<para>
1204-
If you change the <varname>ptrack_map_size</varname> parameter value,
1204+
If you change the <varname>ptrack.map_size</varname> parameter value,
12051205
the previously created PTRACK map file is cleared,
12061206
and tracking newly changed blocks starts from scratch. Thus, you have
12071207
to retake a full backup before taking incremental PTRACK backups after
1208-
changing <varname>ptrack_map_size</varname>.
1208+
changing <varname>ptrack.map_size</varname>.
12091209
</para>
12101210
</note>
12111211

src/backup.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -435,10 +435,11 @@ do_backup_instance(PGconn *backup_conn, PGNodeInfo *nodeInfo, bool no_sync)
435435
/*
436436
* Build the page map from ptrack information.
437437
*/
438-
if (nodeInfo->ptrack_version_num == 20)
438+
if (nodeInfo->ptrack_version_num >= 20)
439439
make_pagemap_from_ptrack_2(backup_files_list, backup_conn,
440-
nodeInfo->ptrack_schema,
441-
prev_backup_start_lsn);
440+
nodeInfo->ptrack_schema,
441+
nodeInfo->ptrack_version_num,
442+
prev_backup_start_lsn);
442443
else if (nodeInfo->ptrack_version_num == 15 ||
443444
nodeInfo->ptrack_version_num == 16 ||
444445
nodeInfo->ptrack_version_num == 17)
@@ -862,15 +863,10 @@ do_backup(time_t start_time, bool no_validate,
862863
#endif
863864

864865
get_ptrack_version(backup_conn, &nodeInfo);
865-
// elog(WARNING, "ptrack_version_num %d", ptrack_version_num);
866+
// elog(WARNING, "ptrack_version_num %d", ptrack_version_num);
866867

867868
if (nodeInfo.ptrack_version_num > 0)
868-
{
869-
if (nodeInfo.ptrack_version_num >= 20)
870-
nodeInfo.is_ptrack_enable = pg_ptrack_enable2(backup_conn);
871-
else
872-
nodeInfo.is_ptrack_enable = pg_ptrack_enable(backup_conn);
873-
}
869+
nodeInfo.is_ptrack_enable = pg_ptrack_enable(backup_conn, nodeInfo.ptrack_version_num);
874870

875871
if (current.backup_mode == BACKUP_MODE_DIFF_PTRACK)
876872
{

src/data.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -408,15 +408,12 @@ prepare_page(ConnectionArgs *conn_arg,
408408
}
409409
}
410410

411-
/* Get page via ptrack interface from PostgreSQL shared buffer.
412-
* We do this in following cases:
413-
* 1. PTRACK backup of 1.x versions
414-
* 2. During backup, regardless of backup mode, of PostgreSQL instance
415-
* with ptrack support we encountered invalid page.
411+
/*
412+
* Get page via ptrack interface from PostgreSQL shared buffer.
413+
* We do this only in the cases of PTRACK 1.x versions backup
416414
*/
417-
if ((backup_mode == BACKUP_MODE_DIFF_PTRACK
415+
if (backup_mode == BACKUP_MODE_DIFF_PTRACK
418416
&& (ptrack_version_num >= 15 && ptrack_version_num < 20))
419-
|| !page_is_valid)
420417
{
421418
int rc = 0;
422419
size_t page_size = 0;
@@ -440,7 +437,8 @@ prepare_page(ConnectionArgs *conn_arg,
440437
memcpy(page, ptrack_page, BLCKSZ);
441438
pg_free(ptrack_page);
442439

443-
/* UPD: It apprears that is possible to get zeroed page or page with invalid header
440+
/*
441+
* UPD: It apprears that is possible to get zeroed page or page with invalid header
444442
* from shared buffer.
445443
* Note, that getting page with wrong checksumm from shared buffer is
446444
* acceptable.
@@ -462,7 +460,8 @@ prepare_page(ConnectionArgs *conn_arg,
462460
from_fullpath, blknum, errormsg);
463461
}
464462

465-
/* We must set checksum here, because it is outdated
463+
/*
464+
* We must set checksum here, because it is outdated
466465
* in the block recieved from shared buffers.
467466
*/
468467
if (checksum_version)

src/pg_probackup.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,19 +1009,21 @@ extern void parse_filelist_filenames(parray *files, const char *root);
10091009
/* in ptrack.c */
10101010
extern void make_pagemap_from_ptrack_1(parray* files, PGconn* backup_conn);
10111011
extern void make_pagemap_from_ptrack_2(parray* files, PGconn* backup_conn,
1012-
const char *ptrack_schema, XLogRecPtr lsn);
1012+
const char *ptrack_schema,
1013+
int ptrack_version_num,
1014+
XLogRecPtr lsn);
10131015
extern void pg_ptrack_clear(PGconn *backup_conn, int ptrack_version_num);
10141016
extern void get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo);
1015-
extern bool pg_ptrack_enable(PGconn *backup_conn);
1016-
extern bool pg_ptrack_enable2(PGconn *backup_conn);
1017+
extern bool pg_ptrack_enable(PGconn *backup_conn, int ptrack_version_num);
10171018
extern bool pg_ptrack_get_and_clear_db(Oid dbOid, Oid tblspcOid, PGconn *backup_conn);
10181019
extern char *pg_ptrack_get_and_clear(Oid tablespace_oid,
10191020
Oid db_oid,
10201021
Oid rel_oid,
10211022
size_t *result_size,
10221023
PGconn *backup_conn);
10231024
extern XLogRecPtr get_last_ptrack_lsn(PGconn *backup_conn, PGNodeInfo *nodeInfo);
1024-
extern parray * pg_ptrack_get_pagemapset(PGconn *backup_conn, const char *ptrack_schema, XLogRecPtr lsn);
1025+
extern parray * pg_ptrack_get_pagemapset(PGconn *backup_conn, const char *ptrack_schema,
1026+
int ptrack_version_num, XLogRecPtr lsn);
10251027

10261028
/* FIO */
10271029
extern int fio_send_pages(FILE* out, const char *from_fullpath, pgFile *file, XLogRecPtr horizonLsn,

src/ptrack.c

Lines changed: 45 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
199199
nodeInfo->ptrack_version_num = 17;
200200
else if (strcmp(ptrack_version_str, "2.0") == 0)
201201
nodeInfo->ptrack_version_num = 20;
202+
else if (strcmp(ptrack_version_str, "2.1") == 0)
203+
nodeInfo->ptrack_version_num = 21;
202204
else
203205
elog(WARNING, "Update your ptrack to the version 1.5 or upper. Current version is %s",
204206
ptrack_version_str);
@@ -210,19 +212,30 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
210212
* Check if ptrack is enabled in target instance
211213
*/
212214
bool
213-
pg_ptrack_enable(PGconn *backup_conn)
215+
pg_ptrack_enable(PGconn *backup_conn, int ptrack_version_num)
214216
{
215217
PGresult *res_db;
218+
bool result = false;
216219

217-
res_db = pgut_execute(backup_conn, "SHOW ptrack_enable", 0, NULL);
218-
219-
if (strcmp(PQgetvalue(res_db, 0, 0), "on") != 0)
220+
if (ptrack_version_num < 20)
220221
{
221-
PQclear(res_db);
222-
return false;
222+
res_db = pgut_execute(backup_conn, "SHOW ptrack_enable", 0, NULL);
223+
result = strcmp(PQgetvalue(res_db, 0, 0), "on") == 0;
224+
}
225+
else if (ptrack_version_num == 20)
226+
{
227+
res_db = pgut_execute(backup_conn, "SHOW ptrack_map_size", 0, NULL);
228+
result = strcmp(PQgetvalue(res_db, 0, 0), "0") != 0;
229+
}
230+
else
231+
{
232+
res_db = pgut_execute(backup_conn, "SHOW ptrack.map_size", 0, NULL);
233+
result = strcmp(PQgetvalue(res_db, 0, 0), "0") != 0 &&
234+
strcmp(PQgetvalue(res_db, 0, 0), "-1") != 0;
223235
}
236+
224237
PQclear(res_db);
225-
return true;
238+
return result;
226239
}
227240

228241

@@ -452,7 +465,11 @@ get_last_ptrack_lsn(PGconn *backup_conn, PGNodeInfo *nodeInfo)
452465
{
453466
char query[128];
454467

455-
sprintf(query, "SELECT %s.pg_ptrack_control_lsn()", nodeInfo->ptrack_schema);
468+
if (nodeInfo->ptrack_version_num == 20)
469+
sprintf(query, "SELECT %s.pg_ptrack_control_lsn()", nodeInfo->ptrack_schema);
470+
else
471+
sprintf(query, "SELECT %s.ptrack_init_lsn()", nodeInfo->ptrack_schema);
472+
456473
res = pgut_execute(backup_conn, query, 0, NULL);
457474
}
458475

@@ -504,7 +521,7 @@ pg_ptrack_get_block(ConnectionArgs *arguments,
504521
if (arguments->cancel_conn == NULL)
505522
arguments->cancel_conn = PQgetCancel(arguments->conn);
506523

507-
//elog(LOG, "db %i pg_ptrack_get_block(%i, %i, %u)",dbOid, tblsOid, relOid, blknum);
524+
// elog(LOG, "db %i pg_ptrack_get_block(%i, %i, %u)",dbOid, tblsOid, relOid, blknum);
508525

509526
if (ptrack_version_num < 20)
510527
res = pgut_execute_parallel(arguments->conn,
@@ -519,7 +536,11 @@ pg_ptrack_get_block(ConnectionArgs *arguments,
519536
if (!ptrack_schema)
520537
elog(ERROR, "Schema name of ptrack extension is missing");
521538

522-
sprintf(query, "SELECT %s.pg_ptrack_get_block($1, $2, $3, $4)", ptrack_schema);
539+
if (ptrack_version_num == 20)
540+
sprintf(query, "SELECT %s.pg_ptrack_get_block($1, $2, $3, $4)", ptrack_schema);
541+
else
542+
elog(ERROR, "ptrack >= 2.1.0 does not support pg_ptrack_get_block()");
543+
// sprintf(query, "SELECT %s.ptrack_get_block($1, $2, $3, $4)", ptrack_schema);
523544

524545
res = pgut_execute_parallel(arguments->conn,
525546
arguments->cancel_conn,
@@ -559,30 +580,12 @@ pg_ptrack_get_block(ConnectionArgs *arguments,
559580
* ----------------------------
560581
*/
561582

562-
/*
563-
* Check if ptrack is enabled in target instance
564-
*/
565-
bool
566-
pg_ptrack_enable2(PGconn *backup_conn)
567-
{
568-
PGresult *res_db;
569-
570-
res_db = pgut_execute(backup_conn, "SHOW ptrack_map_size", 0, NULL);
571-
572-
if (strcmp(PQgetvalue(res_db, 0, 0), "0") == 0)
573-
{
574-
PQclear(res_db);
575-
return false;
576-
}
577-
PQclear(res_db);
578-
return true;
579-
}
580-
581583
/*
582584
* Fetch a list of changed files with their ptrack maps.
583585
*/
584586
parray *
585-
pg_ptrack_get_pagemapset(PGconn *backup_conn, const char *ptrack_schema, XLogRecPtr lsn)
587+
pg_ptrack_get_pagemapset(PGconn *backup_conn, const char *ptrack_schema,
588+
int ptrack_version_num, XLogRecPtr lsn)
586589
{
587590
PGresult *res;
588591
char lsn_buf[17 + 1];
@@ -597,8 +600,12 @@ pg_ptrack_get_pagemapset(PGconn *backup_conn, const char *ptrack_schema, XLogRec
597600
if (!ptrack_schema)
598601
elog(ERROR, "Schema name of ptrack extension is missing");
599602

600-
sprintf(query, "SELECT path, pagemap FROM %s.pg_ptrack_get_pagemapset($1) ORDER BY 1",
601-
ptrack_schema);
603+
if (ptrack_version_num == 20)
604+
sprintf(query, "SELECT path, pagemap FROM %s.pg_ptrack_get_pagemapset($1) ORDER BY 1",
605+
ptrack_schema);
606+
else
607+
sprintf(query, "SELECT path, pagemap FROM %s.ptrack_get_pagemapset($1) ORDER BY 1",
608+
ptrack_schema);
602609

603610
res = pgut_execute(backup_conn, query, 1, (const char **) params);
604611
pfree(params[0]);
@@ -640,16 +647,18 @@ pg_ptrack_get_pagemapset(PGconn *backup_conn, const char *ptrack_schema, XLogRec
640647
*/
641648
void
642649
make_pagemap_from_ptrack_2(parray *files,
643-
PGconn *backup_conn,
644-
const char *ptrack_schema,
645-
XLogRecPtr lsn)
650+
PGconn *backup_conn,
651+
const char *ptrack_schema,
652+
int ptrack_version_num,
653+
XLogRecPtr lsn)
646654
{
647655
parray *filemaps;
648656
int file_i = 0;
649657
page_map_entry *dummy_map = NULL;
650658

651659
/* Receive all available ptrack bitmaps at once */
652-
filemaps = pg_ptrack_get_pagemapset(backup_conn, ptrack_schema, lsn);
660+
filemaps = pg_ptrack_get_pagemapset(backup_conn, ptrack_schema,
661+
ptrack_version_num, lsn);
653662

654663
if (filemaps != NULL)
655664
parray_qsort(filemaps, pgFileMapComparePath);

tests/helpers/ptrack_helpers.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,8 @@ def make_simple_node(
366366

367367
if ptrack_enable:
368368
if node.major_version > 11:
369-
options['ptrack_map_size'] = '128MB'
369+
options['ptrack.map_size'] = '128'
370+
options['shared_preload_libraries'] = 'ptrack'
370371
else:
371372
options['ptrack_enable'] = 'on'
372373

0 commit comments

Comments
 (0)