]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix bug in LWLock statistics mechanism.
authorFujii Masao <fujii@postgresql.org>
Thu, 6 Feb 2020 05:43:21 +0000 (14:43 +0900)
committerFujii Masao <fujii@postgresql.org>
Thu, 6 Feb 2020 05:44:59 +0000 (14:44 +0900)
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

index 82a1cf5150b247f5d20a1e005e5d20f21e2551de..f40af6a1d47ca857566e54757931d23ba96c433f 100644 (file)
@@ -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);