Skip to content

Commit 2d07f5c

Browse files
authored
mdl: always enable and make it read only in nextgen (pingcap#62865)
ref pingcap#61702
1 parent 5f051c7 commit 2d07f5c

File tree

21 files changed

+126
-34
lines changed

21 files changed

+126
-34
lines changed

pkg/ddl/ddl.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,7 +1137,7 @@ func (d *ddl) cleanDeadTableLock(unlockTables []model.TableLockTpInfo, se model.
11371137

11381138
// SwitchMDL enables MDL or disable MDL.
11391139
func (d *ddl) SwitchMDL(enable bool) error {
1140-
isEnableBefore := vardef.EnableMDL.Load()
1140+
isEnableBefore := vardef.IsMDLEnabled()
11411141
if isEnableBefore == enable {
11421142
return nil
11431143
}
@@ -1161,7 +1161,7 @@ func (d *ddl) SwitchMDL(enable bool) error {
11611161
return errors.New("please wait for all jobs done")
11621162
}
11631163

1164-
vardef.EnableMDL.Store(enable)
1164+
vardef.SetEnableMDL(enable)
11651165
err = kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), d.store, true, func(_ context.Context, txn kv.Transaction) error {
11661166
m := meta.NewMutator(txn)
11671167
oldEnable, _, err := m.GetMetadataLock()
@@ -1185,7 +1185,7 @@ func (d *ddl) SwitchMDL(enable bool) error {
11851185
// It should be called before any DDL that could break data consistency.
11861186
// This provides a safe window for async commit and 1PC to commit with an old schema.
11871187
func delayForAsyncCommit() {
1188-
if vardef.EnableMDL.Load() {
1188+
if vardef.IsMDLEnabled() {
11891189
// If metadata lock is enabled. The transaction of DDL must begin after
11901190
// pre-write of the async commit transaction, then the commit ts of DDL
11911191
// must be greater than the async commit transaction. In this case, the

pkg/ddl/job_scheduler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ func (s *jobScheduler) transitOneJobStepAndWaitSync(wk *worker, jobCtx *jobConte
566566
// current owner.
567567
job := jobW.Job
568568
if jobCtx.isUnSynced(job.ID) || (job.Started() && !jobCtx.maybeAlreadyRunOnce(job.ID)) {
569-
if vardef.EnableMDL.Load() {
569+
if vardef.IsMDLEnabled() {
570570
version, err := s.sysTblMgr.GetMDLVer(s.schCtx, job.ID)
571571
if err == nil {
572572
jobCtx.logger.Info("the job have schema version un-synced",
@@ -624,7 +624,7 @@ func (s *jobScheduler) cleanMDLInfo(job *model.Job, ownerID string) {
624624
defer func() {
625625
metrics.DDLCleanMDLInfoHist.Observe(time.Since(start).Seconds())
626626
}()
627-
if !vardef.EnableMDL.Load() {
627+
if !vardef.IsMDLEnabled() {
628628
return
629629
}
630630
var sql string

pkg/ddl/job_worker.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ func (w *worker) updateDDLJob(jobCtx *jobContext, job *model.Job, updateRawArgs
308308

309309
// registerMDLInfo registers metadata lock info.
310310
func (w *worker) registerMDLInfo(job *model.Job, ver int64) error {
311-
if !vardef.EnableMDL.Load() {
311+
if !vardef.IsMDLEnabled() {
312312
return nil
313313
}
314314
if ver == 0 {
@@ -1124,7 +1124,7 @@ func updateGlobalVersionAndWaitSynced(
11241124
err = jobCtx.schemaVerSyncer.OwnerUpdateGlobalVersion(ctx, latestSchemaVersion)
11251125
if err != nil {
11261126
logutil.DDLLogger().Info("update latest schema version failed", zap.Int64("ver", latestSchemaVersion), zap.Error(err))
1127-
if vardef.EnableMDL.Load() {
1127+
if vardef.IsMDLEnabled() {
11281128
return err
11291129
}
11301130
if terror.ErrorEqual(err, context.DeadlineExceeded) {

pkg/ddl/schemaver/mem_syncer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func (s *MemSyncer) UpdateSelfVersion(_ context.Context, jobID int64, version in
6868
failpoint.Return(errors.New("mock update mdl to etcd error"))
6969
}
7070
})
71-
if vardef.EnableMDL.Load() {
71+
if vardef.IsMDLEnabled() {
7272
s.mdlSchemaVersions.Store(jobID, version)
7373
} else {
7474
atomic.StoreInt64(&s.selfSchemaVersion, version)
@@ -117,7 +117,7 @@ func (s *MemSyncer) WaitVersionSynced(ctx context.Context, jobID int64, latestVe
117117
case <-ctx.Done():
118118
return errors.Trace(ctx.Err())
119119
case <-ticker.C:
120-
if vardef.EnableMDL.Load() {
120+
if vardef.IsMDLEnabled() {
121121
ver, ok := s.mdlSchemaVersions.Load(jobID)
122122
if ok && ver.(int64) >= latestVer {
123123
return nil

pkg/ddl/schemaver/syncer.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ func (s *etcdSyncer) UpdateSelfVersion(ctx context.Context, jobID int64, version
282282
ver := strconv.FormatInt(version, 10)
283283
var err error
284284
var path string
285-
if vardef.EnableMDL.Load() {
285+
if vardef.IsMDLEnabled() {
286286
// If jobID is 0, it doesn't need to put into etcd `DDLAllSchemaVersionsByJob` key.
287287
if jobID == 0 {
288288
return nil
@@ -325,7 +325,7 @@ func (s *etcdSyncer) removeSelfVersionPath() error {
325325
// WaitVersionSynced implements Syncer.WaitVersionSynced interface.
326326
func (s *etcdSyncer) WaitVersionSynced(ctx context.Context, jobID int64, latestVer int64, checkAssumedSvr bool) error {
327327
startTime := time.Now()
328-
if !vardef.EnableMDL.Load() {
328+
if !vardef.IsMDLEnabled() {
329329
time.Sleep(CheckVersFirstWaitTime)
330330
}
331331
notMatchVerCnt := 0
@@ -348,7 +348,7 @@ func (s *etcdSyncer) WaitVersionSynced(ctx context.Context, jobID int64, latestV
348348
return errors.Trace(err)
349349
}
350350

351-
if vardef.EnableMDL.Load() {
351+
if vardef.IsMDLEnabled() {
352352
serverInfos, err := infosync.GetServersForISSync(ctx, checkAssumedSvr)
353353
if err != nil {
354354
return err
@@ -375,7 +375,7 @@ func (s *etcdSyncer) WaitVersionSynced(ctx context.Context, jobID int64, latestV
375375
}
376376

377377
// Check all schema versions.
378-
if vardef.EnableMDL.Load() {
378+
if vardef.IsMDLEnabled() {
379379
notifyCh := make(chan struct{})
380380
var unmatchedNodeInfo atomic.Pointer[string]
381381
matchFn := func(nodeVersions map[string]int64) bool {

pkg/ddl/schemaver/syncer_nokit_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ func TestSyncJobSchemaVerLoop(t *testing.T) {
174174
require.NoError(t, err)
175175

176176
// job 4 is matched using WaitVersionSynced
177-
vardef.EnableMDL.Store(true)
177+
vardef.SetEnableMDL(true)
178178
serverInfos := map[string]*serverinfo.ServerInfo{"aa": {StaticInfo: serverinfo.StaticInfo{ID: "aa", IP: "test", Port: 4000}}}
179179
bytes, err := json.Marshal(serverInfos)
180180
require.NoError(t, err)

pkg/ddl/schemaver/syncer_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import (
3939
const minInterval = 10 * time.Nanosecond // It's used to test timeout.
4040

4141
func TestSyncerSimple(t *testing.T) {
42-
vardef.EnableMDL.Store(false)
42+
vardef.SetEnableMDL(false)
4343
if runtime.GOOS == "windows" {
4444
t.Skip("integration.NewClusterV3 will create file contains a colon which is not allowed on Windows")
4545
}

pkg/ddl/serverstate/syncer_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func checkRespKV(t *testing.T, kvCount int, key, val string, kvs ...*mvccpb.KeyV
4343
}
4444

4545
func TestStateSyncerSimple(t *testing.T) {
46-
vardef.EnableMDL.Store(false)
46+
vardef.SetEnableMDL(false)
4747
if runtime.GOOS == "windows" {
4848
t.Skip("integration.NewClusterV3 will create file contains a colon which is not allowed on Windows")
4949
}

pkg/ddl/tests/metadatalock/BUILD.bazel

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ go_test(
88
"mdl_test.go",
99
],
1010
flaky = True,
11-
shard_count = 37,
11+
shard_count = 38,
1212
deps = [
1313
"//pkg/config",
14+
"//pkg/config/kerneltype",
1415
"//pkg/ddl",
1516
"//pkg/ddl/ingest/testutil",
1617
"//pkg/errno",

pkg/ddl/tests/metadatalock/mdl_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"time"
2323

2424
"github.com/pingcap/failpoint"
25+
"github.com/pingcap/tidb/pkg/config/kerneltype"
2526
"github.com/pingcap/tidb/pkg/ddl"
2627
ingesttestutil "github.com/pingcap/tidb/pkg/ddl/ingest/testutil"
2728
mysql "github.com/pingcap/tidb/pkg/errno"
@@ -1159,6 +1160,9 @@ func TestMDLEnable2Disable(t *testing.T) {
11591160
}
11601161

11611162
func TestSwitchMDL(t *testing.T) {
1163+
if kerneltype.IsNextGen() {
1164+
t.Skip("MDL is always enabled and read only in nextgen")
1165+
}
11621166
store, dom := testkit.CreateMockStoreAndDomain(t)
11631167
sv := server.CreateMockServer(t, store)
11641168

@@ -1179,6 +1183,19 @@ func TestSwitchMDL(t *testing.T) {
11791183
tk.MustQuery("show global variables like 'tidb_enable_metadata_lock'").Check(testkit.Rows("tidb_enable_metadata_lock OFF"))
11801184
}
11811185

1186+
func TestSetMDLInNextGen(t *testing.T) {
1187+
if kerneltype.IsClassic() {
1188+
t.Skip("only run in nextgen")
1189+
}
1190+
store, _ := testkit.CreateMockStoreAndDomain(t)
1191+
tk := testkit.NewTestKit(t, store)
1192+
1193+
require.ErrorContains(t, tk.ExecToErr("set global tidb_enable_metadata_lock=0"),
1194+
"setting tidb_enable_metadata_lock is not supported in the next generation of TiDB")
1195+
require.ErrorContains(t, tk.ExecToErr("set global tidb_enable_metadata_lock=1"),
1196+
"setting tidb_enable_metadata_lock is not supported in the next generation of TiDB")
1197+
}
1198+
11821199
func TestMDLViewItself(t *testing.T) {
11831200
store, dom := testkit.CreateMockStoreAndDomain(t)
11841201
sv := server.CreateMockServer(t, store)

0 commit comments

Comments
 (0)