def replace_nonexistent_node_test(self): debug("Starting cluster with 3 nodes.") cluster = self.cluster cluster.populate(3).start() node1, node2, node3 = cluster.nodelist() debug('Start node 4 and replace an address with no node') node4 = Node('node4', cluster=cluster, auto_bootstrap=True, thrift_interface=('127.0.0.4', 9160), storage_interface=('127.0.0.4', 7000), jmx_port='7400', remote_debug_port='0', initial_token=None, binary_interface=('127.0.0.4', 9042)) cluster.add(node4, False) # try to replace an unassigned ip address mark = node4.mark_log() node4.start(replace_address='127.0.0.5', wait_other_notice=False) node4.watch_log_for( "java.lang.RuntimeException: Cannot replace_address /127.0.0.5 because it doesn't exist in gossip", from_mark=mark) assert_not_running(node4)
def replace_active_node_test(self): debug("Starting cluster with 3 nodes.") cluster = self.cluster cluster.populate(3).start() node1, node2, node3 = cluster.nodelist() # replace active node 3 with node 4 debug("Starting node 4 to replace active node 3") node4 = Node('node4', cluster=cluster, auto_bootstrap=True, thrift_interface=('127.0.0.4', 9160), storage_interface=('127.0.0.4', 7000), jmx_port='7400', remote_debug_port='0', initial_token=None, binary_interface=('127.0.0.4', 9042)) cluster.add(node4, False) mark = node4.mark_log() node4.start(replace_address='127.0.0.3', wait_other_notice=False) node4.watch_log_for( "java.lang.UnsupportedOperationException: Cannot replace a live node...", from_mark=mark) assert_not_running(node4)
def _bootstrap_test_with_replica_down(self, consistent_range_movement, rf=2): """ Test to check consistent bootstrap will not succeed when there are insufficient replicas @jira_ticket CASSANDRA-11848 """ cluster = self.cluster cluster.populate(2) node1, node2 = cluster.nodelist() node3_token = None # Make token assignment deterministic if DISABLE_VNODES: cluster.set_configuration_options(values={'num_tokens': 1}) tokens = cluster.balanced_tokens(3) debug("non-vnode tokens: %r" % (tokens,)) node1.set_configuration_options(values={'initial_token': tokens[0]}) node2.set_configuration_options(values={'initial_token': tokens[2]}) node3_token = tokens[1] # Add node 3 between node1 and node2 cluster.start() node1.stress(['write', 'n=10K', 'no-warmup', '-rate', 'threads=8', '-schema', 'replication(factor={})'.format(rf)]) # change system_auth keyspace to 2 (default is 1) to avoid # "Unable to find sufficient sources for streaming" warning if cluster.cassandra_version() >= '2.2.0': session = self.patient_cql_connection(node1) session.execute(""" ALTER KEYSPACE system_auth WITH replication = {'class':'SimpleStrategy', 'replication_factor':2}; """) # Stop node2, so node3 will not be able to perform consistent range movement node2.stop(wait_other_notice=True) successful_bootstrap_expected = not consistent_range_movement node3 = new_node(cluster, token=node3_token) node3.start(wait_for_binary_proto=successful_bootstrap_expected, wait_other_notice=successful_bootstrap_expected, jvm_args=["-Dcassandra.consistent.rangemovement={}".format(consistent_range_movement)]) if successful_bootstrap_expected: # with rf=1 and cassandra.consistent.rangemovement=false, missing sources are ignored if not consistent_range_movement and rf == 1: node3.watch_log_for("Unable to find sufficient sources for streaming range") self.assertTrue(node3.is_running()) assert_bootstrap_state(self, node3, 'COMPLETED') else: if consistent_range_movement: node3.watch_log_for("A node required to move the data consistently is down") else: node3.watch_log_for("Unable to find sufficient sources for streaming range") assert_not_running(node3)
def replace_with_insufficient_replicas_test(self): """ Test that replace fails when there are insufficient replicas @jira_ticket CASSANDRA-11848 """ debug("Starting cluster with 3 nodes.") cluster = self.cluster cluster.populate(3).start() node1, node2, node3 = cluster.nodelist() if DISABLE_VNODES: num_tokens = 1 else: # a little hacky but grep_log returns the whole line... num_tokens = int(node3.get_conf_option('num_tokens')) debug("testing with num_tokens: {}".format(num_tokens)) debug("Inserting Data...") node1.stress([ 'write', 'n=10K', 'no-warmup', '-schema', 'replication(factor=2)' ]) # stop node to replace debug("Stopping node to replace.") node3.stop(wait_other_notice=True) # stop other replica debug("Stopping node2 (other replica)") node2.stop(wait_other_notice=True) # replace node 3 with node 4 debug("Starting node 4 to replace node 3") node4 = Node('node4', cluster=cluster, auto_bootstrap=True, thrift_interface=('127.0.0.4', 9160), storage_interface=('127.0.0.4', 7000), jmx_port='7400', remote_debug_port='0', initial_token=None, binary_interface=('127.0.0.4', 9042)) cluster.add(node4, False) node4.start(replace_address='127.0.0.3', wait_for_binary_proto=False, wait_other_notice=False) # replace should fail due to insufficient replicas node4.watch_log_for( "Unable to find sufficient sources for streaming range") assert_not_running(node4)
def replace_nonexistent_node_test(self): debug("Starting cluster with 3 nodes.") cluster = self.cluster cluster.populate(3).start() node1, node2, node3 = cluster.nodelist() debug('Start node 4 and replace an address with no node') node4 = Node('node4', cluster=cluster, auto_bootstrap=True, thrift_interface=('127.0.0.4', 9160), storage_interface=('127.0.0.4', 7000), jmx_port='7400', remote_debug_port='0', initial_token=None, binary_interface=('127.0.0.4', 9042)) cluster.add(node4, False) # try to replace an unassigned ip address mark = node4.mark_log() node4.start(replace_address='127.0.0.5', wait_other_notice=False) node4.watch_log_for("java.lang.RuntimeException: Cannot replace_address /127.0.0.5 because it doesn't exist in gossip", from_mark=mark) assert_not_running(node4)
def replace_active_node_test(self): debug("Starting cluster with 3 nodes.") cluster = self.cluster cluster.populate(3).start() node1, node2, node3 = cluster.nodelist() # replace active node 3 with node 4 debug("Starting node 4 to replace active node 3") node4 = Node('node4', cluster=cluster, auto_bootstrap=True, thrift_interface=('127.0.0.4', 9160), storage_interface=('127.0.0.4', 7000), jmx_port='7400', remote_debug_port='0', initial_token=None, binary_interface=('127.0.0.4', 9042)) cluster.add(node4, False) mark = node4.mark_log() node4.start(replace_address='127.0.0.3', wait_other_notice=False) node4.watch_log_for("java.lang.UnsupportedOperationException: Cannot replace a live node...", from_mark=mark) assert_not_running(node4)
def replace_with_insufficient_replicas_test(self): """ Test that replace fails when there are insufficient replicas @jira_ticket CASSANDRA-11848 """ debug("Starting cluster with 3 nodes.") cluster = self.cluster cluster.populate(3).start() node1, node2, node3 = cluster.nodelist() if DISABLE_VNODES: num_tokens = 1 else: # a little hacky but grep_log returns the whole line... num_tokens = int(node3.get_conf_option('num_tokens')) debug("testing with num_tokens: {}".format(num_tokens)) debug("Inserting Data...") node1.stress(['write', 'n=10K', 'no-warmup', '-schema', 'replication(factor=2)']) # stop node to replace debug("Stopping node to replace.") node3.stop(wait_other_notice=True) # stop other replica debug("Stopping node2 (other replica)") node2.stop(wait_other_notice=True) # replace node 3 with node 4 debug("Starting node 4 to replace node 3") node4 = Node('node4', cluster=cluster, auto_bootstrap=True, thrift_interface=('127.0.0.4', 9160), storage_interface=('127.0.0.4', 7000), jmx_port='7400', remote_debug_port='0', initial_token=None, binary_interface=('127.0.0.4', 9042)) cluster.add(node4, False) node4.start(replace_address='127.0.0.3', wait_for_binary_proto=False, wait_other_notice=False) # replace should fail due to insufficient replicas node4.watch_log_for("Unable to find sufficient sources for streaming range") assert_not_running(node4)