Request Execution Errors

The Ruby driver will error out and provide error messages for various errors. Check out the request execution diagram in Error Handling guide and come back here for real-world examples of error handling.

Background

Given
a running cassandra cluster

Executing a statement with invalid syntax

Given
the following schema:
CREATE KEYSPACE simplex WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
USE simplex;
CREATE TABLE users (user_id BIGINT PRIMARY KEY, first VARCHAR, last VARCHAR, age BIGINT);
And
the following example:
require 'cassandra'

cluster = Cassandra.cluster
session = cluster.connect("simplex")

begin
  session.execute("INSERT INTO users (user_id, first, last, age)")
rescue => e
  puts "#{e.class.name}: #{e.message}"
end
When
it is executed
Then
its output should contain:
Cassandra::Errors::SyntaxError

Connecting to non-existent keyspace

Given
the following example:
require 'cassandra'

cluster = Cassandra.cluster

begin
  session = cluster.connect("badkeyspace")
rescue => e
  puts "#{e.class.name}: #{e.message}"
end
When
it is executed
Then
its output should contain:
Cassandra::Errors::InvalidError

Modifying system keyspace

Given
the following example:
require 'cassandra'

cluster = Cassandra.cluster
session = cluster.connect("system")

begin
  session.execute("CREATE TABLE users (user_id INT PRIMARY KEY)")
rescue => e
  puts "#{e.class.name}: #{e.message}"
end
When
it is executed
Then
its output should contain:
Cassandra::Errors::UnauthorizedError

Dropping non-existent keyspace

Given
the following example:
require 'cassandra'

cluster = Cassandra.cluster
session = cluster.connect

begin
  session.execute("DROP KEYSPACE badkeyspace")
rescue => e
  puts "#{e.class.name}: #{e.message}"
end
When
it is executed
Then
its output should contain:
Cassandra::Errors::ConfigurationError

Creating keyspace that already exists

Given
the following schema:
CREATE KEYSPACE simplex WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
And
the following example:
require 'cassandra'

cluster = Cassandra.cluster
session = cluster.connect

begin
  session.execute("CREATE KEYSPACE simplex WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3}")
rescue => e
  puts "#{e.class.name}: #{e.message}"
end
When
it is executed
Then
its output should contain:
Cassandra::Errors::AlreadyExistsError

Connecting with invalid authentication credentials

Given
a running cassandra cluster with authentication enabled
And
the following example:
require 'cassandra'

begin
  Cassandra.cluster(
    username: 'invalidname',
    password: 'badpassword'
  )
rescue => e
  puts "#{e.class.name}: #{e.message}"
end
When
it is executed
Then
its output should contain:
Cassandra::Errors::AuthenticationError

Connecting to unreachable cluster

Given
node 1 is unreachable
And
the following example:
require 'cassandra'

begin
  Cassandra.cluster(connect_timeout: 1)
rescue => e
  puts "#{e.class.name}: #{e.message}"
end
When
it is executed
Then
its output should contain:
Cassandra::Errors::NoHostsAvailable: All attempted hosts failed
And
its output should contain:
Cassandra::Errors::TimeoutError: Timed out

Executing a statement when all hosts are down

Given
the following schema:
CREATE KEYSPACE simplex WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE simplex;
CREATE TABLE users (user_id BIGINT PRIMARY KEY, first VARCHAR, last VARCHAR, age BIGINT);
INSERT INTO users (user_id, first, last, age) VALUES (0, 'John', 'Doe', 40);
INSERT INTO users (user_id, first, last, age) VALUES (1, 'Mary', 'Doe', 35);
INSERT INTO users (user_id, first, last, age) VALUES (2, 'Agent', 'Smith', 32);
And
the following example:
require 'cassandra'

cluster = Cassandra.cluster(retry_policy: Cassandra::Retry::Policies::Fallthrough.new)
session = cluster.connect("simplex")

