Skip to content

Commit 89dbaa8

Browse files
authored
Merge pull request #1077 from signal18/bug#1076
Add super-read-only in freezing workload #1076
2 parents d6ec9bc + eb04225 commit 89dbaa8

File tree

9 files changed

+77
-6
lines changed

9 files changed

+77
-6
lines changed

cluster/cluster_fail.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -365,13 +365,14 @@ func (cluster *Cluster) MasterFailover(fail bool) bool {
365365
}
366366

367367
if cluster.Conf.SwitchDecreaseMaxConn {
368-
369368
logs, err := dbhelper.SetMaxConnections(cluster.oldMaster.Conn, cluster.oldMaster.maxConn, cluster.oldMaster.DBVersion)
370369
cluster.LogSQL(logs, err, cluster.oldMaster.URL, "MasterFailover", config.LvlErr, "Could not set max connection, %s", err)
371-
370+
}
371+
if cluster.Conf.SwitchLockUserOnFreeze {
372+
err = cluster.oldMaster.UnLockUsers()
373+
cluster.LogSQL(logs, err, cluster.oldMaster.URL, "MasterFailover", config.LvlErr, "Could not unlock users, %s", err)
372374
}
373375
// Add the old master to the slaves list
374-
375376
cluster.oldMaster.SetState(stateSlave)
376377
if cluster.Conf.MultiMaster == false {
377378
cluster.slaves = append(cluster.slaves, cluster.oldMaster)

cluster/cluster_set.go

+4
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,10 @@ func (cluster *Cluster) SetSwitchSync(check bool) {
823823
cluster.Conf.SwitchSync = check
824824
}
825825

826+
func (cluster *Cluster) SetSwitchoverLockUserOnFreeze(check bool) {
827+
cluster.Conf.SwitchLockUserOnFreeze = check
828+
}
829+
826830
func (cluster *Cluster) SetLogLevel(level int) {
827831
cluster.Conf.LogLevel = level
828832
}

cluster/cluster_tgl.go

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ import (
1313
"github.com/signal18/replication-manager/config"
1414
)
1515

16+
func (cluster *Cluster) SwitchSwitchoverLockUserOnFreeze() {
17+
cluster.Conf.SwitchLockUserOnFreeze = !cluster.Conf.SwitchLockUserOnFreeze
18+
}
19+
1620
func (cluster *Cluster) SwitchForceSlaveNoGtid() {
1721
cluster.Conf.ForceSlaveNoGtid = !cluster.Conf.ForceSlaveNoGtid
1822
}

cluster/srv.go

+36-1
Original file line numberDiff line numberDiff line change
@@ -1109,11 +1109,16 @@ func (server *ServerMonitor) freeze() bool {
11091109
logs, err := server.StopAllSlaves()
11101110
cluster.LogSQL(logs, err, server.URL, "Freeze", config.LvlErr, "Could not stop replicas source on %s ", server.URL)
11111111
cluster.LogModulePrintf(cluster.Conf.Verbose, config.ConstLogModGeneral, config.LvlInfo, "Freezing writes set read only on %s", server.URL)
1112-
logs, err = dbhelper.SetReadOnly(server.Conn, true)
1112+
logs, err = server.SetReadOnly()
11131113
cluster.LogSQL(logs, err, server.URL, "Freeze", config.LvlInfo, "Could not set %s as read-only: %s", server.URL, err)
11141114
if err != nil {
11151115
return false
11161116
}
1117+
if cluster.Conf.SwitchLockUserOnFreeze {
1118+
cluster.LogModulePrintf(cluster.Conf.Verbose, config.ConstLogModGeneral, config.LvlInfo, "Freezing writes locking users %s", server.URL)
1119+
err = server.LockUsers()
1120+
cluster.LogSQL(logs, err, server.URL, "Freeze", config.LvlErr, "Could not lock all users %s : %s", server.URL, err)
1121+
}
11171122
for i := cluster.Conf.SwitchWaitKill; i > 0; i -= 500 {
11181123
threads, logs, err := dbhelper.CheckLongRunningWrites(server.Conn, 0)
11191124
cluster.LogSQL(logs, err, server.URL, "Freeze", config.LvlErr, "Could not check long running writes %s as read-only: %s", server.URL, err)
@@ -1467,6 +1472,36 @@ func (server *ServerMonitor) UnInstallPlugin(name string) error {
14671472
return nil
14681473
}
14691474

1475+
func (server *ServerMonitor) LockUsers() error {
1476+
query := ""
1477+
cluster := server.ClusterGroup
1478+
for _, u := range server.Users.ToNewMap() {
1479+
if u.User != cluster.GetDbUser() && u.User != cluster.GetRplUser() && u.User != "root" {
1480+
query = "ALTER USER '" + u.User + "'@'" + u.Host + "' ACCOUNT LOCK"
1481+
err := server.ExecQueryNoBinLog(query, 5*time.Second)
1482+
if err != nil {
1483+
return err
1484+
}
1485+
}
1486+
}
1487+
return nil
1488+
}
1489+
1490+
func (server *ServerMonitor) UnLockUsers() error {
1491+
query := ""
1492+
cluster := server.ClusterGroup
1493+
for _, u := range server.Users.ToNewMap() {
1494+
if u.User != cluster.GetDbUser() && u.User != cluster.GetRplUser() && u.User != "root" {
1495+
query = "ALTER USER '" + u.User + "'@'" + u.Host + "' ACCOUNT UNLOCK"
1496+
err := server.ExecQueryNoBinLog(query, 5*time.Second)
1497+
if err != nil {
1498+
return err
1499+
}
1500+
}
1501+
}
1502+
return nil
1503+
}
1504+
14701505
func (server *ServerMonitor) Capture(cstate *state.CapturedState) error {
14711506
cluster := server.ClusterGroup
14721507
if server.InCaptureMode {

cluster/srv_job.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1210,7 +1210,7 @@ func (server *ServerMonitor) JobsCheckRunning() error {
12101210
}
12111211

12121212
if server.Conn == nil {
1213-
return fmt.Errorf("No connection pool on %s: %s", server.URL)
1213+
return fmt.Errorf("No connection pool on %s", server.URL)
12141214
}
12151215

12161216
Conn, err := server.GetConnNoBinlog(server.Conn)

config/config.go

+2
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ type Config struct {
206206
SwitchSlaveWaitRouteChange int `mapstructure:"switchover-wait-route-change" toml:"switchover-wait-route-change" json:"switchoverWaitRouteChange"`
207207
SwitchDecreaseMaxConn bool `mapstructure:"switchover-decrease-max-conn" toml:"switchover-decrease-max-conn" json:"switchoverDecreaseMaxConn"`
208208
SwitchDecreaseMaxConnValue int64 `mapstructure:"switchover-decrease-max-conn-value" toml:"switchover-decrease-max-conn-value" json:"switchoverDecreaseMaxConnValue"`
209+
SwitchLockUserOnFreeze bool `mapstructure:"switchover-lock-user-on-freeze" toml:"switchover-lock-user-on-freeze" json:"switchoverLockUserOnFreeze"`
210+
SwitchRedirectOnFreeze bool `mapstructure:"switchover-redirect-on-freeze" toml:"switchover-redirect-on-freeze" json:"switchoverRedirectOnFreeze"`
209211
FailLimit int `mapstructure:"failover-limit" toml:"failover-limit" json:"failoverLimit"`
210212
PreScript string `mapstructure:"failover-pre-script" toml:"failover-pre-script" json:"failoverPreScript"`
211213
PostScript string `mapstructure:"failover-post-script" toml:"failover-post-script" json:"failoverPostScript"`

server/api_cluster.go

+4
Original file line numberDiff line numberDiff line change
@@ -2072,6 +2072,8 @@ func (repman *ReplicationManager) switchClusterSettings(mycluster *cluster.Clust
20722072
mycluster.SwitchRejoinForceRestore()
20732073
case "switchover-at-sync":
20742074
mycluster.SwitchSwitchoverSync()
2075+
case "switchover-lock-user-on-freeze":
2076+
mycluster.SwitchSwitchoverLockUserOnFreeze()
20752077
case "check-replication-filters":
20762078
mycluster.SwitchCheckReplicationFilters()
20772079
case "check-replication-state":
@@ -3015,6 +3017,8 @@ func (repman *ReplicationManager) setClusterSetting(mycluster *cluster.Cluster,
30153017
mycluster.Conf.AutorejoinForceRestore = isactive
30163018
case "switchover-at-sync":
30173019
mycluster.Conf.SwitchSync = isactive
3020+
case "switchover-lock-user-on-freeze":
3021+
mycluster.Conf.SwitchLockUserOnFreeze = isactive
30183022
case "check-replication-filters":
30193023
mycluster.Conf.CheckReplFilter = isactive
30203024
case "check-replication-state":

server/server.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,9 @@ func (repman *ReplicationManager) AddFlags(flags *pflag.FlagSet, conf *config.Co
420420
flags.BoolVar(&conf.SwitchSync, "switchover-at-sync", false, "Switchover Only when state semisync is sync for last status")
421421
flags.BoolVar(&conf.SwitchGtidCheck, "switchover-at-equal-gtid", false, "Switchover only when slaves are fully in sync")
422422
flags.BoolVar(&conf.SwitchSlaveWaitCatch, "switchover-slave-wait-catch", true, "Switchover wait for slave to catch with replication, not needed in GTID mode but enable to detect possible issues like witing on old master")
423+
flags.BoolVar(&conf.SwitchLockUserOnFreeze, "switchover-lock-user-on-freeze", false, "Switchover lock all non replication-manager users on freeze")
424+
// flags.BoolVar(&conf.SwitchRedirectOnFreeze, "switchover-redirect-on-freeze", false, "Switchover redirect traffic to dummy")
425+
423426
flags.BoolVar(&conf.SwitchDecreaseMaxConn, "switchover-decrease-max-conn", true, "Switchover decrease max connection on old master")
424427
flags.BoolVar(&conf.SwitchoverCopyOldLeaderGtid, "switchover-copy-old-leader-gtid", false, "Switchover copy old leader GTID")
425428
flags.Int64Var(&conf.SwitchDecreaseMaxConnValue, "switchover-decrease-max-conn-value", 10, "Switchover decrease max connection to this value different according to flavor")
@@ -788,7 +791,7 @@ func (repman *ReplicationManager) AddFlags(flags *pflag.FlagSet, conf *config.Co
788791
flags.StringVar(&conf.BackupMyLoaderPath, "backup-myloader-path", "/usr/bin/myloader", "Path to myloader binary")
789792
flags.StringVar(&conf.BackupMyLoaderOptions, "backup-myloader-options", "--overwrite-tables --verbose=3", "Extra options")
790793
flags.StringVar(&conf.BackupMyDumperOptions, "backup-mydumper-options", "--chunk-filesize=1000 --compress --less-locking --verbose=3 --triggers --routines --events --trx-consistency-only --kill-long-queries", "Extra options")
791-
flags.StringVar(&conf.BackupMyDumperRegex, "backup-mydumper-regex", `^(?!(sys\.|performance_schema\.|information_schema\.|replication_manager_schema\.jobs$))`, "Mydumper regex for backup")
794+
flags.StringVar(&conf.BackupMyDumperRegex, "backup-mydumper-regex", `^(?!(sys\.|performance_schema\.|information_schema\.|replication_manager_schema\.jobs|mysql\.gtid_slave_pos$))`, "Mydumper regex for backup")
792795
flags.StringVar(&conf.BackupMysqldumpPath, "backup-mysqldump-path", "", "Path to mysqldump binary")
793796
flags.StringVar(&conf.BackupMysqldumpOptions, "backup-mysqldump-options", "--hex-blob --single-transaction --verbose --all-databases --routines=true --triggers=true --system=all", "Extra options")
794797
flags.StringVar(&conf.BackupMysqlbinlogPath, "backup-mysqlbinlog-path", "", "Path to mysqlbinlog binary")

share/dashboard_react/src/Pages/Settings/RepFailOverSettings.jsx

+18
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,24 @@ function RepFailOverSettings({ selectedCluster, user, openConfirmModal, closeCon
227227
/>
228228
)
229229
},
230+
{
231+
key: 'Switchover lock users on freeze workload ',
232+
value: (
233+
<RMSwitch
234+
confirmTitle={'Confirm switch settings for sswitchover-lock-user-on-freeze?'}
235+
onChange={() =>
236+
dispatch(
237+
switchSetting({
238+
clusterName: selectedCluster?.name,
239+
setting: 'switchover-lock-user-on-freeze'
240+
})
241+
)
242+
}
243+
isDisabled={user?.grants['cluster-settings'] == false}
244+
isChecked={selectedCluster?.config?.switchLockUserOnFreeze}
245+
/>
246+
)
247+
},
230248
{
231249
key: 'Switchover replication maximum delay',
232250
value: (

0 commit comments

Comments
 (0)