1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
import os
import tarantool
from lib.tarantool_server import TarantoolServer
import re
import yaml
REPEAT = 20
ID_BEGIN = 0
ID_STEP = 5
LOGIN = 'test'
PASSWORD = 'pass123456'
engines = ['memtx', 'vinyl']
def insert_tuples(_server, begin, end, msg = "tuple"):
for engine in engines:
for i in range(begin, end):
print 'box.space.%s:insert{%d, "%s %d"}' % (engine, i, msg, i)
print '-'
space = _server.iproto.py_con.space(engine)
print space.insert((i, '%s %d' % (msg, i)))
def select_tuples(_server, begin, end):
for engine in engines:
for i in range(begin, end):
print 'box.space.%s:select{%d}' % (engine, i)
print '-'
space = _server.iproto.py_con.space(engine)
print space.select(i)
# master server
master = server
# Re-deploy server to cleanup Phia data
master.stop()
master.cleanup()
master.deploy()
master.admin("box.schema.user.create('%s', { password = '%s'})" % (LOGIN, PASSWORD))
master.admin("box.schema.user.grant('%s', 'read,write,execute', 'universe')" % LOGIN)
master.iproto.py_con.authenticate(LOGIN, PASSWORD)
master.uri = '%s:%s@%s' % (LOGIN, PASSWORD, master.iproto.uri)
os.putenv('MASTER', master.uri)
# replica server
replica = TarantoolServer()
replica.script = "replication-py/replica.lua"
replica.vardir = server.vardir #os.path.join(server.vardir, 'replica')
replica.deploy()
replica.admin("while box.info.id == 0 do require('fiber').sleep(0.01) end")
replica.uri = '%s:%s@%s' % (LOGIN, PASSWORD, replica.iproto.uri)
replica.admin("while box.space['_priv']:len() < 1 do require('fiber').sleep(0.01) end")
replica.iproto.py_con.authenticate(LOGIN, PASSWORD)
for engine in engines:
master.admin("s = box.schema.space.create('%s', { engine = '%s'})" % (engine, engine))
master.admin("index = s:create_index('primary', {type = 'tree'})")
### gh-343: replica.cc must not add login and password to proc title
#status = replica.get_param("status")
#host_port = "%s:%s" % master.iproto.uri
#m = re.search(r'replica/(.*)/.*', status)
#if not m or m.group(1) != host_port:
# print 'invalid box.info.status', status, 'expected host:port', host_port
master_id = master.get_param('id')
replica_id = replica.get_param('id')
id = ID_BEGIN
for i in range(REPEAT):
print "test %d iteration" % i
# insert to master
insert_tuples(master, id, id + ID_STEP)
# select from replica
replica.wait_lsn(master_id, master.get_lsn(master_id))
select_tuples(replica, id, id + ID_STEP)
id += ID_STEP
# insert to master
insert_tuples(master, id, id + ID_STEP)
# select from replica
replica.wait_lsn(master_id, master.get_lsn(master_id))
select_tuples(replica, id, id + ID_STEP)
id += ID_STEP
print "swap servers"
# reconfigure replica to master
replica.rpl_master = None
print("switch replica to master")
replica.admin("box.cfg{replication=''}")
# reconfigure master to replica
master.rpl_master = replica
print("switch master to replica")
master.admin("box.cfg{replication='%s'}" % replica.uri, silent=True)
# insert to replica
insert_tuples(replica, id, id + ID_STEP)
# select from master
master.wait_lsn(replica_id, replica.get_lsn(replica_id))
select_tuples(master, id, id + ID_STEP)
id += ID_STEP
# insert to replica
insert_tuples(replica, id, id + ID_STEP)
# select from master
master.wait_lsn(replica_id, replica.get_lsn(replica_id))
select_tuples(master, id, id + ID_STEP)
id += ID_STEP
print "rollback servers configuration"
# reconfigure replica to master
master.rpl_master = None
print("switch master to master")
master.admin("box.cfg{replication=''}")
# reconfigure master to replica
replica.rpl_master = master
print("switch replica to replica")
replica.admin("box.cfg{replication='%s'}" % master.uri, silent=True)
# Cleanup.
replica.stop()
replica.cleanup()
server.stop()
server.deploy()
|