Skip to content

Commit 717f6d6

Browse files
committed
In pg_upgrade, add various logging improvements:
add ability to control permissions of created files have psql echo its queries for easier debugging output four separate log files, and delete them on success add -r/--retain option to keep log files after success make logs file append-only remove -g/-G/-l logging options sugggest tailing appropriate log file on failure enhance -v/--verbose behavior
1 parent b4af1c2 commit 717f6d6

File tree

16 files changed

+259
-236
lines changed

16 files changed

+259
-236
lines changed

contrib/pg_upgrade/check.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -165,12 +165,13 @@ issue_warnings(char *sequence_script_file_name)
165165
if (sequence_script_file_name)
166166
{
167167
prep_status("Adjusting sequences");
168-
exec_prog(true,
169-
SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on "
168+
exec_prog(true, true, UTILITY_LOG_FILE,
169+
SYSTEMQUOTE "\"%s/psql\" --echo-queries "
170+
"--set ON_ERROR_STOP=on "
170171
"--no-psqlrc --port %d --username \"%s\" "
171-
"-f \"%s\" --dbname template1 >> \"%s\"" SYSTEMQUOTE,
172+
"-f \"%s\" --dbname template1 >> \"%s\" 2>&1" SYSTEMQUOTE,
172173
new_cluster.bindir, new_cluster.port, os_info.user,
173-
sequence_script_file_name, log_opts.filename2);
174+
sequence_script_file_name, UTILITY_LOG_FILE);
174175
unlink(sequence_script_file_name);
175176
check_ok();
176177
}
@@ -393,10 +394,10 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
393394

394395
prep_status("Creating script to delete old cluster");
395396

396-
snprintf(*deletion_script_file_name, MAXPGPATH, "%s/delete_old_cluster.%s",
397-
os_info.cwd, SCRIPT_EXT);
397+
snprintf(*deletion_script_file_name, MAXPGPATH, "delete_old_cluster.%s",
398+
SCRIPT_EXT);
398399

399-
if ((script = fopen(*deletion_script_file_name, "w")) == NULL)
400+
if ((script = fopen_priv(*deletion_script_file_name, "w")) == NULL)
400401
pg_log(PG_FATAL, "Could not open file \"%s\": %s\n",
401402
*deletion_script_file_name, getErrorText(errno));
402403

@@ -541,8 +542,8 @@ check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster)
541542
return;
542543
}
543544

544-
snprintf(output_path, sizeof(output_path), "%s/contrib_isn_and_int8_pass_by_value.txt",
545-
os_info.cwd);
545+
snprintf(output_path, sizeof(output_path),
546+
"contrib_isn_and_int8_pass_by_value.txt");
546547

