diff --git a/go/test/endtoend/backup/vtctlbackup/backup_utils.go b/go/test/endtoend/backup/vtctlbackup/backup_utils.go index 3e79927e1f2..44bbb2b2174 100644 --- a/go/test/endtoend/backup/vtctlbackup/backup_utils.go +++ b/go/test/endtoend/backup/vtctlbackup/backup_utils.go @@ -167,6 +167,7 @@ func LaunchCluster(setupType int, streamMode string, stripes int, cDetails *Comp mysqlShellArgs := []string{ vtutils.GetFlagVariantForTests("--backup-engine-implementation"), "mysqlshell", "--mysql-shell-backup-location", mysqlShellBackupLocation, + "--mysql-shell-speedup-restore=true", } commonTabletArg = append(commonTabletArg, mysqlShellArgs...) } diff --git a/go/vt/mysqlctl/mysqlshellbackupengine.go b/go/vt/mysqlctl/mysqlshellbackupengine.go index 317110d3f80..ac40d9adc17 100644 --- a/go/vt/mysqlctl/mysqlshellbackupengine.go +++ b/go/vt/mysqlctl/mysqlshellbackupengine.go @@ -458,14 +458,21 @@ func (be *MySQLShellBackupEngine) restorePreCheck(ctx context.Context, params Re return false, fmt.Errorf("%w: failed to fetch MySQL version: %v", ErrMySQLShellPreCheck, err) } - capableOf := mysql.ServerVersionCapableOf(version) + _, sv, err := ParseVersionString(version) + if err != nil { + return false, fmt.Errorf("%w: failed to parse MySQL version (version: %s): %v", ErrMySQLShellPreCheck, version, err) + } + + versionStr := fmt.Sprintf("%d.%d.%d", sv.Major, sv.Minor, sv.Patch) + + capableOf := mysql.ServerVersionCapableOf(versionStr) capable, err := capableOf(capabilities.DisableRedoLogFlavorCapability) if err != nil { return false, fmt.Errorf("%w: error checking if server supports disabling redo log: %v", ErrMySQLShellPreCheck, err) } if !capable { - return false, fmt.Errorf("%w: MySQL version doesn't support disabling the redo log (must be >=8.0.21)", ErrMySQLShellPreCheck) + return false, fmt.Errorf("%w: MySQL version doesn't support disabling the redo log (must be >=8.0.21, current version: %s)", ErrMySQLShellPreCheck, versionStr) } } diff --git a/go/vt/mysqlctl/mysqlshellbackupengine_test.go b/go/vt/mysqlctl/mysqlshellbackupengine_test.go index 1f02c86aeea..a005376a758 100644 --- a/go/vt/mysqlctl/mysqlshellbackupengine_test.go +++ b/go/vt/mysqlctl/mysqlshellbackupengine_test.go @@ -159,25 +159,58 @@ func TestMySQLShellBackupRestorePreCheckDisableRedolog(t *testing.T) { mysqlShellSpeedUpRestore = true engine := MySQLShellBackupEngine{} + tests := []struct { + version string + err error + }{ + { + version: "mysqld Ver 5.7.27-0ubuntu0.19.04.1 for Linux on x86_64 ((Ubuntu))", + err: ErrMySQLShellPreCheck, + }, + { + version: "mysqld Ver 5.7.26 for linux-glibc2.12 on x86_64 (MySQL Community Server (GPL))", + err: ErrMySQLShellPreCheck, + }, + { + version: "mysqld Ver 5.7.26-29 for Linux on x86_64 (Percona Server (GPL), Release 29, Revision 11ad961)", + err: ErrMySQLShellPreCheck, + }, + { + version: "mysqld Ver 8.0.16 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)", + err: ErrMySQLShellPreCheck, + }, + { + version: "mysqld Ver 8.0.15-6 for Linux on x86_64 (Percona Server (GPL), Release 6, Revision 63abd08)", + err: ErrMySQLShellPreCheck, + }, + { + version: "mysqld Ver 8.0.42-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))", + err: nil, + }, + { + version: "mysqld Ver 8.0.42-33 for Linux on x86_64 (Percona Server (GPL), Release '33', Revision '9dc49998')", + err: nil, + }, + } + fakedb := fakesqldb.New(t) defer fakedb.Close() - fakeMysqld := NewFakeMysqlDaemon(fakedb) // defaults to 8.0.32 + fakeMysqld := NewFakeMysqlDaemon(fakedb) defer fakeMysqld.Close() params := RestoreParams{ Mysqld: fakeMysqld, } - // this should work as it is supported since 8.0.21 - _, err := engine.restorePreCheck(context.Background(), params) - require.NoError(t, err, params) + for _, tt := range tests { + t.Run(tt.version, func(t *testing.T) { + fakeMysqld.Version = tt.version - // it should error out if we change to an older version - fakeMysqld.Version = "8.0.20" + _, err := engine.restorePreCheck(context.Background(), params) + require.ErrorIs(t, err, tt.err) + }) + } - _, err = engine.restorePreCheck(context.Background(), params) - require.ErrorIs(t, err, ErrMySQLShellPreCheck) - require.ErrorContains(t, err, "doesn't support disabling the redo log") } func TestShouldDrainForBackupMySQLShell(t *testing.T) {