|
@@ -1092,33 +1092,39 @@ void bch_btree_sort_into(struct btree *b, struct btree *new)
|
|
new->sets->size = 0;
|
|
new->sets->size = 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#define SORT_CRIT (4096 / sizeof(uint64_t))
|
|
|
|
+
|
|
void bch_btree_sort_lazy(struct btree *b)
|
|
void bch_btree_sort_lazy(struct btree *b)
|
|
{
|
|
{
|
|
- if (b->nsets) {
|
|
|
|
- unsigned i, j, keys = 0, total;
|
|
|
|
-
|
|
|
|
- for (i = 0; i <= b->nsets; i++)
|
|
|
|
- keys += b->sets[i].data->keys;
|
|
|
|
|
|
+ unsigned crit = SORT_CRIT;
|
|
|
|
+ int i;
|
|
|
|
|
|
- total = keys;
|
|
|
|
|
|
+ /* Don't sort if nothing to do */
|
|
|
|
+ if (!b->nsets)
|
|
|
|
+ goto out;
|
|
|
|
|
|
- for (j = 0; j < b->nsets; j++) {
|
|
|
|
- if (keys * 2 < total ||
|
|
|
|
- keys < 1000) {
|
|
|
|
- bch_btree_sort_partial(b, j);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
|
|
+ /* If not a leaf node, always sort */
|
|
|
|
+ if (b->level) {
|
|
|
|
+ bch_btree_sort(b);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
- keys -= b->sets[j].data->keys;
|
|
|
|
- }
|
|
|
|
|
|
+ for (i = b->nsets - 1; i >= 0; --i) {
|
|
|
|
+ crit *= b->c->sort_crit_factor;
|
|
|
|
|
|
- /* Must sort if b->nsets == 3 or we'll overflow */
|
|
|
|
- if (b->nsets >= (MAX_BSETS - 1) - b->level) {
|
|
|
|
- bch_btree_sort(b);
|
|
|
|
|
|
+ if (b->sets[i].data->keys < crit) {
|
|
|
|
+ bch_btree_sort_partial(b, i);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* Sort if we'd overflow */
|
|
|
|
+ if (b->nsets + 1 == MAX_BSETS) {
|
|
|
|
+ bch_btree_sort(b);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+out:
|
|
bset_build_written_tree(b);
|
|
bset_build_written_tree(b);
|
|
}
|
|
}
|
|
|
|
|