Обсуждение: pg_upgrade output directory

Поиск
Список
Период
Сортировка

pg_upgrade output directory

От
Andrew Dunstan
Дата:
Why does pg_upgrade create its output directory in the user's home 
directory (or TMP on Windows)? I should have thought that the current 
working directory would be a more suitable choice. At the  very least 
there should be an option for where to create it. Also, this location 
doesn't seem to be referred to at all in the docs.

cheers

andrew


Re: pg_upgrade output directory

От
Bruce Momjian
Дата:
Andrew Dunstan wrote:
> 
> Why does pg_upgrade create its output directory in the user's home 
> directory (or TMP on Windows)? I should have thought that the current 
> working directory would be a more suitable choice. At the  very least 
> there should be an option for where to create it. Also, this location 
> doesn't seem to be referred to at all in the docs.

Yeah, it is odd.  I did it that way because the output files need to
exist after the utility is run, and I worried that putting them in the
current directory might cause them to be accidentally deleted or
overlooked.

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?

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + None of us is going to be here forever. +


Re: pg_upgrade output directory

От
Greg Stark
Дата:
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.

--
greg


Re: pg_upgrade output directory

От
Bruce Momjian
Дата:
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");