diff --git a/cmd/internal/planetscale_edge_mysql.go b/cmd/internal/planetscale_edge_mysql.go index b08d649..b721656 100644 --- a/cmd/internal/planetscale_edge_mysql.go +++ b/cmd/internal/planetscale_edge_mysql.go @@ -4,10 +4,11 @@ import ( "context" "database/sql" "fmt" - "github.com/pkg/errors" "regexp" "strings" "time" + + "github.com/pkg/errors" ) type VitessTablet struct { @@ -111,10 +112,14 @@ func (p planetScaleEdgeMySQLAccess) PingContext(ctx context.Context, psc PlanetS } const ( - gCTableNameExpression string = `^_vt_(HOLD|PURGE|EVAC|DROP)_([0-f]{32})_([0-9]{14})$` + gCTableNameExpression string = `^_vt_(HOLD|PURGE|EVAC|DROP)_([0-f]{32})_([0-9]{14})$` + vreplTableNameExpression string = `\b_(\w+|\d+)_\d+_vrepl\b` ) -var gcTableNameRegexp = regexp.MustCompile(gCTableNameExpression) +var ( + gcTableNameRegexp = regexp.MustCompile(gCTableNameExpression) + vreplRegex = regexp.MustCompile(vreplTableNameExpression) +) func (p planetScaleEdgeMySQLAccess) GetTableNames(ctx context.Context, psc PlanetScaleSource) ([]string, error) { var tables []string @@ -131,7 +136,7 @@ func (p planetScaleEdgeMySQLAccess) GetTableNames(ctx context.Context, psc Plane } // skip any that are Vitess's GC tables. - if !gcTableNameRegexp.MatchString(name) { + if !filterTable(name) { tables = append(tables, name) } } @@ -143,6 +148,10 @@ func (p planetScaleEdgeMySQLAccess) GetTableNames(ctx context.Context, psc Plane return tables, err } +func filterTable(name string) bool { + return gcTableNameRegexp.MatchString(name) || vreplRegex.MatchString(name) +} + func (p planetScaleEdgeMySQLAccess) GetTableSchema(ctx context.Context, psc PlanetScaleSource, tableName string) (map[string]PropertyType, error) { properties := map[string]PropertyType{} diff --git a/cmd/internal/planetscale_edge_mysql_test.go b/cmd/internal/planetscale_edge_mysql_test.go new file mode 100644 index 0000000..bdd1af4 --- /dev/null +++ b/cmd/internal/planetscale_edge_mysql_test.go @@ -0,0 +1,53 @@ +package internal + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestFilterNames_CanFilterInternalVitessTables(t *testing.T) { + var tests = []struct { + name string + tableName string + filtered bool + }{ + { + name: "filters_vrepl_tables", + tableName: "_750a3e1f_e6f3_5249_82af_82f5d325ecab_20240528153135_vrepl", + filtered: true, + }, + { + name: "filters_vt_DROP_tables", + tableName: "_vt_DROP_6ace8bcef73211ea87e9f875a4d24e90_20200915120410", + filtered: true, + }, + { + name: "filters_vt_HOLD_tables", + tableName: "_vt_HOLD_6ace8bcef73211ea87e9f875a4d24e90_20200915120410", + filtered: true, + }, + { + name: "filters_vt_EVAC_tables", + tableName: "_vt_EVAC_6ace8bcef73211ea87e9f875a4d24e90_20200915120410", + filtered: true, + }, + { + name: "filters_vt_PURGE_tables", + tableName: "_vt_PURGE_6ace8bcef73211ea87e9f875a4d24e90_20200915120410", + filtered: true, + }, + { + name: "does_not_filter_regular_table", + tableName: "customers", + filtered: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + filteredResult := filterTable(tt.tableName) + assert.Equal(t, tt.filtered, filteredResult) + }) + } +}