bcachefs: Add tracepoint & counter for btree split race
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 20 Feb 2023 21:41:03 +0000 (16:41 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:54 +0000 (17:09 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs_format.h
fs/bcachefs/btree_update_interior.c
fs/bcachefs/trace.h

index 9524ff02f2d70a1a543d529e06db23ceee52b2e4..4d3c5e2f7ea6815afbc619c2cad2a623d9258e17 100644 (file)
@@ -1478,7 +1478,8 @@ struct bch_sb_field_disk_groups {
        x(transaction_commit,                           72)     \
        x(write_super,                                  73)     \
        x(trans_restart_would_deadlock_recursion_limit, 74)     \
-       x(trans_restart_write_buffer_flush,             75)
+       x(trans_restart_write_buffer_flush,             75)     \
+       x(trans_restart_split_race,                     76)
 
 enum bch_persistent_counters {
 #define x(t, n, ...) BCH_COUNTER_##t,
index ad86c0b9e42e200dde7390cff4b067200882a399..79be89006403209ea52753bf6afdf9f6ba1397e3 100644 (file)
@@ -1717,8 +1717,10 @@ split:
         * We could attempt to avoid the transaction restart, by calling
         * bch2_btree_path_upgrade() and allocating more nodes:
         */
-       if (b->c.level >= as->update_level)
+       if (b->c.level >= as->update_level) {
+               trace_and_count(c, trans_restart_split_race, trans, _THIS_IP_);
                return btree_trans_restart(trans, BCH_ERR_transaction_restart_split_race);
+       }
 
        return btree_split(as, trans, path, b, keys, flags);
 }
index 30b10908ced00e7b90f797fb3372e008b72402c2..f608baec294ad974809df98af55ef92c23c60078 100644 (file)
@@ -837,6 +837,12 @@ DEFINE_EVENT(transaction_event,    trans_restart_injected,
        TP_ARGS(trans, caller_ip)
 );
 
+DEFINE_EVENT(transaction_event,        trans_restart_split_race,
+       TP_PROTO(struct btree_trans *trans,
+                unsigned long caller_ip),
+       TP_ARGS(trans, caller_ip)
+);
+
 DEFINE_EVENT(transaction_event,        trans_blocked_journal_reclaim,
        TP_PROTO(struct btree_trans *trans,
                 unsigned long caller_ip),