From 59a11f63b13ea226e15385e4f46f14f7febca1ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Przytu=C5=82a?= Date: Tue, 29 Jul 2025 10:40:22 +0200 Subject: [PATCH] implement API to specify metadata request timeout This commit adds a new API function to the driver: `cass_cluster_set_metadata_request_serverside_timeout`. This function allows users to set a server-side timeout for metadata queries, which is particularly useful for large schemas where the default timeout may be too tight. The default timeout is set to 2 seconds (as in Rust Driver), and users can pass 0 to use the cluster's default timeout. This simply exposes the existing Rust Driver's API. Fixes: #172 --- include/cassandra.h | 21 +++++++++++++++++++++ scylla-rust-wrapper/src/api.rs | 3 ++- scylla-rust-wrapper/src/cluster.rs | 20 ++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/include/cassandra.h b/include/cassandra.h index 8b503bdb..faa0e390 100644 --- a/include/cassandra.h +++ b/include/cassandra.h @@ -3124,6 +3124,27 @@ CASS_EXPORT void cass_cluster_set_compression(CassCluster* cluster, CassCompressionType compression_type); +/** + * Sets the server-side timeout for metadata queries. + * + * It means that all metadata queries will be set the given timeout + * no matter what timeout is set as a cluster default. + * This prevents timeouts of schema queries when the schema is large + * and the default timeout is configured as tight. + * + * Default: 2 seconds. + * + * @public @memberof CassCluster + * + * @param[in] cluster + * @param[in] timeout_ms Request timeout in milliseconds. Pass 0 to use cluster default timeout. + */ +CASS_EXPORT void +cass_cluster_set_metadata_request_serverside_timeout(CassCluster* cluster, + cass_duration_t timeout_ms); + + + /*********************************************************************************** * * Session diff --git a/scylla-rust-wrapper/src/api.rs b/scylla-rust-wrapper/src/api.rs index 17bd9b3d..220e4d3e 100644 --- a/scylla-rust-wrapper/src/api.rs +++ b/scylla-rust-wrapper/src/api.rs @@ -98,8 +98,9 @@ pub mod cluster { // cass_cluster_set_max_connections_per_host, UNIMPLEMENTED // cass_cluster_set_max_requests_per_flush, UNIMPLEMENTED // cass_cluster_set_max_reusable_write_objects, UNIMPLEMENTED - // cass_cluster_set_monitor_reporting_interval, UNIMPLEMENTED cass_cluster_set_max_schema_wait_time, + cass_cluster_set_metadata_request_serverside_timeout, + // cass_cluster_set_monitor_reporting_interval, UNIMPLEMENTED // cass_cluster_set_new_request_ratio, UNIMPLEMENTED // cass_cluster_set_no_compact, UNIMPLEMENTED cass_cluster_set_no_speculative_execution_policy, diff --git a/scylla-rust-wrapper/src/cluster.rs b/scylla-rust-wrapper/src/cluster.rs index 6cf6e7a6..6815d7f2 100644 --- a/scylla-rust-wrapper/src/cluster.rs +++ b/scylla-rust-wrapper/src/cluster.rs @@ -1570,6 +1570,26 @@ pub unsafe extern "C" fn cass_cluster_set_num_threads_io( CassError::CASS_OK } +#[unsafe(no_mangle)] +pub unsafe extern "C" fn cass_cluster_set_metadata_request_serverside_timeout( + cluster: CassBorrowedExclusivePtr, + timeout_ms: cass_duration_t, +) { + let Some(cluster_from_raw) = BoxFFI::as_mut_ref(cluster) else { + tracing::error!( + "Provided null cluster pointer to cass_cluster_set_metadata_request_serverside_timeout!" + ); + return; + }; + + let metadata_request_timeout = (timeout_ms > 0).then(|| Duration::from_millis(timeout_ms)); + + cluster_from_raw + .session_builder + .config + .metadata_request_serverside_timeout = metadata_request_timeout; +} + #[cfg(test)] mod tests { use crate::testing::{assert_cass_error_eq, setup_tracing};