refactor: Extract a function for constructing NamespaceCreated messages in the router

So that the same conversion can happen in the tests and one assert_eq!
can check everything rather than repeating lots of assertions for every
test for every field.
pull/24376/head
Carol (Nichols || Goulding) 2023-09-11 20:51:03 -04:00
parent f6c7fb4403
commit c00cd95f9d
No known key found for this signature in database
GPG Key ID: E907EE5A736F87D4
3 changed files with 39 additions and 64 deletions

View File

@ -52,6 +52,24 @@ pub mod namespace_cache;
pub mod schema_change_observer;
pub mod traits;
use data_types::NamespaceSchema;
use generated_types::influxdata::iox::gossip::v1::NamespaceCreated;
/// Make a `NamespaceCreated` protobuf instance from the specified name and schema.
pub(crate) fn namespace_created(
namespace_name: impl Into<String>,
schema: &NamespaceSchema,
) -> NamespaceCreated {
NamespaceCreated {
namespace_name: namespace_name.into(),
namespace_id: schema.id.get(),
partition_template: schema.partition_template.as_proto().cloned(),
max_columns_per_table: schema.max_columns_per_table as u64,
max_tables: schema.max_tables as u64,
retention_period_ns: schema.retention_period_ns,
}
}
#[cfg(test)]
mod mock_schema_broadcast;

View File

