Skip to content

Commit ca1ba50

Browse files
committed
Add more debugging information when failing to read pgstats files
This is useful to know which part of a stats file is corrupted when reading it, adding to the server logs a WARNING with details about what could not be read before giving up with the remaining data in the file. Author: Michael Paquier Reviewed-by: Bertrand Drouvot Discussion: https://postgr.es/m/Zp8o6_cl0KSgsnvS@paquier.xyz
1 parent 7f56eaf commit ca1ba50

File tree

1 file changed

+62
-4
lines changed

1 file changed

+62
-4
lines changed

src/backend/utils/activity/pgstat.c

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,9 +1537,18 @@ pgstat_read_statsfile(void)
15371537
/*
15381538
* Verify it's of the expected format.
15391539
*/
1540-
if (!read_chunk_s(fpin, &format_id) ||
1541-
format_id != PGSTAT_FILE_FORMAT_ID)
1540+
if (!read_chunk_s(fpin, &format_id))
1541+
{
1542+
elog(WARNING, "could not read format ID");
1543+
goto error;
1544+
}
1545+
1546+
if (format_id != PGSTAT_FILE_FORMAT_ID)
1547+
{
1548+
elog(WARNING, "found incorrect format ID %d (expected %d)",
1549+
format_id, PGSTAT_FILE_FORMAT_ID);
15421550
goto error;
1551+
}
15431552

15441553
/*
15451554
* We found an existing statistics file. Read it and put all the stats
@@ -1559,22 +1568,37 @@ pgstat_read_statsfile(void)
15591568

15601569
/* entry for fixed-numbered stats */
15611570
if (!read_chunk_s(fpin, &kind))
1571+
{
1572+
elog(WARNING, "could not read stats kind for entry of type %c", t);
15621573
goto error;
1574+
}
15631575

15641576
if (!pgstat_is_kind_valid(kind))
1577+
{
1578+
elog(WARNING, "invalid stats kind %d for entry of type %c",
1579+
kind, t);
15651580
goto error;
1581+
}
15661582

15671583
info = pgstat_get_kind_info(kind);
15681584

15691585
if (!info->fixed_amount)
1586+
{
1587+
elog(WARNING, "invalid fixed_amount in stats kind %d for entry of type %c",
1588+
kind, t);
15701589
goto error;
1590+
}
15711591

15721592
/* Load back stats into shared memory */
15731593
ptr = ((char *) shmem) + info->shared_ctl_off +
15741594
info->shared_data_off;
15751595

15761596
if (!read_chunk(fpin, ptr, info->shared_data_len))
1597+
{
1598+
elog(WARNING, "could not read data of stats kind %d for entry of type %c with size %u",
1599+
kind, t, info->shared_data_len);
15771600
goto error;
1601+
}
15781602

15791603
break;
15801604
}
@@ -1591,10 +1615,17 @@ pgstat_read_statsfile(void)
15911615
{
15921616
/* normal stats entry, identified by PgStat_HashKey */
15931617
if (!read_chunk_s(fpin, &key))
1618+
{
1619+
elog(WARNING, "could not read key for entry of type %c", t);
15941620
goto error;
1621+
}
15951622

15961623
if (!pgstat_is_kind_valid(key.kind))
1624+
{
1625+
elog(WARNING, "invalid stats kind for entry %d/%u/%u of type %c",
1626+
key.kind, key.dboid, key.objoid, t);
15971627
goto error;
1628+
}
15981629
}
15991630
else
16001631
{
@@ -1604,22 +1635,41 @@ pgstat_read_statsfile(void)
16041635
NameData name;
16051636

16061637
if (!read_chunk_s(fpin, &kind))
1638+
{
1639+
elog(WARNING, "could not read stats kind for entry of type %c", t);
16071640
goto error;
1641+
}
16081642
if (!read_chunk_s(fpin, &name))
1643+
{
1644+
elog(WARNING, "could not read name of stats kind %d for entry of type %c",
1645+
kind, t);
16091646
goto error;
1647+
}
16101648
if (!pgstat_is_kind_valid(kind))
1649+
{
1650+
elog(WARNING, "invalid stats kind %d for entry of type %c",
1651+
kind, t);
16111652
goto error;
1653+
}
16121654

16131655
kind_info = pgstat_get_kind_info(kind);
16141656

16151657
if (!kind_info->from_serialized_name)
1658+
{
1659+
elog(WARNING, "invalid from_serialized_name in stats kind %d for entry of type %c",
1660+
kind, t);
16161661
goto error;
1662+
}
16171663

16181664
if (!kind_info->from_serialized_name(&name, &key))
16191665
{
16201666
/* skip over data for entry we don't care about */
16211667
if (fseek(fpin, pgstat_get_entry_len(kind), SEEK_CUR) != 0)
1668+
{
1669+
elog(WARNING, "could not seek \"%s\" of stats kind %d for entry of type %c",
1670+
NameStr(name), kind, t);
16221671
goto error;
1672+
}
16231673

16241674
continue;
16251675
}
@@ -1638,8 +1688,8 @@ pgstat_read_statsfile(void)
16381688
if (found)
16391689
{
16401690
dshash_release_lock(pgStatLocal.shared_hash, p);
1641-
elog(WARNING, "found duplicate stats entry %d/%u/%u",
1642-
key.kind, key.dboid, key.objoid);
1691+
elog(WARNING, "found duplicate stats entry %d/%u/%u of type %c",
1692+
key.kind, key.dboid, key.objoid, t);
16431693
goto error;
16441694
}
16451695

@@ -1649,7 +1699,11 @@ pgstat_read_statsfile(void)
16491699
if (!read_chunk(fpin,
16501700
pgstat_get_entry_data(key.kind, header),
16511701
pgstat_get_entry_len(key.kind)))
1702+
{
1703+
elog(WARNING, "could not read data for entry %d/%u/%u of type %c",
1704+
key.kind, key.dboid, key.objoid, t);
16521705
goto error;
1706+
}
16531707

16541708
break;
16551709
}
@@ -1660,11 +1714,15 @@ pgstat_read_statsfile(void)
16601714
* file
16611715
*/
16621716
if (fgetc(fpin) != EOF)
1717+
{
1718+
elog(WARNING, "could not read end-of-file");
16631719
goto error;
1720+
}
16641721

16651722
goto done;
16661723

16671724
default:
1725+
elog(WARNING, "could not read entry of type %c", t);
16681726
goto error;
16691727
}
16701728
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy