Revert CF timestamp format (#3690)

This commit is contained in:
Przemyslaw Hugh Kaznowski 2024-03-21 10:15:40 +00:00 committed by GitHub
parent 1b33a7ba58
commit e00c456389
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 202 additions and 35 deletions

View file

@ -4,7 +4,7 @@ use crate::sql::statements::DefineTableStatement;
use crate::sql::thing::Thing; use crate::sql::thing::Thing;
use crate::sql::value::Value; use crate::sql::value::Value;
use crate::sql::Operation; use crate::sql::Operation;
use crate::vs::versionstamp_to_u64; use crate::vs::to_u128_be;
use derive::Store; use derive::Store;
use revision::revisioned; use revision::revisioned;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -127,7 +127,7 @@ impl DatabaseMutation {
impl ChangeSet { impl ChangeSet {
pub fn into_value(self) -> Value { pub fn into_value(self) -> Value {
let mut m = BTreeMap::<String, Value>::new(); let mut m = BTreeMap::<String, Value>::new();
let vs = versionstamp_to_u64(&self.0); let vs = to_u128_be(self.0);
m.insert("versionstamp".to_string(), Value::from(vs)); m.insert("versionstamp".to_string(), Value::from(vs));
m.insert("changes".to_string(), self.1.into_value()); m.insert("changes".to_string(), self.1.into_value());
let so: Object = m.into(); let so: Object = m.into();
@ -221,7 +221,7 @@ mod tests {
let s = serde_json::to_string(&v).unwrap(); let s = serde_json::to_string(&v).unwrap();
assert_eq!( assert_eq!(
s, s,
r#"{"changes":[{"update":{"id":"mytb:tobie","note":"surreal"}},{"delete":{"id":"mytb:tobie"}},{"define_table":{"name":"mytb"}}],"versionstamp":1}"# r#"{"changes":[{"update":{"id":"mytb:tobie","note":"surreal"}},{"delete":{"id":"mytb:tobie"}},{"define_table":{"name":"mytb"}}],"versionstamp":65536}"#
); );
} }
@ -276,7 +276,7 @@ mod tests {
let s = serde_json::to_string(&v).unwrap(); let s = serde_json::to_string(&v).unwrap();
assert_eq!( assert_eq!(
s, s,
r#"{"changes":[{"current":{"id":"mytb:tobie","note":"surreal"},"update":[{"op":"add","path":"/`/note`","value":"surreal"}]},{"current":{"id":"mytb:tobie2","note":"surreal"},"update":[{"op":"remove","path":"/`/temp`"}]},{"delete":{"id":"mytb:tobie"}},{"define_table":{"name":"mytb"}}],"versionstamp":1}"# r#"{"changes":[{"current":{"id":"mytb:tobie","note":"surreal"},"update":[{"op":"add","path":"/`/note`","value":"surreal"}]},{"current":{"id":"mytb:tobie2","note":"surreal"},"update":[{"op":"remove","path":"/`/temp`"}]},{"delete":{"id":"mytb:tobie"}},{"define_table":{"name":"mytb"}}],"versionstamp":65536}"#
); );
} }
} }

View file

@ -6,7 +6,7 @@ use crate::key::debug::sprint_key;
use crate::kvs::Check; use crate::kvs::Check;
use crate::kvs::Key; use crate::kvs::Key;
use crate::kvs::Val; use crate::kvs::Val;
use crate::vs::{u64_to_versionstamp, versionstamp_to_u64, Versionstamp}; use crate::vs::{try_to_u64_be, u64_to_versionstamp, Versionstamp};
use std::ops::Range; use std::ops::Range;
pub struct Datastore { pub struct Datastore {
@ -182,7 +182,7 @@ impl Transaction {
Err(e) => Err(Error::Ds(e.to_string())), Err(e) => Err(Error::Ds(e.to_string())),
}; };
let array = res?; let array = res?;
let prev = versionstamp_to_u64(&array); let prev = try_to_u64_be(array)?;
prev + 1 prev + 1
} }
None => 1, None => 1,

View file

@ -76,6 +76,8 @@ pub fn try_u128_to_versionstamp(v: u128) -> Result<[u8; 10], Error> {
} }
/// Take the most significant, time-based bytes and ignores the last 2 bytes /// Take the most significant, time-based bytes and ignores the last 2 bytes
///
/// You probably want `to_u128_be` instead
#[doc(hidden)] #[doc(hidden)]
pub fn versionstamp_to_u64(vs: &Versionstamp) -> u64 { pub fn versionstamp_to_u64(vs: &Versionstamp) -> u64 {
u64::from_be_bytes(vs[..8].try_into().unwrap()) u64::from_be_bytes(vs[..8].try_into().unwrap())

View file

@ -6,6 +6,14 @@
/// Versionstamp is a 10-byte array used to identify a specific version of a key. /// Versionstamp is a 10-byte array used to identify a specific version of a key.
/// The first 8 bytes are significant (the u64), and the remaining 2 bytes are not significant, but used for extra precision. /// The first 8 bytes are significant (the u64), and the remaining 2 bytes are not significant, but used for extra precision.
/// To convert to and from this module, see the conv module in this same directory. /// To convert to and from this module, see the conv module in this same directory.
///
/// You're going to want these
/// 65536
/// 131072
/// 196608
/// 262144
/// 327680
/// 393216
pub type Versionstamp = [u8; 10]; pub type Versionstamp = [u8; 10];
pub(crate) mod conv; pub(crate) mod conv;

View file

@ -64,11 +64,13 @@ async fn database_change_feeds() -> Result<(), Error> {
let tmp = res.remove(0).result; let tmp = res.remove(0).result;
assert!(tmp.is_ok()); assert!(tmp.is_ok());
let cf_val_arr = match FFLAGS.change_feed_live_queries.enabled() { let potential_show_changes_values: Vec<Value> = match FFLAGS.change_feed_live_queries.enabled()
true => Value::parse( {
true => vec![
Value::parse(
"[ "[
{ {
versionstamp: 2, versionstamp: 65536,
changes: [ changes: [
{ {
create: { create: {
@ -79,7 +81,7 @@ async fn database_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 3, versionstamp: 131072,
changes: [ changes: [
{ {
delete: { delete: {
@ -90,10 +92,87 @@ async fn database_change_feeds() -> Result<(), Error> {
} }
]", ]",
), ),
false => Value::parse( Value::parse(
"[ "[
{ {
versionstamp: 2, versionstamp: 65536,
changes: [
{
create: {
id: person:test,
name: 'Name: Tobie'
}
}
]
},
{
versionstamp: 196608,
changes: [
{
delete: {
id: person:test
}
}
]
}
]",
),
Value::parse(
"[
{
versionstamp: 131072,
changes: [
{
create: {
id: person:test,
name: 'Name: Tobie'
}
}
]
},
{
versionstamp: 196608,
changes: [
{
delete: {
id: person:test
}
}
]
}
]",
),
Value::parse(
"[
{
versionstamp: 131072,
changes: [
{
create: {
id: person:test,
name: 'Name: Tobie'
}
}
]
},
{
versionstamp: 262144,
changes: [
{
delete: {
id: person:test
}
}
]
}
]",
),
],
false => vec![
Value::parse(
"[
{
versionstamp: 65536,
changes: [ changes: [
{ {
update: { update: {
@ -104,7 +183,7 @@ async fn database_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 3, versionstamp: 131072,
changes: [ changes: [
{ {
delete: { delete: {
@ -115,6 +194,82 @@ async fn database_change_feeds() -> Result<(), Error> {
} }
]", ]",
), ),
Value::parse(
"[
{
versionstamp: 65536,
changes: [
{
update: {
id: person:test,
name: 'Name: Tobie'
}
}
]
},
{
versionstamp: 196608,
changes: [
{
delete: {
id: person:test
}
}
]
}
]",
),
Value::parse(
"[
{
versionstamp: 131072,
changes: [
{
update: {
id: person:test,
name: 'Name: Tobie'
}
}
]
},
{
versionstamp: 196608,
changes: [
{
delete: {
id: person:test
}
}
]
}
]",
),
Value::parse(
"[
{
versionstamp: 131072,
changes: [
{
update: {
id: person:test,
name: 'Name: Tobie'
}
}
]
},
{
versionstamp: 262144,
changes: [
{
delete: {
id: person:test
}
}
]
}
]",
),
],
}; };
// Declare check that is repeatable // Declare check that is repeatable
@ -122,7 +277,7 @@ async fn database_change_feeds() -> Result<(), Error> {
dbs: &Datastore, dbs: &Datastore,
sql2: &str, sql2: &str,
ses: &Session, ses: &Session,
cf_val_arr: &Value, cf_val_arr: &Vec<Value>,
) -> Result<(), String> { ) -> Result<(), String> {
let res = &mut dbs.execute(sql2, ses, None).await?; let res = &mut dbs.execute(sql2, ses, None).await?;
assert_eq!(res.len(), 3); assert_eq!(res.len(), 3);
@ -149,17 +304,19 @@ async fn database_change_feeds() -> Result<(), Error> {
.ok_or(format!("Expected DELETE value:\nleft: {}\nright: {}", tmp, val))?; .ok_or(format!("Expected DELETE value:\nleft: {}\nright: {}", tmp, val))?;
// SHOW CHANGES // SHOW CHANGES
let tmp = res.remove(0).result?; let tmp = res.remove(0).result?;
Some(&tmp) cf_val_arr
.filter(|x| *x == cf_val_arr) .iter()
.find(|x| *x == &tmp)
// We actually dont want to capture if its found
.map(|_v| ()) .map(|_v| ())
.ok_or(format!("Expected SHOW CHANGES value:\nleft: {}\nright: {}", tmp, cf_val_arr))?; .ok_or(format!("Expected SHOW CHANGES value not found:\n{}", tmp))?;
Ok(()) Ok(())
} }
// Check the validation with repeats // Check the validation with repeats
let limit = 1; let limit = 1;
for i in 0..limit { for i in 0..limit {
let test_result = check_test(&dbs, sql2, &ses, &cf_val_arr).await; let test_result = check_test(&dbs, sql2, &ses, &potential_show_changes_values).await;
match test_result { match test_result {
Ok(_) => break, Ok(_) => break,
Err(e) => { Err(e) => {
@ -185,7 +342,7 @@ async fn database_change_feeds() -> Result<(), Error> {
let res = &mut dbs.execute(sql, &ses, None).await?; let res = &mut dbs.execute(sql, &ses, None).await?;
let tmp = res.remove(0).result?; let tmp = res.remove(0).result?;
assert_eq!(tmp, cf_val_arr); assert!(potential_show_changes_values.contains(&tmp));
// GC after 1hs // GC after 1hs
let one_hour_in_secs = 3600; let one_hour_in_secs = 3600;
current_time += one_hour_in_secs; current_time += one_hour_in_secs;
@ -297,7 +454,7 @@ async fn table_change_feeds() -> Result<(), Error> {
true => Value::parse( true => Value::parse(
"[ "[
{ {
versionstamp: 1, versionstamp: 65536,
changes: [ changes: [
{ {
define_table: { define_table: {
@ -307,7 +464,7 @@ async fn table_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 2, versionstamp: 131072,
changes: [ changes: [
{ {
create: { create: {
@ -318,7 +475,7 @@ async fn table_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 3, versionstamp: 196608,
changes: [ changes: [
{ {
update: { update: {
@ -329,7 +486,7 @@ async fn table_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 4, versionstamp: 262144,
changes: [ changes: [
{ {
update: { update: {
@ -340,7 +497,7 @@ async fn table_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 5, versionstamp: 327680,
changes: [ changes: [
{ {
delete: { delete: {
@ -350,7 +507,7 @@ async fn table_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 6, versionstamp: 393216,
changes: [ changes: [
{ {
create: { create: {
@ -365,7 +522,7 @@ async fn table_change_feeds() -> Result<(), Error> {
false => Value::parse( false => Value::parse(
"[ "[
{ {
versionstamp: 1, versionstamp: 65536,
changes: [ changes: [
{ {
define_table: { define_table: {
@ -375,7 +532,7 @@ async fn table_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 2, versionstamp: 131072,
changes: [ changes: [
{ {
update: { update: {
@ -386,7 +543,7 @@ async fn table_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 3, versionstamp: 196608,
changes: [ changes: [
{ {
update: { update: {
@ -397,7 +554,7 @@ async fn table_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 4, versionstamp: 262144,
changes: [ changes: [
{ {
update: { update: {
@ -408,7 +565,7 @@ async fn table_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 5, versionstamp: 327680,
changes: [ changes: [
{ {
delete: { delete: {
@ -418,7 +575,7 @@ async fn table_change_feeds() -> Result<(), Error> {
] ]
}, },
{ {
versionstamp: 6, versionstamp: 393216,
changes: [ changes: [
{ {
update: { update: {