From 16dc9bafb7811c900ffebc0ce5cdfeb8fad3266a Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Wed, 30 Aug 2000 20:30:06 +0000 Subject: [PATCH] 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... --- src/backend/tcop/postgres.c | 37 ++++++++++++++++++++----------------- 1 file 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 -- GitLab