blob: 6fc656af148caa055fd52309483b6db882948e90 [file] [log] [blame]
import pytest
import logging
from cassandra import ConsistencyLevel, OperationTimedOut, ReadTimeout
from cassandra.query import SimpleStatement
from dtest import Tester
since = pytest.mark.since
logger = logging.getLogger(__name__)
class TestSchemaChanges(Tester):
@since('2.0')
def test_friendly_unrecognized_table_handling(self):
"""
After upgrading one of two nodes, create a new table (which will
not be propagated to the old node) and check that queries against
that table result in user-friendly warning logs.
"""
cluster = self.cluster
cluster.populate(2)
cluster.start()
node1, node2 = cluster.nodelist()
original_version = node1.get_cassandra_version()
upgraded_version = None
if original_version.vstring.startswith('2.0'):
upgraded_version = 'github:apache/cassandra-2.1'
elif original_version.vstring.startswith('2.1'):
upgraded_version = 'github:apache/cassandra-2.2'
else:
pytest.skip(msg="This test is only designed to work with 2.0 and 2.1 right now")
# start out with a major behind the previous version
# upgrade node1
node1.stop()
node1.set_install_dir(version=upgraded_version)
logger.debug("Set new cassandra dir for %s: %s" % (node1.name, node1.get_install_dir()))
node1.set_log_level("INFO")
node1.start()
session = self.patient_exclusive_cql_connection(node1)
session.cluster.max_schema_agreement_wait = -1 # don't wait for schema agreement
logger.debug("Creating keyspace and table")
session.execute("CREATE KEYSPACE test_upgrades WITH replication={'class': 'SimpleStrategy', "
"'replication_factor': '2'}")
session.execute("CREATE TABLE test_upgrades.foo (a int primary key, b int)")
pattern = r".*Got .* command for nonexistent table test_upgrades.foo.*"
try:
session.execute(SimpleStatement("SELECT * FROM test_upgrades.foo", consistency_level=ConsistencyLevel.ALL))
self.fail("expected failure")
except (ReadTimeout, OperationTimedOut):
logger.debug("Checking node2 for warning in log")
node2.watch_log_for(pattern, timeout=10)
# non-paged range slice
try:
session.execute(SimpleStatement("SELECT * FROM test_upgrades.foo", consistency_level=ConsistencyLevel.ALL,
fetch_size=None))
self.fail("expected failure")
except (ReadTimeout, OperationTimedOut):
logger.debug("Checking node2 for warning in log")
pattern = r".*Got .* command for nonexistent table test_upgrades.foo.*"
node2.watch_log_for(pattern, timeout=10)
# single-partition slice
try:
for i in range(20):
session.execute(SimpleStatement("SELECT * FROM test_upgrades.foo WHERE a = %d" % (i,),
consistency_level=ConsistencyLevel.ALL, fetch_size=None))
self.fail("expected failure")
except (ReadTimeout, OperationTimedOut):
logger.debug("Checking node2 for warning in log")
pattern = r".*Got .* command for nonexistent table test_upgrades.foo.*"
node2.watch_log_for(pattern, timeout=10)