Skip to content

Commit

Permalink
VReplication workflows: retry "wrong tablet type" errors (#16645)
Browse files Browse the repository at this point in the history
Signed-off-by: Rohit Nayak <[email protected]>
  • Loading branch information
rohit-nayak-ps authored Aug 26, 2024
1 parent 7e9bf4c commit d1d6bd8
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 1 deletion.
7 changes: 6 additions & 1 deletion go/vt/vttablet/tabletmanager/vreplication/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,12 @@ func isUnrecoverableError(err error) bool {
if err == nil {
return false
}
if vterrors.Code(err) == vtrpcpb.Code_FAILED_PRECONDITION {
switch vterrors.Code(err) {
case vtrpcpb.Code_FAILED_PRECONDITION:
if vterrors.RxWrongTablet.MatchString(err.Error()) {
// If the chosen tablet type picked changes, say due to PRS/ERS, we should retry.
return false
}
return true
}
sqlErr, isSQLErr := sqlerror.NewSQLErrorFromError(err).(*sqlerror.SQLError)
Expand Down
61 changes: 61 additions & 0 deletions go/vt/vttablet/tabletmanager/vreplication/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,21 @@ limitations under the License.
package vreplication

import (
"errors"
"fmt"
"strings"
"testing"

"github.com/stretchr/testify/require"

"vitess.io/vitess/go/mysql/sqlerror"
"vitess.io/vitess/go/sqltypes"
"vitess.io/vitess/go/textutil"
"vitess.io/vitess/go/vt/binlog/binlogplayer"
"vitess.io/vitess/go/vt/vterrors"

binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata"
vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc"
)

func TestInsertLogTruncation(t *testing.T) {
Expand Down Expand Up @@ -97,3 +101,60 @@ func TestInsertLogTruncation(t *testing.T) {
})
}
}

// TestIsUnrecoverableError tests the different error cases for isUnrecoverableError().
func TestIsUnrecoverableError(t *testing.T) {
if runNoBlobTest {
t.Skip()
}

type testCase struct {
name string
err error
expected bool
}

testCases := []testCase{
{
name: "Nil error",
err: nil,
expected: false,
},
{
name: "vterrors.Code_FAILED_PRECONDITION",
err: vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "test error"),
expected: true,
},
{
name: "vterrors.Code_FAILED_PRECONDITION, WrongTablet",
err: vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "%s: %v, want: %v or %v", vterrors.WrongTablet, "PRIMARY", "REPLICA", nil),
expected: false,
},
{
name: "Non-SQL error",
err: errors.New("non-SQL error"),
expected: false,
},
{
name: "SQL error with ERUnknownError",
err: sqlerror.NewSQLError(sqlerror.ERUnknownError, "test SQL error", "test"),
expected: false,
},
{
name: "SQL error with ERAccessDeniedError",
err: sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, "access denied", "test"),
expected: true,
},
{
name: "SQL error with ERDataOutOfRange",
err: sqlerror.NewSQLError(sqlerror.ERDataOutOfRange, "data out of range", "test"),
expected: true,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result := isUnrecoverableError(tc.err)
require.Equal(t, tc.expected, result)
})
}
}

0 comments on commit d1d6bd8

Please sign in to comment.