# Changelog

## 0.3.0

- If using local storage (`{:local, directory}`), writes now share one
  exclusive OS lock per store root, held for each mutation until it is synced
  to disk. Multiple processes can open the store; SlateDB fencing still
  enforces one writer per database. Before starting this version, stop all
  processes accessing that store with older `slap_slatedb` versions, which do
  not take this lock. Use the same root in every process accessing the data,
  and keep the root's `.slap-lock#0` file. Before starting another cluster, see
  [running another cluster on the same store](https://hexdocs.pm/slap_cluster/readme.html#running-another-cluster-on-the-same-store).
- Local stores reject recognized network filesystems, including NFS and
  SMB/CIFS.
- Local stores sync object writes and completed uploads to disk with `fsync`.
  On Unix, they also sync directory changes. Persistence depends on the
  filesystem and device honoring sync requests. Writes and opens can take
  longer.
- Local stores support conditional updates (`{:update, version}`). This lets
  SlateDB's garbage collector remove obsolete metadata on subsequent runs and
  lets `slap_cluster` use `ObjectLease` on local storage. Conditional updates
  return `:unsupported` on filesystems without microsecond modification times.
- Fixes `config :rustler_precompiled, :force_build, slap_slatedb: true` being
  ignored. It now builds the NIF from source, as `SLAP_SLATEDB_BUILD=1` does.
- Adds `get_range/3` to preview a value with `:max_value_bytes` and optional
  `:value_range`, and `preview_iterator/2` to preview keys and values with
  `:max_key_bytes` and `:max_value_bytes`. Both return full sizes and limit
  bytes copied into the BEAM; SlateDB still loads whole rows in native memory.

## 0.2.0

- Upgrades SlateDB to 0.17. Databases written by 0.16 open unchanged.
- `Slap.SlateDB.Iterator.seek/3` returns an error with `kind: :invalid` for an
  iterator with `order: :desc`.
- Raises the maximum key size from 65,535 bytes to 4 GiB minus one byte.
- `Slap.SlateDB.ObjectStore.download/3` accepts `range: {first, last}`
  (inclusive) to download part of an object.
- SlateDB 0.17's new settings can be passed in `:settings`, among them
  `compactor_options.checkpoint_lifetime` and
  `compactor_options.scheduler_options.sorted_run_consolidation_threshold`.

## 0.1.0

Initial release of `slap_slatedb`.
