AbortOutOfAnyTransaction() just before backend exit, to ensure that
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 30 Aug 2000 20:30:06 +0000 (20:30 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 30 Aug 2000 20:30:06 +0000 (20:30 +0000)
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

index b860967c3e315697b4b56dfb19a73f83d52e549b..3369e22825eacbcd6e1e89062771fcec17096aa6 100644 (file)
@@ -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