From e5b0640ca84c50c4861ddaa36c7df1145a0debe2 Mon Sep 17 00:00:00 2001 From: "zongfei.fu" Date: Mon, 19 Jun 2023 11:08:40 +0800 Subject: [PATCH] bugfix:When the Master is down, the region or datacenter detects abnormalities, causing the failover to fail --- go/inst/instance_dao.go | 93 +++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/go/inst/instance_dao.go b/go/inst/instance_dao.go index a42ebee4..4c1f7571 100644 --- a/go/inst/instance_dao.go +++ b/go/inst/instance_dao.go @@ -646,6 +646,54 @@ func ReadTopologyInstanceBufferable(instanceKey *InstanceKey, bufferWrites bool, // This can be overriden by later invocation of DetectPhysicalEnvironmentQuery } + // Get datacenter/region etc + func() { + var getMetaWaitGroup sync.WaitGroup + if config.Config.DetectDataCenterQuery != "" && !isMaxScale { + getMetaWaitGroup.Add(1) + go func() { + defer getMetaWaitGroup.Done() + err := db.QueryRow(config.Config.DetectDataCenterQuery).Scan(&instance.DataCenter) + logReadTopologyInstanceError(instanceKey, "DetectDataCenterQuery", err) + }() + } + if config.Config.DetectRegionQuery != "" && !isMaxScale { + getMetaWaitGroup.Add(1) + go func() { + defer getMetaWaitGroup.Done() + err := db.QueryRow(config.Config.DetectRegionQuery).Scan(&instance.Region) + logReadTopologyInstanceError(instanceKey, "DetectRegionQuery", err) + }() + } + if config.Config.DetectPhysicalEnvironmentQuery != "" && !isMaxScale { + getMetaWaitGroup.Add(1) + go func() { + defer getMetaWaitGroup.Done() + err := db.QueryRow(config.Config.DetectPhysicalEnvironmentQuery).Scan(&instance.PhysicalEnvironment) + logReadTopologyInstanceError(instanceKey, "DetectPhysicalEnvironmentQuery", err) + }() + } + + if config.Config.DetectInstanceAliasQuery != "" && !isMaxScale { + getMetaWaitGroup.Add(1) + go func() { + defer getMetaWaitGroup.Done() + err := db.QueryRow(config.Config.DetectInstanceAliasQuery).Scan(&instance.InstanceAlias) + logReadTopologyInstanceError(instanceKey, "DetectInstanceAliasQuery", err) + }() + } + + if config.Config.DetectSemiSyncEnforcedQuery != "" && !isMaxScale { + getMetaWaitGroup.Add(1) + go func() { + defer getMetaWaitGroup.Done() + err := db.QueryRow(config.Config.DetectSemiSyncEnforcedQuery).Scan(&instance.SemiSyncPriority) + logReadTopologyInstanceError(instanceKey, "DetectSemiSyncEnforcedQuery", err) + }() + } + getMetaWaitGroup.Wait() + }() + instance.ReplicationIOThreadState = ReplicationThreadStateNoThread instance.ReplicationSQLThreadState = ReplicationThreadStateNoThread err = sqlutils.QueryRowsMap(db, "show slave status", func(m sqlutils.RowMap) error { @@ -835,51 +883,6 @@ func ReadTopologyInstanceBufferable(instanceKey *InstanceKey, bufferWrites bool, }() } - if config.Config.DetectDataCenterQuery != "" && !isMaxScale { - waitGroup.Add(1) - go func() { - defer waitGroup.Done() - err := db.QueryRow(config.Config.DetectDataCenterQuery).Scan(&instance.DataCenter) - logReadTopologyInstanceError(instanceKey, "DetectDataCenterQuery", err) - }() - } - - if config.Config.DetectRegionQuery != "" && !isMaxScale { - waitGroup.Add(1) - go func() { - defer waitGroup.Done() - err := db.QueryRow(config.Config.DetectRegionQuery).Scan(&instance.Region) - logReadTopologyInstanceError(instanceKey, "DetectRegionQuery", err) - }() - } - - if config.Config.DetectPhysicalEnvironmentQuery != "" && !isMaxScale { - waitGroup.Add(1) - go func() { - defer waitGroup.Done() - err := db.QueryRow(config.Config.DetectPhysicalEnvironmentQuery).Scan(&instance.PhysicalEnvironment) - logReadTopologyInstanceError(instanceKey, "DetectPhysicalEnvironmentQuery", err) - }() - } - - if config.Config.DetectInstanceAliasQuery != "" && !isMaxScale { - waitGroup.Add(1) - go func() { - defer waitGroup.Done() - err := db.QueryRow(config.Config.DetectInstanceAliasQuery).Scan(&instance.InstanceAlias) - logReadTopologyInstanceError(instanceKey, "DetectInstanceAliasQuery", err) - }() - } - - if config.Config.DetectSemiSyncEnforcedQuery != "" && !isMaxScale { - waitGroup.Add(1) - go func() { - defer waitGroup.Done() - err := db.QueryRow(config.Config.DetectSemiSyncEnforcedQuery).Scan(&instance.SemiSyncPriority) - logReadTopologyInstanceError(instanceKey, "DetectSemiSyncEnforcedQuery", err) - }() - } - { latency.Start("backend") err = ReadInstanceClusterAttributes(instance)