]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: threads: augment rwlock debugging stats to report seek lock stats
authorWilly Tarreau <w@1wt.eu>
Fri, 16 Oct 2020 14:49:38 +0000 (16:49 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 16 Oct 2020 14:51:49 +0000 (16:51 +0200)
We currently use only read and write lock operations with rwlocks, but
ours also support upgradable seek locks for which we do not report any
stats. Let's add them now when DEBUG_THREAD is enabled.

include/haproxy/thread-t.h
include/haproxy/thread.h

index d2bf8d365a04d2200dec27ed45cdadbeb8589233..33782f3c1270f96b655ffec700fc9bed1284bba8 100644 (file)
 struct lock_stat {
        uint64_t nsec_wait_for_write;
        uint64_t nsec_wait_for_read;
+       uint64_t nsec_wait_for_seek;
        uint64_t num_write_locked;
        uint64_t num_write_unlocked;
        uint64_t num_read_locked;
        uint64_t num_read_unlocked;
+       uint64_t num_seek_locked;
+       uint64_t num_seek_unlocked;
 };
 
 struct ha_spinlock {
@@ -123,6 +126,8 @@ struct ha_rwlock {
                unsigned long wait_writers; /* a bit is set to 1 << tid for waiting writers */
                unsigned long cur_readers; /* a bit is set to 1 << tid for current readers */
                unsigned long wait_readers; /* a bit is set to 1 << tid for waiting waiters */
+               unsigned long cur_seeker;   /* a bit is set to 1 << tid for the lock seekers */
+               unsigned long wait_seekers; /* a bit is set to 1 << tid for waiting seekers */
                struct {
                        const char *function;
                        const char *file;
index a9a4b62a585b9f58f370597d9e7825e23c64e90c..a3451bde51b3147f1f7d638e28afc9fc7a20b137 100644 (file)
@@ -422,16 +422,26 @@ static inline void show_lock_stats()
                        "\t # write unlock: %lu (%ld)\n"
                        "\t # wait time for write     : %.3f msec\n"
                        "\t # wait time for write/lock: %.3f nsec\n"
+                       "\t # seek lock   : %lu\n"
+                       "\t # seek unlock : %lu (%ld)\n"
+                       "\t # wait time for seek      : %.3f msec\n"
+                       "\t # wait time for seek/lock : %.3f nsec\n"
                        "\t # read lock   : %lu\n"
                        "\t # read unlock : %lu (%ld)\n"
                        "\t # wait time for read      : %.3f msec\n"
                        "\t # wait time for read/lock : %.3f nsec\n",
+
                        lock_label(lbl),
                        lock_stats[lbl].num_write_locked,
                        lock_stats[lbl].num_write_unlocked,
                        lock_stats[lbl].num_write_unlocked - lock_stats[lbl].num_write_locked,
                        (double)lock_stats[lbl].nsec_wait_for_write / 1000000.0,
                        lock_stats[lbl].num_write_locked ? ((double)lock_stats[lbl].nsec_wait_for_write / (double)lock_stats[lbl].num_write_locked) : 0,
+                       lock_stats[lbl].num_seek_locked,
+                       lock_stats[lbl].num_seek_unlocked,
+                       lock_stats[lbl].num_seek_unlocked - lock_stats[lbl].num_seek_locked,
+                       (double)lock_stats[lbl].nsec_wait_for_seek / 1000000.0,
+                       lock_stats[lbl].num_seek_locked ? ((double)lock_stats[lbl].nsec_wait_for_seek / (double)lock_stats[lbl].num_seek_locked) : 0,
                        lock_stats[lbl].num_read_locked,
                        lock_stats[lbl].num_read_unlocked,
                        lock_stats[lbl].num_read_unlocked - lock_stats[lbl].num_read_locked,