[FEAT MERGE] New upgrade framework for 4.x

This commit is contained in:
tino247
2022-12-29 11:40:25 +00:00
committed by ob-robot
parent b39b8c45f0
commit a6098ccbc6
106 changed files with 6140 additions and 3227 deletions

View File

@ -18,9 +18,17 @@ class SqlItem:
self.action_sql = action_sql
self.rollback_sql = rollback_sql
current_cluster_version = "4.1.0.0"
current_data_version = "4.1.0.0"
g_succ_sql_list = []
g_commit_sql_list = []
def get_current_cluster_version():
return current_cluster_version
def get_current_data_version():
return current_data_version
def refresh_commit_sql_list():
global g_succ_sql_list
global g_commit_sql_list
@ -97,15 +105,15 @@ def check_is_update_sql(sql):
and word_list[1].lower().startswith('@') and ':=' == word_list[2].lower()):
raise MyError('sql must be update, key_word="{0}", sql="{1}"'.format(key_word, sql))
def set_parameter(cur, parameter, value):
def set_parameter(cur, parameter, value, timeout = 0):
sql = """alter system set {0} = '{1}'""".format(parameter, value)
logging.info(sql)
cur.execute(sql)
wait_parameter_sync(cur, parameter, value)
wait_parameter_sync(cur, parameter, value, timeout)
def get_ori_enable_ddl(cur):
def get_ori_enable_ddl(cur, timeout):
ori_value_str = fetch_ori_enable_ddl(cur)
wait_parameter_sync(cur, 'enable_ddl', ori_value_str)
wait_parameter_sync(cur, 'enable_ddl', ori_value_str, timeout)
ori_value = (ori_value_str == 'True')
return ori_value
@ -132,11 +140,63 @@ def fetch_ori_enable_ddl(cur):
raise e
return ori_value
def wait_parameter_sync(cur, key, value):
sql = """select count(*) as cnt from oceanbase.__all_virtual_sys_parameter_stat
# print version like "x.x.x.x"
def print_version(version):
version = int(version)
major = (version >> 32) & 0xffffffff
minor = (version >> 16) & 0xffff
major_patch = (version >> 8) & 0xff
minor_patch = version & 0xff
version_str = "{0}.{1}.{2}.{3}".format(major, minor, major_patch, minor_patch)
# version str should like "x.x.x.x"
def get_version(version_str):
versions = version_str.split(".")
if len(versions) != 4:
logging.exception("""version:{0} is invalid""".format(version_str))
raise e
major = int(versions[0])
minor = int(versions[1])
major_patch = int(versions[2])
minor_patch = int(versions[3])
if major > 0xffffffff or minor > 0xffff or major_patch > 0xff or minor_patch > 0xff:
logging.exception("""version:{0} is invalid""".format(version_str))
raise e
version = (major << 32) | (minor << 16) | (major_patch << 8) | (minor_patch)
return version
def check_server_version_by_cluster(cur):
sql = """select distinct(substring_index(build_version, '_', 1)) from __all_server""";
logging.info(sql)
cur.execute(sql)
result = cur.fetchall()
if len(result) != 1:
raise MyError("servers build_version not match")
else:
logging.info("check server version success")
def check_parameter(cur, key, value):
sql = """select * from oceanbase.GV$OB_PARAMETERS
where name = '{0}' and value = '{1}'""".format(key, value)
logging.info(sql)
cur.execute(sql)
result = cur.fetchall()
bret = False
if len(result) > 0:
bret = True
else:
bret = False
return bret
def wait_parameter_sync(cur, key, value, timeout):
sql = """select count(*) as cnt from oceanbase.GV$OB_PARAMETERS
where name = '{0}' and value != '{1}'""".format(key, value)
times = 10
while times > 0:
times = (timeout if timeout > 0 else 60) / 5
while times >= 0:
logging.info(sql)
cur.execute(sql)
result = cur.fetchall()
@ -150,11 +210,66 @@ def wait_parameter_sync(cur, key, value):
logging.info("""{0} is not sync, value should be {1}""".format(key, value))
times -= 1
if times == 0:
if times == -1:
logging.exception("""check {0}:{1} sync timeout""".format(key, value))
raise e
time.sleep(5)
def do_begin_upgrade(cur, timeout):
action_sql = "alter system begin upgrade"
rollback_sql = "alter system end upgrade"
if not check_parameter(cur, "enable_upgrade_mode", "True"):
logging.info(action_sql)
cur.execute(action_sql)
wait_parameter_sync(cur, "enable_upgrade_mode", "True", timeout)
global g_succ_sql_list
g_succ_sql_list.append(SqlItem(action_sql, rollback_sql))
def do_begin_rolling_upgrade(cur, timeout):
action_sql = "alter system begin rolling upgrade"
rollback_sql = "alter system end upgrade"
if not check_parameter(cur, "_upgrade_stage", "DBUPGRADE"):
logging.info(action_sql)
cur.execute(action_sql)
wait_parameter_sync(cur, "_upgrade_stage", "DBUPGRADE", timeout)
global g_succ_sql_list
g_succ_sql_list.append(SqlItem(action_sql, rollback_sql))
def do_end_rolling_upgrade(cur, timeout):
current_cluster_version = get_current_cluster_version()
action_sql = "alter system end rolling upgrade"
rollback_sql = "alter system end upgrade"
if not check_parameter(cur, "_upgrade_stage", "POSTUPGRADE") or not check_parameter(cur, "min_observer_version", current_cluster_version):
logging.info(action_sql)
cur.execute(action_sql)
wait_parameter_sync(cur, "min_observer_version", current_data_version, timeout)
wait_parameter_sync(cur, "_upgrade_stage", "POSTUPGRADE", timeout)
global g_succ_sql_list
g_succ_sql_list.append(SqlItem(action_sql, rollback_sql))
def do_end_upgrade(cur, timeout):
action_sql = "alter system end upgrade"
rollback_sql = ""
if not check_parameter(cur, "enable_upgrade_mode", "False"):
logging.info(action_sql)
cur.execute(action_sql)
wait_parameter_sync(cur, "enable_upgrade_mode", "False", timeout)
global g_succ_sql_list
g_succ_sql_list.append(SqlItem(action_sql, rollback_sql))
class Cursor:
__cursor = None
def __init__(self, cursor):
@ -269,14 +384,6 @@ class BaseEachTenantDMLAction():
rollback_sql = self.get_each_tenant_rollback_sql(tenant_id)
self.__dml_cursor.exec_update(action_sql)
g_succ_sql_list.append(SqlItem(action_sql, rollback_sql))
def change_tenant(self, tenant_id):
self._cursor.exec_sql("alter system change tenant tenant_id = {0}".format(tenant_id))
(desc, results) = self._query_cursor.exec_query("select effective_tenant_id()")
if (1 != len(results) or 1 != len(results[0])):
raise MyError("results cnt not match")
elif (tenant_id != results[0][0]):
raise MyError("change tenant failed, effective_tenant_id:{0}, tenant_id:{1}"
.format(results[0][0], tenant_id))
class BaseEachTenantDDLAction():
__dml_cursor = None
@ -321,13 +428,16 @@ def reflect_action_cls_list(action_module, action_name_prefix):
action_cls_list.sort(actions_cls_compare)
return action_cls_list
def fetch_observer_version(query_cur):
(desc, results) = query_cur.exec_query("""select distinct value from __all_virtual_sys_parameter_stat where name='min_observer_version'""")
if len(results) != 1:
def fetch_observer_version(cur):
sql = """select distinct value from __all_virtual_sys_parameter_stat where name='min_observer_version'"""
logging.info(sql)
cur.execute(sql)
result = cur.fetchall()
if len(result) != 1:
raise MyError('query results count is not 1')
else:
logging.info('get observer version success, version = {0}'.format(results[0][0]))
return results[0][0]
logging.info('get observer version success, version = {0}'.format(result[0][0]))
return result[0][0]
def fetch_tenant_ids(query_cur):
try: