diff --git a/src/timestamp.rs b/src/timestamp.rs index 5bd21a28..9cbbc1f5 100644 --- a/src/timestamp.rs +++ b/src/timestamp.rs @@ -25,12 +25,24 @@ pub trait TimestampExt: Sized { impl TimestampExt for Timestamp { fn version(&self) -> u64 { + if self.physical == i64::MAX && self.logical == i64::MAX { + return u64::MAX; + } + ((self.physical << PHYSICAL_SHIFT_BITS) + self.logical) .try_into() .expect("Overflow converting timestamp to version") } fn from_version(version: u64) -> Self { + if version == u64::MAX { + return Self { + physical: i64::MAX, + logical: i64::MAX, + suffix_bits: 0, + }; + } + let version = version as i64; Self { physical: version >> PHYSICAL_SHIFT_BITS, @@ -41,7 +53,7 @@ impl TimestampExt for Timestamp { } fn try_from_version(version: u64) -> Option { - if version == 0 { + if version == 0 || (version >= i64::MAX as u64 && version != u64::MAX) { None } else { Some(Self::from_version(version)) diff --git a/src/transaction/client.rs b/src/transaction/client.rs index 69f11bce..500a38d8 100644 --- a/src/transaction/client.rs +++ b/src/transaction/client.rs @@ -276,7 +276,11 @@ impl Client { Ok(res) } - fn new_transaction(&self, timestamp: Timestamp, options: TransactionOptions) -> Transaction { + pub fn new_transaction( + &self, + timestamp: Timestamp, + options: TransactionOptions, + ) -> Transaction { let logger = self.logger.new(o!("child" => 1)); Transaction::new(timestamp, self.pd.clone(), options, logger) }