aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2010-10-20 02:05:43 +0000
committerBruce Momjian <bruce@momjian.us>2010-10-20 02:06:06 +0000
commit3325c9bddb332487914c5c96d838286350044814 (patch)
tree535e35002798cb9ed251c164d283173185f8a1f7
parentc33bfb8b9b0d955b813d99e8f9f5c62c31f7387c (diff)
downloadpostgresql-3325c9bddb332487914c5c96d838286350044814.tar.gz
postgresql-3325c9bddb332487914c5c96d838286350044814.zip
Further speed up pg_upgrade lookups.
-rw-r--r--contrib/pg_upgrade/info.c39
-rw-r--r--contrib/pg_upgrade/pg_upgrade.h1
2 files changed, 21 insertions, 19 deletions
diff --git a/contrib/pg_upgrade/info.c b/contrib/pg_upgrade/info.c
index cd408e17636..281d0a7ab47 100644
--- a/contrib/pg_upgrade/info.c
+++ b/contrib/pg_upgrade/info.c
@@ -66,7 +66,7 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
if (strcmp(newrel->nspname, "pg_toast") == 0)
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);
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++)
get_rel_infos(&db_arr->dbs[dbnum],
- &(db_arr->dbs[dbnum].rel_arr), whichCluster);
+ &db_arr->dbs[dbnum].rel_arr, whichCluster);
if (log.debug)
dbarr_print(db_arr, whichCluster);
@@ -292,8 +292,7 @@ get_db_and_rel_infos(DbInfoArr *db_arr, Cluster whichCluster)
* FirstNormalObjectId belongs to the user
*/
static void
-get_rel_infos(const DbInfo *dbinfo,
- RelInfoArr *relarr, Cluster whichCluster)
+get_rel_infos(const DbInfo *dbinfo, RelInfoArr *relarr, Cluster whichCluster)
{
PGconn *conn = connectToServer(dbinfo->db_name, whichCluster);
PGresult *res;
@@ -386,6 +385,7 @@ get_rel_infos(const DbInfo *dbinfo,
relarr->rels = relinfos;
relarr->nrels = num_rels;
+ relarr->cache_name_rel = 0;
}
@@ -419,31 +419,31 @@ dbarr_lookup_db(DbInfoArr *db_arr, const char *db_name)
* RelInfo structure.
*/
static RelInfo *
-relarr_lookup_rel(RelInfoArr *rel_arr,
- const char *nspname, const char *relname,
- Cluster whichCluster)
+relarr_lookup_rel(RelInfoArr *rel_arr, const char *nspname,
+ const char *relname, Cluster whichCluster)
{
- static int relnum = 0;
+ int relnum;
if (!rel_arr || !relname)
return NULL;
- /* Test most recent lookup first, for speed */
- if (relnum < rel_arr->nrels &&
- strcmp(rel_arr->rels[relnum].nspname, nspname) == 0 &&
- strcmp(rel_arr->rels[relnum].relname, relname) == 0)
- return &rel_arr->rels[relnum];
-
- if (relnum + 1 < rel_arr->nrels &&
- strcmp(rel_arr->rels[relnum + 1].nspname, nspname) == 0 &&
- strcmp(rel_arr->rels[relnum + 1].relname, relname) == 0)
- return &rel_arr->rels[relnum + 1];
-
+ /* Test next lookup first, for speed */
+ if (rel_arr->cache_name_rel + 1 < rel_arr->nrels &&
+ strcmp(rel_arr->rels[rel_arr->cache_name_rel + 1].nspname, nspname) == 0 &&
+ strcmp(rel_arr->rels[rel_arr->cache_name_rel + 1].relname, relname) == 0)
+ {
+ rel_arr->cache_name_rel++;
+ return &rel_arr->rels[rel_arr->cache_name_rel];
+ }
+
for (relnum = 0; relnum < rel_arr->nrels; relnum++)
{
if (strcmp(rel_arr->rels[relnum].nspname, nspname) == 0 &&
strcmp(rel_arr->rels[relnum].relname, relname) == 0)
+ {
+ rel_arr->cache_name_rel = relnum;
return &rel_arr->rels[relnum];
+ }
}
pg_log(PG_FATAL, "Could not find %s.%s in %s cluster\n",
nspname, relname, CLUSTERNAME(whichCluster));
@@ -483,6 +483,7 @@ relarr_free(RelInfoArr *rel_arr)
{
pg_free(rel_arr->rels);
rel_arr->nrels = 0;
+ rel_arr->cache_name_rel = 0;
}
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
index 2aa22081582..727ee5563b5 100644
--- a/contrib/pg_upgrade/pg_upgrade.h
+++ b/contrib/pg_upgrade/pg_upgrade.h
@@ -78,6 +78,7 @@ typedef struct
{
RelInfo *rels;
int nrels;
+ int cache_name_rel; /* cache of last lookup location */
} RelInfoArr;
/*