libblobd_lite/
object_id.rs

1#[cfg(test)]
2use crate::test_util::device::TestSeekableAsyncFile as SeekableAsyncFile;
3#[cfg(test)]
4use crate::test_util::journal::TestTransaction as Transaction;
5use off64::int::create_u64_be;
6use off64::int::Off64AsyncReadInt;
7#[cfg(not(test))]
8use seekable_async_file::SeekableAsyncFile;
9use std::sync::atomic::AtomicU64;
10use std::sync::atomic::Ordering;
11use tracing::debug;
12#[cfg(not(test))]
13use write_journal::Transaction;
14
15pub(crate) struct ObjectIdSerial {
16  dev_offset: u64,
17  next: AtomicU64,
18}
19
20impl ObjectIdSerial {
21  pub async fn load_from_device(dev: &SeekableAsyncFile, dev_offset: u64) -> Self {
22    let next = dev.read_u64_be_at(dev_offset).await;
23    debug!(next_id = next, "object ID serial loaded");
24    Self {
25      dev_offset,
26      next: AtomicU64::new(next),
27    }
28  }
29
30  pub async fn format_device(dev: &SeekableAsyncFile, dev_offset: u64) {
31    dev.write_at(dev_offset, create_u64_be(0)).await;
32  }
33
34  pub fn next(&self, txn: &mut Transaction) -> u64 {
35    let id = self.next.fetch_add(1, Ordering::Relaxed);
36    txn.write(self.dev_offset, create_u64_be(id + 1));
37    id
38  }
39}