Skip to content

Downloads

Packages and source tarballs of every release, built by CI and published on GitHub Releases.

v0.2.12

Released 2026-10-03. Release page

Assets

Source tarball

Debian/Ubuntu packages

RPM packages

Python package

Changelog

Fixed

  • rawstor info against a file:// location reported total as the whole filesystem's capacity (statvfs's f_blocks * f_frsize) rather than space accounted for by rawstor, so available (derived as total - used) could include space taken by unrelated data on the same filesystem. total is now used (rawstor's own files) plus the filesystem's actually-free space (f_bavail * f_frsize), matching the lvm:///zfs:// backends' total = used + available semantics.
  • The rawstor-vduse deb/rpm packages (present since 0.2.10) were never actually built or published: CI's packaging jobs never copied its install scriptlets into place, so its .deb/.rpm were silently absent from every release despite rawstor-vduse being a real, working binary.

v0.2.11

Released 2026-10-03. Release page

Assets

Source tarball

Debian/Ubuntu packages

RPM packages

Python package

Changelog

Added

  • Vendored nlohmann/json (single-header, MIT) for parsing command output in the new storage backends below.
  • New lvm:// storage backend: objects are LVM Logical Volumes, provisioned via lvcreate/lvremove. A new object is fully zeroed before it becomes visible (LVM itself only zeroes the first 4KiB of a new LV), so it never exposes another object's leftover data; any staging LV left behind by a process that crashed mid-create is swept and removed on the next create() against that VG.
  • New zfs:// storage backend: objects are ZFS zvols, provisioned via zfs create/zfs destroy.
  • Consistent startup/connection INFO logging across rawstor-ost, rawstor-vhost, rawstor-vhost-qemu and rawstor-vduse: version at startup, waiting for a connection, client connected, client disconnected.
  • rawio::Queue::timeout_multishot() (and its rawio_timeout_multishot() C API counterpart): the multishot counterpart of timeout(), firing once every given number of microseconds until canceled instead of resolving once.

Changed

  • The packaged rawstor-ost.service systemd unit's backing store is now configurable via a LOCATION environment variable (default file:///var/lib/rawstor, unchanged) instead of being hardcoded in ExecStart — set it in /etc/rawstor-ost.conf, same as the unit's other overridable settings.

Fixed

  • rawstor create/list/remove/show/info against a multi-backend LOCATION/TARGET (comma-separated URIs) could intermittently fail with "No buffer space available": the CLI's internal I/O queue was sized for a single backend at a time.
  • The same "No buffer space available" (ENOBUFS) failure could also surface under a small enough --queue-size (io_uring builds only): the submission ring is now flushed and retried instead of failing outright when it's full of not-yet-submitted entries.
  • Object::flush() could report success (and durability) before a write it was still waiting on had actually completed, if a later write happened to finish first -- affects ost://, where responses are matched by request id and can legitimately arrive out of order.
  • Building with GCC 15.2.0 could hit an internal compiler error in Connection::_with_retry()'s coroutine code.

v0.2.10

Released 2026-10-03. Release page

Assets

Source tarball

Debian/Ubuntu packages

RPM packages

Python package

Changelog

Added

  • rawio::Queue::timeout() (and its rawio_timeout() C API counterpart): a standalone async timer op, co_await-able and cancellable exactly like every other rawio::Queue operation, resolving successfully once a given number of microseconds have elapsed.
  • -w/--workers N for rawstor-ost: runs N worker threads (default 12), each with its own I/O queue and client connections, all accepting on the same listening socket.
  • --num-queues N for rawstor-vhost (default 4): advertises N virtqueues over VIRTIO_BLK_F_MQ, each serviced by its own thread and its own connection to TARGET, so I/O on different queues now makes progress in parallel instead of funneling through one shared reactor.
  • Discard and write-zeroes support end to end: new rawstor_object_discard()/rawstor_object_write_zeroes() client API, a WRITE_ZEROES OST wire command (DISCARD already existed but was unimplemented), file://'s backend now actually punches holes/zeroes ranges via fallocate(), and rawstor-vhost/rawstor-vhost-qemu advertise VIRTIO_BLK_F_DISCARD/VIRTIO_BLK_F_WRITE_ZEROES to the guest.
  • rawstor-vduse: a new virtio-blk backend using the VDUSE (vDPA Device in Userspace) kernel protocol, alongside rawstor-vhost. Implements the protocol natively (no vendored third-party library, same approach as vhost/), in its own deb/rpm package with a rawstor-vduse@.service systemd template unit and udev rule. Advertises VIRTIO_BLK_F_MQ/VIRTIO_BLK_F_DISCARD/VIRTIO_BLK_F_WRITE_ZEROES and services _DISCARD/_WRITE_ZEROES requests, and (--num-queues, default 16) services that many virtqueues in parallel, each on its own thread and its own connection to TARGET. Linux-only. See the top-level README's "rawstor-vduse" section.
  • Connection::_with_retry() now waits out an exponential backoff with jitter (tunable via the new RAWSTOR_OPTS_IO_RETRY_BACKOFF_BASE/_MAX/_JITTER) instead of retrying immediately, and reconnects before every retry regardless of what failed, bounded by RAWSTOR_OPTS_IO_ATTEMPTS -- skipped entirely for a rejection retrying can never fix, e.g. ENOENT. See README.md's "Environment Variables" section.

