]> 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:40 +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 a6fda81feb6c3db165e511746fad63b20d0e2295..5aae23399579965c80bec2d3c276eea5d2547419 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);