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 7e5fc2cfdd87907409ad9442d995352589bfb6bb..eaa28f0b7ed686a9cafe9028f21cefb0977a383c 100644 (file)
@@ -17,7 +17,6 @@ static void check_locale_and_encoding(migratorContext *ctx, ControlData *oldctrl
 static void check_for_isn_and_int8_passing_mismatch(migratorContext *ctx,
                                                Cluster whichCluster);
 static void check_for_reg_data_type_usage(migratorContext *ctx, Cluster whichCluster);
-static void check_for_invalid_indexes(migratorContext *ctx, Cluster whichCluster);
 
 
 /*
@@ -97,7 +96,6 @@ check_old_cluster(migratorContext *ctx, bool live_check,
 
    check_for_reg_data_type_usage(ctx, CLUSTER_OLD);
    check_for_isn_and_int8_passing_mismatch(ctx, CLUSTER_OLD);
-   check_for_invalid_indexes(ctx, CLUSTER_OLD);
 
    /* old = PG 8.3 checks? */
    if (GET_MAJOR_VERSION(ctx->old.major_version) <= 803)
@@ -678,93 +676,3 @@ check_for_reg_data_type_usage(migratorContext *ctx, Cluster whichCluster)
    else
        check_ok(ctx);
 }
-
-
-/*
- * 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(migratorContext *ctx, Cluster whichCluster)
-{
-   ClusterInfo *cluster = (whichCluster == CLUSTER_OLD) ?
-   &ctx->old : &ctx->new;
-   int         dbnum;
-   FILE       *script = NULL;
-   bool        found = false;
-   char        output_path[MAXPGPATH];
-
-   prep_status(ctx, "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(ctx, active_db->db_name, whichCluster);
-
-       res = executeQueryOrDie(ctx, 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(ctx, PG_FATAL, "Could not create necessary file:  %s\n", output_path);
-           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(ctx, PG_REPORT, "fatal\n");
-       pg_log(ctx, 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(ctx);
-}
index 02d3e0f52f0c5be88e63357fdc6b1dbb0efc0e81..271c27ce73081f1489a3b55f23504f418f70266c 100644 (file)
@@ -325,6 +325,8 @@ get_rel_infos(migratorContext *ctx, const DbInfo *dbinfo,
             "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 (( "
@@ -338,7 +340,11 @@ get_rel_infos(migratorContext *ctx, const DbInfo *dbinfo,
             "  n.nspname = 'pg_catalog' "
             "  AND relname IN "
             "        ('pg_largeobject', 'pg_largeobject_loid_pn_index'%s) )) "
-            "  AND relkind IN ('r','t', 'i'%s)"
+            "  AND relkind IN ('r','t', 'i'%s) "
+            /* pg_dump only dumps valid indexes;  testing indisready is
+            * necessary in 9.2, and harmless in earlier/later versions. */
+            " AND i.indisvalid IS DISTINCT FROM false AND "
+            " i.indisready IS DISTINCT FROM false "
             "GROUP BY  c.oid, n.nspname, c.relname, c.relfilenode,"
             "          c.reltoastrelid, c.reltablespace, t.spclocation, "
             "          n.nspname "