Re: pg_upgrade output directory - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: pg_upgrade output directory
Date
Msg-id 201006121712.o5CHCX821176@momjian.us
Whole thread Raw
In response to Re: pg_upgrade output directory  (Greg Stark <gsstark@mit.edu>)
List pgsql-hackers
Greg Stark wrote:
> On Sat, Jun 12, 2010 at 4:58 AM, Bruce Momjian <bruce@momjian.us> wrote:
> > However, I might have been too conservative. ?How do tools that generate
> > multiple output files usually handle this situation? ?Do they output in
> > to a subdirectory in $HOME, or in a subdirectory of the current
> > directory, or just create multiple files without a subdirectory?
>
> Generally they put them in the current directory without
> subdirectories but take a parameter to specify a directory to use.
> That parameter could be mandatory though if you're afraid the current
> directory isn't a suitable place.

Agreed.  I have applied the attached patch which creates the files in
the current directory.  I think that will be fine and don't see any need
for a directory parameter.  I have kept the printing of the full path
name in the output:

    Upgrade complete
    ----------------
    | Optimizer statistics is not transferred by pg_upgrade
    | so consider running:
    |       vacuumdb --all --analyze-only
    | on the newly-upgraded cluster.

    | Running this script will delete the old cluster's data files:
    |          /u/pg_migrator/pg_migrator/delete_old_cluster.sh

I figured this would be helpful for people on Windows who might not know
the actual directory used for the files.  However, it does make the
display kind of wide.  Ideas?

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + None of us is going to be here forever. +
Index: contrib/pg_upgrade/check.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/check.c,v
retrieving revision 1.5
diff -c -c -r1.5 check.c
*** contrib/pg_upgrade/check.c    23 May 2010 16:54:13 -0000    1.5
--- contrib/pg_upgrade/check.c    12 Jun 2010 17:01:23 -0000
***************
*** 381,387 ****
      prep_status(ctx, "Creating script to delete old cluster");

      snprintf(*deletion_script_file_name, MAXPGPATH, "%s/delete_old_cluster.%s",
!              ctx->output_dir, EXEC_EXT);

      if ((script = fopen(*deletion_script_file_name, "w")) == NULL)
          pg_log(ctx, PG_FATAL, "Could not create necessary file:  %s\n",
--- 381,387 ----
      prep_status(ctx, "Creating script to delete old cluster");

      snprintf(*deletion_script_file_name, MAXPGPATH, "%s/delete_old_cluster.%s",
!              ctx->cwd, EXEC_EXT);

      if ((script = fopen(*deletion_script_file_name, "w")) == NULL)
          pg_log(ctx, PG_FATAL, "Could not create necessary file:  %s\n",
Index: contrib/pg_upgrade/dump.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/dump.c,v
retrieving revision 1.1
diff -c -c -r1.1 dump.c
*** contrib/pg_upgrade/dump.c    12 May 2010 02:19:10 -0000    1.1
--- contrib/pg_upgrade/dump.c    12 Jun 2010 17:01:23 -0000
***************
*** 21,27 ****
      exec_prog(ctx, true,
                SYSTEMQUOTE "\"%s/pg_dumpall\" --port %d --schema-only "
                "--binary-upgrade > \"%s/" ALL_DUMP_FILE "\"" SYSTEMQUOTE,
!               ctx->new.bindir, ctx->old.port, ctx->output_dir);
      check_ok(ctx);
  }

--- 21,27 ----
      exec_prog(ctx, true,
                SYSTEMQUOTE "\"%s/pg_dumpall\" --port %d --schema-only "
                "--binary-upgrade > \"%s/" ALL_DUMP_FILE "\"" SYSTEMQUOTE,
!               ctx->new.bindir, ctx->old.port, ctx->cwd);
      check_ok(ctx);
  }

***************
*** 52,64 ****
      char        filename[MAXPGPATH];
      bool        suppressed_username = false;

!     snprintf(filename, sizeof(filename), "%s/%s", ctx->output_dir, ALL_DUMP_FILE);
      if ((all_dump = fopen(filename, "r")) == NULL)
          pg_log(ctx, PG_FATAL, "Cannot open dump file %s\n", filename);
!     snprintf(filename, sizeof(filename), "%s/%s", ctx->output_dir, GLOBALS_DUMP_FILE);
      if ((globals_dump = fopen(filename, "w")) == NULL)
          pg_log(ctx, PG_FATAL, "Cannot write to dump file %s\n", filename);
