postgres.git / summary / log / commit / refs

commit    c17abac60eb23f0441cbf481ac5ea58905877084
Author:   Fujii Masao <fujii@postgresql.org>
Date:     Thu Feb 06 05:43:21 2020 +0000
First released in: 13.0, 10.12, 11.7, 12.2

    Fix bug in LWLock statistics mechanism.
    
    Previously PostgreSQL built with -DLWLOCK_STATS could report
    more than one LWLock statistics entries for the same backend
    process and the same LWLock. This is strange and only one
    statistics should be output in that case, instead.
    
    The cause of this issue is that the key variable used for
    LWLock stats hash table was not fully initialized. The key
    consists of two fields and they were initialized. But
    the following 4 bytes allocated in the key variable for
    the alignment was not initialized. So even if the same key
    was specified, hash_search(HASH_ENTER) could not find
    the existing entry for that key and created new one.
    
    This commit fixes this issue by initializing the key
    variable with zero. As the side effect of this commit,
    the volume of LWLock statistics output would be reduced
    very much.
    
    Back-patch to v10, where commit 3761fe3c20 introduced the issue.
    
    Author: Fujii Masao
    Reviewed-by: Julien Rouhaud, Kyotaro Horiguchi
    Discussion: https://postgr.es/m/26359edb-798a-568f-d93a-6aafac49752d@oss.nttdata.com


src/backend/storage/lmgr/lwlock.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 82a1cf5150b..f40af6a1d47 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -310,6 +310,7 @@ get_lwlock_stats_entry(LWLock *lock) return &lwlock_stats_dummy; /* Fetch or create the entry. */ + MemSet(&key, 0, sizeof(key)); key.tranche = lock->tranche; key.instance = lock; lwstats = hash_search(lwlock_stats_htab, &key, HASH_ENTER, &found); [parent: c2ef3ab83832]