At Thu, 15 Sep 2022 11:15:12 -0500, Jaime Casanova 
<jcasa...@systemguards.com.ec> wrote in 
> It fails at ./src/backend/utils/activity/pgstat_shmem.c:530 inside

Thanks for the info.  I reproduced by make check.. stupid..

It's the thinko about the base address of reset_off.

So the attached doesn't crash..

regards.

-- 
Kyotaro Horiguchi
NTT Open Source Software Center
diff --git a/src/backend/utils/activity/pgstat.c 
b/src/backend/utils/activity/pgstat.c
index 6224c498c2..ed3f3af4d9 100644
--- a/src/backend/utils/activity/pgstat.c
+++ b/src/backend/utils/activity/pgstat.c
@@ -263,6 +263,8 @@ static const PgStat_KindInfo 
pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
                .shared_size = sizeof(PgStatShared_Database),
                .shared_data_off = offsetof(PgStatShared_Database, stats),
                .shared_data_len = sizeof(((PgStatShared_Database *) 0)->stats),
+               .reset_off = 0,
+               .reset_len = sizeof(((PgStatShared_Database *) 0)->stats),
                .pending_size = sizeof(PgStat_StatDBEntry),
 
                .flush_pending_cb = pgstat_database_flush_cb,
@@ -277,6 +279,8 @@ static const PgStat_KindInfo 
pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
                .shared_size = sizeof(PgStatShared_Relation),
                .shared_data_off = offsetof(PgStatShared_Relation, stats),
                .shared_data_len = sizeof(((PgStatShared_Relation *) 0)->stats),
+               .reset_off = 0,
+               .reset_len = sizeof(((PgStatShared_Relation *) 0)->stats),
                .pending_size = sizeof(PgStat_TableStatus),
 
                .flush_pending_cb = pgstat_relation_flush_cb,
@@ -291,6 +295,8 @@ static const PgStat_KindInfo 
pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
                .shared_size = sizeof(PgStatShared_Function),
                .shared_data_off = offsetof(PgStatShared_Function, stats),
                .shared_data_len = sizeof(((PgStatShared_Function *) 0)->stats),
+               .reset_off = 0,
+               .reset_len = sizeof(((PgStatShared_Function *) 0)->stats),
                .pending_size = sizeof(PgStat_BackendFunctionEntry),
 
                .flush_pending_cb = pgstat_function_flush_cb,
@@ -307,6 +313,10 @@ static const PgStat_KindInfo 
pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
                .shared_size = sizeof(PgStatShared_ReplSlot),
                .shared_data_off = offsetof(PgStatShared_ReplSlot, stats),
                .shared_data_len = sizeof(((PgStatShared_ReplSlot *) 0)->stats),
+               /* reset doesn't wipe off slot name */
+               .reset_off = offsetof(PgStat_StatReplSlotEntry, spill_txns),
+               .reset_len = sizeof(((PgStatShared_ReplSlot *) 0)->stats),
+               offsetof(PgStat_StatReplSlotEntry, spill_txns),
 
                .reset_timestamp_cb = pgstat_replslot_reset_timestamp_cb,
                .to_serialized_name = pgstat_replslot_to_serialized_name_cb,
@@ -323,6 +333,8 @@ static const PgStat_KindInfo 
pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
                .shared_size = sizeof(PgStatShared_Subscription),
                .shared_data_off = offsetof(PgStatShared_Subscription, stats),
                .shared_data_len = sizeof(((PgStatShared_Subscription *) 
0)->stats),
+               .reset_off = 0,
+               .reset_len = sizeof(((PgStatShared_Subscription *) 0)->stats),
                .pending_size = sizeof(PgStat_BackendSubEntry),
 
                .flush_pending_cb = pgstat_subscription_flush_cb,
diff --git a/src/backend/utils/activity/pgstat_shmem.c 
b/src/backend/utils/activity/pgstat_shmem.c
index ac98918688..09a8c3873c 100644
--- a/src/backend/utils/activity/pgstat_shmem.c
+++ b/src/backend/utils/activity/pgstat_shmem.c
@@ -915,8 +915,9 @@ shared_stat_reset_contents(PgStat_Kind kind, 
PgStatShared_Common *header,
 {
        const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
 
-       memset(pgstat_get_entry_data(kind, header), 0,
-                  pgstat_get_entry_len(kind));
+       memset((char *)pgstat_get_entry_data(kind, header) +
+                  kind_info->reset_off, 0,
+                  kind_info->reset_len);
 
        if (kind_info->reset_timestamp_cb)
                kind_info->reset_timestamp_cb(header, ts);
diff --git a/src/include/utils/pgstat_internal.h 
b/src/include/utils/pgstat_internal.h
index 901d2041d6..144fe5814c 100644
--- a/src/include/utils/pgstat_internal.h
+++ b/src/include/utils/pgstat_internal.h
@@ -215,6 +215,13 @@ typedef struct PgStat_KindInfo
        uint32          shared_data_off;
        uint32          shared_data_len;
 
+       /*
+        * The offset/size of the region to wipe out when the entry is reset.
+        * reset_off is relative to shared_data_off.
+        */
+       uint32          reset_off;
+       uint32          reset_len;
+
        /*
         * The size of the pending data for this kind. E.g. how large
         * PgStat_EntryRef->pending is. Used for allocations.

Reply via email to