You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by aw...@apache.org on 2017/11/15 21:46:40 UTC
[12/50] cassandra git commit: Add tests for MVs when a column in the
base table is renamed with ALTER TABLE
Add tests for MVs when a column in the base table is renamed with ALTER TABLE
patch by Andres de la Peña; reviewed by Zhao Yang for CASSANDRA-12952
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d9c8cebc
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d9c8cebc
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d9c8cebc
Branch: refs/heads/master
Commit: d9c8cebc2d7907d04efb1ce81bda9e2fa2780530
Parents: b724df8
Author: Andrés de la Peña <a....@gmail.com>
Authored: Fri Jul 28 11:56:38 2017 +0100
Committer: Andrés de la Peña <a....@gmail.com>
Committed: Fri Jul 28 11:56:38 2017 +0100
----------------------------------------------------------------------
byteman/merge_schema_failure_3x.btm | 12 ++++++
byteman/merge_schema_failure_4x.btm | 12 ++++++
materialized_views_test.py | 73 +++++++++++++++++++++++++++++++-
3 files changed, 95 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d9c8cebc/byteman/merge_schema_failure_3x.btm
----------------------------------------------------------------------
diff --git a/byteman/merge_schema_failure_3x.btm b/byteman/merge_schema_failure_3x.btm
new file mode 100644
index 0000000..d4c9b36
--- /dev/null
+++ b/byteman/merge_schema_failure_3x.btm
@@ -0,0 +1,12 @@
+#
+# Inject node failure on merge schema exit.
+#
+RULE inject node failure on merge schema exit
+CLASS org.apache.cassandra.schema.SchemaKeyspace
+METHOD mergeSchema
+AT EXIT
+# set flag to only run this rule once.
+IF TRUE
+DO
+ System.exit(0)
+ENDRULE
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d9c8cebc/byteman/merge_schema_failure_4x.btm
----------------------------------------------------------------------
diff --git a/byteman/merge_schema_failure_4x.btm b/byteman/merge_schema_failure_4x.btm
new file mode 100644
index 0000000..bee5c3c
--- /dev/null
+++ b/byteman/merge_schema_failure_4x.btm
@@ -0,0 +1,12 @@
+#
+# Inject node failure on merge schema exit.
+#
+RULE inject node failure on merge schema exit
+CLASS org.apache.cassandra.schema.Schema
+METHOD merge
+AT EXIT
+# set flag to only run this rule once.
+IF TRUE
+DO
+ System.exit(0)
+ENDRULE
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d9c8cebc/materialized_views_test.py
----------------------------------------------------------------------
diff --git a/materialized_views_test.py b/materialized_views_test.py
index 0c9cdcb..306d719 100644
--- a/materialized_views_test.py
+++ b/materialized_views_test.py
@@ -8,6 +8,7 @@ from multiprocessing import Process, Queue
from unittest import skip, skipIf
from cassandra import ConsistencyLevel
+from cassandra.cluster import NoHostAvailable
from cassandra.concurrent import execute_concurrent_with_args
from cassandra.cluster import Cluster
from cassandra.query import SimpleStatement
@@ -40,9 +41,9 @@ class TestMaterializedViews(Tester):
@since 3.0
"""
- def prepare(self, user_table=False, rf=1, options=None, nodes=3, **kwargs):
+ def prepare(self, user_table=False, rf=1, options=None, nodes=3, install_byteman=False, **kwargs):
cluster = self.cluster
- cluster.populate([nodes, 0])
+ cluster.populate([nodes, 0], install_byteman=install_byteman)
if options:
cluster.set_configuration_options(values=options)
cluster.start()
@@ -773,6 +774,74 @@ class TestMaterializedViews(Tester):
['TX', 'user1']
)
+ def rename_column_test(self):
+ """
+ Test that a materialized view created with a 'SELECT *' works as expected when renaming a column
+ @expected_result The column is also renamed in the view.
+ """
+
+ session = self.prepare(user_table=True)
+
+ self._insert_data(session)
+
+ assert_one(
+ session,
+ "SELECT * FROM users_by_state WHERE state = 'TX' AND username = 'user1'",
+ ['TX', 'user1', 1968, 'f', 'ch@ngem3a', None]
+ )
+
+ session.execute("ALTER TABLE users RENAME username TO user")
+
+ results = list(session.execute("SELECT * FROM users_by_state WHERE state = 'TX' AND user = 'user1'"))
+ self.assertEqual(len(results), 1)
+ self.assertTrue(hasattr(results[0], 'user'), 'Column "user" not found')
+ assert_one(
+ session,
+ "SELECT state, user, birth_year, gender FROM users_by_state WHERE state = 'TX' AND user = 'user1'",
+ ['TX', 'user1', 1968, 'f']
+ )
+
+ def rename_column_atomicity_test(self):
+ """
+ Test that column renaming is atomically done between a table and its materialized views
+ @jira_ticket CASSANDRA-12952
+ """
+
+ session = self.prepare(nodes=1, user_table=True, install_byteman=True)
+ node = self.cluster.nodelist()[0]
+
+ self._insert_data(session)
+
+ assert_one(
+ session,
+ "SELECT * FROM users_by_state WHERE state = 'TX' AND username = 'user1'",
+ ['TX', 'user1', 1968, 'f', 'ch@ngem3a', None]
+ )
+
+ # Rename a column with an injected byteman rule to kill the node after the first schema update
+ self.allow_log_errors = True
+ script_version = '4x' if self.cluster.version() >= '4' else '3x'
+ node.byteman_submit(['./byteman/merge_schema_failure_{}.btm'.format(script_version)])
+ with self.assertRaises(NoHostAvailable):
+ session.execute("ALTER TABLE users RENAME username TO user")
+
+ debug('Restarting node')
+ node.stop()
+ node.start(wait_for_binary_proto=True)
+ session = self.patient_cql_connection(node, consistency_level=ConsistencyLevel.ONE)
+
+ # Both the table and its view should have the new schema after restart
+ assert_one(
+ session,
+ "SELECT * FROM ks.users WHERE state = 'TX' AND user = 'user1' ALLOW FILTERING",
+ ['user1', 1968, 'f', 'ch@ngem3a', None, 'TX']
+ )
+ assert_one(
+ session,
+ "SELECT * FROM ks.users_by_state WHERE state = 'TX' AND user = 'user1'",
+ ['TX', 'user1', 1968, 'f', 'ch@ngem3a', None]
+ )
+
def lwt_test(self):
"""Test that lightweight transaction behave properly with a materialized view"""
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org