Skip to content

Commit 9387c06

Browse files
authored
Merge pull request #167 from muzarski/self-identity
config: set self-identity
2 parents b279526 + e9e3cd4 commit 9387c06

File tree

2 files changed

+103
-1
lines changed

2 files changed

+103
-1
lines changed

scylla-rust-wrapper/src/cluster.rs

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::retry_policy::CassRetryPolicy;
77
use crate::retry_policy::RetryPolicy::*;
88
use crate::ssl::CassSsl;
99
use crate::types::*;
10+
use crate::uuid::CassUuid;
1011
use openssl::ssl::SslContextBuilder;
1112
use openssl_sys::SSL_CTX_up_ref;
1213
use scylla::execution_profile::ExecutionProfileBuilder;
@@ -16,6 +17,7 @@ use scylla::load_balancing::{DefaultPolicyBuilder, LoadBalancingPolicy};
1617
use scylla::retry_policy::RetryPolicy;
1718
use scylla::speculative_execution::SimpleSpeculativeExecutionPolicy;
1819
use scylla::statement::{Consistency, SerialConsistency};
20+
use scylla::transport::SelfIdentity;
1921
use scylla::{SessionBuilder, SessionConfig};
2022
use std::collections::HashMap;
2123
use std::convert::TryInto;
@@ -32,6 +34,9 @@ include!(concat!(env!("OUT_DIR"), "/cppdriver_compression_types.rs"));
3234
const DEFAULT_CONSISTENCY: Consistency = Consistency::LocalOne;
3335
const DEFAULT_REQUEST_TIMEOUT_MILLIS: u64 = 12000;
3436

