Zach Brown a07b41fa8b scoutfs: store the manifest in an interval tree
Now that we have the interval tree we can use it to store the manifest.
Instead of having different indexes for each level we store all the
levels in one index.

This simplifies the code quite a bit.  In particular, we won't have to
special case merging between level 0 and 1 quite as much because level 0
is no longer a special list.

We have a strong motivation to keep the manifest small.  So we get
rid of the blkno radix.  It wasn't wise to trade off more manifest
storage to make the ring a bit smaller.  We can store full manifests
in the ring instead of just the block numbers.

We rework the new_manifest interace that adds a final manifest entry
and logs it.  The ring entry addition and manifest update are atomic.

We're about to implement merging which will permute the manifest.  Read
methods won't be able to iterate over levels while racing with merging.
We change the manifest key search interface to return a full set of all
the segments that intersect the key.

The next item interface now knows how to restart the search if hits
the end of a segment on one level and the next least key is in another
segment and greater than the end of that completed segment.

There was also a very crazy cut+paste bug where next item was testing
that the item is past the last search key with a while instead of an if.
It'd spin throwing list_del_init() and brelse() debugging warnings.

Signed-off-by: Zach Brown <zab@versity.com>
2016-04-02 17:27:58 -07:00
Description
No description provided
6.7 MiB
Languages
C 87.2%
Shell 9.1%
Roff 2.5%
TeX 0.9%
Makefile 0.3%