547548
for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
548549
{
@@ -569,7 +570,7 @@ check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster)
569570
for (rowno = 0; rowno < ntups; rowno++)
570571
{
571572
found = true;
572-
if (script == NULL && (script = fopen(output_path, "w")) == NULL)
573+
if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
573574
pg_log(PG_FATAL, "Could not open file \"%s\": %s\n",
574575
output_path, getErrorText(errno));
575576
if (!db_used)
@@ -628,8 +629,7 @@ check_for_reg_data_type_usage(ClusterInfo *cluster)
628629

629630
prep_status("Checking for reg* system OID user data types");
630631

631-
snprintf(output_path, sizeof(output_path), "%s/tables_using_reg.txt",
632-
os_info.cwd);
632+
snprintf(output_path, sizeof(output_path), "tables_using_reg.txt");
633633

634634
for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
635635
{
@@ -675,7 +675,7 @@ check_for_reg_data_type_usage(ClusterInfo *cluster)
675675
for (rowno = 0; rowno < ntups; rowno++)
676676
{
677677
found = true;
678-
if (script == NULL && (script = fopen(output_path, "w")) == NULL)
678+
if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
679679
pg_log(PG_FATAL, "Could not open file \"%s\": %s\n",
680680
output_path, getErrorText(errno));
681681
if (!db_used)

contrib/pg_upgrade/controldata.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,9 @@ get_control_data(ClusterInfo *cluster, bool live_check)
126126
/* we have the result of cmd in "output". so parse it line by line now */
127127
while (fgets(bufin, sizeof(bufin), output))
128128
{
129-
if (log_opts.debug)
130-
fputs(bufin, log_opts.debug_fd);
129+
pg_log(PG_VERBOSE, "%s", bufin);
131130

132131
#ifdef WIN32
133-
134132
/*
135133
* Due to an installer bug, LANG=C doesn't work for PG 8.3.3, but does
136134
* work 8.2.6 and 8.3.7, so check for non-ASCII output and suggest a

contrib/pg_upgrade/dump.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "pg_upgrade.h"
1313

14+
#include <sys/types.h>
1415

1516
void
1617
generate_old_dump(void)
@@ -22,10 +23,12 @@ generate_old_dump(void)
2223
* --binary-upgrade records the width of dropped columns in pg_class, and
2324
* restores the frozenid's for databases and relations.
2425
*/
25-
exec_prog(true,
26+
exec_prog(true, true, UTILITY_LOG_FILE,
2627
SYSTEMQUOTE "\"%s/pg_dumpall\" --port %d --username \"%s\" "
27-
"--schema-only --binary-upgrade > \"%s/" ALL_DUMP_FILE "\""
28-
SYSTEMQUOTE, new_cluster.bindir, old_cluster.port, os_info.user, os_info.cwd);
28+
"--schema-only --binary-upgrade %s > \"%s\" 2>> \"%s\""
29+
SYSTEMQUOTE, new_cluster.bindir, old_cluster.port, os_info.user,
30+
log_opts.verbose ? "--verbose" : "",
31+
ALL_DUMP_FILE, UTILITY_LOG_FILE);
2932
check_ok();
3033
}
3134

@@ -56,15 +59,16 @@ split_old_dump(void)
5659
char filename[MAXPGPATH];
5760
bool suppressed_username = false;
5861

59-
snprintf(filename, sizeof(filename), "%s/%s", os_info.cwd, ALL_DUMP_FILE);
62+
snprintf(filename, sizeof(filename), "%s", ALL_DUMP_FILE);
6063
if ((all_dump = fopen(filename, "r")) == NULL)
6164
pg_log(PG_FATAL, "Could not open dump file \"%s\": %s\n", filename, getErrorText(errno));
62-
snprintf(filename, sizeof(filename), "%s/%s", os_info.cwd, GLOBALS_DUMP_FILE);
63-
if ((globals_dump = fopen(filename, "w")) == NULL)
65+
snprintf(filename, sizeof(filename), "%s", GLOBALS_DUMP_FILE);
66+
if ((globals_dump = fopen_priv(filename, "w")) == NULL)
6467
pg_log(PG_FATAL, "Could not write to dump file \"%s\": %s\n", filename, getErrorText(errno));
65-
snprintf(filename, sizeof(filename), "%s/%s", os_info.cwd, DB_DUMP_FILE);
66-
if ((db_dump = fopen(filename, "w")) == NULL)
68+
snprintf(filename, sizeof(filename), "%s", DB_DUMP_FILE);
69+
if ((db_dump = fopen_priv(filename, "w")) == NULL)
6770
pg_log(PG_FATAL, "Could not write to dump file \"%s\": %s\n", filename, getErrorText(errno));
71+
6872
current_output = globals_dump;
6973

7074
/* patterns used to prevent our own username from being recreated */

contrib/pg_upgrade/exec.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
#include <fcntl.h>
1515
#include <unistd.h>
16-
16+
#include <sys/types.h>
1717

1818
static void check_data_dir(const char *pg_data);
1919
static void check_bin_dir(ClusterInfo *cluster);
@@ -34,24 +34,37 @@ static int win32_check_directory_write_permissions(void);
3434
* instead of returning should an error occur.
3535
*/
3636
int
37-
exec_prog(bool throw_error, const char *fmt,...)
37+
exec_prog(bool throw_error, bool is_priv,
38+
const char *log_file, const char *fmt,...)
3839
{
3940
va_list args;
4041
int result;
4142
char cmd[MAXPGPATH];
43+
mode_t old_umask;
44+
45+
if (is_priv)
46+
old_umask = umask(S_IRWXG | S_IRWXO);
4247

4348
va_start(args, fmt);
4449
vsnprintf(cmd, MAXPGPATH, fmt, args);
4550
va_end(args);
4651

47-
pg_log(PG_INFO, "%s\n", cmd);
52+
pg_log(PG_VERBOSE, "%s\n", cmd);
4853

4954
result = system(cmd);
5055

56+
if (is_priv)
57+
umask(old_umask);
58+
5159
if (result != 0)
5260
{
53-
pg_log(throw_error ? PG_FATAL : PG_INFO,
54-
"There were problems executing \"%s\"\n", cmd);
61+
report_status(PG_REPORT, "*failure*");
62+
fflush(stdout);
63+
pg_log(PG_VERBOSE, "There were problems executing \"%s\"\n", cmd);
64+
pg_log(throw_error ? PG_FATAL : PG_REPORT,
65+
"Consult the last few lines of \"%s\" for\n"
66+
"the probable cause of the failure.\n",
67+
log_file);
5568
return 1;
5669
}
5770

contrib/pg_upgrade/file.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,3 +316,19 @@ win32_pghardlink(const char *src, const char *dst)
316316
}
317317

318318
#endif
319+
320+
321+
/* fopen() file with no group/other permissions */
322+
FILE *
323+
fopen_priv(const char *path, const char *mode)
324+
{
325+
mode_t old_umask = umask(S_IRWXG | S_IRWXO);
326+
FILE *fp;
327+
328+
fp = fopen(path, mode);
329+
umask(old_umask);
330+
331+
return fp;
332+
}
333+
334+

contrib/pg_upgrade/function.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,7 @@ check_loadable_libraries(void)
218218

219219
prep_status("Checking for presence of required libraries");
220220

221-
snprintf(output_path, sizeof(output_path), "%s/loadable_libraries.txt",
222-
os_info.cwd);
221+
snprintf(output_path, sizeof(output_path), "loadable_libraries.txt");
223222

224223
for (libnum = 0; libnum < os_info.num_libraries; libnum++)
225224
{
@@ -257,7 +256,7 @@ check_loadable_libraries(void)
257256
if (PQresultStatus(res) != PGRES_COMMAND_OK)
258257
{
259258
found = true;
260-
if (script == NULL && (script = fopen(output_path, "w")) == NULL)
259+
if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
261260
pg_log(PG_FATAL, "Could not open file \"%s\": %s\n",
262261
output_path, getErrorText(errno));
263262
fprintf(script, "Could not load library \"%s\"\n%s\n",

contrib/pg_upgrade/info.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -132,19 +132,19 @@ create_rel_filename_map(const char *old_data, const char *new_data,
132132
void
133133
print_maps(FileNameMap *maps, int n_maps, const char *db_name)
134134
{
135-
if (log_opts.debug)
135+
if (log_opts.verbose)
136136
{
137137
int mapnum;
138138

139-
pg_log(PG_DEBUG, "mappings for database \"%s\":\n", db_name);
139+
pg_log(PG_VERBOSE, "mappings for database \"%s\":\n", db_name);
140140

141141
for (mapnum = 0; mapnum < n_maps; mapnum++)
142-
pg_log(PG_DEBUG, "%s.%s: %u to %u\n",
142+
pg_log(PG_VERBOSE, "%s.%s: %u to %u\n",
143143
maps[mapnum].nspname, maps[mapnum].relname,
144144
maps[mapnum].old_relfilenode,
145145
maps[mapnum].new_relfilenode);
146146

147-
pg_log(PG_DEBUG, "\n\n");
147+
pg_log(PG_VERBOSE, "\n\n");
148148
}
149149
}
150150

@@ -168,11 +168,9 @@ get_db_and_rel_infos(ClusterInfo *cluster)
168168
for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
169169
get_rel_infos(cluster, &cluster->dbarr.dbs[dbnum]);
170170

171-
if (log_opts.debug)
172-
{
173-
pg_log(PG_DEBUG, "\n%s databases:\n", CLUSTER_NAME(cluster));
171+
pg_log(PG_VERBOSE, "\n%s databases:\n", CLUSTER_NAME(cluster));
172+
if (log_opts.verbose)
174173
print_db_infos(&cluster->dbarr);
175-
}
176174
}
177175

178176

@@ -368,9 +366,9 @@ print_db_infos(DbInfoArr *db_arr)
368366

369367
for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
370368
{
371-
pg_log(PG_DEBUG, "Database: %s\n", db_arr->dbs[dbnum].db_name);
369+
pg_log(PG_VERBOSE, "Database: %s\n", db_arr->dbs[dbnum].db_name);
372370
print_rel_infos(&db_arr->dbs[dbnum].rel_arr);
373-
pg_log(PG_DEBUG, "\n\n");
371+
pg_log(PG_VERBOSE, "\n\n");
374372
}
375373
}
376374

@@ -381,7 +379,7 @@ print_rel_infos(RelInfoArr *arr)
381379
int relnum;
382380

383381
for (relnum = 0; relnum < arr->nrels; relnum++)
384-
pg_log(PG_DEBUG, "relname: %s.%s: reloid: %u reltblspace: %s\n",
382+
pg_log(PG_VERBOSE, "relname: %s.%s: reloid: %u reltblspace: %s\n",
385383
arr->rels[relnum].nspname, arr->rels[relnum].relname,
386384
arr->rels[relnum].reloid, arr->rels[relnum].tablespace);
387385
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy