| From: | Bertrand Drouvot <bertranddrouvot(dot)pg(at)gmail(dot)com> | 
|---|---|
| To: | pgsql-hackers(at)lists(dot)postgresql(dot)org | 
| Subject: | Clear padding in PgStat_HashKey keys | 
| Date: | 2024-11-03 04:25:41 | 
| Message-ID: | Zyb7RW1y9dVfO0UH@ip-10-97-1-34.eu-west-3.compute.internal | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-hackers | 
Hi hackers,
While working on a rebase for [0], I noticed some weird behavior on the stats.
The issue is that [0], in conjonction with b14e9ce7d5, does introduce padding in 
the PgStat_HashKey:
(gdb) ptype /o struct PgStat_HashKey
/* offset      |    size */  type = struct PgStat_HashKey {
/*      0      |       4 */    uint32 kind;
/*      4      |       4 */    Oid dboid;
/*      8      |       8 */    uint64 objid;
/*     16      |       4 */    RelFileNumber relfile;
/* XXX  4-byte padding   */
                               /* total size (bytes):   24 */
                             }
But, the keys are initialized that way:
"
PgStat_HashKey key = {.kind = kind,.dboid = dboid,.objid = objid,.relfile = refile};
"
which could lead to random data in the padding bytes.
We are using sizeof(PgStat_HashKey) in pgstat_cmp_hash_key() and we compute the
hash hash key in pgstat_hash_hash_key() using the PgStat_HashKey struct size as
input: this lead to unexpected results if the keys contain random data in the 
padding bytes.
Even if currently there is no issues, as without [0] there is no padding:
(gdb) ptype /o struct PgStat_HashKey
/* offset      |    size */  type = struct PgStat_HashKey {
/*      0      |       4 */    uint32 kind;
/*      4      |       4 */    Oid dboid;
/*      8      |       8 */    uint64 objid;
                               /* total size (bytes):   16 */
                             }
I think that we should ensure to $SUBJECT (to prevent unexpected results should
padding be introduced in the future).
For example we currently ensure the same for LOCALLOCKTAG localtag in LockHeldByMe()
while there is no padding:
gdb) ptype /o struct LOCALLOCKTAG
/* offset      |    size */  type = struct LOCALLOCKTAG {
/*      0      |      16 */    LOCKTAG lock;
/*     16      |       4 */    LOCKMODE mode;
                               /* total size (bytes):   20 */
                             }
So, please find attached a patch to $SUBJECT.
Looking forward to your feedback,
Regards,
-- 
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com
| Attachment | Content-Type | Size | 
|---|---|---|
| v1-0001-Clear-padding-in-PgStat_HashKey-keys.patch | text/x-diff | 2.6 KB | 
| From | Date | Subject | |
|---|---|---|---|
| Next Message | bigbro_wq@hotmail.com | 2024-11-03 06:18:47 | Repeat the condition check twice in function distribute_qual_to_rels | 
| Previous Message | Junwang Zhao | 2024-11-03 03:33:05 | Re: general purpose array_sort |