]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Reproduce debug_query_string==NULL on parallel workers.
authorNoah Misch <noah@leadboat.com>
Sat, 31 Oct 2020 15:43:28 +0000 (08:43 -0700)
committerNoah Misch <noah@leadboat.com>
Sat, 31 Oct 2020 15:43:28 +0000 (08:43 -0700)
Certain background workers initiate parallel queries while
debug_query_string==NULL, at which point they attempted strlen(NULL) and
died to SIGSEGV.  Older debug_query_string observers allow NULL, so do
likewise in these newer ones.  Back-patch to v11, where commit
7de4a1bcc56f494acbd0d6e70781df877dc8ecb5 introduced the first of these.

Discussion: https://postgr.es/m/20201014022636.GA1962668@rfd.leadboat.com

src/backend/access/heap/vacuumlazy.c
src/backend/access/nbtree/nbtsort.c

index be5439dd9d8106c837e7511facde1a489398cd14..2174fccb1e6ff1192015ca721340a848f4af65a0 100644 (file)
@@ -3237,7 +3237,6 @@ begin_parallel_vacuum(Oid relid, Relation *Irel, LVRelStats *vacrelstats,
        WalUsage   *wal_usage;
        bool       *can_parallel_vacuum;
        long            maxtuples;
-       char       *sharedquery;
        Size            est_shared;
        Size            est_deadtuples;
        int                     nindexes_mwm = 0;
@@ -3334,9 +3333,14 @@ begin_parallel_vacuum(Oid relid, Relation *Irel, LVRelStats *vacrelstats,
        shm_toc_estimate_keys(&pcxt->estimator, 1);
 
        /* Finally, estimate PARALLEL_VACUUM_KEY_QUERY_TEXT space */
-       querylen = strlen(debug_query_string);
-       shm_toc_estimate_chunk(&pcxt->estimator, querylen + 1);
-       shm_toc_estimate_keys(&pcxt->estimator, 1);
+       if (debug_query_string)
+       {
+               querylen = strlen(debug_query_string);
+               shm_toc_estimate_chunk(&pcxt->estimator, querylen + 1);
+               shm_toc_estimate_keys(&pcxt->estimator, 1);
+       }
+       else
+               querylen = 0;                   /* keep compiler quiet */
 
        InitializeParallelDSM(pcxt);
 
@@ -3381,10 +3385,16 @@ begin_parallel_vacuum(Oid relid, Relation *Irel, LVRelStats *vacrelstats,
        lps->wal_usage = wal_usage;
 
        /* Store query string for workers */
-       sharedquery = (char *) shm_toc_allocate(pcxt->toc, querylen + 1);
-       memcpy(sharedquery, debug_query_string, querylen + 1);
-       sharedquery[querylen] = '\0';
-       shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_QUERY_TEXT, sharedquery);
+       if (debug_query_string)
+       {
+               char       *sharedquery;
+
+               sharedquery = (char *) shm_toc_allocate(pcxt->toc, querylen + 1);
+               memcpy(sharedquery, debug_query_string, querylen + 1);
+               sharedquery[querylen] = '\0';
+               shm_toc_insert(pcxt->toc,
+                                          PARALLEL_VACUUM_KEY_QUERY_TEXT, sharedquery);
+       }
 
        pfree(can_parallel_vacuum);
        return lps;
@@ -3527,7 +3537,7 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc)
                elog(DEBUG1, "starting parallel vacuum worker for bulk delete");
 
        /* Set debug_query_string for individual workers */
-       sharedquery = shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_QUERY_TEXT, false);
+       sharedquery = shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_QUERY_TEXT, true);
        debug_query_string = sharedquery;
        pgstat_report_activity(STATE_RUNNING, debug_query_string);
 
index efee86784bbf59cc06e5a262d69dccaef19604e4..8730de25ed71920db059658037a85177b3b176ae 100644 (file)
@@ -1466,7 +1466,6 @@ _bt_begin_parallel(BTBuildState *buildstate, bool isconcurrent, int request)
        WalUsage   *walusage;
        BufferUsage *bufferusage;
        bool            leaderparticipates = true;
-       char       *sharedquery;
        int                     querylen;
 
 #ifdef DISABLE_LEADER_PARTICIPATION
@@ -1533,9 +1532,14 @@ _bt_begin_parallel(BTBuildState *buildstate, bool isconcurrent, int request)
        shm_toc_estimate_keys(&pcxt->estimator, 1);
 
        /* Finally, estimate PARALLEL_KEY_QUERY_TEXT space */
-       querylen = strlen(debug_query_string);
-       shm_toc_estimate_chunk(&pcxt->estimator, querylen + 1);
-       shm_toc_estimate_keys(&pcxt->estimator, 1);
+       if (debug_query_string)
+       {
+               querylen = strlen(debug_query_string);
+               shm_toc_estimate_chunk(&pcxt->estimator, querylen + 1);
+               shm_toc_estimate_keys(&pcxt->estimator, 1);
+       }
+       else
+               querylen = 0;                   /* keep compiler quiet */
 
        /* Everyone's had a chance to ask for space, so now create the DSM */
        InitializeParallelDSM(pcxt);
@@ -1599,9 +1603,14 @@ _bt_begin_parallel(BTBuildState *buildstate, bool isconcurrent, int request)
        }
 
        /* Store query string for workers */
-       sharedquery = (char *) shm_toc_allocate(pcxt->toc, querylen + 1);
-       memcpy(sharedquery, debug_query_string, querylen + 1);
-       shm_toc_insert(pcxt->toc, PARALLEL_KEY_QUERY_TEXT, sharedquery);
+       if (debug_query_string)
+       {
+               char       *sharedquery;
+
+               sharedquery = (char *) shm_toc_allocate(pcxt->toc, querylen + 1);
+               memcpy(sharedquery, debug_query_string, querylen + 1);
+               shm_toc_insert(pcxt->toc, PARALLEL_KEY_QUERY_TEXT, sharedquery);
+       }
 
        /*
         * Allocate space for each worker's WalUsage and BufferUsage; no need to
@@ -1806,7 +1815,7 @@ _bt_parallel_build_main(dsm_segment *seg, shm_toc *toc)
 #endif                                                 /* BTREE_BUILD_STATS */
 
        /* Set debug_query_string for individual workers first */
-       sharedquery = shm_toc_lookup(toc, PARALLEL_KEY_QUERY_TEXT, false);
+       sharedquery = shm_toc_lookup(toc, PARALLEL_KEY_QUERY_TEXT, true);
        debug_query_string = sharedquery;
 
        /* Report the query string from leader */