github.com/whtcorpsinc/MilevaDB-Prod@v0.0.0-20211104133533-f57f4be3b597/dbs/mock.go (about) 1 // Copyright 2020 WHTCORPS INC, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://wwm.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package dbs 15 16 import ( 17 "context" 18 "sync/atomic" 19 "time" 20 21 "github.com/whtcorpsinc/errors" 22 "github.com/whtcorpsinc/failpoint" 23 "github.com/whtcorpsinc/BerolinaSQL/ast" 24 "github.com/whtcorpsinc/BerolinaSQL/charset" 25 "github.com/whtcorpsinc/BerolinaSQL/perceptron" 26 "github.com/whtcorpsinc/milevadb/dbs/soliton" 27 "github.com/whtcorpsinc/milevadb/stochastikctx" 28 "go.etcd.io/etcd/clientv3" 29 ) 30 31 var _ soliton.SchemaSyncer = &MockSchemaSyncer{} 32 33 const mockCheckVersInterval = 2 * time.Millisecond 34 35 // MockSchemaSyncer is a mock schemaReplicant syncer, it is exported for tesing. 36 type MockSchemaSyncer struct { 37 selfSchemaVersion int64 38 globalVerCh chan clientv3.WatchResponse 39 mockStochastik chan struct{} 40 } 41 42 // NewMockSchemaSyncer creates a new mock SchemaSyncer. 43 func NewMockSchemaSyncer() soliton.SchemaSyncer { 44 return &MockSchemaSyncer{} 45 } 46 47 // Init implements SchemaSyncer.Init interface. 48 func (s *MockSchemaSyncer) Init(ctx context.Context) error { 49 s.globalVerCh = make(chan clientv3.WatchResponse, 1) 50 s.mockStochastik = make(chan struct{}, 1) 51 return nil 52 } 53 54 // GlobalVersionCh implements SchemaSyncer.GlobalVersionCh interface. 55 func (s *MockSchemaSyncer) GlobalVersionCh() clientv3.WatchChan { 56 return s.globalVerCh 57 } 58 59 // WatchGlobalSchemaVer implements SchemaSyncer.WatchGlobalSchemaVer interface. 60 func (s *MockSchemaSyncer) WatchGlobalSchemaVer(context.Context) {} 61 62 // UFIDelateSelfVersion implements SchemaSyncer.UFIDelateSelfVersion interface. 63 func (s *MockSchemaSyncer) UFIDelateSelfVersion(ctx context.Context, version int64) error { 64 atomic.StoreInt64(&s.selfSchemaVersion, version) 65 return nil 66 } 67 68 // Done implements SchemaSyncer.Done interface. 69 func (s *MockSchemaSyncer) Done() <-chan struct{} { 70 return s.mockStochastik 71 } 72 73 // CloseStochastik mockStochastik, it is exported for testing. 74 func (s *MockSchemaSyncer) CloseStochastik() { 75 close(s.mockStochastik) 76 } 77 78 // Restart implements SchemaSyncer.Restart interface. 79 func (s *MockSchemaSyncer) Restart(_ context.Context) error { 80 s.mockStochastik = make(chan struct{}, 1) 81 return nil 82 } 83 84 // TenantUFIDelateGlobalVersion implements SchemaSyncer.TenantUFIDelateGlobalVersion interface. 85 func (s *MockSchemaSyncer) TenantUFIDelateGlobalVersion(ctx context.Context, version int64) error { 86 select { 87 case s.globalVerCh <- clientv3.WatchResponse{}: 88 default: 89 } 90 return nil 91 } 92 93 // MustGetGlobalVersion implements SchemaSyncer.MustGetGlobalVersion interface. 94 func (s *MockSchemaSyncer) MustGetGlobalVersion(ctx context.Context) (int64, error) { 95 return 0, nil 96 } 97 98 // TenantCheckAllVersions implements SchemaSyncer.TenantCheckAllVersions interface. 99 func (s *MockSchemaSyncer) TenantCheckAllVersions(ctx context.Context, latestVer int64) error { 100 ticker := time.NewTicker(mockCheckVersInterval) 101 defer ticker.Stop() 102 103 for { 104 select { 105 case <-ctx.Done(): 106 failpoint.Inject("checkTenantCheckAllVersionsWaitTime", func(v failpoint.Value) { 107 if v.(bool) { 108 panic("shouldn't happen") 109 } 110 }) 111 return errors.Trace(ctx.Err()) 112 case <-ticker.C: 113 ver := atomic.LoadInt64(&s.selfSchemaVersion) 114 if ver >= latestVer { 115 return nil 116 } 117 } 118 } 119 } 120 121 // NotifyCleanExpiredPaths implements SchemaSyncer.NotifyCleanExpiredPaths interface. 122 func (s *MockSchemaSyncer) NotifyCleanExpiredPaths() bool { return true } 123 124 // StartCleanWork implements SchemaSyncer.StartCleanWork interface. 125 func (s *MockSchemaSyncer) StartCleanWork() {} 126 127 // Close implements SchemaSyncer.Close interface. 128 func (s *MockSchemaSyncer) Close() {} 129 130 type mockDelRange struct { 131 } 132 133 // newMockDelRangeManager creates a mock delRangeManager only used for test. 134 func newMockDelRangeManager() delRangeManager { 135 return &mockDelRange{} 136 } 137 138 // addDelRangeJob implements delRangeManager interface. 139 func (dr *mockDelRange) addDelRangeJob(job *perceptron.Job) error { 140 return nil 141 } 142 143 // removeFromGCDeleteRange implements delRangeManager interface. 144 func (dr *mockDelRange) removeFromGCDeleteRange(jobID int64, blockIDs []int64) error { 145 return nil 146 } 147 148 // start implements delRangeManager interface. 149 func (dr *mockDelRange) start() {} 150 151 // clear implements delRangeManager interface. 152 func (dr *mockDelRange) clear() {} 153 154 // MockBlockInfo mocks a causet info by create causet stmt ast and a specified causet id. 155 func MockBlockInfo(ctx stochastikctx.Context, stmt *ast.CreateBlockStmt, blockID int64) (*perceptron.BlockInfo, error) { 156 chs, defCausl := charset.GetDefaultCharsetAndDefCauslate() 157 defcaus, newConstraints, err := buildDeferredCausetsAndConstraints(ctx, stmt.DefCauss, stmt.Constraints, chs, defCausl) 158 if err != nil { 159 return nil, errors.Trace(err) 160 } 161 tbl, err := buildBlockInfo(ctx, stmt.Block.Name, defcaus, newConstraints, "", "") 162 if err != nil { 163 return nil, errors.Trace(err) 164 } 165 tbl.ID = blockID 166 167 // The specified charset will be handled in handleBlockOptions 168 if err = handleBlockOptions(stmt.Options, tbl); err != nil { 169 return nil, errors.Trace(err) 170 } 171 172 return tbl, nil 173 }