37+
const DRIVER_NAME: &str = "ScyllaDB Cpp-Rust Driver";
38+
const DRIVER_VERSION: &str = env!("CARGO_PKG_VERSION");
39+
3540
#[derive(Clone, Debug)]
3641
pub(crate) struct LoadBalancingConfig {
3742
pub(crate) token_awareness_enabled: bool,
@@ -85,6 +90,8 @@ pub struct CassCluster {
8590
use_beta_protocol_version: bool,
8691
auth_username: Option<String>,
8792
auth_password: Option<String>,
93+
94+
client_id: Option<uuid::Uuid>,
8895
}
8996

9097
impl CassCluster {
@@ -106,6 +113,11 @@ impl CassCluster {
106113
pub(crate) fn get_contact_points(&self) -> &[String] {
107114
&self.contact_points
108115
}
116+
117+
#[inline]
118+
pub(crate) fn get_client_id(&self) -> Option<uuid::Uuid> {
119+
self.client_id
120+
}
109121
}
110122

111123
pub struct CassCustomPayload;
@@ -140,8 +152,13 @@ pub unsafe extern "C" fn cass_cluster_new() -> *mut CassCluster {
140152
.consistency(DEFAULT_CONSISTENCY)
141153
.request_timeout(Some(Duration::from_millis(DEFAULT_REQUEST_TIMEOUT_MILLIS)));
142154

155+
// Set DRIVER_NAME and DRIVER_VERSION of cpp-rust driver.
156+
let custom_identity = SelfIdentity::new()
157+
.with_custom_driver_name(DRIVER_NAME)
158+
.with_custom_driver_version(DRIVER_VERSION);
159+
143160
Box::into_raw(Box::new(CassCluster {
144-
session_builder: SessionBuilder::new(),
161+
session_builder: SessionBuilder::new().custom_identity(custom_identity),
145162
port: 9042,
146163
contact_points: Vec::new(),
147164
// Per DataStax documentation: Without additional configuration the C/C++ driver
@@ -152,6 +169,7 @@ pub unsafe extern "C" fn cass_cluster_new() -> *mut CassCluster {
152169
default_execution_profile_builder,
153170
execution_profile_map: Default::default(),
154171
load_balancing_config: Default::default(),
172+
client_id: None,
155173
}))
156174
}
157175

@@ -219,6 +237,74 @@ pub unsafe extern "C" fn cass_cluster_set_use_randomized_contact_points(
219237
CassError::CASS_OK
220238
}
221239

240+
#[no_mangle]
241+
pub unsafe extern "C" fn cass_cluster_set_application_name(
242+
cluster_raw: *mut CassCluster,
243+
app_name: *const c_char,
244+
) {
245+
cass_cluster_set_application_name_n(cluster_raw, app_name, strlen(app_name))
246+
}
247+
248+
#[no_mangle]
249+
pub unsafe extern "C" fn cass_cluster_set_application_name_n(
250+
cluster_raw: *mut CassCluster,
251+
app_name: *const c_char,
252+
app_name_len: size_t,
253+
) {
254+
let cluster = ptr_to_ref_mut(cluster_raw);
255+
let app_name = ptr_to_cstr_n(app_name, app_name_len).unwrap().to_string();
256+
257+
cluster
258+
.session_builder
259+
.config
260+
.identity
261+
.set_application_name(app_name)
262+
}
263+
264+
#[no_mangle]
265+
pub unsafe extern "C" fn cass_cluster_set_application_version(
266+
cluster_raw: *mut CassCluster,
267+
app_version: *const c_char,
268+
) {
269+
cass_cluster_set_application_version_n(cluster_raw, app_version, strlen(app_version))
270+
}
271+
272+
#[no_mangle]
273+
pub unsafe extern "C" fn cass_cluster_set_application_version_n(
274+
cluster_raw: *mut CassCluster,
275+
app_version: *const c_char,
276+
app_version_len: size_t,
277+
) {
278+
let cluster = ptr_to_ref_mut(cluster_raw);
279+
let app_version = ptr_to_cstr_n(app_version, app_version_len)
280+
.unwrap()
281+
.to_string();
282+
283+
cluster
284+
.session_builder
285+
.config
286+
.identity
287+
.set_application_version(app_version);
288+
}
289+
290+
#[no_mangle]
291+
pub unsafe extern "C" fn cass_cluster_set_client_id(
292+
cluster_raw: *mut CassCluster,
293+
client_id: CassUuid,
294+
) {
295+
let cluster = ptr_to_ref_mut(cluster_raw);
296+
297+
let client_uuid: uuid::Uuid = client_id.into();
298+
let client_uuid_str = client_uuid.to_string();
299+
300+
cluster.client_id = Some(client_uuid);
301+
cluster
302+
.session_builder
303+
.config
304+
.identity
305+
.set_client_id(client_uuid_str)
306+
}
307+
222308
#[no_mangle]
223309
pub unsafe extern "C" fn cass_cluster_set_use_schema(
224310
cluster_raw: *mut CassCluster,

scylla-rust-wrapper/src/session.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use crate::query_result::{CassResult, CassResultData, CassRow, CassValue, Collec
1313
use crate::statement::CassStatement;
1414
use crate::statement::Statement;
1515
use crate::types::{cass_uint64_t, size_t};
16+
use crate::uuid::CassUuid;
1617
use scylla::frame::response::result::{CqlValue, Row};
1718
use scylla::frame::types::Consistency;
1819
use scylla::query::Query;
@@ -31,6 +32,7 @@ use tokio::sync::RwLock;
3132
pub struct CassSessionInner {
3233
session: Session,
3334
exec_profile_map: HashMap<ExecProfileName, ExecutionProfileHandle>,
35+
client_id: uuid::Uuid,
3436
}
3537

3638
impl CassSessionInner {
@@ -82,6 +84,10 @@ impl CassSessionInner {
8284
session_opt,
8385
session_builder,
8486
exec_profile_map,
87+
cluster
88+
.get_client_id()
89+
// If user did not set a client id, generate a random uuid v4.
90+
.unwrap_or_else(uuid::Uuid::new_v4),
8591
keyspace,
8692
))
8793
}
@@ -90,6 +96,7 @@ impl CassSessionInner {
9096
session_opt: &RwLock<Option<CassSessionInner>>,
9197
session_builder_fut: impl Future<Output = SessionBuilder>,
9298
exec_profile_builder_map: HashMap<ExecProfileName, CassExecProfile>,
99+
client_id: uuid::Uuid,
93100
keyspace: Option<String>,
94101
) -> CassFutureResult {
95102
// This can sleep for a long time, but only if someone connects/closes session
@@ -119,6 +126,7 @@ impl CassSessionInner {
119126
*session_guard = Some(CassSessionInner {
120127
session,
121128
exec_profile_map,
129+
client_id,
122130
});
123131
Ok(CassResultValue::Empty)
124132
}
@@ -562,6 +570,14 @@ pub unsafe extern "C" fn cass_session_close(session: *mut CassSession) -> *const
562570
})
563571
}
564572

573+
#[no_mangle]
574+
pub unsafe extern "C" fn cass_session_get_client_id(session: *const CassSession) -> CassUuid {
575+
let cass_session = ptr_to_ref(session);
576+
577+
let client_id: uuid::Uuid = cass_session.blocking_read().as_ref().unwrap().client_id;
578+
client_id.into()
579+
}
580+
565581
#[no_mangle]
566582
pub unsafe extern "C" fn cass_session_get_schema_meta(
567583
session: *const CassSession,

0 commit comments

Comments
 (0)