Skip to content

Commit 1d18b5c

Browse files
author
Kent Overstreet
committed
bcachefs: __bch2_read(): call trans_begin() on every loop iter
perusal of /sys/kernel/debug/bcachefs/*/btree_transaction_stats shows that the read path has been acculumalating unneeded paths on the reflink btree, which we don't want. The solution is to call bch2_trans_begin(), which drops paths not used on previous loop iteration. bch2_readahead: Max mem used: 0 Transaction duration: count: 194235 since mount recent duration of events min: 150 ns max: 9 ms total: 838 ms mean: 4 us 6 us stddev: 34 us 7 us time between events min: 10 ns max: 15 h mean: 2 s 12 s stddev: 2 s 3 ms Maximum allocated btree paths (193): path: idx 2 ref 0:0 P btree=extents l=0 pos 270943112:392:U32_MAX locks 0 path: idx 3 ref 1:0 S btree=extents l=0 pos 270943112:24578:U32_MAX locks 1 path: idx 4 ref 0:0 P btree=reflink l=0 pos 0:24773509:0 locks 0 path: idx 5 ref 0:0 P S btree=reflink l=0 pos 0:24773631:0 locks 1 path: idx 6 ref 0:0 P S btree=reflink l=0 pos 0:24773759:0 locks 1 path: idx 7 ref 0:0 P S btree=reflink l=0 pos 0:24773887:0 locks 1 path: idx 8 ref 0:0 P S btree=reflink l=0 pos 0:24774015:0 locks 1 path: idx 9 ref 0:0 P S btree=reflink l=0 pos 0:24774143:0 locks 1 path: idx 10 ref 0:0 P S btree=reflink l=0 pos 0:24774271:0 locks 1 <many more reflink paths> Signed-off-by: Kent Overstreet <[email protected]>
1 parent 114f530 commit 1d18b5c

File tree

1 file changed

+19
-26
lines changed

1 file changed

+19
-26
lines changed

fs/bcachefs/io_read.c

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,42 +1147,35 @@ void __bch2_read(struct bch_fs *c, struct bch_read_bio *rbio,
11471147
struct btree_iter iter;
11481148
struct bkey_buf sk;
11491149
struct bkey_s_c k;
1150-
u32 snapshot;
11511150
int ret;
11521151

11531152
BUG_ON(flags & BCH_READ_NODECODE);
11541153

11551154
bch2_bkey_buf_init(&sk);
1156-
retry:
1157-
bch2_trans_begin(trans);
1158-
iter = (struct btree_iter) { NULL };
1159-
1160-
ret = bch2_subvolume_get_snapshot(trans, inum.subvol, &snapshot);
1161-
if (ret)
1162-
goto err;
1163-
11641155
bch2_trans_iter_init(trans, &iter, BTREE_ID_extents,
1165-
SPOS(inum.inum, bvec_iter.bi_sector, snapshot),
1156+
POS(inum.inum, bvec_iter.bi_sector),
11661157
BTREE_ITER_slots);
1158+
11671159
while (1) {
11681160
unsigned bytes, sectors, offset_into_extent;
11691161
enum btree_id data_btree = BTREE_ID_extents;
11701162

1171-
/*
1172-
* read_extent -> io_time_reset may cause a transaction restart
1173-
* without returning an error, we need to check for that here:
1174-
*/
1175-
ret = bch2_trans_relock(trans);
1163+
bch2_trans_begin(trans);
1164+
1165+
u32 snapshot;
1166+
ret = bch2_subvolume_get_snapshot(trans, inum.subvol, &snapshot);
11761167
if (ret)
1177-
break;
1168+
goto err;
1169+
1170+
bch2_btree_iter_set_snapshot(&iter, snapshot);
11781171

11791172
bch2_btree_iter_set_pos(&iter,
11801173
POS(inum.inum, bvec_iter.bi_sector));
11811174

11821175
k = bch2_btree_iter_peek_slot(&iter);
11831176
ret = bkey_err(k);
11841177
if (ret)
1185-
break;
1178+
goto err;
11861179

11871180
offset_into_extent = iter.pos.offset -
11881181
bkey_start_offset(k.k);
@@ -1193,7 +1186,7 @@ void __bch2_read(struct bch_fs *c, struct bch_read_bio *rbio,
11931186
ret = bch2_read_indirect_extent(trans, &data_btree,
11941187
&offset_into_extent, &sk);
11951188
if (ret)
1196-
break;
1189+
goto err;
11971190

11981191
k = bkey_i_to_s_c(sk.k);
11991192

@@ -1213,7 +1206,7 @@ void __bch2_read(struct bch_fs *c, struct bch_read_bio *rbio,
12131206
data_btree, k,
12141207
offset_into_extent, failed, flags);
12151208
if (ret)
1216-
break;
1209+
goto err;
12171210

12181211
if (flags & BCH_READ_LAST_FRAGMENT)
12191212
break;
@@ -1223,16 +1216,16 @@ void __bch2_read(struct bch_fs *c, struct bch_read_bio *rbio,
12231216

12241217
ret = btree_trans_too_many_iters(trans);
12251218
if (ret)
1219+
goto err;
1220+
err:
1221+
if (ret &&
1222+
!bch2_err_matches(ret, BCH_ERR_transaction_restart) &&
1223+
ret != READ_RETRY &&
1224+
ret != READ_RETRY_AVOID)
12261225
break;
12271226
}
1228-
err:
1229-
bch2_trans_iter_exit(trans, &iter);
1230-
1231-
if (bch2_err_matches(ret, BCH_ERR_transaction_restart) ||
1232-
ret == READ_RETRY ||
1233-
ret == READ_RETRY_AVOID)
1234-
goto retry;
12351227

1228+
bch2_trans_iter_exit(trans, &iter);
12361229
bch2_trans_put(trans);
12371230
bch2_bkey_buf_exit(&sk, c);
12381231

0 commit comments

Comments
 (0)