Skip to content

Commit 61404dd

Browse files
authored
V2.3.1 (#179)
1 parent 68d897d commit 61404dd

22 files changed

+1146
-49
lines changed

_deploy.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ def from_cluster_config(cls, cluster_config):
299299
if cluster_config.origin_tag:
300300
conf['tag'] = cluster_config.origin_tag
301301
if cluster_config.depends:
302-
conf['depends'] = cluster_config.depends
302+
conf['depends'] = list(cluster_config.depends)
303303
conf = cls._from_cluster_config(conf, cluster_config)
304304
inner_config = cls.extract_inner_config(cluster_config, conf)
305305
return {
@@ -546,6 +546,8 @@ def is_ln_install_mode(self):
546546
return self._deploy_config.is_ln_install_mode()
547547

548548
def apply_inner_config(self, config):
549+
if not isinstance(config, ComponentInnerConfig):
550+
config = ComponentInnerConfig(self.name, {} if config is None else config)
549551
self._inner_config = config
550552
self._clear_cache_server()
551553

@@ -987,7 +989,7 @@ def get_inner_config(component_name):
987989
return inner_config.get_component_config(component_name)
988990
else:
989991
def get_inner_config(component_name):
990-
return {}
992+
return ComponentInnerConfig(component_name, {})
991993

992994
self._inner_config = inner_config
993995
base_dir = self.get_base_dir()

_errno.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,8 @@ class InitDirFailedErrorMessage(object):
184184
EC_OBC_CONNECTION_URL_EMPTY = OBDErrorCodeTemplate(4402, '{server} ob-configserver config error: connection_url is empty')
185185
EC_OBC_CONNECTION_URL_ERROR = OBDErrorCodeTemplate(4402, '{server} ob-configserver config error: connection_url must be an absolute path')
186186
EC_OBC_DATABASE_TYPE_ERROR = OBDErrorCodeTemplate(4402, '{server} ob-configserver config error: database_type can only be set to `mysql` or `sqlite3`, and must be in lowercase. ')
187-
EC_OBC_SQLITE_PERMISSION_DENIED = OBDErrorCodeTemplate(4403, '{ip}: {path}: permission denied.')
188-
EC_OBC_DATABASE_CONNECT_ERROR = OBDErrorCodeTemplate(4404, '{server}: failed to connect to database: {url}')
187+
EC_OBC_SQLITE_PERMISSION_DENIED = OBDErrorCodeTemplate(4403, 'ob-configserver connect to sqlite failed: {ip}: {path}: permission denied.')
188+
EC_OBC_DATABASE_CONNECT_ERROR = OBDErrorCodeTemplate(4404, 'ob-configserver connect to mysql failed: {server}: failed url to connect to database: {url}')
189189

190190

191191

core.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -2510,7 +2510,7 @@ def redeploy_cluster(self, name, search_repo=True, need_confirm=False):
25102510
return False
25112511
if not getattr(self.options, 'ignore_standby', False):
25122512
# check if the current cluster's tenant has a standby tenant in other cluster
2513-
self._call_stdio('start_loading', 'check is exit standby tenant')
2513+
self._call_stdio('start_loading', 'Check for standby tenant')
25142514
connect_plugins = self.search_py_script_plugin(repositories, 'connect')
25152515
get_standbys_plugins = self.search_py_script_plugin(repositories, 'get_standbys', no_found_act='ignore')
25162516
get_deployment_connections_plugins = self.search_py_script_plugin(repositories, 'get_deployment_connections', no_found_act='ignore')
@@ -2580,9 +2580,9 @@ def destroy_cluster(self, name):
25802580
self._call_stdio('error', err.EC_UNEXPECTED_EXCEPTION)
25812581
return False
25822582
if not getattr(self.options, 'ignore_standby', False):
2583-
self._call_stdio('verbose', 'Check exit standby tenant')
2583+
self._call_stdio('verbose', 'Check for standby tenant')
25842584
# check if the current cluster's tenant has a standby tenant in other cluster
2585-
self._call_stdio('start_loading', 'check is exit standby tenant')
2585+
self._call_stdio('start_loading', 'Check for standby tenant')
25862586
connect_plugins = self.search_py_script_plugin(repositories, 'connect')
25872587
get_standbys_plugins = self.search_py_script_plugin(repositories, 'get_standbys', no_found_act='ignore')
25882588
get_deployment_connections_plugins = self.search_py_script_plugin(repositories, 'get_deployment_connections', no_found_act='ignore')
@@ -2954,7 +2954,6 @@ def upgrade_cluster(self, name):
29542954
return False
29552955
upgrade_repositories.append(dest_repository)
29562956

2957-
self.set_repositories(upgrade_repositories)
29582957
upgrade_check_plugins = self.search_py_script_plugin(upgrade_repositories, 'upgrade_check', no_found_act='warn')
29592958
if current_repository in upgrade_check_plugins:
29602959
connect_plugin = self.search_py_script_plugin(upgrade_repositories, 'connect')[current_repository]
@@ -2969,6 +2968,7 @@ def upgrade_cluster(self, name):
29692968
if not self.call_plugin(
29702969
upgrade_check_plugins[current_repository], current_repository,
29712970
current_repository=current_repository,
2971+
upgrade_repositories=upgrade_repositories,
29722972
route=route,
29732973
cursor=cursor
29742974
):

example/all-components-min.yaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
# timeout: ssh connection timeout (second), default 30
88
oceanbase-ce:
99
depends:
10-
ob-configserver
10+
- ob-configserver
1111
servers:
1212
- name: server1
1313
# Please don't use hostname, only IP can be supported
@@ -80,6 +80,7 @@ obproxy-ce:
8080
# When the associated configurations are not done, OBD will automatically get the these configurations from the dependent components.
8181
depends:
8282
- oceanbase-ce
83+
- ob-configserver
8384
servers:
8485
- 172.19.33.6
8586
global:

example/all-components.yaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
# timeout: ssh connection timeout (second), default 30
88
oceanbase-ce:
99
depends:
10-
ob-configserver
10+
- ob-configserver
1111
servers:
1212
- name: server1
1313
# Please don't use hostname, only IP can be supported
@@ -80,6 +80,7 @@ obproxy-ce:
8080
# When the associated configurations are not done, OBD will automatically get the these configurations from the dependent components.
8181
depends:
8282
- oceanbase-ce
83+
- ob-configserver
8384
servers:
8485
- 172.19.33.6
8586
global:

example/ob-configserver/distributed-with-obproxy-and-configserver-example.yaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
# timeout: ssh connection timeout (second), default 30
88
oceanbase-ce:
99
depends:
10-
ob-configserver
10+
- ob-configserver
1111
servers:
1212
- name: server1
1313
# Please don't use hostname, only IP can be supported
@@ -54,6 +54,7 @@ obproxy-ce:
5454
# When the associated configurations are not done, OBD will automatically get the these configurations from the dependent components.
5555
depends:
5656
- oceanbase-ce
57+
- ob-configserver
5758
servers:
5859
- 192.168.1.5
5960
global:

plugins/oceanbase-diagnostic-tool/1.0/gather_all.py

+9-4
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,16 @@
1919

2020

2121
from __future__ import absolute_import, division, print_function
22-
from ssh import LocalClient
22+
23+
import os
2324
import datetime
24-
from tool import TimeUtils
25+
2526
from subprocess import call, Popen, PIPE
27+
28+
from ssh import LocalClient
29+
from tool import TimeUtils
30+
from _rpm import Version
2631
import _errno as err
27-
import os
2832

2933

3034
def gather_all(plugin_context, *args, **kwargs):
@@ -101,7 +105,8 @@ def run():
101105
if not server_config.get('redo_dir'):
102106
server_config['redo_dir'] = server_config['data_dir']
103107
if not server_config.get('slog_dir'):
104-
server_config['slog_dir'] = '%s/slog' % server_config['redo_dir']
108+
mount_key = 'redo_dir' if Version('4.0') > cluster_config.version else 'data_dir'
109+
server_config['slog_dir'] = '%s/slog' % server_config[mount_key]
105110
if not server_config.get('clog_dir'):
106111
server_config['clog_dir'] = '%s/clog' % server_config['redo_dir']
107112
clog_dir = server_config['clog_dir']

plugins/oceanbase-diagnostic-tool/1.0/gather_slog.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,16 @@
1919

2020

2121
from __future__ import absolute_import, division, print_function
22-
from ssh import LocalClient
22+
23+
import os
2324
import datetime
24-
from tool import TimeUtils
25+
2526
from subprocess import call, Popen, PIPE
27+
28+
from ssh import LocalClient
29+
from tool import TimeUtils
30+
from _rpm import Version
2631
import _errno as err
27-
import os
2832

2933

3034
def gather_slog(plugin_context, *args, **kwargs):
@@ -72,7 +76,6 @@ def run():
7276
options = plugin_context.options
7377
obdiag_bin = "obdiag"
7478
cluster_config = plugin_context.cluster_config
75-
cluster_name = cluster_config.name
7679
stdio = plugin_context.stdio
7780
global_conf = cluster_config.get_global_conf()
7881
from_option = get_option('from')
@@ -91,7 +94,8 @@ def run():
9194
if not server_config.get('redo_dir'):
9295
server_config['redo_dir'] = server_config['data_dir']
9396
if not server_config.get('slog_dir'):
94-
server_config['slog_dir'] = '%s/slog' % server_config['redo_dir']
97+
mount_key = 'redo_dir' if Version('4.0') > cluster_config.version else 'data_dir'
98+
server_config['slog_dir'] = '%s/slog' % server_config[mount_key]
9599
data_dir = server_config['slog_dir']
96100

97101
try:

plugins/oceanbase/3.1.0/upgrade_check.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@
2323
import os
2424

2525

26-
def upgrade_check(plugin_context, current_repository, route, cursor, *args, **kwargs):
26+
def upgrade_check(plugin_context, current_repository, upgrade_repositories, route, cursor, *args, **kwargs):
2727

28-
repositories = plugin_context.repositories
2928
options = plugin_context.options
3029
stdio = plugin_context.stdio
3130
cluster_config = plugin_context.cluster_config
@@ -56,7 +55,7 @@ def upgrade_check(plugin_context, current_repository, route, cursor, *args, **kw
5655
while i < n:
5756
cant_use = False
5857
node = route[i]
59-
repository = repositories[i]
58+
repository = upgrade_repositories[i]
6059
stdio.verbose('route %s-%s use %s. file check begin.' % (node.get('version'), node.get('release'), repository))
6160
script_dir = os.path.join(repository.repository_dir, 'etc/direct_upgrade') if node.get('direct_upgrade') else os.path.join(repository.repository_dir, 'etc')
6261
if skip_check is False:

plugins/oceanbase/3.1.0/upgrade_route.py

+2
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ def get_node(self, repository):
106106

107107
def findShortestUpgradePath(self, current_repository, dest_repository, stdio):
108108
start_node = self.get_node(current_repository)
109+
if not start_node:
110+
return
109111
queue = [start_node]
110112
visited = set([start_node])
111113
finalNode = None

plugins/oceanbase/4.0.0.0/create_tenant.py

+24-10
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@
2323

2424
import re
2525
import time
26+
from collections import defaultdict
2627

2728
from _errno import EC_OBSERVER_CAN_NOT_MIGRATE_IN
2829

29-
tenant_cursor = None
30+
tenant_cursor_cache = defaultdict(dict)
3031

3132

3233
def parse_size(size):
@@ -57,16 +58,29 @@ def format_size(size, precision=1):
5758
return format % (size, units[idx])
5859

5960

60-
def exec_sql_in_tenant(sql, cursor, tenant, mode, retries=10):
61-
global tenant_cursor
62-
if not tenant_cursor:
61+
def exec_sql_in_tenant(sql, cursor, tenant, mode, user='', password='', print_exception=True, retries=20):
62+
if not user:
6363
user = 'SYS' if mode == 'oracle' else 'root'
64-
tenant_cursor = cursor.new_cursor(tenant=tenant, user=user)
65-
if not tenant_cursor and retries:
66-
retries -= 1
67-
time.sleep(2)
68-
return exec_sql_in_tenant(sql, cursor, tenant, mode, retries)
69-
return tenant_cursor.execute(sql)
64+
# find tenant ip, port
65+
tenant_cursor = None
66+
if cursor in tenant_cursor_cache and tenant in tenant_cursor_cache[cursor] and user in tenant_cursor_cache[cursor][tenant]:
67+
tenant_cursor = tenant_cursor_cache[cursor][tenant][user]
68+
else:
69+
query_sql = "select a.SVR_IP,c.SQL_PORT from oceanbase.DBA_OB_UNITS as a, oceanbase.DBA_OB_TENANTS as b, oceanbase.DBA_OB_SERVERS as c where a.TENANT_ID=b.TENANT_ID and a.SVR_IP=c.SVR_IP and a.svr_port=c.SVR_PORT and TENANT_NAME=%s"
70+
tenant_server_ports = cursor.fetchall(query_sql, (tenant, ), raise_exception=False, exc_level='verbose')
71+
for tenant_server_port in tenant_server_ports:
72+
tenant_ip = tenant_server_port['SVR_IP']
73+
tenant_port = tenant_server_port['SQL_PORT']
74+
tenant_cursor = cursor.new_cursor(tenant=tenant, user=user, password=password, ip=tenant_ip, port=tenant_port, print_exception=print_exception)
75+
if tenant_cursor:
76+
if tenant not in tenant_cursor_cache[cursor]:
77+
tenant_cursor_cache[cursor][tenant] = {}
78+
tenant_cursor_cache[cursor][tenant][user] = tenant_cursor
79+
break
80+
if not tenant_cursor and retries:
81+
time.sleep(1)
82+
return exec_sql_in_tenant(sql, cursor, tenant, mode, user, password, print_exception=print_exception, retries=retries-1)
83+
return tenant_cursor.execute(sql, raise_exception=False, exc_level='verbose') if tenant_cursor else False
7084

7185

7286
def create_tenant(plugin_context, cursor, create_tenant_options=None, *args, **kwargs):

plugins/oceanbase/4.0.0.0/start_check.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ def system_memory_check():
264264
if not server_config.get('ilog_dir'):
265265
server_config['ilog_dir'] = '%s/ilog' % server_config['redo_dir']
266266
if not server_config.get('slog_dir'):
267-
server_config['slog_dir'] = '%s/slog' % server_config['redo_dir']
267+
server_config['slog_dir'] = '%s/slog' % server_config['data_dir']
268268
if server_config['redo_dir'] == server_config['data_dir']:
269269
keys = ['home_path', 'data_dir', 'clog_dir', 'ilog_dir', 'slog_dir']
270270
else:

plugins/oceanbase/4.0.0.0/upgrade_check.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@
2323
import os
2424

2525

26-
def upgrade_check(plugin_context, current_repository, route, cursor, *args, **kwargs):
26+
def upgrade_check(plugin_context, current_repository, upgrade_repositories, route, cursor, *args, **kwargs):
2727

28-
repositories = plugin_context.repositories
2928
options = plugin_context.options
3029
stdio = plugin_context.stdio
3130
cluster_config = plugin_context.cluster_config
@@ -41,14 +40,14 @@ def upgrade_check(plugin_context, current_repository, route, cursor, *args, **kw
4140
zones.add(zone)
4241

4342
if len(zones) > 2:
44-
tenants = cursor.fetchall("""select a.tenant_name, a.tenant_id, zone_list from oceanbase.DBA_OB_TENANTS as a left join (
43+
tenants = cursor.fetchall("""select a.tenant_name, a.tenant_id, group_concat(zone_list separator ';') as zone_list from oceanbase.DBA_OB_TENANTS as a left join (
4544
select zone_list, tenant_id from oceanbase.DBA_OB_RESOURCE_POOLS ) as b
46-
on a.tenant_id = b.tenant_id where a.tenant_name not like 'META$%'""")
45+
on a.tenant_id = b.tenant_id where a.tenant_name not like 'META$%' group by tenant_id""")
4746
if tenants is False:
4847
return
4948
for tenant in tenants:
5049
zone_list = tenant.get('zone_list', '').split(';')
51-
if len(zone_list) < 3:
50+
if len(set(zone_list)) < 3:
5251
stdio.error('Tenant %s does not meet rolling upgrade conditions (zone number greater than 2).' % tenant.get('tenant_name'))
5352
return
5453

@@ -57,7 +56,7 @@ def upgrade_check(plugin_context, current_repository, route, cursor, *args, **kw
5756
while i < n:
5857
cant_use = False
5958
node = route[i]
60-
repository = repositories[i]
59+
repository = upgrade_repositories[i]
6160
stdio.verbose('route %s-%s use %s. file check begin.' % (node.get('version'), node.get('release'), repository))
6261
script_dir = os.path.join(repository.repository_dir, 'etc/direct_upgrade') if node.get('direct_upgrade') else os.path.join(repository.repository_dir, 'etc')
6362
if skip_check is False:

plugins/oceanbase/4.0.0.0/upgrade_route.py

+2
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ def get_node(self, repository):
106106

107107
def findShortestUpgradePath(self, current_repository, dest_repository, stdio):
108108
start_node = self.get_node(current_repository)
109+
if not start_node:
110+
return
109111
queue = [start_node]
110112
visited = set([start_node])
111113
finalNode = None

plugins/oceanbase/4.2.0.0/start_check.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ def system_memory_check():
264264
if not server_config.get('ilog_dir'):
265265
server_config['ilog_dir'] = '%s/ilog' % server_config['redo_dir']
266266
if not server_config.get('slog_dir'):
267-
server_config['slog_dir'] = '%s/slog' % server_config['redo_dir']
267+
server_config['slog_dir'] = '%s/slog' % server_config['data_dir']
268268
if server_config['redo_dir'] == server_config['data_dir']:
269269
keys = ['home_path', 'data_dir', 'clog_dir', 'ilog_dir', 'slog_dir']
270270
else:

plugins/oceanbase/4.2.0.0/upgrade_check.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@
2626
from _stdio import FormtatText
2727

2828

29-
def upgrade_check(plugin_context, current_repository, route, cursor, *args, **kwargs):
30-
repositories = plugin_context.repositories
29+
def upgrade_check(plugin_context, current_repository, upgrade_repositories, route, cursor, *args, **kwargs):
3130
options = plugin_context.options
3231
stdio = plugin_context.stdio
3332
cluster_config = plugin_context.cluster_config
@@ -58,14 +57,14 @@ def upgrade_check(plugin_context, current_repository, route, cursor, *args, **kw
5857
zones.add(zone)
5958

6059
if len(zones) > 2:
61-
tenants = cursor.fetchall("""select a.tenant_name, a.tenant_id, zone_list from oceanbase.DBA_OB_TENANTS as a left join (
60+
tenants = cursor.fetchall("""select a.tenant_name, a.tenant_id, group_concat(zone_list separator ';') as zone_list from oceanbase.DBA_OB_TENANTS as a left join (
6261
select zone_list, tenant_id from oceanbase.DBA_OB_RESOURCE_POOLS ) as b
63-
on a.tenant_id = b.tenant_id where a.tenant_name not like 'META$%'""")
62+
on a.tenant_id = b.tenant_id where a.tenant_name not like 'META$%' group by tenant_id""")
6463
if tenants is False:
6564
return
6665
for tenant in tenants:
6766
zone_list = tenant.get('zone_list', '').split(';')
68-
if len(zone_list) < 3:
67+
if len(set(zone_list)) < 3:
6968
stdio.error('Tenant %s does not meet rolling upgrade conditions (zone number greater than 2).' % tenant.get('tenant_name'))
7069
return
7170

@@ -74,7 +73,7 @@ def upgrade_check(plugin_context, current_repository, route, cursor, *args, **kw
7473
while i < n:
7574
cant_use = False
7675
node = route[i]
77-
repository = repositories[i]
76+
repository = upgrade_repositories[i]
7877
stdio.verbose('route %s-%s use %s. file check begin.' % (node.get('version'), node.get('release'), repository))
7978
script_dir = os.path.join(repository.repository_dir, 'etc/direct_upgrade') if node.get('direct_upgrade') else os.path.join(repository.repository_dir, 'etc')
8079
if skip_check is False:

plugins/ocp-express/1.0.1/connect.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
import _errno as err
2727

2828

29+
class ConnectCursor(dict):
30+
def close(self):
31+
pass
32+
33+
2934
class OcpExpressCursor(object):
3035

3136
class Response(object):
@@ -88,7 +93,7 @@ def connect(plugin_context, target_server=None, *args, **kwargs):
8893
else:
8994
servers = cluster_config.servers
9095
stdio.start_loading('Connect to ocp-express')
91-
cursors = {}
96+
cursors = ConnectCursor()
9297
for server in servers:
9398
config = cluster_config.get_server_conf(server)
9499
username = 'system'

0 commit comments

Comments
 (0)