Fixed

  • file://'s Session::create() only ftruncate()d a new object to its full size, leaving it sparse; a write into never-touched territory then depends on the filesystem's own delayed allocation, which under data=ordered journaling must land before the next journal commit -- on an ext4 mount with an unusually long commit= interval, many concurrent writes into a still-sparse object could each back up behind that interval, measured as tens of seconds of rawstor-vhost/OST session round-trip latency under sustained load. create() now preallocates the object's real blocks up front (fallocate() on Linux, fcntl(F_PREALLOCATE) on macOS), removing that dependency entirely.
  • rawstor-ost now reliably stops on the first SIGINT/SIGTERM instead of occasionally needing a second signal to unblock its I/O wait.

v0.2.9

Released 2026-08-26. Release page

Assets

Source tarball

Debian/Ubuntu packages

RPM packages

Python package

Changelog

Added

  • librawstor's top-10 slowest-requests report now shows each entry's own submission/round-trip/callback latency breakdown, not just its total.
  • rawio_fsync()/_open()/_close()/_poll()/_poll_multishot()/_connect()/_accept()/_accept_multishot() gained _2-suffixed siblings with a single collapsed ssize_t result callback, ahead of the breaking rename in 0.3.0.
  • New async rawstor_target_spec()/_create()/_remove()/_open()/_id()/_location() and rawstor_location_list()/_create() API (<rawstor/target.h>, <rawstor/location.h>), plus async completion for rawstor_object_close(); the existing synchronous rawstor_object_*() API keeps working unchanged.
  • rawstor info gained -l/--logical, additionally reporting the sum of every object's own declared size alongside the location's actual physical usage.

Changed

  • librawio and librawstor's client-side (Session/Connection/Object) internals moved from callback-based async I/O to C++20 coroutines; no public API change.
  • Write-throttling (in-flight cap + backlog cap on writes headed to a file:// backing store) moved from rawstor-ost itself into librawstor's own file:// write path, so it now applies to any writer against a file:// location, not just rawstor-ost. rawstor-ost --write-throttle-limit/--write-backlog-capacity are gone; tune the same caps via the RAWSTOR_OPTS_WRITE_THROTTLE_LIMIT/RAWSTOR_OPTS_WRITE_BACKLOG_CAPACITY environment variables instead (same defaults, 128 and 256MiB) — rawstor-ost.service no longer warns on startup if the limit sits too close to --queue-size.

Fixed

  • rawstor_object_flush() could report success while a pwrite()/pwritev() issued just before it was still outstanding, so its data wasn't actually guaranteed durable yet; flush() now waits for every write issued before it to complete first.
  • rawstor_object_close() didn't actually flush pending writes before completing, despite already being documented to -- it now does, and also waits for any write still in flight rather than racing its connection out from under it.
  • rawstor-ost and the client's own OST session each registered a 32MiB recv_multishot buffer pool, undersized for rawstor-vhost's own healthy worst case (its default write-throttle-limit of 128 concurrent requests at a realistic virtio-blk transfer size); a client pipelining that many requests could overflow it, forcing a reconnect that immediately overflowed again under the same sustained load and exhausted the retry budget for real. Raised to 128MiB on both sides.
  • Telemetry's in-flight-requests count could go negative: an op whose session had already died before it was ever registered still ran through the same completion path as a normal one, decrementing a count it had never gotten to increment.

v0.2.8

Released 2026-08-14. Release page

Assets

Source tarball

Debian/Ubuntu packages

RPM packages

Python package

Changelog

Changed

  • rawstor-ost --queue-size's default raised from 256 to 4096, now that per-session write concurrency is bounded (see Fixed below) and no longer needs a small ring to keep worst-case exposure in check.
  • rawstor-ost.service exposes --queue-size/--write-throttle-limit/--write-backlog-capacity as the QUEUE_SIZE/WRITE_THROTTLE_LIMIT/WRITE_BACKLOG_CAPACITY environment variables, overridable in /etc/rawstor-ost.conf like the rest of its tuning knobs.

Fixed

  • rawstor-ost had no limit on how many WRITEs a session could have dispatched to storage at once; against a backing store much slower than the incoming write rate, that queue grew without bound instead of applying ordinary backpressure, eventually stalling the session (and, under sustained pressure, the whole process) for an effectively unbounded time. Now capped per session via the new --write-throttle-limit (default 128); rawstor-ost also now warns on startup if it's set too close to --queue-size to leave any real headroom.
  • Even with --write-throttle-limit in place, a session facing a backing store slower than its incoming write rate could still queue an unbounded number of already-received writes waiting for a dispatch slot, growing memory use without bound. Now capped in bytes via the new --write-backlog-capacity (default 256MiB); a write that would push the backlog over the cap is rejected with EBUSY instead of queued.

v0.2.7

Released 2026-08-12. Release page

v0.2.6

Released 2026-08-10. Release page

v0.2.5

Released 2026-08-07. Release page

v0.2.4

Released 2026-08-05. Release page

v0.2.3

Released 2026-08-04. Release page

v0.2.2

Released 2026-08-03. Release page

v0.2.1

Released 2026-07-14. Release page

v0.2.0

Released 2026-07-03. Release page

v0.1.2

Released 2026-07-02. Release page

v0.1.1

Released 2026-05-25. Release page

v0.0.2

Released 2026-05-25. Release page

v0.1.0

Released 2025-12-29. Release page

v0.0.1

Released 2025-12-29. Release page

v0.0.0

Released 2025-10-26. Release page