From: Bruce Momjian Date: Sun, 31 Mar 2013 02:20:53 +0000 (-0400) Subject: pg_upgrade: don't copy/link files for invalid indexes X-Git-Tag: REL9_2_4~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4b94bc70ce1d500c94dd0557650ac180aa60e04e;p=postgresql pg_upgrade: don't copy/link files for invalid indexes Now that pg_dump no longer dumps invalid indexes, per commit 683abc73dff549e94555d4020dae8d02f32ed78b, have pg_upgrade also skip them. Previously pg_upgrade threw an error if invalid indexes existed. Backpatch to 9.2, 9.1, and 9.0 (where pg_upgrade was added to git) --- diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c index c4c9278883..e9e9a4fe33 100644 --- a/contrib/pg_upgrade/check.c +++ b/contrib/pg_upgrade/check.c @@ -20,7 +20,6 @@ static void check_is_super_user(ClusterInfo *cluster); static void check_for_prepared_transactions(ClusterInfo *cluster); static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster); static void check_for_reg_data_type_usage(ClusterInfo *cluster); -static void check_for_invalid_indexes(ClusterInfo *cluster); static void get_bin_version(ClusterInfo *cluster); static char *get_canonical_locale_name(int category, const char *locale); @@ -98,7 +97,6 @@ check_old_cluster(bool live_check, char **sequence_script_file_name) check_is_super_user(&old_cluster); check_for_prepared_transactions(&old_cluster); check_for_reg_data_type_usage(&old_cluster); - check_for_invalid_indexes(&old_cluster); check_for_isn_and_int8_passing_mismatch(&old_cluster); /* old = PG 8.3 checks? */ @@ -929,95 +927,6 @@ check_for_reg_data_type_usage(ClusterInfo *cluster) } -/* - * check_for_invalid_indexes() - * - * CREATE INDEX CONCURRENTLY can create invalid indexes if the index build - * fails. These are dumped as valid indexes by pg_dump, but the - * underlying files are still invalid indexes. This checks to make sure - * no invalid indexes exist, either failed index builds or concurrent - * indexes in the process of being created. - */ -static void -check_for_invalid_indexes(ClusterInfo *cluster) -{ - int dbnum; - FILE *script = NULL; - bool found = false; - char output_path[MAXPGPATH]; - - prep_status("Checking for invalid indexes from concurrent index builds"); - - snprintf(output_path, sizeof(output_path), "invalid_indexes.txt"); - - for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++) - { - PGresult *res; - bool db_used = false; - int ntups; - int rowno; - int i_nspname, - i_relname; - DbInfo *active_db = &cluster->dbarr.dbs[dbnum]; - PGconn *conn = connectToServer(cluster, active_db->db_name); - - res = executeQueryOrDie(conn, - "SELECT n.nspname, c.relname " - "FROM pg_catalog.pg_class c, " - " pg_catalog.pg_namespace n, " - " pg_catalog.pg_index i " - "WHERE (i.indisvalid = false OR " - " i.indisready = false) AND " - " i.indexrelid = c.oid AND " - " c.relnamespace = n.oid AND " - /* we do not migrate these, so skip them */ - " n.nspname != 'pg_catalog' AND " - " n.nspname != 'information_schema' AND " - /* indexes do not have toast tables */ - " n.nspname != 'pg_toast'"); - - ntups = PQntuples(res); - i_nspname = PQfnumber(res, "nspname"); - i_relname = PQfnumber(res, "relname"); - for (rowno = 0; rowno < ntups; rowno++) - { - found = true; - if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_log(PG_FATAL, "Could not open file \"%s\": %s\n", - output_path, getErrorText(errno)); - if (!db_used) - { - fprintf(script, "Database: %s\n", active_db->db_name); - db_used = true; - } - fprintf(script, " %s.%s\n", - PQgetvalue(res, rowno, i_nspname), - PQgetvalue(res, rowno, i_relname)); - } - - PQclear(res); - - PQfinish(conn); - } - - if (script) - fclose(script); - - if (found) - { - pg_log(PG_REPORT, "fatal\n"); - pg_log(PG_FATAL, - "Your installation contains invalid indexes due to failed or\n" - "currently running CREATE INDEX CONCURRENTLY operations. You\n" - "cannot upgrade until these indexes are valid or removed. A\n" - "list of the problem indexes is in the file:\n" - " %s\n\n", output_path); - } - else - check_ok(); -} - - static void get_bin_version(ClusterInfo *cluster) { diff --git a/contrib/pg_upgrade/info.c b/contrib/pg_upgrade/info.c index c406941c98..6cc10c7b5a 100644 --- a/contrib/pg_upgrade/info.c +++ b/contrib/pg_upgrade/info.c @@ -274,7 +274,13 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo) "CREATE TEMPORARY TABLE info_rels (reloid) AS SELECT c.oid " "FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n " " ON c.relnamespace = n.oid " + "LEFT OUTER JOIN pg_catalog.pg_index i " + " ON c.oid = i.indexrelid " "WHERE relkind IN ('r', 'i'%s) AND " + /* pg_dump only dumps valid indexes; testing indisready is + * necessary in 9.2, and harmless in earlier/later versions. */ + " i.indisvalid IS DISTINCT FROM false AND " + " i.indisready IS DISTINCT FROM false AND " /* exclude possible orphaned temp tables */ " ((n.nspname !~ '^pg_temp_' AND " " n.nspname !~ '^pg_toast_temp_' AND "