Module scylla::transport::execution_profile
source · Expand description
ExecutionProfile
is a grouping of configurable options regarding query execution.
Profiles can be created to represent different workloads, which thanks to them can be run conveniently on a single session.
There are two classes of objects related to execution profiles: ExecutionProfile
and ExecutionProfileHandle
.
The former is simply an immutable set of the settings. The latter is a handle that at particular moment points
to some ExecutionProfile
(but during its lifetime, it can change the profile it points at).
Handles are assigned to Sessions
and Statements
.
At any moment, handles point to another ExecutionProfile
. This allows convenient switching between workloads
for all Sessions
and/or Statements
that, for instance, share common characteristics.
§Example
To create an ExecutionProfile
and attach it as default for Session
:
use scylla::{Session, SessionBuilder};
use scylla::statement::Consistency;
use scylla::transport::ExecutionProfile;
let profile = ExecutionProfile::builder()
.consistency(Consistency::LocalOne)
.request_timeout(None) // no request timeout
.build();
let handle = profile.into_handle();
let session: Session = SessionBuilder::new()
.known_node("127.0.0.1:9042")
.default_execution_profile_handle(handle)
.build()
.await?;
§Example
To create an ExecutionProfile
and attach it to a Query
:
use scylla::query::Query;
use scylla::statement::Consistency;
use scylla::transport::ExecutionProfile;
use std::time::Duration;
let profile = ExecutionProfile::builder()
.consistency(Consistency::All)
.request_timeout(Some(Duration::from_secs(30)))
.build();
let handle = profile.into_handle();
let mut query1 = Query::from("SELECT * FROM ks.table");
query1.set_execution_profile_handle(Some(handle.clone()));
let mut query2 = Query::from("SELECT pk FROM ks.table WHERE pk = ?");
query2.set_execution_profile_handle(Some(handle));
§Example
To create an ExecutionProfile
with config options defaulting
to those set on another profile:
use scylla::statement::Consistency;
use scylla::transport::ExecutionProfile;
use std::time::Duration;
let base_profile = ExecutionProfile::builder()
.request_timeout(Some(Duration::from_secs(30)))
.build();
let profile = base_profile.to_builder()
.consistency(Consistency::All)
.build();
ExecutionProfileHandle
s can be remapped to another ExecutionProfile
, and the change affects all sessions and statements that have been assigned that handle. This enables quick workload switches.
Example mapping:
- session1 -> handle1 -> profile1
- statement1 -> handle1 -> profile1
- statement2 -> handle2 -> profile2
We can now remap handle2 to profile1, so that the mapping for statement2 becomes as follows:
- statement2 -> handle2 -> profile1
We can also change statement1’s handle to handle2, and remap handle1 to profile2, yielding:
- session1 -> handle1 -> profile2
- statement1 -> handle2 -> profile1
- statement2 -> handle2 -> profile1
As you can see, profiles are a powerful and convenient way to define and modify your workloads.
§Example
Below, the remaps described above are followed in code.
use scylla::{Session, SessionBuilder};
use scylla::query::Query;
use scylla::statement::Consistency;
use scylla::transport::ExecutionProfile;
let profile1 = ExecutionProfile::builder()
.consistency(Consistency::One)
.build();
let profile2 = ExecutionProfile::builder()
.consistency(Consistency::Two)
.build();
let mut handle1 = profile1.clone().into_handle();
let mut handle2 = profile2.clone().into_handle();
let session: Session = SessionBuilder::new()
.known_node("127.0.0.1:9042")
.default_execution_profile_handle(handle1.clone())
.build()
.await?;
let mut query1 = Query::from("SELECT * FROM ks.table");
let mut query2 = Query::from("SELECT pk FROM ks.table WHERE pk = ?");
query1.set_execution_profile_handle(Some(handle1.clone()));
query2.set_execution_profile_handle(Some(handle2.clone()));
// session1 -> handle1 -> profile1
// query1 -> handle1 -> profile1
// query2 -> handle2 -> profile2
// We can now remap handle2 to profile1:
handle2.map_to_another_profile(profile1);
// ...so that the mapping for query2 becomes as follows:
// query2 -> handle2 -> profile1
// We can also change query1's handle to handle2:
query1.set_execution_profile_handle(Some(handle2.clone()));
// ...and remap handle1 to profile2:
handle1.map_to_another_profile(profile2);
// ...yielding:
// session1 -> handle1 -> profile2
// query1 -> handle2 -> profile1
// query2 -> handle2 -> profile1
Structs§
- A profile that groups configurable options regarding query execution.
ExecutionProfileBuilder
is used to create newExecutionProfile
s- A handle that points to an ExecutionProfile.