aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-08-30 20:30:06 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-08-30 20:30:06 +0000
commit16dc9bafb7811c900ffebc0ce5cdfeb8fad3266a (patch)
tree6e65355cae883cda0d2067827c98f9bdaaab8b8d
parent7bc654bb16dc08153060c8ddc1e0f3786026a483 (diff)
downloadpostgresql-16dc9bafb7811c900ffebc0ce5cdfeb8fad3266a.tar.gz
postgresql-16dc9bafb7811c900ffebc0ce5cdfeb8fad3266a.zip
AbortOutOfAnyTransaction() just before backend exit, to ensure that
resources are cleaned up if the user disconnected mid-transaction. Great thanks to Hiroshi for pointing out what should have been obvious...
-rw-r--r--src/backend/tcop/postgres.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index b860967c3e3..3369e22825e 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.173 2000/08/29 09:36:47 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.174 2000/08/30 20:30:06 tgl Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -1404,14 +1404,14 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface ");
- puts("$Revision: 1.173 $ $Date: 2000/08/29 09:36:47 $\n");
+ puts("$Revision: 1.174 $ $Date: 2000/08/30 20:30:06 $\n");
}
/*
* Initialize the deferred trigger manager
*/
if (DeferredTriggerInit() != 0)
- proc_exit(0);
+ goto normalexit;
SetProcessingMode(NormalProcessing);
@@ -1451,10 +1451,8 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
AbortCurrentTransaction();
if (ExitAfterAbort)
- {
- ProcReleaseLocks(); /* Just to be sure... */
- proc_exit(0);
- }
+ goto errorexit;
+
/*
* If we recovered successfully, return to normal top-level context
* and clear ErrorContext for next time.
@@ -1547,8 +1545,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (HandleFunctionRequest() == EOF)
{
/* lost frontend connection during F message input */
- pq_close();
- proc_exit(0);
+ goto normalexit;
}
break;
@@ -1607,11 +1604,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
*/
case 'X':
case EOF:
- if (!IsUnderPostmaster)
- ShutdownXLOG();
- pq_close();
- proc_exit(0);
- break;
+ goto normalexit;
default:
elog(ERROR, "unknown frontend message was received");
@@ -1649,10 +1642,20 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
*/
MemoryContextCheck(TopMemoryContext);
#endif
- } /* infinite for-loop */
+ } /* end of main loop */
+
+normalexit:
+ ExitAfterAbort = true; /* ensure we will exit if elog during abort */
+ AbortOutOfAnyTransaction();
+ if (!IsUnderPostmaster)
+ ShutdownXLOG();
+
+errorexit:
+ pq_close();
+ ProcReleaseLocks(); /* Just to be sure... */
+ proc_exit(0);
- proc_exit(0); /* shouldn't get here... */
- return 1;
+ return 1; /* keep compiler quiet */
}
#ifndef HAVE_GETRUSAGE