LCOV - code coverage report
Current view: top level - src/backend/access/rmgrdesc - standbydesc.c (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 80.0 % 65 52
Test Date: 2026-04-07 14:16:30 Functions: 100.0 % 4 4
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*-------------------------------------------------------------------------
       2              :  *
       3              :  * standbydesc.c
       4              :  *    rmgr descriptor routines for storage/ipc/standby.c
       5              :  *
       6              :  * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
       7              :  * Portions Copyright (c) 1994, Regents of the University of California
       8              :  *
       9              :  *
      10              :  * IDENTIFICATION
      11              :  *    src/backend/access/rmgrdesc/standbydesc.c
      12              :  *
      13              :  *-------------------------------------------------------------------------
      14              :  */
      15              : #include "postgres.h"
      16              : 
      17              : #include "storage/standbydefs.h"
      18              : 
      19              : static void
      20            9 : standby_desc_running_xacts(StringInfo buf, xl_running_xacts *xlrec)
      21              : {
      22              :     int         i;
      23              : 
      24            9 :     appendStringInfo(buf, "nextXid %u latestCompletedXid %u oldestRunningXid %u",
      25              :                      xlrec->nextXid,
      26              :                      xlrec->latestCompletedXid,
      27              :                      xlrec->oldestRunningXid);
      28            9 :     if (xlrec->xcnt > 0)
      29              :     {
      30            0 :         appendStringInfo(buf, "; %d xacts:", xlrec->xcnt);
      31            0 :         for (i = 0; i < xlrec->xcnt; i++)
      32            0 :             appendStringInfo(buf, " %u", xlrec->xids[i]);
      33              :     }
      34              : 
      35            9 :     if (xlrec->subxid_overflow)
      36            0 :         appendStringInfoString(buf, "; subxid overflowed");
      37              : 
      38            9 :     if (xlrec->subxcnt > 0)
      39              :     {
      40            0 :         appendStringInfo(buf, "; %d subxacts:", xlrec->subxcnt);
      41            0 :         for (i = 0; i < xlrec->subxcnt; i++)
      42            0 :             appendStringInfo(buf, " %u", xlrec->xids[xlrec->xcnt + i]);
      43              :     }
      44              : 
      45            9 :     appendStringInfo(buf, "; dbid: %u", xlrec->dbid);
      46            9 : }
      47              : 
      48              : void
      49           14 : standby_desc(StringInfo buf, XLogReaderState *record)
      50              : {
      51           14 :     char       *rec = XLogRecGetData(record);
      52           14 :     uint8       info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
      53              : 
      54           14 :     if (info == XLOG_STANDBY_LOCK)
      55              :     {
      56            4 :         xl_standby_locks *xlrec = (xl_standby_locks *) rec;
      57              :         int         i;
      58              : 
      59            8 :         for (i = 0; i < xlrec->nlocks; i++)
      60            4 :             appendStringInfo(buf, "xid %u db %u rel %u ",
      61              :                              xlrec->locks[i].xid, xlrec->locks[i].dbOid,
      62              :                              xlrec->locks[i].relOid);
      63              :     }
      64           10 :     else if (info == XLOG_RUNNING_XACTS)
      65              :     {
      66            9 :         xl_running_xacts *xlrec = (xl_running_xacts *) rec;
      67              : 
      68            9 :         standby_desc_running_xacts(buf, xlrec);
      69              :     }
      70            1 :     else if (info == XLOG_INVALIDATIONS)
      71              :     {
      72            1 :         xl_invalidations *xlrec = (xl_invalidations *) rec;
      73              : 
      74            1 :         standby_desc_invalidations(buf, xlrec->nmsgs, xlrec->msgs,
      75              :                                    xlrec->dbId, xlrec->tsId,
      76            1 :                                    xlrec->relcacheInitFileInval);
      77              :     }
      78           14 : }
      79              : 
      80              : const char *
      81           14 : standby_identify(uint8 info)
      82              : {
      83           14 :     const char *id = NULL;
      84              : 
      85           14 :     switch (info & ~XLR_INFO_MASK)
      86              :     {
      87            4 :         case XLOG_STANDBY_LOCK:
      88            4 :             id = "LOCK";
      89            4 :             break;
      90            9 :         case XLOG_RUNNING_XACTS:
      91            9 :             id = "RUNNING_XACTS";
      92            9 :             break;
      93            1 :         case XLOG_INVALIDATIONS:
      94            1 :             id = "INVALIDATIONS";
      95            1 :             break;
      96              :     }
      97              : 
      98           14 :     return id;
      99              : }
     100              : 
     101              : /* also used by non-standby records having analogous invalidation fields */
     102              : void
     103           27 : standby_desc_invalidations(StringInfo buf,
     104              :                            int nmsgs, SharedInvalidationMessage *msgs,
     105              :                            Oid dbId, Oid tsId,
     106              :                            bool relcacheInitFileInval)
     107              : {
     108              :     int         i;
     109              : 
     110              :     /* Do nothing if there are no invalidation messages */
     111           27 :     if (nmsgs <= 0)
     112            7 :         return;
     113              : 
     114           20 :     if (relcacheInitFileInval)
     115            1 :         appendStringInfo(buf, "; relcache init file inval dbid %u tsid %u",
     116              :                          dbId, tsId);
     117              : 
     118           20 :     appendStringInfoString(buf, "; inval msgs:");
     119          319 :     for (i = 0; i < nmsgs; i++)
     120              :     {
     121          299 :         SharedInvalidationMessage *msg = &msgs[i];
     122              : 
     123          299 :         if (msg->id >= 0)
     124          238 :             appendStringInfo(buf, " catcache %d", msg->id);
     125           61 :         else if (msg->id == SHAREDINVALCATALOG_ID)
     126            0 :             appendStringInfo(buf, " catalog %u", msg->cat.catId);
     127           61 :         else if (msg->id == SHAREDINVALRELCACHE_ID)
     128           36 :             appendStringInfo(buf, " relcache %u", msg->rc.relId);
     129              :         /* not expected, but print something anyway */
     130           25 :         else if (msg->id == SHAREDINVALSMGR_ID)
     131            0 :             appendStringInfoString(buf, " smgr");
     132              :         /* not expected, but print something anyway */
     133           25 :         else if (msg->id == SHAREDINVALRELMAP_ID)
     134            0 :             appendStringInfo(buf, " relmap db %u", msg->rm.dbId);
     135           25 :         else if (msg->id == SHAREDINVALSNAPSHOT_ID)
     136           25 :             appendStringInfo(buf, " snapshot %u", msg->sn.relId);
     137            0 :         else if (msg->id == SHAREDINVALRELSYNC_ID)
     138            0 :             appendStringInfo(buf, " relsync %u", msg->rs.relid);
     139              :         else
     140            0 :             appendStringInfo(buf, " unrecognized id %d", msg->id);
     141              :     }
     142              : }
        

Generated by: LCOV version 2.0-1