flashback: retry getStoreGlobalMinSafeTS during execute flashback (#41100)
close pingcap/tidb#41086
This commit is contained in:
@ -28,7 +28,6 @@ import (
|
||||
"github.com/pingcap/kvproto/pkg/kvrpcpb"
|
||||
"github.com/pingcap/tidb/ddl/util"
|
||||
"github.com/pingcap/tidb/domain/infosync"
|
||||
"github.com/pingcap/tidb/expression"
|
||||
"github.com/pingcap/tidb/infoschema"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
"github.com/pingcap/tidb/meta"
|
||||
@ -99,6 +98,16 @@ func recoverPDSchedule(pdScheduleParam map[string]interface{}) error {
|
||||
return infosync.SetPDScheduleConfig(context.Background(), pdScheduleParam)
|
||||
}
|
||||
|
||||
func getStoreGlobalMinSafeTS(s kv.Storage) time.Time {
|
||||
minSafeTS := s.GetMinSafeTS(kv.GlobalTxnScope)
|
||||
// Inject mocked SafeTS for test.
|
||||
failpoint.Inject("injectSafeTS", func(val failpoint.Value) {
|
||||
injectTS := val.(int)
|
||||
minSafeTS = uint64(injectTS)
|
||||
})
|
||||
return oracle.GetTimeFromTS(minSafeTS)
|
||||
}
|
||||
|
||||
// ValidateFlashbackTS validates that flashBackTS in range [gcSafePoint, currentTS).
|
||||
func ValidateFlashbackTS(ctx context.Context, sctx sessionctx.Context, flashBackTS uint64) error {
|
||||
currentTS, err := sctx.GetStore().GetOracle().GetStaleTimestamp(ctx, oracle.GlobalTxnScope, 0)
|
||||
@ -111,12 +120,34 @@ func ValidateFlashbackTS(ctx context.Context, sctx sessionctx.Context, flashBack
|
||||
}
|
||||
currentTS = currentVer.Ver
|
||||
}
|
||||
if oracle.GetTimeFromTS(flashBackTS).After(oracle.GetTimeFromTS(currentTS)) {
|
||||
oracleFlashbackTS := oracle.GetTimeFromTS(flashBackTS)
|
||||
if oracleFlashbackTS.After(oracle.GetTimeFromTS(currentTS)) {
|
||||
return errors.Errorf("cannot set flashback timestamp to future time")
|
||||
}
|
||||
if oracle.GetTimeFromTS(flashBackTS).After(expression.GetMinSafeTime(sctx)) {
|
||||
return errors.Errorf("cannot set flashback timestamp to too close to present time")
|
||||
|
||||
flashbackGetMinSafeTimeTimeout := time.Minute
|
||||
failpoint.Inject("changeFlashbackGetMinSafeTimeTimeout", func(val failpoint.Value) {
|
||||
t := val.(int)
|
||||
flashbackGetMinSafeTimeTimeout = time.Duration(t)
|
||||
})
|
||||
|
||||
start := time.Now()
|
||||
minSafeTime := getStoreGlobalMinSafeTS(sctx.GetStore())
|
||||
ticker := time.NewTicker(time.Second)
|
||||
defer ticker.Stop()
|
||||
for oracleFlashbackTS.After(minSafeTime) {
|
||||
if time.Since(start) >= flashbackGetMinSafeTimeTimeout {
|
||||
return errors.Errorf("cannot set flashback timestamp after min-resolved-ts(%s)", minSafeTime)
|
||||
}
|
||||
select {
|
||||
case <-ticker.C:
|
||||
minSafeTime = getStoreGlobalMinSafeTS(sctx.GetStore())
|
||||
break
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
}
|
||||
}
|
||||
|
||||
gcSafePoint, err := gcutil.GetGCSafePoint(sctx)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@ -71,9 +71,7 @@ func TestFlashbackCloseAndResetPDSchedule(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(time.Now().Add(10 * time.Second))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`))
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
|
||||
oldValue := map[string]interface{}{
|
||||
@ -111,8 +109,7 @@ func TestFlashbackCloseAndResetPDSchedule(t *testing.T) {
|
||||
require.EqualValues(t, finishValue["merge-schedule-limit"], 1)
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
|
||||
func TestAddDDLDuringFlashback(t *testing.T) {
|
||||
@ -128,9 +125,7 @@ func TestAddDDLDuringFlashback(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(10 * time.Second))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`))
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
|
||||
timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk)
|
||||
@ -150,8 +145,7 @@ func TestAddDDLDuringFlashback(t *testing.T) {
|
||||
|
||||
dom.DDL().SetHook(originHook)
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
|
||||
func TestGlobalVariablesOnFlashback(t *testing.T) {
|
||||
@ -167,9 +161,7 @@ func TestGlobalVariablesOnFlashback(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(10 * time.Second))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`))
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
|
||||
timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk)
|
||||
@ -232,8 +224,7 @@ func TestGlobalVariablesOnFlashback(t *testing.T) {
|
||||
|
||||
dom.DDL().SetHook(originHook)
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
|
||||
func TestCancelFlashbackCluster(t *testing.T) {
|
||||
@ -247,9 +238,7 @@ func TestCancelFlashbackCluster(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(10 * time.Second))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`))
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
|
||||
timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk)
|
||||
@ -284,6 +273,5 @@ func TestCancelFlashbackCluster(t *testing.T) {
|
||||
dom.DDL().SetHook(originHook)
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
|
||||
@ -458,9 +458,7 @@ func TestTiFlashFlashbackCluster(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(10 * time.Second))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`))
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
|
||||
ChangeGCSafePoint(tk, time.Now().Add(-10*time.Second), "true", "10m0s")
|
||||
@ -473,8 +471,7 @@ func TestTiFlashFlashbackCluster(t *testing.T) {
|
||||
tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)), errorMsg)
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
|
||||
func CheckTableAvailableWithTableName(dom *domain.Domain, t *testing.T, count uint64, labels []string, db string, table string) {
|
||||
|
||||
@ -307,9 +307,7 @@ func TestRecoverClusterMeetError(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(flashbackTs.Add(10 * time.Second))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`))
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
|
||||
// Get GC safe point error.
|
||||
@ -346,8 +344,7 @@ func TestRecoverClusterMeetError(t *testing.T) {
|
||||
errorMsg = fmt.Sprintf("[ddl:-1]Detected TiDB upgrade during [%s, now), can't do flashback", oracle.GetTimeFromTS(nowTS).String())
|
||||
tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(nowTS)), errorMsg)
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest"))
|
||||
}
|
||||
|
||||
@ -356,6 +353,7 @@ func TestFlashbackWithSafeTs(t *testing.T) {
|
||||
tk := testkit.NewTestKit(t, store)
|
||||
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/changeFlashbackGetMinSafeTimeTimeout", `return(0)`))
|
||||
|
||||
timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk)
|
||||
defer resetGC()
|
||||
@ -380,9 +378,8 @@ func TestFlashbackWithSafeTs(t *testing.T) {
|
||||
compareWithSafeTS: 0,
|
||||
},
|
||||
{
|
||||
name: "10 seconds ago to now, safeTS 5 secs ago",
|
||||
// Add flashbackTs.Add(-500*time.Millisecond) to avoid flashback time range overlapped.
|
||||
sql: fmt.Sprintf("flashback cluster to timestamp '%s'", flashbackTs.Add(-500*time.Millisecond)),
|
||||
name: "10 seconds ago to now, safeTS 5 secs ago",
|
||||
sql: fmt.Sprintf("flashback cluster to timestamp '%s'", flashbackTs),
|
||||
injectSafeTS: oracle.GoTimeToTS(flashbackTs.Add(10 * time.Second)),
|
||||
compareWithSafeTS: -1,
|
||||
},
|
||||
@ -395,19 +392,55 @@ func TestFlashbackWithSafeTs(t *testing.T) {
|
||||
}
|
||||
for _, testcase := range testcases {
|
||||
t.Log(testcase.name)
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", testcase.injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", testcase.injectSafeTS)))
|
||||
if testcase.compareWithSafeTS == 1 {
|
||||
start := time.Now()
|
||||
tk.MustContainErrMsg(testcase.sql,
|
||||
"cannot set flashback timestamp to too close to present time")
|
||||
"cannot set flashback timestamp after min-resolved-ts")
|
||||
// When set `flashbackGetMinSafeTimeTimeout` = 0, no retry for `getStoreGlobalMinSafeTS`.
|
||||
require.Less(t, time.Since(start), time.Second)
|
||||
} else {
|
||||
tk.MustExec(testcase.sql)
|
||||
}
|
||||
}
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/changeFlashbackGetMinSafeTimeTimeout"))
|
||||
}
|
||||
|
||||
func TestFlashbackRetryGetMinSafeTime(t *testing.T) {
|
||||
store := testkit.CreateMockStore(t)
|
||||
tk := testkit.NewTestKit(t, store)
|
||||
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockFlashbackTest", `return(true)`))
|
||||
|
||||
timeBeforeDrop, _, safePointSQL, resetGC := MockGC(tk)
|
||||
defer resetGC()
|
||||
|
||||
// Set GC safe point.
|
||||
tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop))
|
||||
|
||||
time.Sleep(time.Second)
|
||||
ts, _ := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{})
|
||||
flashbackTs := oracle.GetTimeFromTS(ts)
|
||||
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", oracle.GoTimeToTS(flashbackTs.Add(-10*time.Minute)))))
|
||||
|
||||
go func() {
|
||||
time.Sleep(2 * time.Second)
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", oracle.GoTimeToTS(flashbackTs.Add(10*time.Minute)))))
|
||||
}()
|
||||
|
||||
start := time.Now()
|
||||
tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", flashbackTs))
|
||||
duration := time.Since(start)
|
||||
require.Greater(t, duration, 2*time.Second)
|
||||
require.Less(t, duration, 5*time.Second)
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockFlashbackTest"))
|
||||
}
|
||||
|
||||
|
||||
@ -76,9 +76,7 @@ func TestFlashback(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
|
||||
tk.MustExec("insert t values (4), (5), (6)")
|
||||
@ -88,8 +86,7 @@ func TestFlashback(t *testing.T) {
|
||||
require.Equal(t, tk.MustQuery("select max(a) from t").Rows()[0][0], "3")
|
||||
require.Equal(t, tk.MustQuery("select max(a) from t use index(i)").Rows()[0][0], "3")
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -114,9 +111,7 @@ func TestPrepareFlashbackFailed(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockPrepareMeetsEpochNotMatch", `return(true)`))
|
||||
|
||||
@ -132,8 +127,7 @@ func TestPrepareFlashbackFailed(t *testing.T) {
|
||||
require.NoError(t, job.Decode([]byte(jobMeta)))
|
||||
require.Equal(t, job.ErrorCount, int64(0))
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockPrepareMeetsEpochNotMatch"))
|
||||
}
|
||||
}
|
||||
@ -166,9 +160,7 @@ func TestFlashbackAddDropIndex(t *testing.T) {
|
||||
require.Greater(t, tk.MustQuery("select count(*) from mysql.gc_delete_range").Rows()[0][0], prevGCCount)
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
|
||||
tk.MustExec("insert t values (4), (5), (6)")
|
||||
@ -179,8 +171,7 @@ func TestFlashbackAddDropIndex(t *testing.T) {
|
||||
tk.MustGetErrCode("select max(a) from t use index(k)", errno.ErrKeyDoesNotExist)
|
||||
require.Equal(t, tk.MustQuery("select count(*) from mysql.gc_delete_range").Rows()[0][0], prevGCCount)
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -214,9 +205,7 @@ func TestFlashbackAddDropModifyColumn(t *testing.T) {
|
||||
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
|
||||
tk.MustExec("insert t values (4, 4), (5, 5), (6, 6)")
|
||||
@ -230,8 +219,7 @@ func TestFlashbackAddDropModifyColumn(t *testing.T) {
|
||||
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")
|
||||
require.Equal(t, tk.MustQuery("select max(b) from t").Rows()[0][0], "3")
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -270,9 +258,7 @@ func TestFlashbackBasicRenameDropCreateTable(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)))
|
||||
|
||||
@ -282,8 +268,7 @@ func TestFlashbackBasicRenameDropCreateTable(t *testing.T) {
|
||||
require.Equal(t, tk.MustQuery("select max(a) from t1").Rows()[0][0], "6")
|
||||
require.Equal(t, tk.MustQuery("select count(*) from mysql.gc_delete_range").Rows()[0][0], prevGCCount)
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -311,17 +296,14 @@ func TestFlashbackCreateDropTableWithData(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)))
|
||||
|
||||
tk.MustExec("admin check table t")
|
||||
require.Equal(t, tk.MustQuery("select count(a) from t").Rows()[0][0], "0")
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -353,9 +335,7 @@ func TestFlashbackCreateDropSchema(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)))
|
||||
|
||||
@ -365,8 +345,7 @@ func TestFlashbackCreateDropSchema(t *testing.T) {
|
||||
tk.MustGetErrCode("use test1", errno.ErrBadDB)
|
||||
tk.MustGetErrCode("use test2", errno.ErrBadDB)
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -395,9 +374,7 @@ func TestFlashbackAutoID(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)))
|
||||
|
||||
@ -408,8 +385,7 @@ func TestFlashbackAutoID(t *testing.T) {
|
||||
res = tk.MustQuery("select max(a) from t").Rows()
|
||||
require.Equal(t, res[0][0], "101")
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -438,9 +414,7 @@ func TestFlashbackSequence(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)))
|
||||
|
||||
@ -448,8 +422,7 @@ func TestFlashbackSequence(t *testing.T) {
|
||||
res = tk.MustQuery("select nextval(seq)").Rows()
|
||||
require.Equal(t, res[0][0], "101")
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -485,9 +458,7 @@ func TestFlashbackPartitionTable(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)))
|
||||
|
||||
@ -502,8 +473,7 @@ func TestFlashbackPartitionTable(t *testing.T) {
|
||||
require.Equal(t, res[0][1], "-1")
|
||||
require.Equal(t, res[0][2], "102")
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -529,9 +499,7 @@ func TestFlashbackTmpTable(t *testing.T) {
|
||||
|
||||
injectSafeTS := oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)))
|
||||
|
||||
@ -547,15 +515,12 @@ func TestFlashbackTmpTable(t *testing.T) {
|
||||
|
||||
injectSafeTS = oracle.GoTimeToTS(oracle.GetTimeFromTS(ts).Add(100 * time.Second))
|
||||
|
||||
require.NoError(t, failpoint.Enable("tikvclient/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS",
|
||||
require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/injectSafeTS",
|
||||
fmt.Sprintf("return(%v)", injectSafeTS)))
|
||||
tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)))
|
||||
|
||||
tk.MustGetErrCode("select * from t", errno.ErrNoSuchTable)
|
||||
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("tikvclient/injectSafeTS"))
|
||||
require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/injectSafeTS"))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user