seekable-async-file 0.14.0

Async pread and pwrite, with optional delayed sync and metrics
Documentation
# SeekableAsyncFile

This library will provide a `SeekableAsyncFile` struct that is designed to be similar in function to [tokio::fs::File](https://docs.rs/tokio/latest/tokio/fs/struct.File.html). It provides async `read_at` and `write_at` methods, which aren't currently available with Tokio.

## Getting started

Add it to your project like:

```bash
cargo add seekable-async-file
```

View the [documentation](https://docs.rs/seekable-async-file) for usage guides.

## Delayed sync

The `write_at_with_delayed_sync` method is provided to call `write` and `fdatasync`, but the sync call will be made at some future time. The returned future won't resolve until the sync call is made and completes successfully. This is a performance optimisation to try to batch multiple writes with a single sync, but still keep the semantics where the call completes only when successfully written to disk.

If this is used, make sure to also execute the `start_delayed_data_sync_background_loop` method in the background, such as using `tokio::spawn` or `tokio::join!`.

## Metrics

Metrics will be populated via the `SeekableAsyncFileMetrics` struct. All values are atomic, so it's possible to read them at any time from any thread safely using the provided getter methods. This is designed for use inside a larger system (e.g. database, object storage, cache) or I/O subsystem.

## Modes

### mmap (default)

By default, a memory map is created on the file. This means that all platforms that support mmap can be targeted, instead of only Unix platforms with `pread` and `pwrite`.

### tokio_file

Enabling the `tokio_file` feature will cause `pread` and `pwrite` on standard file descriptors to be used instead of mmap. Ensure to disable the `mmap` feature, which is enabled by default.

The target platform must support [std::os::unix::fs::FileExt](https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html).

## Features

For experimental purposes, there are other Cargo features that can be toggled:

- **mmap**: (Default) Use mmap instead of `pread` and `pwrite`.
- **tokio_file**: Use `pread` and `pwrite` with `tokio::spawn_blocking`.