import time

from dtest import Tester
from ccmlib.node import ToolError
import pytest

since = pytest.mark.since

@since('3.0')
class TestRefresh(Tester):
    def test_refresh_deadlock_startup(self):
        """ Test refresh deadlock during startup (CASSANDRA-14310) """
        self.cluster.populate(1)
        node = self.cluster.nodelist()[0]
        node.byteman_port = '8100'
        node.import_config_files()
        self.cluster.start(wait_other_notice=True)
        session = self.patient_cql_connection(node)
        session.execute("CREATE KEYSPACE ks WITH replication = {'class':'SimpleStrategy', 'replication_factor':1}")
        session.execute("CREATE TABLE ks.a (id int primary key, d text)")
        session.execute("CREATE TABLE ks.b (id int primary key, d text)")
        node.nodetool("disableautocompaction") # make sure we have more than 1 sstable
        for x in range(0, 10):
            session.execute("INSERT INTO ks.a (id, d) VALUES (%d, '%d %d')"%(x, x, x))
            session.execute("INSERT INTO ks.b (id, d) VALUES (%d, '%d %d')"%(x, x, x))
            node.flush()
        node.stop()
        node.update_startup_byteman_script('byteman/sstable_open_delay.btm')
        node.start()
        node.watch_log_for("opening keyspace ks", filename="debug.log")
        time.sleep(5)
        for x in range(0, 20):
            try:
                node.nodetool("refresh ks a")
                node.nodetool("refresh ks b")
            except ToolError:
                pass # this is OK post-14310 - we just don't want to hang forever
            time.sleep(1)
