Skip to content

Commit f3aae01

Browse files
committed
topology: reduce query_filter_keyspace_name monomorphisation penalty
`query_filter_keyspace_name` is monomorphised into 5 different functions, with considerably large body each. To reduce code bloat (and potentially have better caching by calling the same code, not distinct), the large common part is degenericised and extracted.
1 parent 6d9d971 commit f3aae01

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

scylla/src/transport/topology.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::transport::connection::{Connection, ConnectionConfig};
55
use crate::transport::connection_pool::{NodeConnectionPool, PoolConfig, PoolSize};
66
use crate::transport::errors::{DbError, NewSessionError, QueryError};
77
use crate::transport::host_filter::HostFilter;
8+
use crate::transport::iterator::QueryPager;
89
use crate::transport::node::resolve_contact_points;
910
use crate::utils::parse::{ParseErrorCause, ParseResult, ParserState};
1011

@@ -933,8 +934,15 @@ where
933934
{
934935
let conn = conn.clone();
935936

936-
let fut = async move {
937-
let pager = if keyspaces_to_fetch.is_empty() {
937+
// This function is extracted to reduce monomorphisation penalty:
938+
// query_filter_keyspace_name() is going to be monomorphised into 5 distinct functions,
939+
// so it's better to extract the common part.
940+
async fn make_keyspace_filtered_query_pager(
941+
conn: Arc<Connection>,
942+
query_str: &str,
943+
keyspaces_to_fetch: &[String],
944+
) -> Result<QueryPager, QueryError> {
945+
if keyspaces_to_fetch.is_empty() {
938946
let mut query = Query::new(query_str);
939947
query.set_page_size(METADATA_QUERY_PAGE_SIZE);
940948

@@ -949,8 +957,11 @@ where
949957
let prepared = conn.prepare(&query).await?;
950958
let serialized_values = prepared.serialize_values(&keyspaces)?;
951959
conn.execute_iter(prepared, serialized_values).await
952-
}?;
960+
}
961+
}
953962

963+
let fut = async move {
964+
let pager = make_keyspace_filtered_query_pager(conn, query_str, keyspaces_to_fetch).await?;
954965
let stream: super::iterator::TypedRowStream<R> =
955966
pager.rows_stream::<R>().map_err(convert_typecheck_error)?;
956967
Ok::<_, QueryError>(stream)

0 commit comments

Comments
 (0)