Skip to content

Commit 89b5af9

Browse files
authored
Merge pull request #1266 from muzarski/cluster-state-keyspace-getters
state: Adjust ClusterState keyspace info getters
2 parents 2935f48 + b8be1bf commit 89b5af9

File tree

5 files changed

+43
-37
lines changed

5 files changed

+43
-37
lines changed

docs/source/schema/schema.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ async fn main() -> Result<(), Box<dyn Error>> {
5656
session.refresh_metadata().await?;
5757

5858
let cluster_state = &session.get_cluster_state();
59-
let keyspaces = &cluster_state.get_keyspace_info();
59+
let keyspaces_iter = cluster_state.keyspaces_iter();
6060

61-
for (keyspace_name, keyspace_info) in keyspaces.iter() {
61+
for (keyspace_name, keyspace_info) in keyspaces_iter {
6262
println!("Keyspace {}:", keyspace_name);
6363
println!("\tTables: {:#?}", keyspace_info.tables);
6464
println!("\tViews: {:#?}", keyspace_info.views);

scylla/src/client/session_test.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1632,7 +1632,7 @@ async fn test_schema_types_in_metadata() {
16321632
session.refresh_metadata().await.unwrap();
16331633

16341634
let cluster_state = session.get_cluster_state();
1635-
let tables = &cluster_state.get_keyspace_info()[&ks].tables;
1635+
let tables = &cluster_state.get_keyspace(&ks).unwrap().tables;
16361636

16371637
assert_eq!(
16381638
tables.keys().sorted().collect::<Vec<_>>(),
@@ -1762,7 +1762,7 @@ async fn test_user_defined_types_in_metadata() {
17621762
session.refresh_metadata().await.unwrap();
17631763

17641764
let cluster_state = session.get_cluster_state();
1765-
let user_defined_types = &cluster_state.get_keyspace_info()[&ks].user_defined_types;
1765+
let user_defined_types = &cluster_state.get_keyspace(&ks).unwrap().user_defined_types;
17661766

17671767
assert_eq!(
17681768
user_defined_types.keys().sorted().collect::<Vec<_>>(),
@@ -1817,7 +1817,7 @@ async fn test_column_kinds_in_metadata() {
18171817
session.refresh_metadata().await.unwrap();
18181818

18191819
let cluster_state = session.get_cluster_state();
1820-
let columns = &cluster_state.get_keyspace_info()[&ks].tables["t"].columns;
1820+
let columns = &cluster_state.get_keyspace(&ks).unwrap().tables["t"].columns;
18211821

18221822
assert_eq!(columns["a"].kind, ColumnKind::Clustering);
18231823
assert_eq!(columns["b"].kind, ColumnKind::Clustering);
@@ -1865,7 +1865,7 @@ async fn test_primary_key_ordering_in_metadata() {
18651865
session.refresh_metadata().await.unwrap();
18661866

18671867
let cluster_state = session.get_cluster_state();
1868-
let table = &cluster_state.get_keyspace_info()[&ks].tables["t"];
1868+
let table = &cluster_state.get_keyspace(&ks).unwrap().tables["t"];
18691869

18701870
assert_eq!(table.partition_key, vec!["c", "e"]);
18711871
assert_eq!(table.clustering_key, vec!["b", "a"]);
@@ -1907,7 +1907,7 @@ async fn test_table_partitioner_in_metadata() {
19071907
session.refresh_metadata().await.unwrap();
19081908

19091909
let cluster_state = session.get_cluster_state();
1910-
let tables = &cluster_state.get_keyspace_info()[&ks].tables;
1910+
let tables = &cluster_state.get_keyspace(&ks).unwrap().tables;
19111911
let table = &tables["t"];
19121912
let cdc_table = &tables["t_scylla_cdc_log"];
19131913

@@ -1973,7 +1973,7 @@ async fn test_turning_off_schema_fetching() {
19731973

19741974
session.refresh_metadata().await.unwrap();
19751975
let cluster_state = &session.get_cluster_state();
1976-
let keyspace = &cluster_state.get_keyspace_info()[&ks];
1976+
let keyspace = cluster_state.get_keyspace(&ks).unwrap();
19771977

19781978
let datacenter_repfactors: HashMap<String, usize> = cluster_state
19791979
.replica_locator()
@@ -2398,8 +2398,7 @@ async fn test_views_in_schema_info() {
23982398

23992399
let keyspace_meta = session
24002400
.get_cluster_state()
2401-
.get_keyspace_info()
2402-
.get(&ks)
2401+
.get_keyspace(&ks)
24032402
.unwrap()
24042403
.clone();
24052404

@@ -2558,8 +2557,7 @@ async fn test_refresh_metadata_after_schema_agreement() {
25582557
.unwrap();
25592558

25602559
let cluster_state = session.get_cluster_state();
2561-
let metadata = cluster_state.get_keyspace_info();
2562-
let keyspace_metadata = metadata.get(ks.as_str());
2560+
let keyspace_metadata = cluster_state.get_keyspace(ks.as_str());
25632561
assert_ne!(keyspace_metadata, None);
25642562

25652563
let udt = keyspace_metadata.unwrap().user_defined_types.get("udt");

scylla/src/cluster/state.rs

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -110,24 +110,30 @@ impl ClusterState {
110110
}
111111

112112
let keyspaces: HashMap<String, Keyspace> = metadata
113-
.keyspaces
114-
.into_iter()
115-
.filter_map(|(ks_name, ks)| match ks {
116-
Ok(ks) => Some((ks_name, ks)),
117-
Err(e) => {
118-
if let Some(old_ks) = old_keyspaces.get(&ks_name) {
119-
warn!("Encountered an error while processing metadata of keyspace \"{ks_name}\": {e}.\
120-
Re-using older version of this keyspace metadata");
121-
Some((ks_name, old_ks.clone()))
122-
} else {
123-
warn!("Encountered an error while processing metadata of keyspace \"{ks_name}\": {e}.\
124-
No previous version of this keyspace metadata found, so it will not be\
125-
present in ClusterData until next refresh.");
126-
None
113+
.keyspaces
114+
.into_iter()
115+
.filter_map(|(ks_name, ks)| match ks {
116+
Ok(ks) => Some((ks_name, ks)),
117+
Err(e) => {
118+
if let Some(old_ks) = old_keyspaces.get(&ks_name) {
119+
warn!(
120+
"Encountered an error while processing\
121+
metadata of keyspace \"{ks_name}\": {e}.\
122+
Re-using older version of this keyspace metadata"
123+
);
124+
Some((ks_name, old_ks.clone()))
125+
} else {
126+
warn!(
127+
"Encountered an error while processing metadata\
128+
of keyspace \"{ks_name}\": {e}.\
129+
No previous version of this keyspace metadata found, so it will not be\
130+
present in ClusterData until next refresh."
131+
);
132+
None
133+
}
127134
}
128-
}
129-
})
130-
.collect();
135+
})
136+
.collect();
131137

132138
{
133139
let removed_nodes = {
@@ -185,11 +191,14 @@ impl ClusterState {
185191
}
186192
}
187193

188-
/// Access keyspaces details collected by the driver
189-
/// Driver collects various schema details like tables, partitioners, columns, types.
190-
/// They can be read using this method
191-
pub fn get_keyspace_info(&self) -> &HashMap<String, Keyspace> {
192-
&self.keyspaces
194+
/// Access keyspace details collected by the driver.
195+
pub fn get_keyspace(&self, keyspace: impl AsRef<str>) -> Option<&Keyspace> {
196+
self.keyspaces.get(keyspace.as_ref())
197+
}
198+
199+
/// Returns an iterator over keyspaces.
200+
pub fn keyspaces_iter(&self) -> impl Iterator<Item = (&str, &Keyspace)> {
201+
self.keyspaces.iter().map(|(k, v)| (k.as_str(), v))
193202
}
194203

195204
/// Access details about nodes known to the driver

scylla/src/policies/load_balancing/default.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,7 @@ impl<'a> TokenWithStrategy<'a> {
11521152
fn new(query: &'a RoutingInfo, cluster: &'a ClusterState) -> Option<TokenWithStrategy<'a>> {
11531153
let token = query.token?;
11541154
let keyspace_name = query.table?.ks_name();
1155-
let keyspace = cluster.get_keyspace_info().get(keyspace_name)?;
1155+
let keyspace = cluster.get_keyspace(keyspace_name)?;
11561156
let strategy = &keyspace.strategy;
11571157
Some(TokenWithStrategy { strategy, token })
11581158
}

scylla/tests/integration/utils.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,7 @@ pub(crate) async fn supports_feature(session: &Session, feature: &str) -> bool {
101101

102102
let meta = session.get_cluster_state();
103103
let system_local = meta
104-
.get_keyspace_info()
105-
.get("system")
104+
.get_keyspace("system")
106105
.unwrap()
107106
.tables
108107
.get("local")

0 commit comments

Comments
 (0)