]> granicus.if.org Git - postgresql/commitdiff
pg_upgrade: don't copy/link files for invalid indexes
authorBruce Momjian <bruce@momjian.us>
Sun, 31 Mar 2013 02:20:53 +0000 (22:20 -0400)
committerBruce Momjian <bruce@momjian.us>
Sun, 31 Mar 2013 02:20:53 +0000 (22:20 -0400)
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)

contrib/pg_upgrade/check.c
contrib/pg_upgrade/info.c

index 7537bde3af8f3578c7deedc31502cd528a6d96a7..e6d86ba7b9d8d5d4573a70ee905bbee6c9c89909 100644 (file)
@@ -19,7 +19,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);
 
 
@@ -100,7 +99,6 @@ check_old_cluster(bool live_check,
        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? */
@@ -805,95 +803,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(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)
 {
index dad0117b93cf2dd6877692dbf776b5b899f474d1..2c78f6ed4f5a320af0ec5dd5de8ea75c79acc61d 100644 (file)
@@ -267,9 +267,15 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
                         "      c.relfilenode, c.reltablespace, t.spclocation "
                         "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 "
                         "  LEFT OUTER JOIN pg_catalog.pg_tablespace t "
                         "         ON c.reltablespace = t.oid "
                         "WHERE relkind IN ('r','t', '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 "