Skip to content

introduce ptrack_parse_version_string() and new ptrack version number… #390

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 3, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/backup.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ do_backup_instance(PGconn *backup_conn, PGNodeInfo *nodeInfo, bool no_sync, bool
{
XLogRecPtr ptrack_lsn = get_last_ptrack_lsn(backup_conn, nodeInfo);

if (nodeInfo->ptrack_version_num < 20)
if (nodeInfo->ptrack_version_num < 200)
{
// backward compatibility kludge: use Stop LSN for ptrack 1.x,
if (ptrack_lsn > prev_backup->stop_lsn || ptrack_lsn == InvalidXLogRecPtr)
Expand Down Expand Up @@ -408,14 +408,14 @@ do_backup_instance(PGconn *backup_conn, PGNodeInfo *nodeInfo, bool no_sync, bool
/*
* Build the page map from ptrack information.
*/
if (nodeInfo->ptrack_version_num >= 20)
if (nodeInfo->ptrack_version_num >= 200)
make_pagemap_from_ptrack_2(backup_files_list, backup_conn,
nodeInfo->ptrack_schema,
nodeInfo->ptrack_version_num,
prev_backup_start_lsn);
else if (nodeInfo->ptrack_version_num == 15 ||
nodeInfo->ptrack_version_num == 16 ||
nodeInfo->ptrack_version_num == 17)
else if (nodeInfo->ptrack_version_num == 105 ||
nodeInfo->ptrack_version_num == 106 ||
nodeInfo->ptrack_version_num == 107)
make_pagemap_from_ptrack_1(backup_files_list, backup_conn);
}

Expand Down
4 changes: 2 additions & 2 deletions src/data.c
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ prepare_page(ConnectionArgs *conn_arg,
* Under high write load it's possible that we've read partly
* flushed page, so try several times before throwing an error.
*/
if (backup_mode != BACKUP_MODE_DIFF_PTRACK || ptrack_version_num >= 20)
if (backup_mode != BACKUP_MODE_DIFF_PTRACK || ptrack_version_num >= 200)
{
int rc = 0;
while (!page_is_valid && try_again--)
Expand Down Expand Up @@ -400,7 +400,7 @@ prepare_page(ConnectionArgs *conn_arg,
* We do this only in the cases of PTRACK 1.x versions backup
*/
if (backup_mode == BACKUP_MODE_DIFF_PTRACK
&& (ptrack_version_num >= 15 && ptrack_version_num < 20))
&& (ptrack_version_num >= 105 && ptrack_version_num < 200))
{
int rc = 0;
size_t page_size = 0;
Expand Down
56 changes: 33 additions & 23 deletions src/ptrack.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,23 @@ make_pagemap_from_ptrack_1(parray *files, PGconn *backup_conn)
}
}

/*
* Parse a string like "2.1" into int
* result: int by formula major_number * 100 + minor_number
* or -1 if string cannot be parsed
*/
static int
ptrack_parse_version_string(const char *version_str)
{
int ma, mi;
int sscanf_readed_count;
if (sscanf(version_str, "%u.%2u%n", &ma, &mi, &sscanf_readed_count) != 2)
return -1;
if (sscanf_readed_count != strlen(version_str))
return -1;
return ma * 100 + mi;
}

/* Check if the instance supports compatible version of ptrack,
* fill-in version number if it does.
* Also for ptrack 2.x save schema namespace.
Expand All @@ -148,6 +165,7 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
{
PGresult *res_db;
char *ptrack_version_str;
int ptrack_version_num;

res_db = pgut_execute(backup_conn,
"SELECT extnamespace::regnamespace, extversion "
Expand Down Expand Up @@ -191,24 +209,16 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
ptrack_version_str = PQgetvalue(res_db, 0, 0);
}

if (strcmp(ptrack_version_str, "1.5") == 0)
nodeInfo->ptrack_version_num = 15;
else if (strcmp(ptrack_version_str, "1.6") == 0)
nodeInfo->ptrack_version_num = 16;
else if (strcmp(ptrack_version_str, "1.7") == 0)
nodeInfo->ptrack_version_num = 17;
else if (strcmp(ptrack_version_str, "2.0") == 0)
nodeInfo->ptrack_version_num = 20;
else if (strcmp(ptrack_version_str, "2.1") == 0)
nodeInfo->ptrack_version_num = 21;
else if (strcmp(ptrack_version_str, "2.2") == 0)
nodeInfo->ptrack_version_num = 22;
else
elog(WARNING, "Update your ptrack to the version 2.1 or upper. Current version is %s",
ptrack_version_num = ptrack_parse_version_string(ptrack_version_str);
if (ptrack_version_num == -1)
/* leave default nodeInfo->ptrack_version_num = 0 from pgNodeInit() */
elog(WARNING, "Cannot parse ptrack version string \"%s\"",
ptrack_version_str);
else
nodeInfo->ptrack_version_num = ptrack_version_num;

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

if (ptrack_version_num < 20)
if (ptrack_version_num < 200)
{
res_db = pgut_execute(backup_conn, "SHOW ptrack_enable", 0, NULL);
result = strcmp(PQgetvalue(res_db, 0, 0), "on") == 0;
}
else if (ptrack_version_num == 20)
else if (ptrack_version_num == 200)
{
res_db = pgut_execute(backup_conn, "SHOW ptrack_map_size", 0, NULL);
result = strcmp(PQgetvalue(res_db, 0, 0), "0") != 0;
Expand Down Expand Up @@ -270,7 +280,7 @@ pg_ptrack_clear(PGconn *backup_conn, int ptrack_version_num)
char *params[2];

// FIXME Perform this check on caller's side
if (ptrack_version_num >= 20)
if (ptrack_version_num >= 200)
return;

params[0] = palloc(64);
Expand Down Expand Up @@ -472,14 +482,14 @@ get_last_ptrack_lsn(PGconn *backup_conn, PGNodeInfo *nodeInfo)
uint32 lsn_lo;
XLogRecPtr lsn;

if (nodeInfo->ptrack_version_num < 20)
if (nodeInfo->ptrack_version_num < 200)
res = pgut_execute(backup_conn, "SELECT pg_catalog.pg_ptrack_control_lsn()",
0, NULL);
else
{
char query[128];

if (nodeInfo->ptrack_version_num == 20)
if (nodeInfo->ptrack_version_num == 200)
sprintf(query, "SELECT %s.pg_ptrack_control_lsn()", nodeInfo->ptrack_schema);
else
sprintf(query, "SELECT %s.ptrack_init_lsn()", nodeInfo->ptrack_schema);
Expand Down Expand Up @@ -537,7 +547,7 @@ pg_ptrack_get_block(ConnectionArgs *arguments,

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

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

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

if (ptrack_version_num == 20)
if (ptrack_version_num == 200)
sprintf(query, "SELECT path, pagemap FROM %s.pg_ptrack_get_pagemapset($1) ORDER BY 1",
ptrack_schema);
else
Expand Down