@ -396,7 +396,10 @@ mod tests {
};
use crate::{
gossip::tests::{DEFAULT_NAMESPACE, DEFAULT_NAMESPACE_PARTITION_TEMPLATE, NAMESPACE_NAME},
gossip::{
namespace_created,
tests::{DEFAULT_NAMESPACE, DEFAULT_NAMESPACE_PARTITION_TEMPLATE, NAMESPACE_NAME},
},
namespace_cache::{CacheMissErr, MemoryNamespaceCache},
};
@ -846,14 +849,10 @@ mod tests {
test_handle_gossip_message_!(
namespace_created_missing_name,
existing = None,
message = Event::NamespaceCreated(NamespaceCreated {
namespace_name: "".to_string(), // missing in proto
namespace_id: DEFAULT_NAMESPACE.id.get(),
partition_template: Some((**PARTITION_BY_DAY_PROTO).clone()),
max_columns_per_table: DEFAULT_NAMESPACE.max_columns_per_table as _,
max_tables: DEFAULT_NAMESPACE.max_tables as _,
retention_period_ns: DEFAULT_NAMESPACE.retention_period_ns,
}),
message = Event::NamespaceCreated(namespace_created(
"", // missing name in proto
&DEFAULT_NAMESPACE,
)),
want = Err(CacheMissErr { .. })
);
@ -862,12 +861,8 @@ mod tests {
namespace_created,
existing = None,
message = Event::NamespaceCreated(NamespaceCreated {
namespace_name: NAMESPACE_NAME.to_string(),
namespace_id: DEFAULT_NAMESPACE.id.get(),
partition_template: None,
max_columns_per_table: DEFAULT_NAMESPACE.max_columns_per_table as _,
max_tables: DEFAULT_NAMESPACE.max_tables as _,
retention_period_ns: DEFAULT_NAMESPACE.retention_period_ns,
..namespace_created(NAMESPACE_NAME, &DEFAULT_NAMESPACE)
}),
want = Ok(v) => {
assert_eq!(*v, DEFAULT_NAMESPACE);
@ -880,12 +875,11 @@ mod tests {
namespace_created_specified_partition_template,
existing = None,
message = Event::NamespaceCreated(NamespaceCreated {
namespace_name: NAMESPACE_NAME.to_string(), // missing in proto
namespace_id: DEFAULT_NAMESPACE.id.get(),
partition_template: Some((**PARTITION_BY_DAY_PROTO).clone()),
max_columns_per_table: DEFAULT_NAMESPACE.max_columns_per_table as _,
max_tables: DEFAULT_NAMESPACE.max_tables as _,
retention_period_ns: DEFAULT_NAMESPACE.retention_period_ns,
..namespace_created(
NAMESPACE_NAME,
&DEFAULT_NAMESPACE,
)
}),
want = Ok(v) => {
let mut want = DEFAULT_NAMESPACE.clone();
@ -899,19 +893,16 @@ mod tests {
namespace_created_existing,
existing = Some(DEFAULT_NAMESPACE),
message = Event::NamespaceCreated(NamespaceCreated {
namespace_name: NAMESPACE_NAME.to_string(), // missing in proto
namespace_id: DEFAULT_NAMESPACE.id.get(),
// The partition template is not allowed to change over the lifetime
// of the namespace.
partition_template: DEFAULT_NAMESPACE.partition_template.as_proto().cloned(),
// But these fields can change.
//
// They will be ignored, and the local values used instead.
max_columns_per_table: 123456,
max_tables: 123456,
retention_period_ns: Some(123456),
..namespace_created(NAMESPACE_NAME, &DEFAULT_NAMESPACE)
}),
want = Ok(v) => {
// Mutable values remain unmodified

View File

@ -5,12 +5,12 @@ use std::{collections::BTreeMap, fmt::Debug, sync::Arc};
use async_trait::async_trait;
use data_types::{ColumnsByName, NamespaceName, NamespaceSchema};
use generated_types::influxdata::iox::gossip::v1::{
schema_message::Event, Column, NamespaceCreated, TableCreated, TableUpdated,
schema_message::Event, Column, TableCreated, TableUpdated,
};
use crate::namespace_cache::{ChangeStats, NamespaceCache};
use super::traits::SchemaBroadcast;
use super::{namespace_created, traits::SchemaBroadcast};
/// A [`NamespaceCache`] decorator implementing cluster-wide, best-effort
/// propagation of local schema changes via the gossip subsystem.
@ -116,14 +116,7 @@ where
namespace_name: &NamespaceName<'static>,
schema: &NamespaceSchema,
) {
let msg = NamespaceCreated {
namespace_name: namespace_name.to_string(),
namespace_id: schema.id.get(),
partition_template: schema.partition_template.as_proto().cloned(),
max_columns_per_table: schema.max_columns_per_table as u64,
max_tables: schema.max_tables as u64,
retention_period_ns: schema.retention_period_ns,
};
let msg = namespace_created(namespace_name, schema);
self.tx.broadcast(Event::NamespaceCreated(msg));
}
@ -262,20 +255,8 @@ mod tests {
},
schema = DEFAULT_NAMESPACE,
want_count = 1,
want = [Event::NamespaceCreated(NamespaceCreated {
namespace_name,
namespace_id,
partition_template,
max_columns_per_table,
max_tables,
retention_period_ns
})] => {
assert_eq!(namespace_name, NAMESPACE_NAME);
assert_eq!(*namespace_id, DEFAULT_NAMESPACE.id.get());
assert_eq!(*partition_template, DEFAULT_NAMESPACE.partition_template.as_proto().cloned());
assert_eq!(*max_columns_per_table, DEFAULT_NAMESPACE.max_columns_per_table as u64);
assert_eq!(*max_tables, DEFAULT_NAMESPACE.max_tables as u64);
assert_eq!(*retention_period_ns, DEFAULT_NAMESPACE.retention_period_ns);
want = [Event::NamespaceCreated(created)] => {
assert_eq!(created, &namespace_created(NAMESPACE_NAME, &DEFAULT_NAMESPACE));
}
);
@ -306,28 +287,13 @@ mod tests {
},
schema = DEFAULT_NAMESPACE,
want_count = 1,
want = [Event::NamespaceCreated(NamespaceCreated {
namespace_name,
namespace_id,
partition_template,
max_columns_per_table,
max_tables,
retention_period_ns
}),
want = [Event::NamespaceCreated(created),
Event::TableCreated(TableCreated { table, partition_template: table_template })] => {
// Validate the namespace create message
assert_eq!(namespace_name, NAMESPACE_NAME);
assert_eq!(*namespace_id, DEFAULT_NAMESPACE.id.get());
assert_eq!(*partition_template, DEFAULT_NAMESPACE.partition_template.as_proto().cloned());
assert_eq!(*max_columns_per_table, DEFAULT_NAMESPACE.max_columns_per_table as u64);
assert_eq!(*max_tables, DEFAULT_NAMESPACE.max_tables as u64);
assert_eq!(*retention_period_ns, DEFAULT_NAMESPACE.retention_period_ns);
assert_eq!(created, &namespace_created(NAMESPACE_NAME, &DEFAULT_NAMESPACE));
// Validate the table message
let meta = table.as_ref().expect("must have metadata");
assert_eq!(meta.table_name, TABLE_NAME);
assert_eq!(meta.namespace_name, NAMESPACE_NAME);
assert_eq!(meta.table_id, TABLE_ID);