libblobd_lite/
object_id.rs1#[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}