!     snprintf(filename, sizeof(filename), "%s/%s", ctx->output_dir, DB_DUMP_FILE);
      if ((db_dump = fopen(filename, "w")) == NULL)
          pg_log(ctx, PG_FATAL, "Cannot write to dump file %s\n", filename);
      current_output = globals_dump;
--- 52,64 ----
      char        filename[MAXPGPATH];
      bool        suppressed_username = false;

!     snprintf(filename, sizeof(filename), "%s/%s", ctx->cwd, ALL_DUMP_FILE);
      if ((all_dump = fopen(filename, "r")) == NULL)
          pg_log(ctx, PG_FATAL, "Cannot open dump file %s\n", filename);
!     snprintf(filename, sizeof(filename), "%s/%s", ctx->cwd, GLOBALS_DUMP_FILE);
      if ((globals_dump = fopen(filename, "w")) == NULL)
          pg_log(ctx, PG_FATAL, "Cannot write to dump file %s\n", filename);
!     snprintf(filename, sizeof(filename), "%s/%s", ctx->cwd, DB_DUMP_FILE);
      if ((db_dump = fopen(filename, "w")) == NULL)
          pg_log(ctx, PG_FATAL, "Cannot write to dump file %s\n", filename);
      current_output = globals_dump;
Index: contrib/pg_upgrade/function.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/function.c,v
retrieving revision 1.2
diff -c -c -r1.2 function.c
*** contrib/pg_upgrade/function.c    13 May 2010 01:03:01 -0000    1.2
--- contrib/pg_upgrade/function.c    12 Jun 2010 17:01:23 -0000
***************
*** 213,219 ****
      prep_status(ctx, "Checking for presence of required libraries");

      snprintf(output_path, sizeof(output_path), "%s/loadable_libraries.txt",
!              ctx->output_dir);

      for (libnum = 0; libnum < ctx->num_libraries; libnum++)
      {
--- 213,219 ----
      prep_status(ctx, "Checking for presence of required libraries");

      snprintf(output_path, sizeof(output_path), "%s/loadable_libraries.txt",
!              ctx->cwd);

      for (libnum = 0; libnum < ctx->num_libraries; libnum++)
      {
Index: contrib/pg_upgrade/option.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/option.c,v
retrieving revision 1.5
diff -c -c -r1.5 option.c
*** contrib/pg_upgrade/option.c    25 May 2010 15:55:28 -0000    1.5
--- contrib/pg_upgrade/option.c    12 Jun 2010 17:01:23 -0000
***************
*** 84,103 ****
      if (user_id == 0)
          pg_log(ctx, PG_FATAL, "%s: cannot be run as root\n", ctx->progname);

! #ifndef WIN32
!     get_home_path(ctx->home_dir);
! #else
!     {
!         char       *tmppath;
!
!         /* TMP is the best place on Windows, rather than APPDATA */
!         if ((tmppath = getenv("TMP")) == NULL)
!             pg_log(ctx, PG_FATAL, "TMP environment variable is not set.\n");
!         snprintf(ctx->home_dir, MAXPGPATH, "%s", tmppath);
!     }
! #endif
!
!     snprintf(ctx->output_dir, MAXPGPATH, "%s/" OUTPUT_SUBDIR, ctx->home_dir);

      while ((option = getopt_long(argc, argv, "d:D:b:B:cgG:kl:p:P:u:v",
                                   long_options, &optindex)) != -1)
--- 84,90 ----
      if (user_id == 0)
          pg_log(ctx, PG_FATAL, "%s: cannot be run as root\n", ctx->progname);

!     getcwd(ctx->cwd, MAXPGPATH);

      while ((option = getopt_long(argc, argv, "d:D:b:B:cgG:kl:p:P:u:v",
                                   long_options, &optindex)) != -1)
Index: contrib/pg_upgrade/pg_upgrade.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/pg_upgrade.c,v
retrieving revision 1.4
diff -c -c -r1.4 pg_upgrade.c
*** contrib/pg_upgrade/pg_upgrade.c    19 May 2010 18:27:43 -0000    1.4
--- contrib/pg_upgrade/pg_upgrade.c    12 Jun 2010 17:01:23 -0000
***************
*** 18,24 ****
  static void set_frozenxids(migratorContext *ctx);
  static void setup(migratorContext *ctx, char *argv0, bool live_check);
  static void cleanup(migratorContext *ctx);
- static void create_empty_output_directory(migratorContext *ctx);


  int
--- 18,23 ----
***************
*** 37,44 ****

      setup(&ctx, argv[0], live_check);

-     create_empty_output_directory(&ctx);
-
      check_cluster_versions(&ctx);
      check_cluster_compatibility(&ctx, live_check);

--- 36,41 ----
***************
*** 201,207 ****
      exec_prog(ctx, true,
                SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on --port %d "
                "-f \"%s/%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE,
!               ctx->new.bindir, ctx->new.port, ctx->output_dir,
                GLOBALS_DUMP_FILE, ctx->logfile);
      check_ok(ctx);

--- 198,204 ----
      exec_prog(ctx, true,
                SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on --port %d "
                "-f \"%s/%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE,
!               ctx->new.bindir, ctx->new.port, ctx->cwd,
                GLOBALS_DUMP_FILE, ctx->logfile);
      check_ok(ctx);

***************
*** 223,229 ****
      exec_prog(ctx, true,
                SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on --port %d "
                "-f \"%s/%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE,
!               ctx->new.bindir, ctx->new.port, ctx->output_dir,
                DB_DUMP_FILE, ctx->logfile);
      check_ok(ctx);

--- 220,226 ----
      exec_prog(ctx, true,
                SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on --port %d "
                "-f \"%s/%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE,
!               ctx->new.bindir, ctx->new.port, ctx->cwd,
                DB_DUMP_FILE, ctx->logfile);
      check_ok(ctx);

***************
*** 399,431 ****
      if (ctx->debug_fd)
          fclose(ctx->debug_fd);

!     snprintf(filename, sizeof(filename), "%s/%s", ctx->output_dir, ALL_DUMP_FILE);
      unlink(filename);
!     snprintf(filename, sizeof(filename), "%s/%s", ctx->output_dir, GLOBALS_DUMP_FILE);
      unlink(filename);
!     snprintf(filename, sizeof(filename), "%s/%s", ctx->output_dir, DB_DUMP_FILE);
      unlink(filename);
  }
-
-
- /*
-  * create_empty_output_directory
-  *
-  *    Create empty directory for output files
-  */
- static void
- create_empty_output_directory(migratorContext *ctx)
- {
-     /*
-      *    rmtree() outputs a warning if the directory does not exist,
-      *    so we try to create the directory first.
-      */
-     if (mkdir(ctx->output_dir, S_IRWXU) != 0)
-     {
-         if (errno == EEXIST)
-             rmtree(ctx->output_dir, false);
-         else
-             pg_log(ctx, PG_FATAL, "Cannot create subdirectory %s: %s\n",
-                ctx->output_dir, getErrorText(errno));
-     }
- }
--- 396,405 ----
      if (ctx->debug_fd)
          fclose(ctx->debug_fd);

!     snprintf(filename, sizeof(filename), "%s/%s", ctx->cwd, ALL_DUMP_FILE);
      unlink(filename);
!     snprintf(filename, sizeof(filename), "%s/%s", ctx->cwd, GLOBALS_DUMP_FILE);
      unlink(filename);
!     snprintf(filename, sizeof(filename), "%s/%s", ctx->cwd, DB_DUMP_FILE);
      unlink(filename);
  }
