diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-08-30 20:30:06 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-08-30 20:30:06 +0000 |
commit | 16dc9bafb7811c900ffebc0ce5cdfeb8fad3266a (patch) | |
tree | 6e65355cae883cda0d2067827c98f9bdaaab8b8d | |
parent | 7bc654bb16dc08153060c8ddc1e0f3786026a483 (diff) | |
download | postgresql-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.c | 37 |
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 |