]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bcachefs: Add tracepoint, counter for io_move_created_rebalance
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 13 May 2025 17:49:51 +0000 (13:49 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 May 2025 00:14:58 +0000 (20:14 -0400)
Internal moves shouldn't add new rebalance_work, but it's been reported
that this seems to be happening. Add a tracepoint and counter so we can
see what's going on.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/data_update.c
fs/bcachefs/sb-counters_format.h
fs/bcachefs/trace.h

index e5909e54ad2e587c2b6e0f9ecfe82ae1fc0fa793..c39ea51e9e484cb3cd62fc62c03a29a6833fce43 100644 (file)
@@ -346,7 +346,7 @@ restart_drop_extra_replicas:
                                                        .btree  = m->btree_id,
                                                        .flags  = BCH_VALIDATE_commit,
                                                 });
-               if (invalid) {
+               if (unlikely(invalid)) {
                        struct printbuf buf = PRINTBUF;
                        bch2_log_msg_start(c, &buf);
 
@@ -368,6 +368,21 @@ restart_drop_extra_replicas:
                        goto out;
                }
 
+               printbuf_reset(&journal_msg);
+               prt_str(&journal_msg, bch2_data_update_type_strs[m->type]);
+
+               ret =   bch2_trans_log_msg(trans, &journal_msg) ?:
+                       bch2_trans_log_bkey(trans, m->btree_id, 0, m->k.k) ?:
+                       bch2_insert_snapshot_whiteouts(trans, m->btree_id,
+                                               k.k->p, bkey_start_pos(&insert->k)) ?:
+                       bch2_insert_snapshot_whiteouts(trans, m->btree_id,
+                                               k.k->p, insert->k.p) ?:
+                       bch2_bkey_set_needs_rebalance(c, &op->opts, insert) ?:
+                       bch2_trans_update(trans, &iter, insert,
+                               BTREE_UPDATE_internal_snapshot_node);
+               if (ret)
+                       goto err;
+
                if (trace_data_update_enabled()) {
                        struct printbuf buf = PRINTBUF;
 
@@ -382,30 +397,38 @@ restart_drop_extra_replicas:
                        printbuf_exit(&buf);
                }
 
-               printbuf_reset(&journal_msg);
-               prt_str(&journal_msg, bch2_data_update_type_strs[m->type]);
+               if (bch2_bkey_sectors_need_rebalance(c, bkey_i_to_s_c(insert)) * k.k->size >
+                   bch2_bkey_sectors_need_rebalance(c, k) * insert->k.size) {
+                       struct printbuf buf = PRINTBUF;
 
-               ret =   bch2_trans_log_msg(trans, &journal_msg) ?:
-                       bch2_trans_log_bkey(trans, m->btree_id, 0, m->k.k) ?:
-                       bch2_insert_snapshot_whiteouts(trans, m->btree_id,
-                                               k.k->p, bkey_start_pos(&insert->k)) ?:
-                       bch2_insert_snapshot_whiteouts(trans, m->btree_id,
-                                               k.k->p, insert->k.p) ?:
-                       bch2_bkey_set_needs_rebalance(c, &op->opts, insert) ?:
-                       bch2_trans_update(trans, &iter, insert,
-                               BTREE_UPDATE_internal_snapshot_node) ?:
-                       bch2_trans_commit(trans, &op->res,
+                       bch2_data_update_opts_to_text(&buf, c, &m->op.opts, &m->data_opts);
+
+                       prt_str(&buf, "\nold: ");
+                       bch2_bkey_val_to_text(&buf, c, old);
+                       prt_str(&buf, "\nk:   ");
+                       bch2_bkey_val_to_text(&buf, c, k);
+                       prt_str(&buf, "\nnew: ");
+                       bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(insert));
+
+                       trace_io_move_created_rebalance(c, buf.buf);
+                       printbuf_exit(&buf);
+
+                       this_cpu_inc(c->counters[BCH_COUNTER_io_move_created_rebalance]);
+               }
+
+               ret =   bch2_trans_commit(trans, &op->res,
                                NULL,
                                BCH_TRANS_COMMIT_no_check_rw|
                                BCH_TRANS_COMMIT_no_enospc|
                                m->data_opts.btree_insert_flags);
-               if (!ret) {
-                       bch2_btree_iter_set_pos(trans, &iter, next_pos);
+               if (ret)
+                       goto err;
 
-                       this_cpu_add(c->counters[BCH_COUNTER_io_move_finish], new->k.size);
-                       if (trace_io_move_finish_enabled())
-                               trace_io_move_finish2(m, &new->k_i, insert);
-               }
+               bch2_btree_iter_set_pos(trans, &iter, next_pos);
+
+               this_cpu_add(c->counters[BCH_COUNTER_io_move_finish], new->k.size);
+               if (trace_io_move_finish_enabled())
+                       trace_io_move_finish2(m, &new->k_i, insert);
 err:
                if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
                        ret = 0;
index 5c4e5de79d81e30f125df9e035daa56afa5a1e22..7c0c9c842b4e7e34f617f59d5b8fa36a91124ae8 100644 (file)
@@ -25,6 +25,7 @@ enum counters_flags {
        x(io_move_fail,                                 38,     TYPE_COUNTER)   \
        x(io_move_write_fail,                           82,     TYPE_COUNTER)   \
        x(io_move_start_fail,                           39,     TYPE_COUNTER)   \
+       x(io_move_created_rebalance,                    83,     TYPE_COUNTER)   \
        x(bucket_invalidate,                            3,      TYPE_COUNTER)   \
        x(bucket_discard,                               4,      TYPE_COUNTER)   \
        x(bucket_discard_fast,                          79,     TYPE_COUNTER)   \
index 8c07189a080a5cbb26a07e68380e780881ea41f4..a31024f082f30b14bcd746f3380a4d357575f4b0 100644 (file)
@@ -1473,6 +1473,11 @@ DEFINE_EVENT(fs_str, data_update,
        TP_ARGS(c, str)
 );
 
+DEFINE_EVENT(fs_str, io_move_created_rebalance,
+       TP_PROTO(struct bch_fs *c, const char *str),
+       TP_ARGS(c, str)
+);
+
 TRACE_EVENT(error_downcast,
        TP_PROTO(int bch_err, int std_err, unsigned long ip),
        TP_ARGS(bch_err, std_err, ip),