49 releases (12 breaking)
0.13.0 | Oct 7, 2022 |
---|---|
0.12.0 | Mar 9, 2022 |
0.11.5 | Mar 6, 2022 |
0.9.0 | Dec 24, 2021 |
0.1.6 | Dec 28, 2020 |
#951 in Database interfaces
88 downloads per month
Used in 11 crates
(7 directly)
125KB
3K
SLoC
IPFS sqlite block store
Sqlite based block store for content-addressed data like IPLD.
See the module level docs for more details.
lib.rs
:
IPFS sqlite block store
A block store for a rust implementation of ipfs.
Concepts
Aliases
An alias is a named pin of a root. When a root is aliased, none of the leaves of the dag pointed to by the root will be collected by gc. However, a root being aliased does not mean that the dag must be complete.
Temporary aliases
A temporary alias is an unnamed alias that is just for the purpose of protecting blocks from gc while a large tree is being constructed. While an alias maps a single name to a single root, a temporary alias can be assigned to an arbitary number of blocks before the dag is finished.
A temporary alias will be deleted as soon as the handle goes out of scope.
Garbage Collection (GC)
GC refers to the process of removing unpinned blocks. It runs only when the configured size targets are exceeded. Size targets contain both the total size of the store and the number of blocks.
GC will run incrementally, deleting blocks until the size targets are no longer exceeded. The order in which unpinned blocks will be deleted can be customized.
Caching
For unpinned blocks, it is possible to customize which blocks have the highest value using a CacheTracker. The default is to do nothing and has no performance overhead.
The most elaborate implemented strategy is to keep track of access times in a separate database, via the SqliteCacheTracker, which has a slight performance overhead.
The performance overhead of writing to an access tracking database on each block read can be mitigated by using the AsyncCacheTracker wrapper to perform the database writes on a different thread.
Usage
Blocking
For blocking usage, use BlockStore. This is the most low level interface.
Major differences to the go-ipfs pinning concept
- Pinning/aliasing a root does not require that the dag is complete
- Aliases/named pins as opposed to unnamed and non-reference-counted pins
- Temporary pins as a mechanism to keep blocks safe from gc while a tree is being constructed
Dependencies
~31MB
~501K SLoC