Index: contrib/pg_upgrade/pg_upgrade.h
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/pg_upgrade.h,v
retrieving revision 1.5
diff -c -c -r1.5 pg_upgrade.h
*** contrib/pg_upgrade/pg_upgrade.h    14 May 2010 00:13:38 -0000    1.5
--- contrib/pg_upgrade/pg_upgrade.h    12 Jun 2010 17:01:23 -0000
***************
*** 29,36 ****
  #define OVERWRITE_MESSAGE    "  %-" MESSAGE_WIDTH "." MESSAGE_WIDTH "s\r"
  #define GET_MAJOR_VERSION(v)    ((v) / 100)

- #define OUTPUT_SUBDIR        "pg_upgrade_output"
-
  #define ALL_DUMP_FILE        "pg_upgrade_dump_all.sql"
  /* contains both global db information and CREATE DATABASE commands */
  #define GLOBALS_DUMP_FILE    "pg_upgrade_dump_globals.sql"
--- 29,34 ----
***************
*** 217,224 ****
      const char *progname;        /* complete pathname for this program */
      char       *exec_path;        /* full path to my executable */
      char       *user;            /* username for clusters */
!     char        home_dir[MAXPGPATH];    /* name of user's home directory */
!     char        output_dir[MAXPGPATH];    /* directory for pg_upgrade output */
      char      **tablespaces;    /* tablespaces */
      int            num_tablespaces;
      char      **libraries;        /* loadable libraries */
--- 215,221 ----
      const char *progname;        /* complete pathname for this program */
      char       *exec_path;        /* full path to my executable */
      char       *user;            /* username for clusters */
