reindexdb: move PQfinish() calls to the right place
authorÁlvaro Herrera <[email protected]>
Thu, 6 Mar 2025 17:14:41 +0000 (18:14 +0100)
committerÁlvaro Herrera <[email protected]>
Thu, 6 Mar 2025 18:40:06 +0000 (19:40 +0100)
get_parallel_object_list() has no business closing a connection it did
not create.  Make things more sensible by closing the connection at the
level where it is created, in reindex_one_database().

Extracted from a larger patch by the same author.  However, the patch as
submitted not only was not described as containing this change, but in
addition it contained a fatal flaw whereby reindexdb would crash and
fail across all of its TAP test, which is why I list myself as
co-author.

Author: Ranier Vilela <[email protected]>
Author: Álvaro Herrera <[email protected]>
Discussion: https://postgr.es/m/CAEudQArfqr0-s0VVPSEh=0kgOgBJvFNdGW=xSL5rBcr0WDMQYQ@mail.gmail.com

src/bin/scripts/reindexdb.c

index 665864fd22be0fa659445c6bfcc00435647510df..b00c8112869170f61ea794074456f97f34089668 100644 (file)
@@ -339,7 +339,10 @@ reindex_one_database(ConnParams *cparams, ReindexType type,
 
                /* Bail out if nothing to process */
                if (process_list == NULL)
+               {
+                   PQfinish(conn);
                    return;
+               }
                break;
 
            case REINDEX_SCHEMA:
@@ -352,7 +355,10 @@ reindex_one_database(ConnParams *cparams, ReindexType type,
 
                /* Bail out if nothing to process */
                if (process_list == NULL)
+               {
+                   PQfinish(conn);
                    return;
+               }
                break;
 
            case REINDEX_INDEX:
@@ -370,7 +376,10 @@ reindex_one_database(ConnParams *cparams, ReindexType type,
                 * in-place, so check if it has at least one cell.
                 */
                if (user_list->head == NULL)
+               {
+                   PQfinish(conn);
                    return;
+               }
 
                /*
                 * Assuming 'user_list' is not empty, 'indices_tables_list'
@@ -416,6 +425,7 @@ reindex_one_database(ConnParams *cparams, ReindexType type,
 
    sa = ParallelSlotsSetup(concurrentCons, cparams, progname, echo, NULL);
    ParallelSlotsAdoptConn(sa, conn);
+   conn = NULL;
 
    cell = process_list->head;
    do
@@ -765,7 +775,6 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
    if (ntups == 0)
    {
        PQclear(res);
-       PQfinish(conn);
        return NULL;
    }