diff --git a/cmd/tidb-lightning-ctl/main.go b/cmd/tidb-lightning-ctl/main.go index 52b96e449..0bb5fda5b 100644 --- a/cmd/tidb-lightning-ctl/main.go +++ b/cmd/tidb-lightning-ctl/main.go @@ -22,9 +22,9 @@ import ( "strconv" "strings" + "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/import_sstpb" - "github.com/google/uuid" kv "github.com/pingcap/tidb-lightning/lightning/backend" "github.com/pingcap/tidb-lightning/lightning/common" diff --git a/lightning/backend/backend.go b/lightning/backend/backend.go index 2e31118da..643a1f688 100644 --- a/lightning/backend/backend.go +++ b/lightning/backend/backend.go @@ -18,13 +18,13 @@ import ( "fmt" "time" + "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" - "github.com/google/uuid" "go.uber.org/zap" "github.com/pingcap/tidb-lightning/lightning/common" diff --git a/lightning/backend/backend_test.go b/lightning/backend/backend_test.go index de0b19330..de718158f 100644 --- a/lightning/backend/backend_test.go +++ b/lightning/backend/backend_test.go @@ -5,10 +5,10 @@ import ( "time" "github.com/golang/mock/gomock" + "github.com/google/uuid" . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/parser/mysql" - "github.com/google/uuid" kv "github.com/pingcap/tidb-lightning/lightning/backend" "github.com/pingcap/tidb-lightning/mock" diff --git a/lightning/backend/importer.go b/lightning/backend/importer.go index bf5dfa000..ca7624377 100644 --- a/lightning/backend/importer.go +++ b/lightning/backend/importer.go @@ -21,11 +21,11 @@ import ( "time" "github.com/coreos/go-semver/semver" + "github.com/google/uuid" "github.com/pingcap/errors" kv "github.com/pingcap/kvproto/pkg/import_kvpb" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/table" - "github.com/google/uuid" "go.uber.org/zap" "google.golang.org/grpc" diff --git a/lightning/backend/importer_test.go b/lightning/backend/importer_test.go index b4794ab0d..22702c76d 100644 --- a/lightning/backend/importer_test.go +++ b/lightning/backend/importer_test.go @@ -6,10 +6,10 @@ import ( "testing" "github.com/golang/mock/gomock" + "github.com/google/uuid" . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/import_kvpb" - "github.com/google/uuid" kvpb "github.com/pingcap/kvproto/pkg/import_kvpb" diff --git a/lightning/backend/session.go b/lightning/backend/session.go index a6c7dbad7..1285eb774 100644 --- a/lightning/backend/session.go +++ b/lightning/backend/session.go @@ -176,6 +176,8 @@ type SessionOptions struct { SQLMode mysql.SQLMode Timestamp int64 RowFormatVersion string + // a seed used for tableKvEncoder's auto random bits value + AutoRandomSeed int64 } func newSession(options *SessionOptions) *session { diff --git a/lightning/backend/sql2kv.go b/lightning/backend/sql2kv.go index fe84dbf8d..01b283ec0 100644 --- a/lightning/backend/sql2kv.go +++ b/lightning/backend/sql2kv.go @@ -14,6 +14,8 @@ package backend import ( + "math/rand" + "github.com/pingcap/errors" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" @@ -37,6 +39,8 @@ type tableKVEncoder struct { tbl table.Table se *session recordCache []types.Datum + // auto random bits value for this chunk + autoRandomHeaderBits int64 } func NewTableKVEncoder(tbl table.Table, options *SessionOptions) Encoder { @@ -45,12 +49,35 @@ func NewTableKVEncoder(tbl table.Table, options *SessionOptions) Encoder { // Set CommonAddRecordCtx to session to reuse the slices and BufStore in AddRecord recordCtx := tables.NewCommonAddRecordCtx(len(tbl.Cols())) tables.SetAddRecordCtx(se, recordCtx) + + var autoRandomBits int64 + if tbl.Meta().PKIsHandle && tbl.Meta().ContainsAutoRandomBits() { + for _, col := range tbl.Cols() { + if mysql.HasPriKeyFlag(col.Flag) { + incrementalBits := autoRandomIncrementBits(col, int(tbl.Meta().AutoRandomBits)) + autoRandomBits = rand.New(rand.NewSource(options.AutoRandomSeed)).Int63n(1<> 58) as count from auto_random.t" + check_contains "count: 2" + + # auto random base is 4 + run_sql "INSERT INTO auto_random.t VALUES ();" + run_sql "SELECT id & b'000001111111111111111111111111111111111111111111111111111111111' as inc FROM auto_random.t" + if [ "$backend" = 'tidb' ]; then + check_contains 'inc: 2000001' + else + check_contains 'inc: 28' + fi +done