Skip to content

Commit 65f8417

Browse files
authored
*: Update client-go and verify all read ts (#58909)
ref #57786
1 parent 722347b commit 65f8417

23 files changed

+150
-93
lines changed

DEPS.bzl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6933,13 +6933,13 @@ def go_deps():
69336933
name = "com_github_tikv_client_go_v2",
69346934
build_file_proto_mode = "disable_global",
69356935
importpath = "github.com/tikv/client-go/v2",
6936-
sha256 = "cdcad188042c4d716dd9d4a304a2e36bc9d4edccaf86a19b85b1682f01df193c",
6937-
strip_prefix = "github.com/tikv/client-go/[email protected].20241121061241-006dfb024c26",
6936+
sha256 = "f896c60fc81339cc03e7dcb38b70bcfa368bbb2a94c6c7f3f5da6a4795d237f0",
6937+
strip_prefix = "github.com/tikv/client-go/[email protected].20250113074216-d66e460ff577",
69386938
urls = [
6939-
"http://bazel-cache.pingcap.net:8080/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20241121061241-006dfb024c26.zip",
6940-
"http://ats.apps.svc/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20241121061241-006dfb024c26.zip",
6941-
"https://cache.hawkingrei.com/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20241121061241-006dfb024c26.zip",
6942-
"https://storage.googleapis.com/pingcapmirror/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20241121061241-006dfb024c26.zip",
6939+
"http://bazel-cache.pingcap.net:8080/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20250113074216-d66e460ff577.zip",
6940+
"http://ats.apps.svc/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20250113074216-d66e460ff577.zip",
6941+
"https://cache.hawkingrei.com/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20250113074216-d66e460ff577.zip",
6942+
"https://storage.googleapis.com/pingcapmirror/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20250113074216-d66e460ff577.zip",
69436943
],
69446944
)
69456945
go_repository(

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ require (
109109
github.com/tdakkota/asciicheck v0.2.0
110110
github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2
111111
github.com/tidwall/btree v1.7.0
112-
github.com/tikv/client-go/v2 v2.0.8-0.20241121061241-006dfb024c26
112+
github.com/tikv/client-go/v2 v2.0.8-0.20250113074216-d66e460ff577
113113
github.com/tikv/pd/client v0.0.0-20241111073742-238d4d79ea31
114114
github.com/timakin/bodyclose v0.0.0-20240125160201-f835fa56326a
115115
github.com/twmb/murmur3 v1.1.6

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -824,8 +824,8 @@ github.com/tiancaiamao/gp v0.0.0-20221230034425-4025bc8a4d4a h1:J/YdBZ46WKpXsxsW
824824
github.com/tiancaiamao/gp v0.0.0-20221230034425-4025bc8a4d4a/go.mod h1:h4xBhSNtOeEosLJ4P7JyKXX7Cabg7AVkWCK5gV2vOrM=
825825
github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=
826826
github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
827-
github.com/tikv/client-go/v2 v2.0.8-0.20241121061241-006dfb024c26 h1:CwiOzQZl7qCJi4QhNbzptX0hJoG10Q/gyLc5QULNW7I=
828-
github.com/tikv/client-go/v2 v2.0.8-0.20241121061241-006dfb024c26/go.mod h1:p9zPFlKBrxhp3b/cBmKBWL9M0X4HtJjgi1ThUtQYF7o=
827+
github.com/tikv/client-go/v2 v2.0.8-0.20250113074216-d66e460ff577 h1:9uW3zya97o4gXvF4AvqJV9Dpb61Gk76CxGD/C3/bFvk=
828+
github.com/tikv/client-go/v2 v2.0.8-0.20250113074216-d66e460ff577/go.mod h1:p9zPFlKBrxhp3b/cBmKBWL9M0X4HtJjgi1ThUtQYF7o=
829829
github.com/tikv/pd/client v0.0.0-20241111073742-238d4d79ea31 h1:oAYc4m5Eu1OY9ogJ103VO47AYPHvhtzbUPD8L8B67Qk=
830830
github.com/tikv/pd/client v0.0.0-20241111073742-238d4d79ea31/go.mod h1:W5a0sDadwUpI9k8p7M77d3jo253ZHdmua+u4Ho4Xw8U=
831831
github.com/timakin/bodyclose v0.0.0-20240125160201-f835fa56326a h1:A6uKudFIfAEpoPdaal3aSqGxBzLyU8TqyXImLwo6dIo=

pkg/ddl/column_change_test.go

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import (
3535
"github.com/pingcap/tidb/pkg/testkit/external"
3636
"github.com/pingcap/tidb/pkg/testkit/testfailpoint"
3737
"github.com/pingcap/tidb/pkg/types"
38-
"github.com/pingcap/tidb/pkg/util/mock"
3938
"github.com/stretchr/testify/require"
4039
)
4140

@@ -48,7 +47,7 @@ func TestColumnAdd(t *testing.T) {
4847
tk.MustExec("create table t (c1 int, c2 int);")
4948
tk.MustExec("insert t values (1, 2);")
5049

51-
ct := testNewContext(store)
50+
ct := testNewContext(t, store)
5251
// set up hook
5352
var (
5453
deleteOnlyTable table.Table
@@ -120,7 +119,7 @@ func TestColumnAdd(t *testing.T) {
120119
return
121120
}
122121
first = false
123-
sess := testNewContext(store)
122+
sess := testNewContext(t, store)
124123
txn, err := newTxn(sess)
125124
require.NoError(t, err)
126125
_, err = writeOnlyTable.AddRecord(sess.GetTableCtx(), txn, types.MakeDatums(10, 10))
@@ -210,6 +209,10 @@ func checkAddWriteOnly(ctx sessionctx.Context, deleteOnlyTable, writeOnlyTable t
210209
if err != nil {
211210
return errors.Trace(err)
212211
}
212+
err = txn.Commit(context.Background())
213+
if err != nil {
214+
return errors.Trace(err)
215+
}
213216
txn, err = newTxn(ctx)
214217
if err != nil {
215218
return errors.Trace(err)
@@ -248,6 +251,10 @@ func checkAddWriteOnly(ctx sessionctx.Context, deleteOnlyTable, writeOnlyTable t
248251
if err != nil {
249252
return errors.Trace(err)
250253
}
254+
err = txn.Commit(context.Background())
255+
if err != nil {
256+
return errors.Trace(err)
257+
}
251258
txn, err = newTxn(ctx)
252259
if err != nil {
253260
return errors.Trace(err)
@@ -265,6 +272,10 @@ func checkAddWriteOnly(ctx sessionctx.Context, deleteOnlyTable, writeOnlyTable t
265272
if err != nil {
266273
return errors.Trace(err)
267274
}
275+
err = txn.Commit(context.Background())
276+
if err != nil {
277+
return errors.Trace(err)
278+
}
268279
_, err = newTxn(ctx)
269280
if err != nil {
270281
return errors.Trace(err)
@@ -294,6 +305,10 @@ func checkAddPublic(sctx sessionctx.Context, writeOnlyTable, publicTable table.T
294305
if err != nil {
295306
return errors.Trace(err)
296307
}
308+
err = txn.Commit(context.Background())
309+
if err != nil {
310+
return errors.Trace(err)
311+
}
297312
txn, err = newTxn(sctx)
298313
if err != nil {
299314
return errors.Trace(err)
@@ -311,6 +326,10 @@ func checkAddPublic(sctx sessionctx.Context, writeOnlyTable, publicTable table.T
311326
if err != nil {
312327
return errors.Trace(err)
313328
}
329+
err = txn.Commit(context.Background())
330+
if err != nil {
331+
return errors.Trace(err)
332+
}
314333
_, err = newTxn(sctx)
315334
if err != nil {
316335
return errors.Trace(err)
@@ -415,10 +434,8 @@ func testCheckJobDone(t *testing.T, store kv.Storage, jobID int64, isAdd bool) {
415434
}
416435
}
417436

418-
func testNewContext(store kv.Storage) sessionctx.Context {
419-
ctx := mock.NewContext()
420-
ctx.Store = store
421-
return ctx
437+
func testNewContext(t *testing.T, store kv.Storage) sessionctx.Context {
438+
return testkit.NewSession(t, store)
422439
}
423440

424441
func TestIssue40135(t *testing.T) {

pkg/ddl/column_test.go

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func TestColumnBasic(t *testing.T) {
167167
tk.MustExec(fmt.Sprintf("insert into t1 values(%d, %d, %d)", i, 10*i, 100*i))
168168
}
169169

170-
ctx := testNewContext(store)
170+
ctx := testNewContext(t, store)
171171
txn, err := newTxn(ctx)
172172
require.NoError(t, err)
173173

@@ -214,6 +214,8 @@ func TestColumnBasic(t *testing.T) {
214214

215215
h, err := tbl.AddRecord(ctx.GetTableCtx(), txn, types.MakeDatums(11, 12, 13, 14))
216216
require.NoError(t, err)
217+
err = txn.Commit(context.Background())
218+
require.NoError(t, err)
217219
_, err = newTxn(ctx)
218220
require.NoError(t, err)
219221
values, err := tables.RowWithCols(tbl, ctx, h, tbl.Cols())
@@ -379,7 +381,9 @@ func checkDeleteOnlyColumn(t *testing.T, ctx sessionctx.Context, tableID int64,
379381
newRow := types.MakeDatums(int64(11), int64(22), int64(33))
380382
newHandle, err := tbl.AddRecord(ctx.GetTableCtx(), txn, newRow)
381383
require.NoError(t, err)
382-
_, err = newTxn(ctx)
384+
err = txn.Commit(context.Background())
385+
require.NoError(t, err)
386+
txn, err = newTxn(ctx)
383387
require.NoError(t, err)
384388

385389
rows := [][]types.Datum{row, newRow}
@@ -401,7 +405,9 @@ func checkDeleteOnlyColumn(t *testing.T, ctx sessionctx.Context, tableID int64,
401405

402406
err = tbl.RemoveRecord(ctx.GetTableCtx(), txn, newHandle, newRow)
403407
require.NoError(t, err)
404-
_, err = newTxn(ctx)
408+
err = txn.Commit(context.Background())
409+
require.NoError(t, err)
410+
txn, err = newTxn(ctx)
405411
require.NoError(t, err)
406412
i = 0
407413
err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) {
@@ -441,7 +447,9 @@ func checkWriteOnlyColumn(t *testing.T, ctx sessionctx.Context, tableID int64, h
441447
newRow := types.MakeDatums(int64(11), int64(22), int64(33))
442448
newHandle, err := tbl.AddRecord(ctx.GetTableCtx(), txn, newRow)
443449
require.NoError(t, err)
444-
_, err = newTxn(ctx)
450+
err = txn.Commit(context.Background())
451+
require.NoError(t, err)
452+
txn, err = newTxn(ctx)
445453
require.NoError(t, err)
446454

447455
rows := [][]types.Datum{row, newRow}
@@ -463,7 +471,10 @@ func checkWriteOnlyColumn(t *testing.T, ctx sessionctx.Context, tableID int64, h
463471

464472
err = tbl.RemoveRecord(ctx.GetTableCtx(), txn, newHandle, newRow)
465473
require.NoError(t, err)
466-
_, err = newTxn(ctx)
474+
475+
err = txn.Commit(context.Background())
476+
require.NoError(t, err)
477+
txn, err = newTxn(ctx)
467478
require.NoError(t, err)
468479

469480
i = 0
@@ -501,7 +512,9 @@ func checkReorganizationColumn(t *testing.T, ctx sessionctx.Context, tableID int
501512
newRow := types.MakeDatums(int64(11), int64(22), int64(33))
502513
newHandle, err := tbl.AddRecord(ctx.GetTableCtx(), txn, newRow)
503514
require.NoError(t, err)
504-
_, err = newTxn(ctx)
515+
err = txn.Commit(context.Background())
516+
require.NoError(t, err)
517+
txn, err = newTxn(ctx)
505518
require.NoError(t, err)
506519

507520
rows := [][]types.Datum{row, newRow}
@@ -524,7 +537,9 @@ func checkReorganizationColumn(t *testing.T, ctx sessionctx.Context, tableID int
524537

525538
err = tbl.RemoveRecord(ctx.GetTableCtx(), txn, newHandle, newRow)
526539
require.NoError(t, err)
527-
_, err = newTxn(ctx)
540+
err = txn.Commit(context.Background())
541+
require.NoError(t, err)
542+
txn, err = newTxn(ctx)
528543
require.NoError(t, err)
529544

530545
i = 0
@@ -567,7 +582,9 @@ func checkPublicColumn(t *testing.T, ctx sessionctx.Context, tableID int64, newC
567582
}
568583
handle, err := tbl.AddRecord(ctx.GetTableCtx(), txn, newRow)
569584
require.NoError(t, err)
570-
_, err = newTxn(ctx)
585+
err = txn.Commit(context.Background())
586+
require.NoError(t, err)
587+
txn, err = newTxn(ctx)
571588
require.NoError(t, err)
572589

573590
rows := [][]types.Datum{updatedRow, newRow}
@@ -587,8 +604,10 @@ func checkPublicColumn(t *testing.T, ctx sessionctx.Context, tableID int64, newC
587604

588605
err = tbl.RemoveRecord(ctx.GetTableCtx(), txn, handle, newRow)
589606
require.NoError(t, err)
607+
err = txn.Commit(context.Background())
608+
require.NoError(t, err)
590609

591-
_, err = newTxn(ctx)
610+
txn, err = newTxn(ctx)
592611
require.NoError(t, err)
593612

594613
i = 0
@@ -605,7 +624,7 @@ func checkPublicColumn(t *testing.T, ctx sessionctx.Context, tableID int64, newC
605624
}
606625

607626
func checkAddColumn(t *testing.T, state model.SchemaState, tableID int64, handle kv.Handle, newCol *table.Column, oldRow []types.Datum, columnValue any, dom *domain.Domain, store kv.Storage, columnCnt int) {
608-
ctx := testNewContext(store)
627+
ctx := testNewContext(t, store)
609628
switch state {
610629
case model.StateNone:
611630
checkNoneColumn(t, ctx, tableID, handle, newCol, columnValue, dom)
@@ -647,7 +666,7 @@ func TestAddColumn(t *testing.T) {
647666
tableID = int64(tableIDi)
648667
tbl := testGetTable(t, dom, tableID)
649668

650-
ctx := testNewContext(store)
669+
ctx := testNewContext(t, store)
651670
txn, err := newTxn(ctx)
652671
require.NoError(t, err)
653672
oldRow := types.MakeDatums(int64(1), int64(2), int64(3))
@@ -712,7 +731,7 @@ func TestAddColumns(t *testing.T) {
712731
tableID = int64(tableIDi)
713732
tbl := testGetTable(t, dom, tableID)
714733

715-
ctx := testNewContext(store)
734+
ctx := testNewContext(t, store)
716735
txn, err := newTxn(ctx)
717736
require.NoError(t, err)
718737
oldRow := types.MakeDatums(int64(1), int64(2), int64(3))
@@ -769,7 +788,7 @@ func TestDropColumnInColumnTest(t *testing.T) {
769788
tableID = int64(tableIDi)
770789
tbl := testGetTable(t, dom, tableID)
771790

772-
ctx := testNewContext(store)
791+
ctx := testNewContext(t, store)
773792
colName := "c4"
774793
defaultColValue := int64(4)
775794
row := types.MakeDatums(int64(1), int64(2), int64(3))
@@ -823,7 +842,7 @@ func TestDropColumns(t *testing.T) {
823842
tableID = int64(tableIDi)
824843
tbl := testGetTable(t, dom, tableID)
825844

826-
ctx := testNewContext(store)
845+
ctx := testNewContext(t, store)
827846
txn, err := newTxn(ctx)
828847
require.NoError(t, err)
829848

pkg/ddl/db_integration_test.go

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ import (
5353
contextutil "github.com/pingcap/tidb/pkg/util/context"
5454
"github.com/pingcap/tidb/pkg/util/dbterror"
5555
"github.com/pingcap/tidb/pkg/util/dbterror/plannererrors"
56-
"github.com/pingcap/tidb/pkg/util/mock"
5756
"github.com/stretchr/testify/require"
5857
)
5958

@@ -523,11 +522,10 @@ func TestChangingTableCharset(t *testing.T) {
523522
tblInfo.Charset = ""
524523
tblInfo.Collate = ""
525524
updateTableInfo := func(tblInfo *model.TableInfo) {
526-
mockCtx := mock.NewContext()
527-
mockCtx.Store = store
528-
err := sessiontxn.NewTxn(context.Background(), mockCtx)
525+
ctx := testkit.NewSession(t, store)
526+
err := sessiontxn.NewTxn(context.Background(), ctx)
529527
require.NoError(t, err)
530-
txn, err := mockCtx.Txn(true)
528+
txn, err := ctx.Txn(true)
531529
require.NoError(t, err)
532530
mt := meta.NewMutator(txn)
533531

@@ -769,11 +767,10 @@ func TestCaseInsensitiveCharsetAndCollate(t *testing.T) {
769767
tblInfo.Charset = "UTF8MB4"
770768

771769
updateTableInfo := func(tblInfo *model.TableInfo) {
772-
mockCtx := mock.NewContext()
773-
mockCtx.Store = store
774-
err := sessiontxn.NewTxn(context.Background(), mockCtx)
770+
sctx := testkit.NewSession(t, store)
771+
err := sessiontxn.NewTxn(context.Background(), sctx)
775772
require.NoError(t, err)
776-
txn, err := mockCtx.Txn(true)
773+
txn, err := sctx.Txn(true)
777774
require.NoError(t, err)
778775
mt := meta.NewMutator(txn)
779776
require.True(t, ok)
@@ -1437,11 +1434,10 @@ func TestTreatOldVersionUTF8AsUTF8MB4(t *testing.T) {
14371434
tblInfo.Version = model.TableInfoVersion0
14381435
tblInfo.Columns[0].Version = model.ColumnInfoVersion0
14391436
updateTableInfo := func(tblInfo *model.TableInfo) {
1440-
mockCtx := mock.NewContext()
1441-
mockCtx.Store = store
1442-
err := sessiontxn.NewTxn(context.Background(), mockCtx)
1437+
sctx := testkit.NewSession(t, store)
1438+
err := sessiontxn.NewTxn(context.Background(), sctx)
14431439
require.NoError(t, err)
1444-
txn, err := mockCtx.Txn(true)
1440+
txn, err := sctx.Txn(true)
14451441
require.NoError(t, err)
14461442
mt := meta.NewMutator(txn)
14471443
require.True(t, ok)

pkg/ddl/index_change_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func TestIndexChange(t *testing.T) {
5959
return
6060
}
6161
jobID.Store(job.ID)
62-
ctx1 := testNewContext(store)
62+
ctx1 := testNewContext(t, store)
6363
prevState = job.SchemaState
6464
require.NoError(t, dom.Reload())
6565
tbl, exist := dom.InfoSchema().TableByID(context.Background(), job.TableID)
@@ -106,7 +106,7 @@ func TestIndexChange(t *testing.T) {
106106
require.NoError(t, dom.Reload())
107107
tbl, exist := dom.InfoSchema().TableByID(context.Background(), job.TableID)
108108
require.True(t, exist)
109-
ctx1 := testNewContext(store)
109+
ctx1 := testNewContext(t, store)
110110
switch job.SchemaState {
111111
case model.StateWriteOnly:
112112
writeOnlyTable = tbl

pkg/ddl/job_worker_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func TestInvalidDDLJob(t *testing.T) {
5353
BinlogInfo: &model.HistoryInfo{},
5454
InvolvingSchemaInfo: []model.InvolvingSchemaInfo{{}},
5555
}
56-
ctx := testNewContext(store)
56+
ctx := testNewContext(t, store)
5757
ctx.SetValue(sessionctx.QueryString, "skip")
5858
de := dom.DDLExecutor().(ddl.ExecutorForTest)
5959
err := de.DoDDLJobWrapper(ctx, ddl.NewJobWrapperWithArgs(job, &model.EmptyArgs{}, true))
@@ -62,7 +62,7 @@ func TestInvalidDDLJob(t *testing.T) {
6262

6363
func TestAddBatchJobError(t *testing.T) {
6464
store, dom := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease)
65-
ctx := testNewContext(store)
65+
ctx := testNewContext(t, store)
6666

6767
require.Nil(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/mockAddBatchDDLJobsErr", `return(true)`))
6868
// Test the job runner should not hang forever.

pkg/executor/set.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,8 @@ func (e *SetExecutor) setSysVariable(ctx context.Context, name string, v *expres
222222
newSnapshotTS := getSnapshotTSByName()
223223
newSnapshotIsSet := newSnapshotTS > 0 && newSnapshotTS != oldSnapshotTS
224224
if newSnapshotIsSet {
225-
err = sessionctx.ValidateSnapshotReadTS(ctx, e.Ctx().GetStore(), newSnapshotTS)
225+
isStaleRead := name == variable.TiDBTxnReadTS
226+
err = sessionctx.ValidateSnapshotReadTS(ctx, e.Ctx().GetStore(), newSnapshotTS, isStaleRead)
226227
if name != variable.TiDBTxnReadTS {
227228
// Also check gc safe point for snapshot read.
228229
// We don't check snapshot with gc safe point for read_ts

pkg/executor/test/executor/executor_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,7 @@ func TestNotFillCacheFlag(t *testing.T) {
288288
func TestCheckIndex(t *testing.T) {
289289
store, dom := testkit.CreateMockStoreAndDomain(t)
290290

291-
ctx := mock.NewContext()
292-
ctx.Store = store
291+
ctx := testkit.NewSession(t, store)
293292
se, err := session.CreateSession4Test(store)
294293
require.NoError(t, err)
295294
defer se.Close()

0 commit comments

Comments
 (0)