ctdb-daemon: Add extra logging of hot keys
authorMartin Schwenke <martin@meltin.net>
Fri, 1 May 2020 06:44:22 +0000 (16:44 +1000)
committerAmitay Isaacs <amitay@samba.org>
Fri, 22 May 2020 06:41:45 +0000 (06:41 +0000)
ctdbd currently only logs when a new hot key is added.  If a key gets
hotter then nothing new is logged.

Log hot key updates when the number of migrations has doubled since
the last time that key was logged.

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/include/ctdb_private.h
ctdb/server/ctdb_call.c
ctdb/server/ctdb_ltdb_server.c

index 3eb536672b2821e33fe97f31eb0aa2fa3b8a8b94..9ca87332d6102b7dc01fbbc4900f315fdaad6c60 100644 (file)
@@ -345,6 +345,7 @@ struct ctdb_context {
 struct ctdb_db_hot_key {
        uint32_t count;
        TDB_DATA key;
+       uint32_t last_logged_count;
 };
 
 struct ctdb_db_context {
index cb110ebd21d4b0d816b5586ea2050e49f155d16b..f833cac04c8b21084343ba9f91b0bb0c9d7df648 100644 (file)
@@ -849,6 +849,17 @@ ctdb_update_db_stat_hot_keys(struct ctdb_db_context *ctdb_db, TDB_DATA key,
                if (count <= ctdb_db->hot_keys[i].count) {
                        return;
                }
+               if (count >= (2 * ctdb_db->hot_keys[i].last_logged_count)) {
+                       keystr = hex_encode_talloc(ctdb_db,
+                                                  (unsigned char *)key.dptr,
+                                                  key.dsize);
+                       D_NOTICE("Updated hot key database=%s key=%s count=%d\n",
+                                ctdb_db->db_name,
+                                keystr ? keystr : "" ,
+                                count);
+                       TALLOC_FREE(keystr);
+                       ctdb_db->hot_keys[i].last_logged_count = count;
+               }
                ctdb_db->hot_keys[i].count = count;
                goto sort_keys;
        }
@@ -876,6 +887,7 @@ ctdb_update_db_stat_hot_keys(struct ctdb_db_context *ctdb_db, TDB_DATA key,
                 keystr ? keystr : "" ,
                 count);
        talloc_free(keystr);
+       ctdb_db->hot_keys[id].last_logged_count = count;
 
 sort_keys:
        for (i = 1; i < MAX_HOT_KEYS; i++) {
index 331a1ec478dfec44fada89bc9896bd158dd2bd24..b6c7630bea3bc8325b0b2249280db7aac234639e 100644 (file)
@@ -1605,6 +1605,7 @@ void ctdb_db_statistics_reset(struct ctdb_db_context *ctdb_db)
                        ctdb_db->hot_keys[i].key.dsize = 0;
                }
                ctdb_db->hot_keys[i].count = 0;
+               ctdb_db->hot_keys[i].last_logged_count = 0;
        }
 
        ZERO_STRUCT(ctdb_db->statistics);