!     char        cwd[MAXPGPATH];    /* directory for pg_upgrade output */
      char      **tablespaces;    /* tablespaces */
      int            num_tablespaces;
      char      **libraries;        /* loadable libraries */
Index: contrib/pg_upgrade/version.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/version.c,v
retrieving revision 1.1
diff -c -c -r1.1 version.c
*** contrib/pg_upgrade/version.c    12 May 2010 02:19:11 -0000    1.1
--- contrib/pg_upgrade/version.c    12 Jun 2010 17:01:23 -0000
***************
*** 28,34 ****
      prep_status(ctx, "Checking for large objects");

      snprintf(output_path, sizeof(output_path), "%s/pg_largeobject.sql",
!              ctx->output_dir);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
--- 28,34 ----
      prep_status(ctx, "Checking for large objects");

      snprintf(output_path, sizeof(output_path), "%s/pg_largeobject.sql",
!              ctx->cwd);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
Index: contrib/pg_upgrade/version_old_8_3.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/version_old_8_3.c,v
retrieving revision 1.2
diff -c -c -r1.2 version_old_8_3.c
*** contrib/pg_upgrade/version_old_8_3.c    14 May 2010 00:13:38 -0000    1.2
--- contrib/pg_upgrade/version_old_8_3.c    12 Jun 2010 17:01:23 -0000
***************
*** 28,34 ****
      prep_status(ctx, "Checking for invalid 'name' user columns");

      snprintf(output_path, sizeof(output_path), "%s/tables_using_name.txt",
!              ctx->output_dir);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
--- 28,34 ----
      prep_status(ctx, "Checking for invalid 'name' user columns");

      snprintf(output_path, sizeof(output_path), "%s/tables_using_name.txt",
!              ctx->cwd);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
***************
*** 123,129 ****
      prep_status(ctx, "Checking for tsquery user columns");

      snprintf(output_path, sizeof(output_path), "%s/tables_using_tsquery.txt",
!              ctx->output_dir);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
--- 123,129 ----
      prep_status(ctx, "Checking for tsquery user columns");

      snprintf(output_path, sizeof(output_path), "%s/tables_using_tsquery.txt",
!              ctx->cwd);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
***************
*** 222,228 ****
      }

      snprintf(output_path, sizeof(output_path), "%s/contrib_isn_and_int8_pass_by_value.txt",
!              ctx->output_dir);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
--- 222,228 ----
      }

      snprintf(output_path, sizeof(output_path), "%s/contrib_isn_and_int8_pass_by_value.txt",
!              ctx->cwd);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
***************
*** 312,318 ****
      prep_status(ctx, "Checking for tsvector user columns");

      snprintf(output_path, sizeof(output_path), "%s/rebuild_tsvector_tables.sql",
!              ctx->output_dir);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
--- 312,318 ----
      prep_status(ctx, "Checking for tsvector user columns");

      snprintf(output_path, sizeof(output_path), "%s/rebuild_tsvector_tables.sql",
!              ctx->cwd);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
***************
*** 457,463 ****
      prep_status(ctx, "Checking for hash and gin indexes");

      snprintf(output_path, sizeof(output_path), "%s/reindex_hash_and_gin.sql",
!              ctx->output_dir);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
--- 457,463 ----
      prep_status(ctx, "Checking for hash and gin indexes");

      snprintf(output_path, sizeof(output_path), "%s/reindex_hash_and_gin.sql",
!              ctx->cwd);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
***************
*** 573,579 ****
      prep_status(ctx, "Checking for bpchar_pattern_ops indexes");

      snprintf(output_path, sizeof(output_path), "%s/reindex_bpchar_ops.sql",
!              ctx->output_dir);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
--- 573,579 ----
      prep_status(ctx, "Checking for bpchar_pattern_ops indexes");

      snprintf(output_path, sizeof(output_path), "%s/reindex_bpchar_ops.sql",
!              ctx->cwd);

      for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
      {
***************
*** 705,711 ****
      bool        found = false;
      char       *output_path = pg_malloc(ctx, MAXPGPATH);

!     snprintf(output_path, MAXPGPATH, "%s/adjust_sequences.sql", ctx->output_dir);

      prep_status(ctx, "Creating script to adjust sequences");

--- 705,711 ----
      bool        found = false;
      char       *output_path = pg_malloc(ctx, MAXPGPATH);

!     snprintf(output_path, MAXPGPATH, "%s/adjust_sequences.sql", ctx->cwd);

      prep_status(ctx, "Creating script to adjust sequences");


pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: hstore ==> and deprecate =>
Next
From: Tom Lane
Date:
Subject: Re: hstore ==> and deprecate =>