$stdout.puts("=== START ===")
$stdout.flush
until (input = $stdin.gets).nil? # block until closed
  query = input.chomp
  begin
    results = session.execute(query, consistency: :all, timeout: 2)
    puts results.inspect
    execution_info = results.execution_info
    $stdout.puts("Query #{query.inspect} fulfilled by #{execution_info.hosts}")
  rescue => e
    $stdout.puts("#{e.class.name}: #{e.message}")
  end
  $stdout.flush
end
$stdout.puts("=== STOP ===")
$stdout.flush
When
it is running interactively
And
I wait for its output to contain “START”
And
all nodes are down
And
I type “SELECT * FROM simplex.users”
And
I close the stdin stream
Then
its output should contain:
Cassandra::Errors::NoHostsAvailable: All hosts down

Executing a statement when can’t achieve desired consistency

Given
the following schema:
CREATE KEYSPACE simplex WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
USE simplex;
CREATE TABLE users (user_id BIGINT PRIMARY KEY, first VARCHAR, last VARCHAR, age BIGINT);
And
the following example:
require 'cassandra'

cluster = Cassandra.cluster
session = cluster.connect("simplex")

query = "INSERT INTO users (user_id, first, last, age) VALUES (0, 'John', 'Doe', 40)"
begin
  session.execute(query, consistency: :all)
rescue => e
  puts "#{e.class.name}: #{e.message}"
end
When
node 3 stops
And
it is executed
Then
its output should contain:
Cassandra::Errors::UnavailableError

Executing a SELECT statement when replica times out

Given
the following schema:
CREATE KEYSPACE simplex WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE simplex;
CREATE TABLE users (user_id BIGINT PRIMARY KEY, first VARCHAR, last VARCHAR, age BIGINT);
INSERT INTO users (user_id, first, last, age) VALUES (0, 'John', 'Doe', 40);
INSERT INTO users (user_id, first, last, age) VALUES (1, 'Mary', 'Doe', 35);
INSERT INTO users (user_id, first, last, age) VALUES (2, 'Agent', 'Smith', 32);
And
the following example:
require 'cassandra'

cluster = Cassandra.cluster(retry_policy: Cassandra::Retry::Policies::Fallthrough.new)
session = cluster.connect("simplex")

$stdout.puts("=== START ===")
$stdout.flush
until (input = $stdin.gets).nil? # block until closed
  query = input.chomp
  begin
    results = session.execute(query, consistency: :all, timeout: 2)
    puts results.inspect
    execution_info = results.execution_info
    $stdout.puts("Query #{query.inspect} fulfilled by #{execution_info.hosts}")
  rescue => e
    $stdout.puts("#{e.class.name}: #{e.message}")
  end
  $stdout.flush
end
$stdout.puts("=== STOP ===")
$stdout.flush
When
it is running interactively
And
I wait for its output to contain “START”
And
node 3 is unreachable
And
I type “SELECT * FROM simplex.users”
And
I close the stdin stream
Then
its output should contain:
Cassandra::Errors::ReadTimeoutError

Executing an UPDATE statement when replica times out

Given
the following schema:
CREATE KEYSPACE simplex WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE simplex;
CREATE TABLE users (user_id BIGINT PRIMARY KEY, first VARCHAR, last VARCHAR, age BIGINT);
INSERT INTO users (user_id, first, last, age) VALUES (0, 'John', 'Doe', 40);
INSERT INTO users (user_id, first, last, age) VALUES (1, 'Mary', 'Doe', 35);
INSERT INTO users (user_id, first, last, age) VALUES (2, 'Agent', 'Smith', 32);
And
the following example:
require 'cassandra'

cluster = Cassandra.cluster(retry_policy: Cassandra::Retry::Policies::Fallthrough.new)
session = cluster.connect("simplex")

$stdout.puts("=== START ===")
$stdout.flush
until (input = $stdin.gets).nil? # block until closed
  query = input.chomp
  begin
    results = session.execute(query, consistency: :all, timeout: 2)
    puts results.inspect
    execution_info = results.execution_info
    $stdout.puts("Query #{query.inspect} fulfilled by #{execution_info.hosts}")
  rescue => e
    $stdout.puts("#{e.class.name}: #{e.message}")
  end
  $stdout.flush
