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};