Commit c7e351be authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Add range being updated to btree_update_to_text()



We had a deadlock during recovery where interior btree updates became
wedged and all open_buckets were consumed; start adding more
introspection.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent b43f7249
Loading
Loading
Loading
Loading
+24 −2
Original line number Diff line number Diff line
@@ -1232,6 +1232,15 @@ bch2_btree_update_start(struct btree_trans *trans, struct btree_path *path,
	list_add_tail(&as->list, &c->btree_interior_update_list);
	mutex_unlock(&c->btree_interior_update_lock);

	struct btree *b = btree_path_node(path, path->level);
	as->node_start	= b->data->min_key;
	as->node_end	= b->data->max_key;
	as->node_needed_rewrite = btree_node_need_rewrite(b);
	as->node_written = b->written;
	as->node_sectors = btree_buf_bytes(b) >> 9;
	as->node_remaining = __bch2_btree_u64s_remaining(b,
				btree_bkey_last(b, bset_tree_last(b)));

	/*
	 * We don't want to allocate if we're in an error state, that can cause
	 * deadlock on emergency shutdown due to open buckets getting stuck in
@@ -2108,6 +2117,9 @@ int __bch2_foreground_maybe_merge(struct btree_trans *trans,
	if (ret)
		goto err;

	as->node_start	= prev->data->min_key;
	as->node_end	= next->data->max_key;

	trace_and_count(c, btree_node_merge, trans, b);

	n = bch2_btree_node_alloc(as, trans, b->c.level);
@@ -2681,9 +2693,19 @@ static void bch2_btree_update_to_text(struct printbuf *out, struct btree_update

	prt_str(out, " ");
	bch2_btree_id_to_text(out, as->btree_id);
	prt_printf(out, " l=%u-%u mode=%s nodes_written=%u cl.remaining=%u journal_seq=%llu\n",
	prt_printf(out, " l=%u-%u ",
		   as->update_level_start,
		   as->update_level_end,
		   as->update_level_end);
	bch2_bpos_to_text(out, as->node_start);
	prt_char(out, ' ');
	bch2_bpos_to_text(out, as->node_end);
	prt_printf(out, "\nwritten %u/%u u64s_remaining %u need_rewrite %u",
		   as->node_written,
		   as->node_sectors,
		   as->node_remaining,
		   as->node_needed_rewrite);

	prt_printf(out, "\nmode=%s nodes_written=%u cl.remaining=%u journal_seq=%llu\n",
		   bch2_btree_update_modes[as->mode],
		   as->nodes_written,
		   closure_nr_remaining(&as->cl),
+7 −0
Original line number Diff line number Diff line
@@ -57,6 +57,13 @@ struct btree_update {
	unsigned			took_gc_lock:1;

	enum btree_id			btree_id;
	struct bpos			node_start;
	struct bpos			node_end;
	bool				node_needed_rewrite;
	u16				node_written;
	u16				node_sectors;
	u16				node_remaining;

	unsigned			update_level_start;
	unsigned			update_level_end;