@@ -21,7 +21,6 @@ import (
2121 "database/sql"
2222 "errors"
2323 "fmt"
24- "github.com/go-sql-driver/mysql"
2524 "regexp"
2625 "runtime"
2726 "sort"
@@ -30,6 +29,8 @@ import (
3029 "sync"
3130 "time"
3231
32+ "github.com/go-sql-driver/mysql"
33+
3334 "github.com/openark/golib/log"
3435 "github.com/openark/golib/math"
3536 "github.com/openark/golib/sqlutils"
@@ -463,20 +464,54 @@ func ReadTopologyInstanceBufferable(instanceKey *InstanceKey, bufferWrites bool,
463464 defer waitGroup .Done ()
464465 semiSyncMasterPluginLoaded := false
465466 semiSyncReplicaPluginLoaded := false
467+ instance .SemiSyncAvailable = false
468+
466469 err := sqlutils .QueryRowsMap (db , "show global variables like 'rpl_semi_sync_%'" , func (m sqlutils.RowMap ) error {
467- if m .GetString ("Variable_name" ) == "rpl_semi_sync_master_enabled" {
470+ variableName := m .GetString ("Variable_name" )
471+ // Learn if semi-sync plugin is loaded and what is its version
472+ if variableName == "rpl_semi_sync_master_enabled" {
468473 instance .SemiSyncMasterEnabled = (m .GetString ("Value" ) == "ON" )
469474 semiSyncMasterPluginLoaded = true
470- } else if m .GetString ("Variable_name" ) == "rpl_semi_sync_master_timeout" {
471- instance .SemiSyncMasterTimeout = m .GetUint64 ("Value" )
472- } else if m .GetString ("Variable_name" ) == "rpl_semi_sync_master_wait_for_slave_count" {
473- instance .SemiSyncMasterWaitForReplicaCount = m .GetUint ("Value" )
474- } else if m .GetString ("Variable_name" ) == "rpl_semi_sync_slave_enabled" {
475+ instance .SemiSyncMasterPluginNewVersion = false
476+ } else if variableName == "rpl_semi_sync_source_enabled" {
477+ instance .SemiSyncMasterEnabled = (m .GetString ("Value" ) == "ON" )
478+ semiSyncMasterPluginLoaded = true
479+ instance .SemiSyncMasterPluginNewVersion = true
480+ } else if variableName == "rpl_semi_sync_slave_enabled" {
475481 instance .SemiSyncReplicaEnabled = (m .GetString ("Value" ) == "ON" )
476482 semiSyncReplicaPluginLoaded = true
483+ instance .SemiSyncReplicaPluginNewVersion = false
484+ } else if variableName == "rpl_semi_sync_replica_enabled" {
485+ instance .SemiSyncReplicaEnabled = (m .GetString ("Value" ) == "ON" )
486+ semiSyncReplicaPluginLoaded = true
487+ instance .SemiSyncReplicaPluginNewVersion = true
488+ } else {
489+ // additional info
490+ matched , regexperr := regexp .MatchString ("^rpl_semi_sync_(master|source)_timeout$" , variableName )
491+ if regexperr != nil {
492+ return regexperr
493+ }
494+ if matched {
495+ instance .SemiSyncMasterTimeout = m .GetUint64 ("Value" )
496+ return nil
497+ }
498+
499+ matched , regexperr = regexp .MatchString ("^rpl_semi_sync_(master|source)_wait_for_(slave|replica)_count$" , variableName )
500+ if regexperr != nil {
501+ return regexperr
502+ }
503+ if matched {
504+ instance .SemiSyncMasterWaitForReplicaCount = m .GetUint ("Value" )
505+ return nil
506+ }
477507 }
478508 return nil
479509 })
510+ if err != nil {
511+ errorChan <- err
512+ return
513+ }
514+
480515 instance .SemiSyncAvailable = (semiSyncMasterPluginLoaded && semiSyncReplicaPluginLoaded )
481516 errorChan <- err
482517 }()
@@ -486,14 +521,32 @@ func ReadTopologyInstanceBufferable(instanceKey *InstanceKey, bufferWrites bool,
486521 go func () {
487522 defer waitGroup .Done ()
488523 err := sqlutils .QueryRowsMap (db , "show global status like 'rpl_semi_sync_%'" , func (m sqlutils.RowMap ) error {
489- if m .GetString ("Variable_name" ) == "Rpl_semi_sync_master_status" {
524+ variableName := m .GetString ("Variable_name" )
525+ matched , regexperr := regexp .MatchString ("^Rpl_semi_sync_(master|source)_status$" , variableName )
526+ if regexperr != nil {
527+ return regexperr
528+ }
529+ if matched {
490530 instance .SemiSyncMasterStatus = (m .GetString ("Value" ) == "ON" )
491- } else if m .GetString ("Variable_name" ) == "Rpl_semi_sync_master_clients" {
531+ return nil
532+ }
533+
534+ matched , regexperr = regexp .MatchString ("^Rpl_semi_sync_(master|source)_clients$" , variableName )
535+ if regexperr != nil {
536+ return regexperr
537+ }
538+ if matched {
492539 instance .SemiSyncMasterClients = m .GetUint ("Value" )
493- } else if m .GetString ("Variable_name" ) == "Rpl_semi_sync_slave_status" {
494- instance .SemiSyncReplicaStatus = (m .GetString ("Value" ) == "ON" )
540+ return nil
495541 }
496542
543+ matched , regexperr = regexp .MatchString ("^Rpl_semi_sync_(slave|replica)_status$" , variableName )
544+ if regexperr != nil {
545+ return regexperr
546+ }
547+ if matched {
548+ instance .SemiSyncReplicaStatus = (m .GetString ("Value" ) == "ON" )
549+ }
497550 return nil
498551 })
499552 errorChan <- err
0 commit comments