|
@@ -955,7 +955,7 @@ static void sort_key_next(struct btree_iter *iter,
|
|
*i = iter->data[--iter->used];
|
|
*i = iter->data[--iter->used];
|
|
}
|
|
}
|
|
|
|
|
|
-static void btree_sort_fixup(struct btree_iter *iter)
|
|
|
|
|
|
+static struct bkey *btree_sort_fixup(struct btree_iter *iter, struct bkey *tmp)
|
|
{
|
|
{
|
|
while (iter->used > 1) {
|
|
while (iter->used > 1) {
|
|
struct btree_iter_set *top = iter->data, *i = top + 1;
|
|
struct btree_iter_set *top = iter->data, *i = top + 1;
|
|
@@ -983,9 +983,22 @@ static void btree_sort_fixup(struct btree_iter *iter)
|
|
} else {
|
|
} else {
|
|
/* can't happen because of comparison func */
|
|
/* can't happen because of comparison func */
|
|
BUG_ON(!bkey_cmp(&START_KEY(top->k), &START_KEY(i->k)));
|
|
BUG_ON(!bkey_cmp(&START_KEY(top->k), &START_KEY(i->k)));
|
|
- bch_cut_back(&START_KEY(i->k), top->k);
|
|
|
|
|
|
+
|
|
|
|
+ if (bkey_cmp(i->k, top->k) < 0) {
|
|
|
|
+ bkey_copy(tmp, top->k);
|
|
|
|
+
|
|
|
|
+ bch_cut_back(&START_KEY(i->k), tmp);
|
|
|
|
+ bch_cut_front(i->k, top->k);
|
|
|
|
+ heap_sift(iter, 0, btree_iter_cmp);
|
|
|
|
+
|
|
|
|
+ return tmp;
|
|
|
|
+ } else {
|
|
|
|
+ bch_cut_back(&START_KEY(i->k), top->k);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
static void btree_mergesort(struct btree *b, struct bset *out,
|
|
static void btree_mergesort(struct btree *b, struct bset *out,
|
|
@@ -993,15 +1006,20 @@ static void btree_mergesort(struct btree *b, struct bset *out,
|
|
bool fixup, bool remove_stale)
|
|
bool fixup, bool remove_stale)
|
|
{
|
|
{
|
|
struct bkey *k, *last = NULL;
|
|
struct bkey *k, *last = NULL;
|
|
|
|
+ BKEY_PADDED(k) tmp;
|
|
bool (*bad)(struct btree *, const struct bkey *) = remove_stale
|
|
bool (*bad)(struct btree *, const struct bkey *) = remove_stale
|
|
? bch_ptr_bad
|
|
? bch_ptr_bad
|
|
: bch_ptr_invalid;
|
|
: bch_ptr_invalid;
|
|
|
|
|
|
while (!btree_iter_end(iter)) {
|
|
while (!btree_iter_end(iter)) {
|
|
if (fixup && !b->level)
|
|
if (fixup && !b->level)
|
|
- btree_sort_fixup(iter);
|
|
|
|
|
|
+ k = btree_sort_fixup(iter, &tmp.k);
|
|
|
|
+ else
|
|
|
|
+ k = NULL;
|
|
|
|
+
|
|
|
|
+ if (!k)
|
|
|
|
+ k = bch_btree_iter_next(iter);
|
|
|
|
|
|
- k = bch_btree_iter_next(iter);
|
|
|
|
if (bad(b, k))
|
|
if (bad(b, k))
|
|
continue;
|
|
continue;
|
|
|
|
|