From 72559b49c051ff7dc860068c96324ddf07d7955d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 5 Jan 2010 20:23:32 +0000 Subject: [PATCH] Fix genbki.pl and Gen_fmgrtab.pl to use PID-specific temp file names, so that it's safe if a parallel make chooses to run two concurrent copies. Also, work around a memory leak in some versions of Perl. --- src/backend/catalog/Catalog.pm | 9 ++++++--- src/backend/catalog/genbki.pl | 33 ++++++++++++++++++-------------- src/backend/utils/Gen_fmgrtab.pl | 21 +++++++++++++------- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm index 6a2c13d771..bcd4e31fb9 100644 --- a/src/backend/catalog/Catalog.pm +++ b/src/backend/catalog/Catalog.pm @@ -7,7 +7,7 @@ # Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # -# $PostgreSQL: pgsql/src/backend/catalog/Catalog.pm,v 1.2 2010/01/05 02:34:03 tgl Exp $ +# $PostgreSQL: pgsql/src/backend/catalog/Catalog.pm,v 1.3 2010/01/05 20:23:32 tgl Exp $ # #---------------------------------------------------------------------- @@ -170,11 +170,14 @@ sub Catalogs } # Rename temporary files to final names. -# Call this function with the final file name --- we append .tmp automatically +# Call this function with the final file name and the .tmp extension +# Note: recommended extension is ".tmp$$", so that parallel make steps +# can't use the same temp files sub RenameTempFile { my $final_name = shift; - my $temp_name = $final_name . '.tmp'; + my $extension = shift; + my $temp_name = $final_name . $extension; print "Writing $final_name\n"; rename($temp_name, $final_name) || die "rename: $temp_name: $!"; } diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl index 0b1a50f233..0f972822d3 100644 --- a/src/backend/catalog/genbki.pl +++ b/src/backend/catalog/genbki.pl @@ -10,7 +10,7 @@ # Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # -# $PostgreSQL: pgsql/src/backend/catalog/genbki.pl,v 1.3 2010/01/05 06:41:44 tgl Exp $ +# $PostgreSQL: pgsql/src/backend/catalog/genbki.pl,v 1.4 2010/01/05 20:23:32 tgl Exp $ # #---------------------------------------------------------------------- @@ -62,14 +62,19 @@ if ($output_path ne '' && substr($output_path, -1) ne '/') } # Open temp files -open BKI, '>', $output_path . 'postgres.bki.tmp' - || die "can't open postgres.bki.tmp: $!"; -open SCHEMAPG, '>', $output_path . 'schemapg.h.tmp' - || die "can't open 'schemapg.h.tmp: $!"; -open DESCR, '>', $output_path . 'postgres.description.tmp' - || die "can't open postgres.description.tmp: $!"; -open SHDESCR, '>', $output_path . 'postgres.shdescription.tmp' - || die "can't open postgres.shdescription.tmp: $!"; +my $tmpext = ".tmp$$"; +my $bkifile = $output_path . 'postgres.bki'; +open BKI, '>', $bkifile . $tmpext + or die "can't open $bkifile$tmpext: $!"; +my $schemafile = $output_path . 'schemapg.h'; +open SCHEMAPG, '>', $schemafile . $tmpext + or die "can't open $schemafile$tmpext: $!"; +my $descrfile = $output_path . 'postgres.description'; +open DESCR, '>', $descrfile . $tmpext + or die "can't open $descrfile$tmpext: $!"; +my $shdescrfile = $output_path . 'postgres.shdescription'; +open SHDESCR, '>', $shdescrfile . $tmpext + or die "can't open $shdescrfile$tmpext: $!"; # Fetch some special data that we will substitute into the output file. # CAUTION: be wary about what symbols you substitute into the .bki file here! @@ -283,15 +288,15 @@ print SCHEMAPG "\n#endif /* SCHEMAPG_H */\n"; # We're done emitting data close BKI; +close SCHEMAPG; close DESCR; close SHDESCR; -close SCHEMAPG; # Finally, rename the completed files into place. -Catalog::RenameTempFile($output_path . 'postgres.bki'); -Catalog::RenameTempFile($output_path . 'postgres.description'); -Catalog::RenameTempFile($output_path . 'postgres.shdescription'); -Catalog::RenameTempFile($output_path . 'schemapg.h'); +Catalog::RenameTempFile($bkifile, $tmpext); +Catalog::RenameTempFile($schemafile, $tmpext); +Catalog::RenameTempFile($descrfile, $tmpext); +Catalog::RenameTempFile($shdescrfile, $tmpext); exit 0; diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl index 5b281e874e..3c9c777362 100644 --- a/src/backend/utils/Gen_fmgrtab.pl +++ b/src/backend/utils/Gen_fmgrtab.pl @@ -9,7 +9,7 @@ # # # IDENTIFICATION -# $PostgreSQL: pgsql/src/backend/utils/Gen_fmgrtab.pl,v 1.4 2010/01/05 01:06:56 tgl Exp $ +# $PostgreSQL: pgsql/src/backend/utils/Gen_fmgrtab.pl,v 1.5 2010/01/05 20:23:32 tgl Exp $ # #------------------------------------------------------------------------- @@ -58,7 +58,6 @@ foreach my $column ( @{ $catalogs->{pg_proc}->{columns} } ) my $data = $catalogs->{pg_proc}->{data}; foreach my $row (@$data) { - # To construct fmgroids.h and fmgrtab.c, we need to inspect some # of the individual data fields. Just splitting on whitespace # won't work, because some quoted fields might contain internal @@ -81,10 +80,19 @@ foreach my $row (@$data) nargs => $row->{pronargs}, prosrc => $row->{prosrc}, }; + + # Hack to work around memory leak in some versions of Perl + $row = undef; } # Emit headers for both files -open H, '>', $output_path . 'fmgroids.h.tmp' || die "Could not open fmgroids.h.tmp: $!"; +my $tmpext = ".tmp$$"; +my $oidsfile = $output_path . 'fmgroids.h'; +my $tabfile = $output_path . 'fmgrtab.c'; + +open H, '>', $oidsfile . $tmpext or die "Could not open $oidsfile$tmpext: $!"; +open T, '>', $tabfile . $tmpext or die "Could not open $tabfile$tmpext: $!"; + print H qq|/*------------------------------------------------------------------------- * @@ -123,7 +131,6 @@ qq|/*------------------------------------------------------------------------- */ |; -open T, '>', $output_path . 'fmgrtab.c.tmp' || die "Could not open fmgrtab.c.tmp: $!"; print T qq|/*------------------------------------------------------------------------- * @@ -174,7 +181,6 @@ foreach my $s (sort {$a->{oid} <=> $b->{oid}} @fmgr) # And add the file footers. print H "\n#endif /* FMGROIDS_H */\n"; -close(H); print T qq| /* dummy entry is easier than getting rid of comma after last real one */ @@ -187,11 +193,12 @@ qq| /* dummy entry is easier than getting rid of comma after last real one */ const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin)) - 1; |; +close(H); close(T); # Finally, rename the completed files into place. -Catalog::RenameTempFile($output_path . 'fmgroids.h'); -Catalog::RenameTempFile($output_path . 'fmgrtab.c'); +Catalog::RenameTempFile($oidsfile, $tmpext); +Catalog::RenameTempFile($tabfile, $tmpext); sub usage { -- 2.40.0