Skip to content

Commit 94b6d16

Browse files
authored
Merge pull request #193 from muzarski/heartbeat
cluster: keepalive config options
2 parents b23b531 + 99f6e44 commit 94b6d16

File tree

2 files changed

+53
-18
lines changed

2 files changed

+53
-18
lines changed

scylla-rust-wrapper/src/cluster.rs

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,21 @@ use std::time::Duration;
2828

2929
use crate::cass_compression_types::CassCompressionType;
3030

31-
// According to `cassandra.h` the default CPP driver's
31+
// According to `cassandra.h` the defaults for
3232
// - consistency for statements is LOCAL_ONE,
33-
// - request client timeout is 12000 millis.
3433
const DEFAULT_CONSISTENCY: Consistency = Consistency::LocalOne;
35-
const DEFAULT_REQUEST_TIMEOUT_MILLIS: u64 = 12000;
34+
// - request client timeout is 12000 millis,
35+
const DEFAULT_REQUEST_TIMEOUT: Duration = Duration::from_millis(12000);
36+
// - fetching schema metadata is true
37+
const DEFAULT_DO_FETCH_SCHEMA_METADATA: bool = true;
38+
// - setting TCP_NODELAY is true
39+
const DEFAULT_SET_TCP_NO_DELAY: bool = true;
40+
// - connect timeout is 5000 millis
41+
const DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_millis(5000);
42+
// - keepalive interval is 30 secs
43+
const DEFAULT_KEEPALIVE_INTERVAL: Duration = Duration::from_secs(30);
44+
// - keepalive timeout is 60 secs
45+
const DEFAULT_KEEPALIVE_TIMEOUT: Duration = Duration::from_secs(60);
3646

3747
const DRIVER_NAME: &str = "ScyllaDB Cpp-Rust Driver";
3848
const DRIVER_VERSION: &str = env!("CARGO_PKG_VERSION");
@@ -157,15 +167,26 @@ pub fn build_session_builder(
157167
pub unsafe extern "C" fn cass_cluster_new() -> *mut CassCluster {
158168
let default_execution_profile_builder = ExecutionProfileBuilder::default()
159169
.consistency(DEFAULT_CONSISTENCY)
160-
.request_timeout(Some(Duration::from_millis(DEFAULT_REQUEST_TIMEOUT_MILLIS)));
161-
162-
// Set DRIVER_NAME and DRIVER_VERSION of cpp-rust driver.
163-
let custom_identity = SelfIdentity::new()
164-
.with_custom_driver_name(DRIVER_NAME)
165-
.with_custom_driver_version(DRIVER_VERSION);
170+
.request_timeout(Some(DEFAULT_REQUEST_TIMEOUT));
171+
172+
// Default config options - according to cassandra.h
173+
let default_session_builder = {
174+
// Set DRIVER_NAME and DRIVER_VERSION of cpp-rust driver.
175+
let custom_identity = SelfIdentity::new()
176+
.with_custom_driver_name(DRIVER_NAME)
177+
.with_custom_driver_version(DRIVER_VERSION);
178+
179+
SessionBuilder::new()
180+
.custom_identity(custom_identity)
181+
.fetch_schema_metadata(DEFAULT_DO_FETCH_SCHEMA_METADATA)
182+
.tcp_nodelay(DEFAULT_SET_TCP_NO_DELAY)
183+
.connection_timeout(DEFAULT_CONNECT_TIMEOUT)
184+
.keepalive_interval(DEFAULT_KEEPALIVE_INTERVAL)
185+
.keepalive_timeout(DEFAULT_KEEPALIVE_TIMEOUT)
186+
};
166187

167188
Box::into_raw(Box::new(CassCluster {
168-
session_builder: SessionBuilder::new().custom_identity(custom_identity),
189+
session_builder: default_session_builder,
169190
port: 9042,
170191
contact_points: Vec::new(),
171192
// Per DataStax documentation: Without additional configuration the C/C++ driver
@@ -343,6 +364,28 @@ pub unsafe extern "C" fn cass_cluster_set_tcp_keepalive(
343364
cluster.session_builder.config.tcp_keepalive_interval = tcp_keepalive_interval;
344365
}
345366

367+
#[no_mangle]
368+
pub unsafe extern "C" fn cass_cluster_set_connection_heartbeat_interval(
369+
cluster_raw: *mut CassCluster,
370+
interval_secs: c_uint,
371+
) {
372+
let cluster = ptr_to_ref_mut(cluster_raw);
373+
let keepalive_interval = (interval_secs > 0).then(|| Duration::from_secs(interval_secs as u64));
374+
375+
cluster.session_builder.config.keepalive_interval = keepalive_interval;
376+
}
377+
378+
#[no_mangle]
379+
pub unsafe extern "C" fn cass_cluster_set_connection_idle_timeout(
380+
cluster_raw: *mut CassCluster,
381+
timeout_secs: c_uint,
382+
) {
383+
let cluster = ptr_to_ref_mut(cluster_raw);
384+
let keepalive_timeout = (timeout_secs > 0).then(|| Duration::from_secs(timeout_secs as u64));
385+
386+
cluster.session_builder.config.keepalive_timeout = keepalive_timeout;
387+
}
388+
346389
#[no_mangle]
347390
pub unsafe extern "C" fn cass_cluster_set_connect_timeout(
348391
cluster_raw: *mut CassCluster,

src/testing_unimplemented.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,6 @@ CASS_EXPORT CassError cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib
6262
throw std::runtime_error(
6363
"UNIMPLEMENTED cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init\n");
6464
}
65-
CASS_EXPORT void cass_cluster_set_connection_heartbeat_interval(CassCluster* cluster,
66-
unsigned interval_secs) {
67-
throw std::runtime_error("UNIMPLEMENTED cass_cluster_set_connection_heartbeat_interval\n");
68-
}
69-
CASS_EXPORT void cass_cluster_set_connection_idle_timeout(CassCluster* cluster,
70-
unsigned timeout_secs) {
71-
throw std::runtime_error("UNIMPLEMENTED cass_cluster_set_connection_idle_timeout\n");
72-
}
7365
CASS_EXPORT void cass_cluster_set_constant_reconnect(CassCluster* cluster, cass_uint64_t delay_ms) {
7466
throw std::runtime_error("UNIMPLEMENTED cass_cluster_set_constant_reconnect\n");
7567
}

0 commit comments

Comments
 (0)