github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/tables/segment.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 tables 16 17 import ( 18 "time" 19 20 "github.com/matrixorigin/matrixone/pkg/common/moerr" 21 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/buffer/base" 22 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog" 23 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" 24 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/containers" 25 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/txnif" 26 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tables/jobs" 27 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tasks" 28 ) 29 30 type dataSegment struct { 31 common.ClosedState 32 meta *catalog.SegmentEntry 33 bufMgr base.INodeManager 34 scheduler tasks.TaskScheduler 35 } 36 37 func newSegment(meta *catalog.SegmentEntry, 38 bufMgr base.INodeManager, 39 dir string) *dataSegment { 40 seg := &dataSegment{ 41 meta: meta, 42 bufMgr: bufMgr, 43 scheduler: meta.GetScheduler(), 44 } 45 return seg 46 } 47 48 func (segment *dataSegment) Destroy() (err error) { 49 if !segment.TryClose() { 50 return 51 } 52 return 53 } 54 55 func (segment *dataSegment) GetID() uint64 { return segment.meta.GetID() } 56 57 func (segment *dataSegment) BatchDedup(txn txnif.AsyncTxn, pks containers.Vector) (err error) { 58 // TODO: segment level index 59 return moerr.GetOkExpectedPossibleDup() 60 // blkIt := segment.meta.MakeBlockIt(false) 61 // for blkIt.Valid() { 62 // block := blkIt.Get().GetPayload().(*catalog.BlockEntry) 63 // if err = block.GetBlockData().BatchDedup(txn, pks); err != nil { 64 // return 65 // } 66 // blkIt.Next() 67 // } 68 // return nil 69 } 70 71 func (segment *dataSegment) MutationInfo() string { return "" } 72 73 func (segment *dataSegment) RunCalibration() int { return 0 } 74 func (segment *dataSegment) EstimateScore(interval time.Duration, force bool) int { return 0 } 75 76 func (segment *dataSegment) BuildCompactionTaskFactory() (factory tasks.TxnTaskFactory, taskType tasks.TaskType, scopes []common.ID, err error) { 77 if segment.meta.IsAppendable() { 78 segment.meta.RLock() 79 dropped := segment.meta.HasDropCommittedLocked() 80 inTxn := segment.meta.IsCreatingOrAborted() 81 segment.meta.RUnlock() 82 if dropped || inTxn { 83 return 84 } 85 filter := catalog.NewComposedFilter() 86 filter.AddBlockFilter(catalog.NonAppendableBlkFilter) 87 filter.AddCommitFilter(catalog.ActiveWithNoTxnFilter) 88 blks := segment.meta.CollectBlockEntries(filter.FilteCommit, filter.FilteBlock) 89 if len(blks) < int(segment.meta.GetTable().GetSchema().SegmentMaxBlocks) { 90 return 91 } 92 for _, blk := range blks { 93 scopes = append(scopes, *blk.AsCommonID()) 94 } 95 factory = jobs.CompactSegmentTaskFactory(blks, segment.scheduler) 96 taskType = tasks.DataCompactionTask 97 return 98 } 99 return 100 }