Unversioned archiving

This commit is contained in:
mdecimus
2025-05-15 13:35:40 +02:00
parent 839b7189fa
commit 365c87af20
28 changed files with 360 additions and 219 deletions

View File

@@ -15,7 +15,6 @@ use std::{
#[derive(Debug)]
pub struct SnowflakeIdGenerator {
epoch: SystemTime,
last_timestamp: AtomicU64,
node_id: u64,
sequence: AtomicU64,
}
@@ -31,7 +30,7 @@ const NODE_ID_MASK: u64 = (1 << NODE_ID_LEN) - 1;
const DEFAULT_EPOCH: u64 = 1632280000; // 52 years after UNIX_EPOCH
const DEFAULT_EPOCH_MS: u128 = (DEFAULT_EPOCH as u128) * 1000; // 52 years after UNIX_EPOCH in milliseconds
const MAX_CLOCK_DRIFT: i64 = 60 * 1000; // 1 minute
const MAX_CLOCK_DRIFT: i64 = 2000; // 2 seconds
static LOGICAL_TIME: AtomicU64 = AtomicU64::new(0);
static CHANGE_SEQ: AtomicU64 = AtomicU64::new(0);
@@ -73,7 +72,6 @@ impl SnowflakeIdGenerator {
epoch: SystemTime::UNIX_EPOCH + Duration::from_secs(DEFAULT_EPOCH), // 52 years after UNIX_EPOCH
node_id,
sequence: 0.into(),
last_timestamp: 0.into(),
}
}
@@ -92,22 +90,15 @@ impl SnowflakeIdGenerator {
#[inline(always)]
pub fn generate(&self) -> u64 {
let current_elapsed = self
let elapsed = self
.epoch
.elapsed()
.map(|e| e.as_millis())
.unwrap_or_default() as u64;
let last_elapsed = self
.last_timestamp
.fetch_max(current_elapsed, Ordering::Relaxed);
let (elapsed, sequence) = if current_elapsed > last_elapsed {
(current_elapsed, 0)
} else {
(last_elapsed, self.sequence.fetch_add(1, Ordering::Relaxed))
};
let sequence = self.sequence.fetch_add(1, Ordering::Relaxed) & SEQUENCE_MASK;
(elapsed << (SEQUENCE_LEN + NODE_ID_LEN))
| ((sequence & SEQUENCE_MASK) << NODE_ID_LEN)
| (sequence << NODE_ID_LEN)
| (self.node_id & NODE_ID_MASK)
}
}
@@ -139,20 +130,18 @@ impl HlcTimestamp {
pub fn generate() -> u64 {
let node_id = *NODE_MUM;
let current_elapsed = SystemTime::UNIX_EPOCH
let elapsed = SystemTime::UNIX_EPOCH
.elapsed()
.map(|e| e.as_millis())
.unwrap_or_default()
.saturating_sub(DEFAULT_EPOCH_MS) as u64;
let last_elapsed = LOGICAL_TIME.fetch_max(current_elapsed, Ordering::SeqCst);
let (elapsed, sequence) = if current_elapsed > last_elapsed {
(current_elapsed, 0)
} else {
(last_elapsed, CHANGE_SEQ.fetch_add(1, Ordering::Relaxed))
};
let elapsed = LOGICAL_TIME
.fetch_max(elapsed, Ordering::SeqCst)
.max(elapsed);
let sequence = CHANGE_SEQ.fetch_add(1, Ordering::Relaxed) & SEQUENCE_MASK;
(elapsed << (SEQUENCE_LEN + NODE_ID_LEN))
| ((sequence & SEQUENCE_MASK) << NODE_ID_LEN)
| (sequence << NODE_ID_LEN)
| (node_id as u64 & NODE_ID_MASK)
}
}
@@ -168,7 +157,6 @@ impl Clone for SnowflakeIdGenerator {
Self {
epoch: self.epoch,
node_id: self.node_id,
last_timestamp: 0.into(),
sequence: 0.into(),
}
}