libblobd-lite 0.2.0

Library for blobd, lite variant
Documentation
#[cfg(test)]
use crate::test_util::device::TestSeekableAsyncFile as SeekableAsyncFile;
#[cfg(test)]
use crate::test_util::journal::TestTransaction as Transaction;
use off64::int::create_u64_be;
use off64::int::Off64AsyncReadInt;
#[cfg(not(test))]
use seekable_async_file::SeekableAsyncFile;
use std::sync::atomic::AtomicU64;
use std::sync::atomic::Ordering;
use tracing::debug;
#[cfg(not(test))]
use write_journal::Transaction;

pub(crate) struct ObjectIdSerial {
  dev_offset: u64,
  next: AtomicU64,
}

impl ObjectIdSerial {
  pub async fn load_from_device(dev: &SeekableAsyncFile, dev_offset: u64) -> Self {
    let next = dev.read_u64_be_at(dev_offset).await;
    debug!(next_id = next, "object ID serial loaded");
    Self {
      dev_offset,
      next: AtomicU64::new(next),
    }
  }

  pub async fn format_device(dev: &SeekableAsyncFile, dev_offset: u64) {
    dev.write_at(dev_offset, create_u64_be(0)).await;
  }

  pub fn next(&self, txn: &mut Transaction) -> u64 {
    let id = self.next.fetch_add(1, Ordering::Relaxed);
    txn.write(self.dev_offset, create_u64_be(id + 1));
    id
  }
}