in mysqloperator/controller/innodbcluster/cluster_controller.py [0:0]
def connect_to_cluster(self, logger: Logger, need_primary:bool = False) -> MySQLPod:
# Get list of pods and try to connect to one of them
def try_connect() -> MySQLPod:
last_exc = None
offline_pods = []
all_pods = self.cluster.get_pods()
for pod in all_pods:
if pod.name in offline_pods or pod.deleting:
continue
try:
self.dba = mysqlsh.connect_dba(pod.endpoint_co)
if need_primary:
res = self.dba.session.run_sql(
"SELECT member_role"
" FROM performance_schema.replication_group_members"
" WHERE member_host = @@report_host")
r = res.fetch_one()
if r[0] != "PRIMARY":
logger.info(f"Primary requested, but {pod.name} is no primary")
self.dba.session.close()
continue
except Exception as e:
logger.debug(f"connect_dba: target={pod.name} error={e}")
# Try another pod if we can't connect to it
last_exc = e
continue
try:
self.dba_cluster = self.dba.get_cluster()
logger.info(f"Connected to {pod}")
return pod
except mysqlsh.Error as e:
logger.info(
f"get_cluster() from {pod.name} failed: {e}")
if e.code == errors.SHERR_DBA_BADARG_INSTANCE_NOT_ONLINE:
# This member is not ONLINE, so there's no chance of
# getting a cluster handle from it
offline_pods.append(pod.name)
except Exception as e:
logger.info(
f"get_cluster() from {pod.name} failed: {e}")
# If all pods are connectable but OFFLINE, then we have complete outage and need a reboot
if len(offline_pods) == len(all_pods):
raise kopf.TemporaryError(
"Could not connect to any cluster member", delay=15)
if last_exc:
raise last_exc
raise kopf.TemporaryError(
"Could not connect to any cluster member", delay=15)
return try_connect()