On 2025/05/15 14:39, Daniil Davydov wrote:
> Hi,
> I noticed that inside ParsePrepareRecord function we are missing
> initialization of `nstats` and `nabortstats` fields of
> xl_xact_parsed_prepare structure:
> *** (current code in master)
> memset(parsed, 0, sizeof(*parsed));
>
> parsed->xact_time = xlrec->prepared_at;
> parsed->origin_lsn = xlrec->origin_lsn;
> parsed->origin_timestamp = xlrec->origin_timestamp;
> parsed->twophase_xid = xlrec->xid;
> parsed->dbId = xlrec->database;
> parsed->nsubxacts = xlrec->nsubxacts;
> parsed->nrels = xlrec->ncommitrels;
> parsed->nabortrels = xlrec->nabortrels;
> parsed->nmsgs = xlrec->ninvalmsgs;
> ***
>
> Thus, they will always be 0 after calling the ParsePrepareRecord
> function, but `stats` and `abortstats` pointers are set correctly:
> *** (current code in master)
> parsed->stats = (xl_xact_stats_item *) bufptr;
> bufptr += MAXALIGN(xlrec->ncommitstats * sizeof(xl_xact_stats_item));
>
> parsed->abortstats = (xl_xact_stats_item *) bufptr;
> bufptr += MAXALIGN(xlrec->nabortstats * sizeof(xl_xact_stats_item));
> ***
>
> If we look (for example) on parsing of a commit record, we could see
> that both `nstats` and `stats` fields are set inside the
> ParseCommitRecord function.
> For now, zeroed number of stats lead to invalid output of
> `xact_desc_prepare`, because it relies on values of `nstats` and
> `nabortstats` fields:
> *** (current code in master)
> xact_desc_stats(buf, "commit ", parsed.nstats, parsed.stats);
> xact_desc_stats(buf, "abort ", parsed.nabortstats, parsed.abortstats);
> ***
Thanks for the report! You're right.
> I suppose to add initialization of `nstats` and `nabortstats` to
> ParsePrepareRecord (see attached patch).
LGTM. Barring any objection, I will commit this patch.
Regards,
--
Fujii Masao
Advanced Computing Technology Center
Research and Development Headquarters
NTT DATA CORPORATION