end
$stdout.puts("=== STOP ===")
$stdout.flush
When
it is running interactively
And
I wait for its output to contain “START”
And
node 3 is unreachable
And
I type “UPDATE simplex.users SET age=41 WHERE user_id=0”
And
I close the stdin stream
Then
its output should contain:
Cassandra::Errors::WriteTimeoutError

Truncating a table when replica times out

Given
the following schema:
CREATE KEYSPACE simplex WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE simplex;
CREATE TABLE users (user_id BIGINT PRIMARY KEY, first VARCHAR, last VARCHAR, age BIGINT);
INSERT INTO users (user_id, first, last, age) VALUES (0, 'John', 'Doe', 40);
INSERT INTO users (user_id, first, last, age) VALUES (1, 'Mary', 'Doe', 35);
INSERT INTO users (user_id, first, last, age) VALUES (2, 'Agent', 'Smith', 32);
And
the following example:
require 'cassandra'

cluster = Cassandra.cluster(retry_policy: Cassandra::Retry::Policies::Fallthrough.new)
session = cluster.connect("simplex")

$stdout.puts("=== START ===")
$stdout.flush
until (input = $stdin.gets).nil? # block until closed
  query = input.chomp
  begin
    results = session.execute(query, consistency: :all, timeout: 2)
    puts results.inspect
    execution_info = results.execution_info
    $stdout.puts("Query #{query.inspect} fulfilled by #{execution_info.hosts}")
  rescue => e
    $stdout.puts("#{e.class.name}: #{e.message}")
  end
  $stdout.flush
end
$stdout.puts("=== STOP ===")
$stdout.flush
When
it is running interactively
And
I wait for its output to contain “START”
And
node 3 is unreachable
And
I type “TRUNCATE simplex.users”
And
I close the stdin stream
Then
its output should contain:
Cassandra::Errors::TruncateError

Executing a statement when all nodes time out

Given
the following schema:
CREATE KEYSPACE simplex WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE simplex;
CREATE TABLE users (user_id BIGINT PRIMARY KEY, first VARCHAR, last VARCHAR, age BIGINT);
INSERT INTO users (user_id, first, last, age) VALUES (0, 'John', 'Doe', 40);
INSERT INTO users (user_id, first, last, age) VALUES (1, 'Mary', 'Doe', 35);
INSERT INTO users (user_id, first, last, age) VALUES (2, 'Agent', 'Smith', 32);
And
the following example:
require 'cassandra'

cluster = Cassandra.cluster(retry_policy: Cassandra::Retry::Policies::Fallthrough.new)
session = cluster.connect("simplex")

$stdout.puts("=== START ===")
$stdout.flush
until (input = $stdin.gets).nil? # block until closed
  query = input.chomp
  begin
    results = session.execute(query, consistency: :all, timeout: 2)
    puts results.inspect
    execution_info = results.execution_info
    $stdout.puts("Query #{query.inspect} fulfilled by #{execution_info.hosts}")
  rescue => e
    $stdout.puts("#{e.class.name}: #{e.message}")
  end
  $stdout.flush
end
$stdout.puts("=== STOP ===")
$stdout.flush
When
it is running interactively
And
I wait for its output to contain “START”
And
all nodes are unreachable
And
I type “SELECT * FROM simplex.users WHERE user_id=0”
And
I close the stdin stream
Then
its output should contain:
Cassandra::Errors::NoHostsAvailable: All attempted hosts failed
And
its output should contain:
127.0.0.1 (Cassandra::Errors::TimeoutError: Timed out)
And
its output should contain:
127.0.0.2 (Cassandra::Errors::TimeoutError: Timed out)
And
its output should contain:
127.0.0.3 (Cassandra::Errors::TimeoutError: Timed out)