Further speed up pg_upgrade lookups.
This commit is contained in:
parent
c33bfb8b9b
commit
3325c9bddb
@ -66,7 +66,7 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
|
|||||||
if (strcmp(newrel->nspname, "pg_toast") == 0)
|
if (strcmp(newrel->nspname, "pg_toast") == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
oldrel = relarr_lookup_rel(&(old_db->rel_arr), newrel->nspname,
|
oldrel = relarr_lookup_rel(&old_db->rel_arr, newrel->nspname,
|
||||||
newrel->relname, CLUSTER_OLD);
|
newrel->relname, CLUSTER_OLD);
|
||||||
|
|
||||||
map_rel(oldrel, newrel, old_db, new_db, old_pgdata, new_pgdata,
|
map_rel(oldrel, newrel, old_db, new_db, old_pgdata, new_pgdata,
|
||||||
@ -275,7 +275,7 @@ get_db_and_rel_infos(DbInfoArr *db_arr, Cluster whichCluster)
|
|||||||
|
|
||||||
for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
|
for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
|
||||||
get_rel_infos(&db_arr->dbs[dbnum],
|
get_rel_infos(&db_arr->dbs[dbnum],
|
||||||
&(db_arr->dbs[dbnum].rel_arr), whichCluster);
|
&db_arr->dbs[dbnum].rel_arr, whichCluster);
|
||||||
|
|
||||||
if (log.debug)
|
if (log.debug)
|
||||||
dbarr_print(db_arr, whichCluster);
|
dbarr_print(db_arr, whichCluster);
|
||||||
@ -292,8 +292,7 @@ get_db_and_rel_infos(DbInfoArr *db_arr, Cluster whichCluster)
|
|||||||
* FirstNormalObjectId belongs to the user
|
* FirstNormalObjectId belongs to the user
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
get_rel_infos(const DbInfo *dbinfo,
|
get_rel_infos(const DbInfo *dbinfo, RelInfoArr *relarr, Cluster whichCluster)
|
||||||
RelInfoArr *relarr, Cluster whichCluster)
|
|
||||||
{
|
{
|
||||||
PGconn *conn = connectToServer(dbinfo->db_name, whichCluster);
|
PGconn *conn = connectToServer(dbinfo->db_name, whichCluster);
|
||||||
PGresult *res;
|
PGresult *res;
|
||||||
@ -386,6 +385,7 @@ get_rel_infos(const DbInfo *dbinfo,
|
|||||||
|
|
||||||
relarr->rels = relinfos;
|
relarr->rels = relinfos;
|
||||||
relarr->nrels = num_rels;
|
relarr->nrels = num_rels;
|
||||||
|
relarr->cache_name_rel = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -419,32 +419,32 @@ dbarr_lookup_db(DbInfoArr *db_arr, const char *db_name)
|
|||||||
* RelInfo structure.
|
* RelInfo structure.
|
||||||
*/
|
*/
|
||||||
static RelInfo *
|
static RelInfo *
|
||||||
relarr_lookup_rel(RelInfoArr *rel_arr,
|
relarr_lookup_rel(RelInfoArr *rel_arr, const char *nspname,
|
||||||
const char *nspname, const char *relname,
|
const char *relname, Cluster whichCluster)
|
||||||
Cluster whichCluster)
|
|
||||||
{
|
{
|
||||||
static int relnum = 0;
|
int relnum;
|
||||||
|
|
||||||
if (!rel_arr || !relname)
|
if (!rel_arr || !relname)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Test most recent lookup first, for speed */
|
/* Test next lookup first, for speed */
|
||||||
if (relnum < rel_arr->nrels &&
|
if (rel_arr->cache_name_rel + 1 < rel_arr->nrels &&
|
||||||
strcmp(rel_arr->rels[relnum].nspname, nspname) == 0 &&
|
strcmp(rel_arr->rels[rel_arr->cache_name_rel + 1].nspname, nspname) == 0 &&
|
||||||
strcmp(rel_arr->rels[relnum].relname, relname) == 0)
|
strcmp(rel_arr->rels[rel_arr->cache_name_rel + 1].relname, relname) == 0)
|
||||||
return &rel_arr->rels[relnum];
|
{
|
||||||
|
rel_arr->cache_name_rel++;
|
||||||
if (relnum + 1 < rel_arr->nrels &&
|
return &rel_arr->rels[rel_arr->cache_name_rel];
|
||||||
strcmp(rel_arr->rels[relnum + 1].nspname, nspname) == 0 &&
|
}
|
||||||
strcmp(rel_arr->rels[relnum + 1].relname, relname) == 0)
|
|
||||||
return &rel_arr->rels[relnum + 1];
|
|
||||||
|
|
||||||
for (relnum = 0; relnum < rel_arr->nrels; relnum++)
|
for (relnum = 0; relnum < rel_arr->nrels; relnum++)
|
||||||
{
|
{
|
||||||
if (strcmp(rel_arr->rels[relnum].nspname, nspname) == 0 &&
|
if (strcmp(rel_arr->rels[relnum].nspname, nspname) == 0 &&
|
||||||
strcmp(rel_arr->rels[relnum].relname, relname) == 0)
|
strcmp(rel_arr->rels[relnum].relname, relname) == 0)
|
||||||
|
{
|
||||||
|
rel_arr->cache_name_rel = relnum;
|
||||||
return &rel_arr->rels[relnum];
|
return &rel_arr->rels[relnum];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
pg_log(PG_FATAL, "Could not find %s.%s in %s cluster\n",
|
pg_log(PG_FATAL, "Could not find %s.%s in %s cluster\n",
|
||||||
nspname, relname, CLUSTERNAME(whichCluster));
|
nspname, relname, CLUSTERNAME(whichCluster));
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -483,6 +483,7 @@ relarr_free(RelInfoArr *rel_arr)
|
|||||||
{
|
{
|
||||||
pg_free(rel_arr->rels);
|
pg_free(rel_arr->rels);
|
||||||
rel_arr->nrels = 0;
|
rel_arr->nrels = 0;
|
||||||
|
rel_arr->cache_name_rel = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
RelInfo *rels;
|
RelInfo *rels;
|
||||||
int nrels;
|
int nrels;
|
||||||
|
int cache_name_rel; /* cache of last lookup location */
|
||||||
} RelInfoArr;
|
} RelInfoArr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user