Skip to content

Commit 389c82f

Browse files
committed
use pg_ptrack_get_block_2 to read block by relfilenode without relcache
1 parent 109b996 commit 389c82f

File tree

1 file changed

+42
-36
lines changed

1 file changed

+42
-36
lines changed

src/backup.c

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2677,55 +2677,59 @@ pg_ptrack_get_block(Oid dbOid,
26772677
PGresult *res_db;
26782678
PGresult *res;
26792679
const char *dbname;
2680-
char *params[3];
2680+
char *params[4];
26812681
char *result;
26822682
char *val;
26832683
PGconn *tmp_conn;
26842684

26852685
params[0] = palloc(64);
26862686
params[1] = palloc(64);
26872687
params[2] = palloc(64);
2688-
2689-
sprintf(params[0], "%i", dbOid);
2690-
res_db = pgut_execute(backup_conn,
2691-
"SELECT datname FROM pg_database WHERE oid=$1",
2692-
1, (const char **) params, true);
2693-
/*
2694-
* If database is not found, it's not an error.
2695-
* It could have been deleted.
2696-
*/
2697-
if (PQntuples(res_db) != 1 || PQnfields(res_db) != 1)
2698-
{
2699-
//elog(LOG, "Database with oid %d is not found", dbOid);
2700-
return NULL;
2701-
}
2702-
2703-
dbname = PQgetvalue(res_db, 0, 0);
2704-
if (strcmp(dbname, "template0") == 0)
2705-
{
2706-
/*
2707-
* There is no way to connect to the template0 database.
2708-
* But it's totally OK, since files there can never be changed.
2709-
*/
2710-
return NULL;
2711-
}
2712-
tmp_conn = pgut_connect(dbname);
2688+
params[3] = palloc(64);
2689+
2690+
// sprintf(params[0], "%i", dbOid);
2691+
// res_db = pgut_execute(backup_conn,
2692+
// "SELECT datname FROM pg_database WHERE oid=$1",
2693+
// 1, (const char **) params, true);
2694+
// /*
2695+
// * If database is not found, it's not an error.
2696+
// * It could have been deleted.
2697+
// */
2698+
// if (PQntuples(res_db) != 1 || PQnfields(res_db) != 1)
2699+
// {
2700+
// //elog(LOG, "Database with oid %d is not found", dbOid);
2701+
// return NULL;
2702+
// }
2703+
//
2704+
// dbname = PQgetvalue(res_db, 0, 0);
2705+
// if (strcmp(dbname, "template0") == 0)
2706+
// {
2707+
// /*
2708+
// * There is no way to connect to the template0 database.
2709+
// * But it's totally OK, since files there can never be changed.
2710+
// */
2711+
// return NULL;
2712+
// }
2713+
// tmp_conn = pgut_connect(dbname);
27132714

27142715
/*
27152716
* Use backup_conn, cause we can do it from any database.
27162717
*/
27172718
sprintf(params[0], "%i", tblsOid);
2718-
sprintf(params[1], "%i", relOid);
2719-
sprintf(params[2], "%u", blknum);
2719+
sprintf(params[1], "%i", dbOid);
2720+
sprintf(params[2], "%i", relOid);
2721+
sprintf(params[3], "%u", blknum);
27202722

2721-
//elog(WARNING, "db %i pg_ptrack_get_block(%i, %i, %u)",dbOid, tblsOid, relOid, blknum);
2722-
2723-
res = pgut_execute(tmp_conn, "SELECT pg_ptrack_get_block($1, $2, $3)",
2724-
3, (const char **)params, true);
2723+
//elog(LOG, "db %i pg_ptrack_get_block(%i, %i, %u)",dbOid, tblsOid, relOid, blknum);
2724+
res = pgut_execute(backup_conn, "SELECT pg_ptrack_get_block_2($1, $2, $3, $4)",
2725+
4, (const char **)params, true);
27252726

27262727
if (PQnfields(res) != 1)
2727-
elog(WARNING, "cannot get file block for relation oid %u",
2728-
relOid);
2728+
{
2729+
elog(LOG, "cannot get file block for relation oid %u",
2730+
relOid);
2731+
return NULL;
2732+
}
27292733

27302734
val = PQgetvalue(res, 0, 0);
27312735

@@ -2735,12 +2739,14 @@ pg_ptrack_get_block(Oid dbOid,
27352739
result = (char *) PQunescapeBytea((unsigned char *) PQgetvalue(res, 0, 0),
27362740
result_size);
27372741

2738-
pgut_disconnect(tmp_conn);
2742+
// pgut_disconnect(tmp_conn);
2743+
// PQclear(res_db);
2744+
27392745
PQclear(res);
2740-
PQclear(res_db);
27412746
pfree(params[0]);
27422747
pfree(params[1]);
27432748
pfree(params[2]);
2749+
pfree(params[3]);
27442750

27452751
return result;
27462752
}

0 commit comments

Comments
 (0)