diff --git a/Cargo.lock b/Cargo.lock index 18f3d4942b51..f0751e7aac25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3798,12 +3798,6 @@ dependencies = [ "serde", ] -[[package]] -name = "histogram" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" - [[package]] name = "hmac" version = "0.12.1" @@ -4337,6 +4331,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.14" @@ -6849,11 +6852,11 @@ dependencies = [ [[package]] name = "rand_pcg" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +checksum = "b48ac3f7ffaab7fac4d2376632268aa5f89abdb55f7ebf8f4d11fffccb2320f7" dependencies = [ - "rand_core 0.6.4", + "rand_core 0.9.3", ] [[package]] @@ -7512,9 +7515,9 @@ dependencies = [ [[package]] name = "scylla" -version = "0.15.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0408e59e11f589071d1cefc3928270aa8fe4d03f654cb118e0c24d16013ea82" +checksum = "bd81aa1c6de67ed43f78a64aa233c547c569979922ab2e6c6d58730f0d53b651" dependencies = [ "arc-swap", "async-trait", @@ -7524,14 +7527,12 @@ dependencies = [ "dashmap 5.5.3", "futures", "hashbrown 0.14.5", - "histogram", - "itertools 0.13.0", + "itertools 0.14.0", "lazy_static", "lz4_flex", - "rand 0.8.5", + "rand 0.9.0", "rand_pcg", "scylla-cql", - "scylla-macros", "smallvec", "snap", "socket2", @@ -7543,13 +7544,15 @@ dependencies = [ [[package]] name = "scylla-cql" -version = "0.4.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0cefd8b924bb8f67525937a811038d5662f9febc30c74c778a8205f63c4b365" +checksum = "ae84054fed47b0a7e757d66aeb4574a4ca9696bf68c25ed6325b0f198c15795b" dependencies = [ "async-trait", "byteorder", "bytes", + "chrono", + "itertools 0.14.0", "lz4_flex", "scylla-macros", "snap", @@ -7562,9 +7565,9 @@ dependencies = [ [[package]] name = "scylla-macros" -version = "0.7.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e878bfb8a235207864ac3fb0b51d7954c77fd38486e0e4fb4e037935ff7eb46c" +checksum = "e67d343ebea5cc079bfa89ca4b231b432207c3748baaa3b00e5c238e7644e838" dependencies = [ "darling", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 0fb8434842fc..eb3cd01305da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -147,7 +147,12 @@ revm-precompile = "16.2.0" revm-primitives = "15.2.0" rocksdb = "0.21.0" ruzstd = "0.7.1" -scylla = "0.15.1" +scylla = "1.1.0" +secp256k1 = { version = "0.30.0", default-features = false, features = [ + "alloc", + "rand", + "serde", +] } semver = "1.0.22" serde = { version = "1.0.197", features = ["derive"] } serde-name = "0.2.1" diff --git a/linera-views/src/backends/scylla_db.rs b/linera-views/src/backends/scylla_db.rs index 2757887bb0b4..917b59c05eea 100644 --- a/linera-views/src/backends/scylla_db.rs +++ b/linera-views/src/backends/scylla_db.rs @@ -17,11 +17,16 @@ use async_lock::{Semaphore, SemaphoreGuard}; use futures::{future::join_all, FutureExt as _, StreamExt}; use linera_base::ensure; use scylla::{ - batch::BatchStatement, - prepared_statement::PreparedStatement, - statement::batch::BatchType, - transport::errors::{DbError, QueryError}, - Session, SessionBuilder, + client::{session::Session, session_builder::SessionBuilder}, + deserialize::{DeserializationError, TypeCheckError}, + errors::{ + DbError, ExecutionError, IntoRowsResultError, NewSessionError, NextPageError, NextRowError, + PagerExecutionError, PrepareError, RequestAttemptError, RequestError, RowsError, + }, + statement::{ + batch::{BatchStatement, BatchType}, + prepared::PreparedStatement, + }, }; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -465,27 +470,27 @@ pub enum ScyllaDbStoreInternalError { /// A deserialization error in ScyllaDB #[error(transparent)] - DeserializationError(#[from] scylla::deserialize::DeserializationError), + DeserializationError(#[from] DeserializationError), /// A row error in ScyllaDB #[error(transparent)] - RowsError(#[from] scylla::transport::query_result::RowsError), + RowsError(#[from] RowsError), /// A type error in the accessed data in ScyllaDB #[error(transparent)] - IntoRowsResultError(#[from] scylla::transport::query_result::IntoRowsResultError), + IntoRowsResultError(#[from] IntoRowsResultError), /// A type check error in ScyllaDB #[error(transparent)] - TypeCheckError(#[from] scylla::deserialize::TypeCheckError), + TypeCheckError(#[from] TypeCheckError), /// A query error in ScyllaDB #[error(transparent)] - ScyllaDbQueryError(#[from] scylla::transport::errors::QueryError), + PagerExecutionError(#[from] PagerExecutionError), /// A query error in ScyllaDB #[error(transparent)] - ScyllaDbNewSessionError(#[from] scylla::transport::errors::NewSessionError), + ScyllaDbNewSessionError(#[from] NewSessionError), /// Namespace contains forbidden characters #[error("Namespace contains forbidden characters")] @@ -498,6 +503,18 @@ pub enum ScyllaDbStoreInternalError { /// The batch is too long to be written #[error("The batch is too long to be written")] BatchTooLong, + + /// A prepare error in ScyllaDB + #[error(transparent)] + PrepareError(#[from] PrepareError), + + /// An execution error in ScyllaDB + #[error(transparent)] + ExecutionError(#[from] ExecutionError), + + /// A next row error in ScyllaDB + #[error(transparent)] + NextRowError(#[from] NextRowError), } impl KeyValueStoreError for ScyllaDbStoreInternalError { @@ -689,16 +706,16 @@ impl AdminKeyValueStore for ScyllaDbStoreInternal { let result = match result { Ok(result) => result, Err(error) => { - let invalid_or_not_found = match &error { - QueryError::DbError(db_error, msg) => { - *db_error == DbError::Invalid && msg.as_str() == miss_msg - } + let invalid_or_keyspace_not_found = match &error { + PagerExecutionError::NextPageError(NextPageError::RequestFailure( + RequestError::LastAttemptError(RequestAttemptError::DbError(db_error, msg)), + )) => *db_error == DbError::Invalid && msg.as_str() == miss_msg, _ => false, }; - if invalid_or_not_found { + if invalid_or_keyspace_not_found { return Ok(Vec::new()); } else { - return Err(ScyllaDbStoreInternalError::ScyllaDbQueryError(error)); + return Err(ScyllaDbStoreInternalError::PagerExecutionError(error)); } } }; @@ -780,7 +797,9 @@ impl AdminKeyValueStore for ScyllaDbStoreInternal { return Ok(true); }; let missing_table = match &error { - QueryError::DbError(db_error, msg) => { + PrepareError::AllAttemptsFailed { + first_attempt: RequestAttemptError::DbError(db_error, msg), + } => { if *db_error != DbError::Invalid { false } else { @@ -794,7 +813,7 @@ impl AdminKeyValueStore for ScyllaDbStoreInternal { if missing_table { Ok(false) } else { - Err(ScyllaDbStoreInternalError::ScyllaDbQueryError(error)) + Err(ScyllaDbStoreInternalError::PrepareError(error)) } }