Skip to content

Commit 4ba1d65

Browse files
authored
Merge pull request #390 from postgrespro/ptrack-version-refactoring
introduce ptrack_parse_version_string() and new ptrack version number…
2 parents 4188a69 + 908a5ad commit 4ba1d65

File tree

3 files changed

+40
-30
lines changed

3 files changed

+40
-30
lines changed

src/backup.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ do_backup_instance(PGconn *backup_conn, PGNodeInfo *nodeInfo, bool no_sync, bool
219219
{
220220
XLogRecPtr ptrack_lsn = get_last_ptrack_lsn(backup_conn, nodeInfo);
221221

222-
if (nodeInfo->ptrack_version_num < 20)
222+
if (nodeInfo->ptrack_version_num < 200)
223223
{
224224
// backward compatibility kludge: use Stop LSN for ptrack 1.x,
225225
if (ptrack_lsn > prev_backup->stop_lsn || ptrack_lsn == InvalidXLogRecPtr)
@@ -408,14 +408,14 @@ do_backup_instance(PGconn *backup_conn, PGNodeInfo *nodeInfo, bool no_sync, bool
408408
/*
409409
* Build the page map from ptrack information.
410410
*/
411-
if (nodeInfo->ptrack_version_num >= 20)
411+
if (nodeInfo->ptrack_version_num >= 200)
412412
make_pagemap_from_ptrack_2(backup_files_list, backup_conn,
413413
nodeInfo->ptrack_schema,
414414
nodeInfo->ptrack_version_num,
415415
prev_backup_start_lsn);
416-
else if (nodeInfo->ptrack_version_num == 15 ||
417-
nodeInfo->ptrack_version_num == 16 ||
418-
nodeInfo->ptrack_version_num == 17)
416+
else if (nodeInfo->ptrack_version_num == 105 ||
417+
nodeInfo->ptrack_version_num == 106 ||
418+
nodeInfo->ptrack_version_num == 107)
419419
make_pagemap_from_ptrack_1(backup_files_list, backup_conn);
420420
}
421421

src/data.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ prepare_page(ConnectionArgs *conn_arg,
300300
* Under high write load it's possible that we've read partly
301301
* flushed page, so try several times before throwing an error.
302302
*/
303-
if (backup_mode != BACKUP_MODE_DIFF_PTRACK || ptrack_version_num >= 20)
303+
if (backup_mode != BACKUP_MODE_DIFF_PTRACK || ptrack_version_num >= 200)
304304
{
305305
int rc = 0;
306306
while (!page_is_valid && try_again--)
@@ -400,7 +400,7 @@ prepare_page(ConnectionArgs *conn_arg,
400400
* We do this only in the cases of PTRACK 1.x versions backup
401401
*/
402402
if (backup_mode == BACKUP_MODE_DIFF_PTRACK
403-
&& (ptrack_version_num >= 15 && ptrack_version_num < 20))
403+
&& (ptrack_version_num >= 105 && ptrack_version_num < 200))
404404
{
405405
int rc = 0;
406406
size_t page_size = 0;

src/ptrack.c

+33-23
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,23 @@ make_pagemap_from_ptrack_1(parray *files, PGconn *backup_conn)
139139
}
140140
}
141141

142+
/*
143+
* Parse a string like "2.1" into int
144+
* result: int by formula major_number * 100 + minor_number
145+
* or -1 if string cannot be parsed
146+
*/
147+
static int
148+
ptrack_parse_version_string(const char *version_str)
149+
{
150+
int ma, mi;
151+
int sscanf_readed_count;
152+
if (sscanf(version_str, "%u.%2u%n", &ma, &mi, &sscanf_readed_count) != 2)
153+
return -1;
154+
if (sscanf_readed_count != strlen(version_str))
155+
return -1;
156+
return ma * 100 + mi;
157+
}
158+
142159
/* Check if the instance supports compatible version of ptrack,
143160
* fill-in version number if it does.
144161
* Also for ptrack 2.x save schema namespace.
@@ -148,6 +165,7 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
148165
{
149166
PGresult *res_db;
150167
char *ptrack_version_str;
168+
int ptrack_version_num;
151169

152170
res_db = pgut_execute(backup_conn,
153171
"SELECT extnamespace::regnamespace, extversion "
@@ -191,24 +209,16 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
191209
ptrack_version_str = PQgetvalue(res_db, 0, 0);
192210
}
193211

194-
if (strcmp(ptrack_version_str, "1.5") == 0)
195-
nodeInfo->ptrack_version_num = 15;
196-
else if (strcmp(ptrack_version_str, "1.6") == 0)
197-
nodeInfo->ptrack_version_num = 16;
198-
else if (strcmp(ptrack_version_str, "1.7") == 0)
199-
nodeInfo->ptrack_version_num = 17;
200-
else if (strcmp(ptrack_version_str, "2.0") == 0)
201-
nodeInfo->ptrack_version_num = 20;
202-
else if (strcmp(ptrack_version_str, "2.1") == 0)
203-
nodeInfo->ptrack_version_num = 21;
204-
else if (strcmp(ptrack_version_str, "2.2") == 0)
205-
nodeInfo->ptrack_version_num = 22;
206-
else
207-
elog(WARNING, "Update your ptrack to the version 2.1 or upper. Current version is %s",
212+
ptrack_version_num = ptrack_parse_version_string(ptrack_version_str);
213+
if (ptrack_version_num == -1)
214+
/* leave default nodeInfo->ptrack_version_num = 0 from pgNodeInit() */
215+
elog(WARNING, "Cannot parse ptrack version string \"%s\"",
208216
ptrack_version_str);
217+
else
218+
nodeInfo->ptrack_version_num = ptrack_version_num;
209219

210220
/* ptrack 1.X is buggy, so fall back to DELTA backup strategy for safety */
211-
if (nodeInfo->ptrack_version_num >= 15 && nodeInfo->ptrack_version_num < 20)
221+
if (nodeInfo->ptrack_version_num >= 105 && nodeInfo->ptrack_version_num < 200)
212222
{
213223
if (current.backup_mode == BACKUP_MODE_DIFF_PTRACK)
214224
{
@@ -231,12 +241,12 @@ pg_ptrack_enable(PGconn *backup_conn, int ptrack_version_num)
231241
PGresult *res_db;
232242
bool result = false;
233243

234-
if (ptrack_version_num < 20)
244+
if (ptrack_version_num < 200)
235245
{
236246
res_db = pgut_execute(backup_conn, "SHOW ptrack_enable", 0, NULL);
237247
result = strcmp(PQgetvalue(res_db, 0, 0), "on") == 0;
238248
}
239-
else if (ptrack_version_num == 20)
249+
else if (ptrack_version_num == 200)
240250
{
241251
res_db = pgut_execute(backup_conn, "SHOW ptrack_map_size", 0, NULL);
242252
result = strcmp(PQgetvalue(res_db, 0, 0), "0") != 0;
@@ -270,7 +280,7 @@ pg_ptrack_clear(PGconn *backup_conn, int ptrack_version_num)
270280
char *params[2];
271281

272282
// FIXME Perform this check on caller's side
273-
if (ptrack_version_num >= 20)
283+
if (ptrack_version_num >= 200)
274284
return;
275285

276286
params[0] = palloc(64);
@@ -472,14 +482,14 @@ get_last_ptrack_lsn(PGconn *backup_conn, PGNodeInfo *nodeInfo)
472482
uint32 lsn_lo;
473483
XLogRecPtr lsn;
474484

475-
if (nodeInfo->ptrack_version_num < 20)
485+
if (nodeInfo->ptrack_version_num < 200)
476486
res = pgut_execute(backup_conn, "SELECT pg_catalog.pg_ptrack_control_lsn()",
477487
0, NULL);
478488
else
479489
{
480490
char query[128];
481491

482-
if (nodeInfo->ptrack_version_num == 20)
492+
if (nodeInfo->ptrack_version_num == 200)
483493
sprintf(query, "SELECT %s.pg_ptrack_control_lsn()", nodeInfo->ptrack_schema);
484494
else
485495
sprintf(query, "SELECT %s.ptrack_init_lsn()", nodeInfo->ptrack_schema);
@@ -537,7 +547,7 @@ pg_ptrack_get_block(ConnectionArgs *arguments,
537547

538548
// elog(LOG, "db %i pg_ptrack_get_block(%i, %i, %u)",dbOid, tblsOid, relOid, blknum);
539549

540-
if (ptrack_version_num < 20)
550+
if (ptrack_version_num < 200)
541551
res = pgut_execute_parallel(arguments->conn,
542552
arguments->cancel_conn,
543553
"SELECT pg_catalog.pg_ptrack_get_block_2($1, $2, $3, $4)",
@@ -550,7 +560,7 @@ pg_ptrack_get_block(ConnectionArgs *arguments,
550560
if (!ptrack_schema)
551561
elog(ERROR, "Schema name of ptrack extension is missing");
552562

553-
if (ptrack_version_num == 20)
563+
if (ptrack_version_num == 200)
554564
sprintf(query, "SELECT %s.pg_ptrack_get_block($1, $2, $3, $4)", ptrack_schema);
555565
else
556566
elog(ERROR, "ptrack >= 2.1.0 does not support pg_ptrack_get_block()");
@@ -614,7 +624,7 @@ pg_ptrack_get_pagemapset(PGconn *backup_conn, const char *ptrack_schema,
614624
if (!ptrack_schema)
615625
elog(ERROR, "Schema name of ptrack extension is missing");
616626

617-
if (ptrack_version_num == 20)
627+
if (ptrack_version_num == 200)
618628
sprintf(query, "SELECT path, pagemap FROM %s.pg_ptrack_get_pagemapset($1) ORDER BY 1",
619629
ptrack_schema);
620630
else

0 commit comments

Comments
 (0)