Skip to content

Commit fdba3dd

Browse files
committed
test/crimson/seastore/test_transaction_manager: improve check_available()
Locally, the test time has reduced by ~35% after the improvement. Signed-off-by: Yingxin Cheng <[email protected]>
1 parent 36ffa8c commit fdba3dd

File tree

1 file changed

+54
-6
lines changed

1 file changed

+54
-6
lines changed

src/test/crimson/seastore/test_transaction_manager.cc

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,34 @@ struct transaction_manager_test_t :
179179
return *this;
180180
}
181181

182+
bool to_left() {
183+
assert(is_end() || is_valid());
184+
do {
185+
if (biter == parent.extents.begin()
186+
&& oiter == parent.delta.begin()) {
187+
return false;
188+
} else if (biter == parent.extents.begin()) {
189+
--oiter;
190+
} else if (oiter == parent.delta.begin()) {
191+
--biter;
192+
} else {
193+
auto l_biter = biter;
194+
auto l_oiter = oiter;
195+
--l_biter;
196+
--l_oiter;
197+
auto l_bkey = l_biter->first;
198+
auto l_okey = l_oiter->first;
199+
if (l_bkey > l_okey) {
200+
biter = l_biter;
201+
} else { // l_bkey <= l_okey
202+
oiter = l_oiter;
203+
}
204+
}
205+
} while (!is_valid());
206+
cur = get_pair();
207+
return true;
208+
}
209+
182210
bool operator==(const iterator &o) const {
183211
return o.biter == biter && o.oiter == oiter;
184212
}
@@ -187,10 +215,12 @@ struct transaction_manager_test_t :
187215
}
188216

189217
auto operator*() {
218+
assert(is_valid());
190219
assert(!is_end());
191220
return *cur;
192221
}
193222
auto operator->() {
223+
assert(is_valid());
194224
assert(!is_end());
195225
return &*cur;
196226
}
@@ -228,18 +258,36 @@ struct transaction_manager_test_t :
228258
return ret;
229259
}
230260
}
261+
262+
std::optional<iterator> get_left(const iterator &it) {
263+
iterator left_it(it);
264+
bool success = left_it.to_left();
265+
if (success) {
266+
auto ret = left_it;
267+
assert(++left_it == it);
268+
return ret;
269+
} else {
270+
assert(begin() == it);
271+
return std::nullopt;
272+
}
273+
}
231274
};
275+
232276
private:
233277
void check_available(
234278
laddr_t addr, extent_len_t len, const delta_t &delta
235279
) const {
236280
delta_overlay_t overlay(*this, delta);
237-
for (const auto &i: overlay) {
238-
if (i.first < addr) {
239-
EXPECT_FALSE(i.first + i.second.desc.len > addr);
240-
} else {
241-
EXPECT_FALSE(addr + len > i.first);
242-
}
281+
auto iter = overlay.lower_bound(addr);
282+
if (iter != overlay.end()) {
283+
assert(iter->first >= addr);
284+
EXPECT_TRUE(iter->first >= addr + len);
285+
}
286+
auto maybe_left_it = overlay.get_left(iter);
287+
if (maybe_left_it.has_value()) {
288+
auto left_it = *maybe_left_it;
289+
assert(left_it->first < addr);
290+
EXPECT_TRUE(left_it->first + left_it->second.desc.len <= addr);
243291
}
244292
}
245293

0 commit comments

Comments
 (0)