- Added a
Raw.Header_prefix
function, for use by libraries that share the file format used byindex.unix
. (#378)
-
The benchmarks now use
tezos-base58
instead oftezos-context-hash
(#367) -
Add an LRU to cache the result of
Index.find
operations. The default LRU capacity is 30_000 entries. (#366)
- Fix stats recording in
Raw.unsafe_write
(#351)
- Changed the implementation of the write-ahead log to significantly reduce its memory usage (at the cost of some additional disk IO). (#355)
-
Proper cleaning of merge file descriptors when aborting a merge (#326)
-
Recover from crash of the merge thread. When this happen, the main thread can continue to run and will need to recover from the crash before doing a new merge. This fixes a critical issue which might cause data loss (#339)
-
Make sure that no entries can disappear for read-only instances during log_async recovery (#338)
-
Fixed a crash-consistency bug due to a potential flush of an incomplete entry to disk. Entries are now flushed as complete strings. (#301)
-
Attempt to recover from
log_async
invariant violations during an explicit sync operation, rather than failing immediately. (#329)
-
Release overly defensive warnings occuring when pre-fetching the disk. (#322)
-
Optimised the in-memory representation of index handles and intermediate buffers, resulting in a significant reduction in memory use. (#273, #279)
-
Benches are now executed 3 times and a new option
nb-exec
has been added (#292) -
Index.Make
now requires an implementation of a monotonic time source. (#321) -
The
Index.Make
functor now takes a singlePlatform
argument containing all system dependencies (i.e.IO
,Clock
,Semaphore
andThread
). ThePlatform
module holds the necessary types for these modules. (#321, #330)
-
Added benchmarks that replay a trace of index operations. (#300)
-
Log reporter for the benches
-
Reduce allocations during merge (#274, #277)
-
Protect concurrent syncs with a lock (#309)
-
Fixed a performance issue for
Index.sync
when there is a blocking merge in progress: thelog_async
file was not cached properly and fully reloaded from disk every time. (#310) -
Release the merge lock if a merge raises an exception (#312)
-
Added fsync after
Index.clear
to signal more quickly to read-only instances than something has changed in the file (#308)
-
Specialise
IO.v
to create read-only or read-write instances. (#291) -
clear
removes the files on disks and opens new ones containing only the header. (#288, #307, #317)
-
Added
flush_callback
parameter to the creation of a store, to register a callback before a flush. This callback can be temporarily disabled by~no_callback:()
toflush
. (#189, #216) -
Added
Stats.merge_durations
to list the duration of the last 10 merges. (#193) -
Added
is_merging
to detect if a merge is running. (#192) -
New
IO.Header.{get,set}
functions to read and write the file headers atomically (#175, #204, @icristescu, @CraigFe, @samoht) -
Added a
throttle
configuration option to select the strategy to use when the cache are full and an async merge is already in progress. The current behavior is the (default)`Block_writes
strategy. The new`Overcommit_memory
does not block but continue to fill the cache instead. (#209, @samoht) -
Add
IO.exists
obligation for IO implementations, to be used for lazy creation of IO instances. (#233, @CraigFe) -
Index.close
now takes an~immediately:()
argument. When passed, this causesclose
to terminate any ongoing asynchronous merge operation, rather than waiting for it to finish. (#185, #234) -
Added
Index.Checks.cli
, which provides offline integrity checking of Index stores. (#236) -
Index.replace
now takes a~overcommit
argument to postpone a merge. (#253) -
Index.merge
is now part of the public API. (#253) -
Index.try_merge
is now part of the public API.try_merge' is a no-op if the number of entries in the write-ahead log is smaller than
log_size, otherwise it's
merge'. (#253 @samoht)
sync
has to be called by the read-only instance to synchronise with the files on disk. (#175)- Caching of
Index
instances is now explicit:Index.Make
requires a cache implementation, andIndex.v
may be passed a cache to be used for instance sharing. The default behaviour is not to share instances. (#188)
- Added values after a clear are found by read-only instances. (#168)
- Fix a race between
merge
andsync
(#203, @samoht, @CraigFe) - Fix a potential loss of data if a crash occurs at the end of a merge (#232)
- Fix
Index.iter
to only iterate once over elements persisted on the disk (#260, @samoht, @icristescu)
- Added
Index_unix.Syscalls
, a module exposing various Unix bindings for interacting with file-systems. (#176)
-
Fail when
Index_unix.IO
file version number is not as expected. (#178) -
Fixed creation of an index when an empty
data
file exists. (#173)
- Added
filter
, removing bindings depending on a predicate (#165)
- Parameterise
Index.Make
over arbitrary mutex and thread implementations (and remove the obligation forIO
to provide this functionality). (#160, #161)
-
Improve the cooperativeness of the
merge
operation, allowing concurrent read operations to share CPU resources with ongoing merges. (#152) -
Improve speed of read operations for read-only instances. (#141)
- Remove
force_merge
fromIndex.S
, due to difficulties with guaranteeing sensible semantics to this function under MRSW access patterns. (#147, #150)
- Provide a better CLI interface for the benchmarks (#130, #133)
- Fix a segmentation fault when using musl <= 1.1.20 by not allocating 64k-byte buffers on the thread stack (#132)
- Do not call
pwrite
withlen=0
(#131) - Clear
log.mem
onclose
(#135) - Load
log_async
on startup (#136)
First stable release.