LCOV - differential code coverage report
Current view: top level - src/backend/executor - instrument.c (source / functions) Coverage Total Hit UBC GNC CBC DCB
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 94.5 % 146 138 8 8 130 4
Current Date: 2024-04-14 14:21:10 Functions: 100.0 % 14 14 2 12
Baseline: 16@8cea358b128 Branches: 65.4 % 52 34 18 34
Baseline Date: 2024-04-14 14:21:09 Line coverage date bins:
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed (120,180] days: 100.0 % 8 8 8
(240..) days: 94.2 % 138 130 8 130
Function coverage date bins:
(240..) days: 100.0 % 14 14 2 12
Branch coverage date bins:
(240..) days: 65.4 % 52 34 18 34

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /*-------------------------------------------------------------------------
                                  2                 :                :  *
                                  3                 :                :  * instrument.c
                                  4                 :                :  *   functions for instrumentation of plan execution
                                  5                 :                :  *
                                  6                 :                :  *
                                  7                 :                :  * Copyright (c) 2001-2024, PostgreSQL Global Development Group
                                  8                 :                :  *
                                  9                 :                :  * IDENTIFICATION
                                 10                 :                :  *    src/backend/executor/instrument.c
                                 11                 :                :  *
                                 12                 :                :  *-------------------------------------------------------------------------
                                 13                 :                :  */
                                 14                 :                : #include "postgres.h"
                                 15                 :                : 
                                 16                 :                : #include <unistd.h>
                                 17                 :                : 
                                 18                 :                : #include "executor/instrument.h"
                                 19                 :                : 
                                 20                 :                : BufferUsage pgBufferUsage;
                                 21                 :                : static BufferUsage save_pgBufferUsage;
                                 22                 :                : WalUsage    pgWalUsage;
                                 23                 :                : static WalUsage save_pgWalUsage;
                                 24                 :                : 
                                 25                 :                : static void BufferUsageAdd(BufferUsage *dst, const BufferUsage *add);
                                 26                 :                : static void WalUsageAdd(WalUsage *dst, WalUsage *add);
                                 27                 :                : 
                                 28                 :                : 
                                 29                 :                : /* Allocate new instrumentation structure(s) */
                                 30                 :                : Instrumentation *
 1068 efujita@postgresql.o       31                 :CBC       34499 : InstrAlloc(int n, int instrument_options, bool async_mode)
                                 32                 :                : {
                                 33                 :                :     Instrumentation *instr;
                                 34                 :                : 
                                 35                 :                :     /* initialize all fields to zeroes, then modify as needed */
 5234 rhaas@postgresql.org       36                 :          34499 :     instr = palloc0(n * sizeof(Instrumentation));
 1471 akapila@postgresql.o       37         [ +  + ]:          34499 :     if (instrument_options & (INSTRUMENT_BUFFERS | INSTRUMENT_TIMER | INSTRUMENT_WAL))
                                 38                 :                :     {
 4084 tgl@sss.pgh.pa.us          39                 :          32123 :         bool        need_buffers = (instrument_options & INSTRUMENT_BUFFERS) != 0;
 1471 akapila@postgresql.o       40                 :          32123 :         bool        need_wal = (instrument_options & INSTRUMENT_WAL) != 0;
 4084 tgl@sss.pgh.pa.us          41                 :          32123 :         bool        need_timer = (instrument_options & INSTRUMENT_TIMER) != 0;
                                 42                 :                :         int         i;
                                 43                 :                : 
 5234 rhaas@postgresql.org       44         [ +  + ]:          64246 :         for (i = 0; i < n; i++)
                                 45                 :                :         {
 4450                            46                 :          32123 :             instr[i].need_bufusage = need_buffers;
 1471 akapila@postgresql.o       47                 :          32123 :             instr[i].need_walusage = need_wal;
 4450 rhaas@postgresql.org       48                 :          32123 :             instr[i].need_timer = need_timer;
 1068 efujita@postgresql.o       49                 :          32123 :             instr[i].async_mode = async_mode;
                                 50                 :                :         }
                                 51                 :                :     }
                                 52                 :                : 
 8244 tgl@sss.pgh.pa.us          53                 :          34499 :     return instr;
                                 54                 :                : }
                                 55                 :                : 
                                 56                 :                : /* Initialize a pre-allocated instrumentation structure. */
                                 57                 :                : void
 3121 rhaas@postgresql.org       58                 :            843 : InstrInit(Instrumentation *instr, int instrument_options)
                                 59                 :                : {
                                 60                 :            843 :     memset(instr, 0, sizeof(Instrumentation));
                                 61                 :            843 :     instr->need_bufusage = (instrument_options & INSTRUMENT_BUFFERS) != 0;
 1471 akapila@postgresql.o       62                 :            843 :     instr->need_walusage = (instrument_options & INSTRUMENT_WAL) != 0;
 3121 rhaas@postgresql.org       63                 :            843 :     instr->need_timer = (instrument_options & INSTRUMENT_TIMER) != 0;
                                 64                 :            843 : }
                                 65                 :                : 
                                 66                 :                : /* Entry to a plan node */
                                 67                 :                : void
 8244 tgl@sss.pgh.pa.us          68                 :        6686769 : InstrStartNode(Instrumentation *instr)
                                 69                 :                : {
 1971 alvherre@alvh.no-ip.       70   [ +  +  -  + ]:       11976758 :     if (instr->need_timer &&
                                 71         [ +  - ]:        5289989 :         !INSTR_TIME_SET_CURRENT_LAZY(instr->starttime))
 1971 alvherre@alvh.no-ip.       72         [ #  # ]:UBC           0 :         elog(ERROR, "InstrStartNode called twice in a row");
                                 73                 :                : 
                                 74                 :                :     /* save buffer usage totals at node entry, if needed */
 4588 tgl@sss.pgh.pa.us          75         [ +  + ]:CBC     6686769 :     if (instr->need_bufusage)
 5234 rhaas@postgresql.org       76                 :         147808 :         instr->bufusage_start = pgBufferUsage;
                                 77                 :                : 
 1471 akapila@postgresql.o       78         [ +  + ]:        6686769 :     if (instr->need_walusage)
                                 79                 :          57556 :         instr->walusage_start = pgWalUsage;
 8244 tgl@sss.pgh.pa.us          80                 :        6686769 : }
                                 81                 :                : 
                                 82                 :                : /* Exit from a plan node */
                                 83                 :                : void
 6529 bruce@momjian.us           84                 :        6685385 : InstrStopNode(Instrumentation *instr, double nTuples)
                                 85                 :                : {
 1068 efujita@postgresql.o       86                 :        6685385 :     double      save_tuplecount = instr->tuplecount;
                                 87                 :                :     instr_time  endtime;
                                 88                 :                : 
                                 89                 :                :     /* count the returned tuples */
 6529 bruce@momjian.us           90                 :        6685385 :     instr->tuplecount += nTuples;
                                 91                 :                : 
                                 92                 :                :     /* let's update the time only if the timer was requested */
 4450 rhaas@postgresql.org       93         [ +  + ]:        6685385 :     if (instr->need_timer)
                                 94                 :                :     {
                                 95         [ -  + ]:        5288611 :         if (INSTR_TIME_IS_ZERO(instr->starttime))
 4084 tgl@sss.pgh.pa.us          96         [ #  # ]:UBC           0 :             elog(ERROR, "InstrStopNode called without start");
                                 97                 :                : 
 4450 rhaas@postgresql.org       98                 :CBC     5288611 :         INSTR_TIME_SET_CURRENT(endtime);
                                 99                 :        5288611 :         INSTR_TIME_ACCUM_DIFF(instr->counter, endtime, instr->starttime);
                                100                 :                : 
                                101                 :        5288611 :         INSTR_TIME_SET_ZERO(instr->starttime);
                                102                 :                :     }
                                103                 :                : 
                                104                 :                :     /* Add delta of buffer usage since entry to node's totals */
 4588 tgl@sss.pgh.pa.us         105         [ +  + ]:        6685385 :     if (instr->need_bufusage)
 5234 rhaas@postgresql.org      106                 :         146430 :         BufferUsageAccumDiff(&instr->bufusage,
 5161 bruce@momjian.us          107                 :         146430 :                              &pgBufferUsage, &instr->bufusage_start);
                                108                 :                : 
 1471 akapila@postgresql.o      109         [ +  + ]:        6685385 :     if (instr->need_walusage)
                                110                 :          56178 :         WalUsageAccumDiff(&instr->walusage,
                                111                 :          56178 :                           &pgWalUsage, &instr->walusage_start);
                                112                 :                : 
                                113                 :                :     /* Is this the first tuple of this cycle? */
 8244 tgl@sss.pgh.pa.us         114         [ +  + ]:        6685385 :     if (!instr->running)
                                115                 :                :     {
                                116                 :          47301 :         instr->running = true;
 6965                           117                 :          47301 :         instr->firsttuple = INSTR_TIME_GET_DOUBLE(instr->counter);
                                118                 :                :     }
                                119                 :                :     else
                                120                 :                :     {
                                121                 :                :         /*
                                122                 :                :          * In async mode, if the plan node hadn't emitted any tuples before,
                                123                 :                :          * this might be the first tuple
                                124                 :                :          */
 1068 efujita@postgresql.o      125   [ -  +  -  - ]:        6638084 :         if (instr->async_mode && save_tuplecount < 1.0)
 1068 efujita@postgresql.o      126                 :UBC           0 :             instr->firsttuple = INSTR_TIME_GET_DOUBLE(instr->counter);
                                127                 :                :     }
 1068 efujita@postgresql.o      128                 :CBC     6685385 : }
                                129                 :                : 
                                130                 :                : /* Update tuple count */
                                131                 :                : void
                                132                 :              1 : InstrUpdateTupleCount(Instrumentation *instr, double nTuples)
                                133                 :                : {
                                134                 :                :     /* count the returned tuples */
                                135                 :              1 :     instr->tuplecount += nTuples;
 6938 tgl@sss.pgh.pa.us         136                 :              1 : }
                                137                 :                : 
                                138                 :                : /* Finish a run cycle for a plan node */
                                139                 :                : void
 8244                           140                 :          48150 : InstrEndLoop(Instrumentation *instr)
                                141                 :                : {
                                142                 :                :     double      totaltime;
                                143                 :                : 
                                144                 :                :     /* Skip if nothing has happened, or already shut down */
                                145         [ +  + ]:          48150 :     if (!instr->running)
                                146                 :           1003 :         return;
                                147                 :                : 
 6938                           148         [ -  + ]:          47147 :     if (!INSTR_TIME_IS_ZERO(instr->starttime))
 4084 tgl@sss.pgh.pa.us         149         [ #  # ]:UBC           0 :         elog(ERROR, "InstrEndLoop called on running node");
                                150                 :                : 
                                151                 :                :     /* Accumulate per-cycle statistics into totals */
 6965 tgl@sss.pgh.pa.us         152                 :CBC       47147 :     totaltime = INSTR_TIME_GET_DOUBLE(instr->counter);
                                153                 :                : 
 6529                           154                 :          47147 :     instr->startup += instr->firsttuple;
                                155                 :          47147 :     instr->total += totaltime;
 8244                           156                 :          47147 :     instr->ntuples += instr->tuplecount;
                                157                 :          47147 :     instr->nloops += 1;
                                158                 :                : 
                                159                 :                :     /* Reset for next cycle (if any) */
                                160                 :          47147 :     instr->running = false;
 6965                           161                 :          47147 :     INSTR_TIME_SET_ZERO(instr->starttime);
                                162                 :          47147 :     INSTR_TIME_SET_ZERO(instr->counter);
 8244                           163                 :          47147 :     instr->firsttuple = 0;
                                164                 :          47147 :     instr->tuplecount = 0;
                                165                 :                : }
                                166                 :                : 
                                167                 :                : /* aggregate instrumentation information */
                                168                 :                : void
 3121 rhaas@postgresql.org      169                 :           2034 : InstrAggNode(Instrumentation *dst, Instrumentation *add)
                                170                 :                : {
                                171   [ +  +  -  + ]:           2034 :     if (!dst->running && add->running)
                                172                 :                :     {
 3121 rhaas@postgresql.org      173                 :UBC           0 :         dst->running = true;
                                174                 :              0 :         dst->firsttuple = add->firsttuple;
                                175                 :                :     }
 3121 rhaas@postgresql.org      176   [ +  +  -  +  :CBC        2034 :     else if (dst->running && add->running && dst->firsttuple > add->firsttuple)
                                              -  - ]
 3121 rhaas@postgresql.org      177                 :UBC           0 :         dst->firsttuple = add->firsttuple;
                                178                 :                : 
 3121 rhaas@postgresql.org      179                 :CBC        2034 :     INSTR_TIME_ADD(dst->counter, add->counter);
                                180                 :                : 
                                181                 :           2034 :     dst->tuplecount += add->tuplecount;
                                182                 :           2034 :     dst->startup += add->startup;
                                183                 :           2034 :     dst->total += add->total;
                                184                 :           2034 :     dst->ntuples += add->ntuples;
 2196 alvherre@alvh.no-ip.      185                 :           2034 :     dst->ntuples2 += add->ntuples2;
 3121 rhaas@postgresql.org      186                 :           2034 :     dst->nloops += add->nloops;
                                187                 :           2034 :     dst->nfiltered1 += add->nfiltered1;
                                188                 :           2034 :     dst->nfiltered2 += add->nfiltered2;
                                189                 :                : 
                                190                 :                :     /* Add delta of buffer usage since entry to node's totals */
                                191         [ +  + ]:           2034 :     if (dst->need_bufusage)
                                192                 :             48 :         BufferUsageAdd(&dst->bufusage, &add->bufusage);
                                193                 :                : 
 1471 akapila@postgresql.o      194         [ -  + ]:           2034 :     if (dst->need_walusage)
 1471 akapila@postgresql.o      195                 :UBC           0 :         WalUsageAdd(&dst->walusage, &add->walusage);
 3121 rhaas@postgresql.org      196                 :CBC        2034 : }
                                197                 :                : 
                                198                 :                : /* note current values during parallel executor startup */
                                199                 :                : void
                                200                 :           1322 : InstrStartParallelQuery(void)
                                201                 :                : {
                                202                 :           1322 :     save_pgBufferUsage = pgBufferUsage;
 1471 akapila@postgresql.o      203                 :           1322 :     save_pgWalUsage = pgWalUsage;
 3121 rhaas@postgresql.org      204                 :           1322 : }
                                205                 :                : 
                                206                 :                : /* report usage after parallel executor shutdown */
                                207                 :                : void
 1471 akapila@postgresql.o      208                 :           1319 : InstrEndParallelQuery(BufferUsage *bufusage, WalUsage *walusage)
                                209                 :                : {
 1466                           210                 :           1319 :     memset(bufusage, 0, sizeof(BufferUsage));
                                211                 :           1319 :     BufferUsageAccumDiff(bufusage, &pgBufferUsage, &save_pgBufferUsage);
 1471                           212                 :           1319 :     memset(walusage, 0, sizeof(WalUsage));
                                213                 :           1319 :     WalUsageAccumDiff(walusage, &pgWalUsage, &save_pgWalUsage);
 3121 rhaas@postgresql.org      214                 :           1319 : }
                                215                 :                : 
                                216                 :                : /* accumulate work done by workers in leader's stats */
                                217                 :                : void
 1471 akapila@postgresql.o      218                 :           1319 : InstrAccumParallelQuery(BufferUsage *bufusage, WalUsage *walusage)
                                219                 :                : {
 1466                           220                 :           1319 :     BufferUsageAdd(&pgBufferUsage, bufusage);
 1471                           221                 :           1319 :     WalUsageAdd(&pgWalUsage, walusage);
 3121 rhaas@postgresql.org      222                 :           1319 : }
                                223                 :                : 
                                224                 :                : /* dst += add */
                                225                 :                : static void
                                226                 :           1367 : BufferUsageAdd(BufferUsage *dst, const BufferUsage *add)
                                227                 :                : {
                                228                 :           1367 :     dst->shared_blks_hit += add->shared_blks_hit;
                                229                 :           1367 :     dst->shared_blks_read += add->shared_blks_read;
                                230                 :           1367 :     dst->shared_blks_dirtied += add->shared_blks_dirtied;
                                231                 :           1367 :     dst->shared_blks_written += add->shared_blks_written;
                                232                 :           1367 :     dst->local_blks_hit += add->local_blks_hit;
                                233                 :           1367 :     dst->local_blks_read += add->local_blks_read;
                                234                 :           1367 :     dst->local_blks_dirtied += add->local_blks_dirtied;
                                235                 :           1367 :     dst->local_blks_written += add->local_blks_written;
                                236                 :           1367 :     dst->temp_blks_read += add->temp_blks_read;
                                237                 :           1367 :     dst->temp_blks_written += add->temp_blks_written;
  178 michael@paquier.xyz       238                 :GNC        1367 :     INSTR_TIME_ADD(dst->shared_blk_read_time, add->shared_blk_read_time);
                                239                 :           1367 :     INSTR_TIME_ADD(dst->shared_blk_write_time, add->shared_blk_write_time);
                                240                 :           1367 :     INSTR_TIME_ADD(dst->local_blk_read_time, add->local_blk_read_time);
                                241                 :           1367 :     INSTR_TIME_ADD(dst->local_blk_write_time, add->local_blk_write_time);
  737 michael@paquier.xyz       242                 :CBC        1367 :     INSTR_TIME_ADD(dst->temp_blk_read_time, add->temp_blk_read_time);
                                243                 :           1367 :     INSTR_TIME_ADD(dst->temp_blk_write_time, add->temp_blk_write_time);
 3121 rhaas@postgresql.org      244                 :           1367 : }
                                245                 :                : 
                                246                 :                : /* dst += add - sub */
                                247                 :                : void
 5234                           248                 :         169020 : BufferUsageAccumDiff(BufferUsage *dst,
                                249                 :                :                      const BufferUsage *add,
                                250                 :                :                      const BufferUsage *sub)
                                251                 :                : {
                                252                 :         169020 :     dst->shared_blks_hit += add->shared_blks_hit - sub->shared_blks_hit;
                                253                 :         169020 :     dst->shared_blks_read += add->shared_blks_read - sub->shared_blks_read;
 4435                           254                 :         169020 :     dst->shared_blks_dirtied += add->shared_blks_dirtied - sub->shared_blks_dirtied;
 5234                           255                 :         169020 :     dst->shared_blks_written += add->shared_blks_written - sub->shared_blks_written;
                                256                 :         169020 :     dst->local_blks_hit += add->local_blks_hit - sub->local_blks_hit;
                                257                 :         169020 :     dst->local_blks_read += add->local_blks_read - sub->local_blks_read;
 4435                           258                 :         169020 :     dst->local_blks_dirtied += add->local_blks_dirtied - sub->local_blks_dirtied;
 5234                           259                 :         169020 :     dst->local_blks_written += add->local_blks_written - sub->local_blks_written;
                                260                 :         169020 :     dst->temp_blks_read += add->temp_blks_read - sub->temp_blks_read;
                                261                 :         169020 :     dst->temp_blks_written += add->temp_blks_written - sub->temp_blks_written;
  178 michael@paquier.xyz       262                 :GNC      169020 :     INSTR_TIME_ACCUM_DIFF(dst->shared_blk_read_time,
                                263                 :                :                           add->shared_blk_read_time, sub->shared_blk_read_time);
                                264                 :         169020 :     INSTR_TIME_ACCUM_DIFF(dst->shared_blk_write_time,
                                265                 :                :                           add->shared_blk_write_time, sub->shared_blk_write_time);
                                266                 :         169020 :     INSTR_TIME_ACCUM_DIFF(dst->local_blk_read_time,
                                267                 :                :                           add->local_blk_read_time, sub->local_blk_read_time);
                                268                 :         169020 :     INSTR_TIME_ACCUM_DIFF(dst->local_blk_write_time,
                                269                 :                :                           add->local_blk_write_time, sub->local_blk_write_time);
  737 michael@paquier.xyz       270                 :CBC      169020 :     INSTR_TIME_ACCUM_DIFF(dst->temp_blk_read_time,
                                271                 :                :                           add->temp_blk_read_time, sub->temp_blk_read_time);
                                272                 :         169020 :     INSTR_TIME_ACCUM_DIFF(dst->temp_blk_write_time,
                                273                 :                :                           add->temp_blk_write_time, sub->temp_blk_write_time);
 5234 rhaas@postgresql.org      274                 :         169020 : }
                                275                 :                : 
                                276                 :                : /* helper functions for WAL usage accumulation */
                                277                 :                : static void
 1471 akapila@postgresql.o      278                 :           1319 : WalUsageAdd(WalUsage *dst, WalUsage *add)
                                279                 :                : {
                                280                 :           1319 :     dst->wal_bytes += add->wal_bytes;
                                281                 :           1319 :     dst->wal_records += add->wal_records;
 1440                           282                 :           1319 :     dst->wal_fpi += add->wal_fpi;
 1471                           283                 :           1319 : }
                                284                 :                : 
                                285                 :                : void
                                286                 :         165736 : WalUsageAccumDiff(WalUsage *dst, const WalUsage *add, const WalUsage *sub)
                                287                 :                : {
                                288                 :         165736 :     dst->wal_bytes += add->wal_bytes - sub->wal_bytes;
                                289                 :         165736 :     dst->wal_records += add->wal_records - sub->wal_records;
 1440                           290                 :         165736 :     dst->wal_fpi += add->wal_fpi - sub->wal_fpi;
 1471                           291                 :         165736 : }
        

Generated by: LCOV version 2.1-beta2-3-g6141622