Skip to content

Commit cfc3e5b

Browse files
alantang888prydie
authored andcommitted
Keep mysql readonly after exit group unintentionally (oracle#261)
Since mysql version >= 8.0.12, <= 8.0.15 changed default behavior to `ABORT_SERVER`. Which will shutdown the server after exit group unintentionally. It should better change server to `READ_ONLY` instead of exit. Future version MySQL also change this behavior back to `READ_ONLY` https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html#sysvar_group_replication_exit_state_action Signed-off-by: Alan Tang <alantang888@gmail.com>
1 parent c98210b commit cfc3e5b

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

pkg/resources/statefulsets/statefulset.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import (
3333
operatoropts "github.com/oracle/mysql-operator/pkg/options/operator"
3434
"github.com/oracle/mysql-operator/pkg/resources/secrets"
3535
"github.com/oracle/mysql-operator/pkg/version"
36+
37+
"github.com/coreos/go-semver/semver"
3638
)
3739

3840
const (
@@ -48,6 +50,8 @@ const (
4850
mySQLSSLVolumeName = "mysqlsslvolume"
4951

5052
replicationGroupPort = 13306
53+
54+
minMysqlVersionWithGroupExitStateArgs = "8.0.12"
5155
)
5256

5357
func volumeMounts(cluster *v1alpha1.Cluster) []v1.VolumeMount {
@@ -155,6 +159,26 @@ func getReplicationGroupSeeds(name string, members int) string {
155159
return strings.Join(seeds, ",")
156160
}
157161

162+
func checkSupportGroupExitStateArgs(deployingVersion string) (supportedVer bool) {
163+
defer func() {
164+
if r := recover(); r != nil {
165+
166+
}
167+
}()
168+
169+
supportedVer = false
170+
171+
ver := semver.New(deployingVersion)
172+
minVer := semver.New(minMysqlVersionWithGroupExitStateArgs)
173+
174+
if ver.LessThan(*minVer) {
175+
return
176+
}
177+
178+
supportedVer = true
179+
return
180+
}
181+
158182
// Builds the MySQL operator container for a cluster.
159183
// The 'mysqlImage' parameter is the image name of the mysql server to use with
160184
// no version information.. e.g. 'mysql/mysql-server'
@@ -184,6 +208,10 @@ func mysqlServerContainer(cluster *v1alpha1.Cluster, mysqlServerImage string, ro
184208
"--ssl-key=/etc/ssl/mysql/tls.key")
185209
}
186210

211+
if checkSupportGroupExitStateArgs(cluster.Spec.Version) {
212+
args = append(args, "--loose-group-replication-exit-state-action=READ_ONLY")
213+
}
214+
187215
entryPointArgs := strings.Join(args, " ")
188216

189217
cmd := fmt.Sprintf(`

pkg/resources/statefulsets/statefulset_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,3 +323,37 @@ func TestClusterDefaultOverride(t *testing.T) {
323323

324324
assert.Equal(t, "OverrideDefaultImage:"+v1alpha1.DefaultVersion, si)
325325
}
326+
327+
func TestClusterSetGroupExitStateArgs(t *testing.T) {
328+
cluster := &v1alpha1.Cluster{}
329+
cluster.EnsureDefaults()
330+
cluster.Spec.Version = "8.0.12"
331+
332+
statefulSet := NewForCluster(cluster, mockOperatorConfig().Images, "mycluster")
333+
334+
cmd := statefulSet.Spec.Template.Spec.Containers[0].Command[2]
335+
336+
assert.Contains(t, cmd, "--loose-group-replication-exit-state-action=READ_ONLY")
337+
338+
cluster2 := &v1alpha1.Cluster{}
339+
cluster2.EnsureDefaults()
340+
cluster2.Spec.Version = "8.0.13"
341+
342+
statefulSet2 := NewForCluster(cluster2, mockOperatorConfig().Images, "mycluster")
343+
344+
cmd2 := statefulSet2.Spec.Template.Spec.Containers[0].Command[2]
345+
346+
assert.Contains(t, cmd2, "--loose-group-replication-exit-state-action=READ_ONLY")
347+
}
348+
349+
func TestClusterNotSetGroupExitStateArgs(t *testing.T) {
350+
cluster := &v1alpha1.Cluster{}
351+
cluster.EnsureDefaults()
352+
cluster.Spec.Version = "8.0.11"
353+
354+
statefulSet := NewForCluster(cluster, mockOperatorConfig().Images, "mycluster")
355+
356+
cmd := statefulSet.Spec.Template.Spec.Containers[0].Command[2]
357+
358+
assert.NotContains(t, cmd, "--loose-group-replication-exit-state-action=READ_ONLY")
359+
}

0 commit comments

Comments
 (0)