mysql-test/include/raft_config.py (55 lines of code) (raw):
#!/usr/local/bin/python3
import os
import sys
import json
import socket
import re
def execute_sql(server_id, query):
socket = f'{socket_path}/mysqld.{server_id}.sock'
stream = os.popen(
f'mysql --no-defaults -S {socket} -u root -D test -sNe "{query}"'
)
return stream.read().strip()
num_servers = int(sys.argv[1])
socket_path = sys.argv[2]
hostname = socket.gethostname()
hostname = hostname.replace('.facebook.com', '')
dc = hostname.split(".")[1]
region = re.sub('[0-9]+$', '', dc)
ip = "0000:0000:0000:0000:0000:0000:0000:0001"
config={}
for i in range(1, num_servers + 1):
uuid = execute_sql(i, "select @@global.server_uuid")
server_id = int(execute_sql(i, "select @@global.server_id"))
port = execute_sql(i, "select @@global.port")
config["bootstrap"] = True
config["commit_rule"] = {"mode": 2}
config["replicaset_name"] = "mysql.replicaset.0"
server_config = {}
server_config["region"] = region
server_config["hostname"] = hostname
server_config["ip_port"] = f"[{ip}]:{port}"
server_config["uuid"] = uuid
server_config["backed_by_database"] = True
server_config["voter_type"] = 0
server_config["server_id"] = server_id
config["server_config"] = server_config
server_props = []
for j in range(1, num_servers + 1):
uuid = execute_sql(j, "select @@global.server_uuid")
server_id = int(execute_sql(j, "select @@global.server_id"))
port = execute_sql(j, "select @@global.port")
server_prop = {}
server_prop["region"] = region
server_prop["hostname"] = hostname
server_prop["ip_port"] = f"[{ip}]:{port}"
server_prop["uuid"] = uuid
server_prop["server_id"] = server_id
server_prop["backed_by_database"] = True
server_prop["voter_type"] = 0
server_props.append(server_prop)
config["raft_topology"] = {"raft_server_properties": server_props}
config["voter_distribution"] = {region: num_servers}
config["enable_flexiraft"] = False
config_str = json.dumps(config)
config_str = config_str.replace('"', r'\"')
execute_sql(i, f"set @@global.rpl_raft_topology_config_json='{config_str}'")