Skip to content

Commit 4402539

Browse files
committed
ScyllaDB optimizations
1 parent 84db085 commit 4402539

File tree

1 file changed

+23
-22
lines changed

1 file changed

+23
-22
lines changed

linera-views/src/backends/scylla_db.rs

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ use futures::{future::join_all, FutureExt as _, StreamExt};
1919
use linera_base::ensure;
2020
use scylla::{
2121
batch::BatchStatement,
22+
load_balancing::DefaultPolicy,
2223
prepared_statement::PreparedStatement,
23-
statement::batch::BatchType,
24+
statement::{batch::BatchType, Consistency},
2425
transport::errors::{DbError, QueryError},
25-
Session, SessionBuilder,
26+
ExecutionProfile, Session, SessionBuilder,
2627
};
2728
use serde::{Deserialize, Serialize};
2829
use thiserror::Error;
@@ -54,8 +55,8 @@ const MAX_MULTI_KEYS: usize = 99;
5455
/// So, we set up the maximal size of 16 MB - 10 KB for the values and 10 KB for the keys
5556
/// We also arbitrarily decrease the size by 4000 bytes because an amount of size is
5657
/// taken internally by the database.
57-
const RAW_MAX_VALUE_SIZE: usize = 16762976;
58-
const MAX_KEY_SIZE: usize = 10240;
58+
const RAW_MAX_VALUE_SIZE: usize = 16 * 1024 * 1024;
59+
const MAX_KEY_SIZE: usize = 10 * 1024;
5960
const MAX_BATCH_TOTAL_SIZE: usize = RAW_MAX_VALUE_SIZE + MAX_KEY_SIZE;
6061

6162
/// The `RAW_MAX_VALUE_SIZE` is the maximum size on the ScyllaDB storage.
@@ -132,13 +133,13 @@ impl ScyllaDbClient {
132133
async fn new(session: Session, namespace: &str) -> Result<Self, ScyllaDbStoreInternalError> {
133134
let namespace = namespace.to_string();
134135
let query = format!(
135-
"SELECT v FROM kv.{} WHERE root_key = ? AND k = ? ALLOW FILTERING",
136+
"SELECT v FROM kv.{} WHERE root_key = ? AND k = ?",
136137
namespace
137138
);
138139
let read_value = session.prepare(query).await?;
139140

140141
let query = format!(
141-
"SELECT root_key FROM kv.{} WHERE root_key = ? AND k = ? ALLOW FILTERING",
142+
"SELECT root_key FROM kv.{} WHERE root_key = ? AND k = ?",
142143
namespace
143144
);
144145
let contains_key = session.prepare(query).await?;
@@ -159,23 +160,23 @@ impl ScyllaDbClient {
159160
let write_batch_insertion = session.prepare(query).await?.into();
160161

161162
let query = format!(
162-
"SELECT k FROM kv.{} WHERE root_key = ? AND k >= ? ALLOW FILTERING",
163+
"SELECT k FROM kv.{} WHERE root_key = ? AND k >= ?",
163164
namespace
164165
);
165166
let find_keys_by_prefix_unbounded = session.prepare(query).await?;
166167
let query = format!(
167-
"SELECT k FROM kv.{} WHERE root_key = ? AND k >= ? AND k < ? ALLOW FILTERING",
168+
"SELECT k FROM kv.{} WHERE root_key = ? AND k >= ? AND k < ?",
168169
namespace
169170
);
170171
let find_keys_by_prefix_bounded = session.prepare(query).await?;
171172

172173
let query = format!(
173-
"SELECT k,v FROM kv.{} WHERE root_key = ? AND k >= ? ALLOW FILTERING",
174+
"SELECT k,v FROM kv.{} WHERE root_key = ? AND k >= ?",
174175
namespace
175176
);
176177
let find_key_values_by_prefix_unbounded = session.prepare(query).await?;
177178
let query = format!(
178-
"SELECT k,v FROM kv.{} WHERE root_key = ? AND k >= ? AND k < ? ALLOW FILTERING",
179+
"SELECT k,v FROM kv.{} WHERE root_key = ? AND k >= ? AND k < ?",
179180
namespace
180181
);
181182
let find_key_values_by_prefix_bounded = session.prepare(query).await?;
@@ -244,7 +245,7 @@ impl ScyllaDbClient {
244245
let mut group_query = "?".to_string();
245246
group_query.push_str(&",?".repeat(num_unique_keys - 1));
246247
let query = format!(
247-
"SELECT k,v FROM kv.{} WHERE root_key = ? AND k IN ({}) ALLOW FILTERING",
248+
"SELECT k,v FROM kv.{} WHERE root_key = ? AND k IN ({})",
248249
self.namespace, group_query
249250
);
250251

@@ -291,7 +292,7 @@ impl ScyllaDbClient {
291292
let mut group_query = "?".to_string();
292293
group_query.push_str(&",?".repeat(num_unique_keys - 1));
293294
let query = format!(
294-
"SELECT k FROM kv.{} WHERE root_key = ? AND k IN ({}) ALLOW FILTERING",
295+
"SELECT k FROM kv.{} WHERE root_key = ? AND k IN ({})",
295296
self.namespace, group_query
296297
);
297298

@@ -725,7 +726,7 @@ impl AdminKeyValueStore for ScyllaDbStoreInternal {
725726
.build()
726727
.boxed()
727728
.await?;
728-
let query = format!("SELECT root_key FROM kv.{} ALLOW FILTERING", namespace);
729+
let query = format!("SELECT root_key FROM kv.{}", namespace);
729730

730731
// Execute the query
731732
let rows = session.query_iter(query, &[]).await?;
@@ -764,10 +765,7 @@ impl AdminKeyValueStore for ScyllaDbStoreInternal {
764765
.boxed()
765766
.await?;
766767
// We check the way the test can fail. It can fail in different ways.
767-
let query = format!(
768-
"SELECT root_key FROM kv.{} LIMIT 1 ALLOW FILTERING",
769-
namespace
770-
);
768+
let query = format!("SELECT root_key FROM kv.{} LIMIT 1", namespace);
771769

772770
// Execute the query
773771
let result = session.prepare(&*query).await;
@@ -811,20 +809,23 @@ impl AdminKeyValueStore for ScyllaDbStoreInternal {
811809
.boxed()
812810
.await?;
813811
// Create a keyspace if it doesn't exist
812+
// TODO(#3754): Increase the replication factor to at least 3 before mainnet
814813
let query = "CREATE KEYSPACE IF NOT EXISTS kv WITH REPLICATION = { \
815814
'class' : 'SimpleStrategy', \
816-
'replication_factor' : 1 \
815+
'replication_factor' : 3 \
817816
}";
818817

819818
// Execute the query
820819
let prepared = session.prepare(query).await?;
821820
session.execute_unpaged(&prepared, &[]).await?;
822821

823-
// Create a table if it doesn't exist
824-
// The schema appears too complicated for non-trivial reasons.
825-
// See TODO(#1069).
826822
let query = format!(
827-
"CREATE TABLE kv.{} (root_key blob, k blob, v blob, primary key (root_key, k))",
823+
"CREATE TABLE kv.{} (
824+
root_key blob,
825+
k blob,
826+
v blob,
827+
PRIMARY KEY (root_key, k)
828+
)",
828829
namespace
829830
);
830831

0 commit comments

Comments
 (0)