1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-31 22:04:40 +03:00

pg_upgrade: dramatically reduce memory consumption

Report from Jeff Janes
This commit is contained in:
Bruce Momjian
2014-02-12 16:35:24 -05:00
parent f9bb944cd8
commit 2a2e40aaaa
3 changed files with 66 additions and 34 deletions

View File

@ -108,20 +108,18 @@ create_rel_filename_map(const char *old_data, const char *new_data,
* relation belongs to the default tablespace, hence relfiles should
* exist in the data directories.
*/
strlcpy(map->old_tablespace, old_data, sizeof(map->old_tablespace));
strlcpy(map->new_tablespace, new_data, sizeof(map->new_tablespace));
strlcpy(map->old_tablespace_suffix, "/base", sizeof(map->old_tablespace_suffix));
strlcpy(map->new_tablespace_suffix, "/base", sizeof(map->new_tablespace_suffix));
map->old_tablespace = old_data;
map->new_tablespace = new_data;
map->old_tablespace_suffix = "/base";
map->new_tablespace_suffix = "/base";
}
else
{
/* relation belongs to a tablespace, so use the tablespace location */
strlcpy(map->old_tablespace, old_rel->tablespace, sizeof(map->old_tablespace));
strlcpy(map->new_tablespace, new_rel->tablespace, sizeof(map->new_tablespace));
strlcpy(map->old_tablespace_suffix, old_cluster.tablespace_suffix,
sizeof(map->old_tablespace_suffix));
strlcpy(map->new_tablespace_suffix, new_cluster.tablespace_suffix,
sizeof(map->new_tablespace_suffix));
map->old_tablespace = old_rel->tablespace;
map->new_tablespace = new_rel->tablespace;
map->old_tablespace_suffix = old_cluster.tablespace_suffix;
map->new_tablespace_suffix = new_cluster.tablespace_suffix;
}
map->old_db_oid = old_db->db_oid;
@ -231,7 +229,7 @@ get_db_infos(ClusterInfo *cluster)
{
dbinfos[tupnum].db_oid = atooid(PQgetvalue(res, tupnum, i_oid));
dbinfos[tupnum].db_name = pg_strdup(PQgetvalue(res, tupnum, i_datname));
snprintf(dbinfos[tupnum].db_tblspace, sizeof(dbinfos[tupnum].db_tblspace), "%s",
snprintf(dbinfos[tupnum].db_tablespace, sizeof(dbinfos[tupnum].db_tablespace), "%s",
PQgetvalue(res, tupnum, i_spclocation));
}
PQclear(res);
@ -264,6 +262,7 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
int num_rels = 0;
char *nspname = NULL;
char *relname = NULL;
char *tablespace = NULL;
int i_spclocation,
i_nspname,
i_relname,
@ -271,6 +270,7 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
i_relfilenode,
i_reltablespace;
char query[QUERY_ALLOC];
char *last_namespace = NULL, *last_tablespace = NULL;
/*
* pg_largeobject contains user data that does not appear in pg_dumpall
@ -366,26 +366,53 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
for (relnum = 0; relnum < ntups; relnum++)
{
RelInfo *curr = &relinfos[num_rels++];
const char *tblspace;
curr->reloid = atooid(PQgetvalue(res, relnum, i_oid));
nspname = PQgetvalue(res, relnum, i_nspname);
curr->nspname = pg_strdup(nspname);
curr->nsp_alloc = false;
/*
* Many of the namespace and tablespace strings are identical,
* so we try to reuse the allocated string pointers where possible
* to reduce memory consumption.
*/
/* Can we reuse the previous string allocation? */
if (last_namespace && strcmp(nspname, last_namespace) == 0)
curr->nspname = last_namespace;
else
{
last_namespace = curr->nspname = pg_strdup(nspname);
curr->nsp_alloc = true;
}
relname = PQgetvalue(res, relnum, i_relname);
curr->relname = pg_strdup(relname);
curr->relfilenode = atooid(PQgetvalue(res, relnum, i_relfilenode));
curr->tblsp_alloc = false;
/* Is the tablespace oid non-zero? */
if (atooid(PQgetvalue(res, relnum, i_reltablespace)) != 0)
/* Might be "", meaning the cluster default location. */
tblspace = PQgetvalue(res, relnum, i_spclocation);
else
/* A zero reltablespace indicates the database tablespace. */
tblspace = dbinfo->db_tblspace;
{
/*
* The tablespace location might be "", meaning the cluster
* default location, i.e. pg_default or pg_global.
*/
tablespace = PQgetvalue(res, relnum, i_spclocation);
strlcpy(curr->tablespace, tblspace, sizeof(curr->tablespace));
/* Can we reuse the previous string allocation? */
if (last_tablespace && strcmp(tablespace, last_tablespace) == 0)
curr->tablespace = last_tablespace;
else
{
last_tablespace = curr->tablespace = pg_strdup(tablespace);
curr->tblsp_alloc = true;
}
}
else
/* A zero reltablespace oid indicates the database tablespace. */
curr->tablespace = dbinfo->db_tablespace;
}
PQclear(res);
@ -419,8 +446,11 @@ free_rel_infos(RelInfoArr *rel_arr)
for (relnum = 0; relnum < rel_arr->nrels; relnum++)
{
pg_free(rel_arr->rels[relnum].nspname);
if (rel_arr->rels[relnum].nsp_alloc)
pg_free(rel_arr->rels[relnum].nspname);
pg_free(rel_arr->rels[relnum].relname);
if (rel_arr->rels[relnum].tblsp_alloc)
pg_free(rel_arr->rels[relnum].tablespace);
}
pg_free(rel_arr->rels);
rel_arr->nrels = 0;