github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/wal/checkpoint.go (about) 1 // Copyright 2021 Matrix Origin 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://www.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 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package wal 16 17 import ( 18 "time" 19 20 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" 21 ) 22 23 func (driver *walDriver) Checkpoint(indexes []*Index) (e LogEntry, err error) { 24 e, err = driver.impl.FuzzyCheckpoint(GroupPrepare, indexes) 25 return 26 } 27 28 func (driver *walDriver) RangeCheckpoint(start, end uint64) (e LogEntry, err error) { 29 e, err = driver.impl.RangeCheckpoint(GroupPrepare, start, end) 30 return 31 } 32 33 func (driver *walDriver) checkpointTicker() { 34 defer driver.wg.Done() 35 ticker := time.NewTicker(driver.ckpDuration) 36 for { 37 select { 38 case <-driver.cancelContext.Done(): 39 return 40 case <-ticker.C: 41 driver.CkpUC() 42 } 43 } 44 } 45 46 // tid-lsn-ckped uclsn-tid,tid-clsn,cckped 47 func (driver *walDriver) CkpUC() { 48 ckpedlsn := driver.impl.GetCheckpointed(GroupPrepare) 49 ucLsn := driver.impl.GetCheckpointed(GroupUC) 50 maxLsn := driver.impl.GetSynced(GroupUC) 51 ckpedUC := ucLsn 52 driver.cmu.RLock() 53 driver.ucmu.RLock() 54 for i := ucLsn + 1; i <= maxLsn; i++ { 55 tid, ok := driver.ucLsnTidMap[i] 56 if !ok { 57 break 58 } 59 lsn, ok := driver.cTidLsnMap[tid] 60 if !ok { 61 break 62 } 63 if lsn > ckpedlsn { 64 break 65 } 66 ckpedUC = i 67 } 68 driver.cmu.RUnlock() 69 driver.ucmu.RUnlock() 70 if ckpedUC == ucLsn { 71 return 72 } 73 e, err := driver.impl.RangeCheckpoint(GroupUC, 0, ckpedUC) 74 if err == common.ErrClose { 75 return 76 } 77 if err != nil { 78 panic(err) 79 } 80 err = e.WaitDone() 81 if err != nil { 82 panic(err) 83 } 84 }