github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/dataio/blockio/reader.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 blockio 16 17 import ( 18 "context" 19 "errors" 20 "io" 21 22 "github.com/google/uuid" 23 "github.com/matrixorigin/matrixone/pkg/common/mpool" 24 "github.com/matrixorigin/matrixone/pkg/fileservice" 25 26 "github.com/matrixorigin/matrixone/pkg/container/types" 27 "github.com/matrixorigin/matrixone/pkg/container/vector" 28 "github.com/matrixorigin/matrixone/pkg/objectio" 29 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/containers" 30 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tasks" 31 ) 32 33 type Reader struct { 34 reader objectio.Reader 35 fs *objectio.ObjectFS 36 key string 37 meta *Meta 38 name string 39 locs []objectio.Extent 40 readCxt context.Context 41 } 42 43 func NewReader(cxt context.Context, fs *objectio.ObjectFS, key string) (*Reader, error) { 44 meta, err := DecodeMetaLocToMeta(key) 45 if err != nil { 46 return nil, err 47 } 48 reader, err := objectio.NewObjectReader(meta.GetKey(), fs.Service) 49 if err != nil { 50 return nil, err 51 } 52 return &Reader{ 53 fs: fs, 54 reader: reader, 55 key: key, 56 meta: meta, 57 readCxt: cxt, 58 }, nil 59 } 60 61 func NewCheckpointReader(cxt context.Context, fs fileservice.FileService, key string) (*Reader, error) { 62 name, locs, err := DecodeMetaLocToMetas(key) 63 if err != nil { 64 return nil, err 65 } 66 reader, err := objectio.NewObjectReader(name, fs) 67 if err != nil { 68 return nil, err 69 } 70 return &Reader{ 71 fs: objectio.NewObjectFS(fs, ""), 72 reader: reader, 73 key: key, 74 name: name, 75 locs: locs, 76 readCxt: cxt, 77 }, nil 78 } 79 80 func (r *Reader) BlkColumnByMetaLoadJob( 81 colTypes []types.Type, 82 colNames []string, 83 nullables []bool, 84 block objectio.BlockObject, 85 ) *tasks.Job { 86 exec := func(_ context.Context) (result *tasks.JobResult) { 87 bat, err := r.LoadBlkColumnsByMeta(colTypes, colNames, nullables, block) 88 return &tasks.JobResult{ 89 Err: err, 90 Res: bat, 91 } 92 } 93 return tasks.NewJob(uuid.NewString(), r.readCxt, exec) 94 } 95 96 func (r *Reader) BlkColumnsByMetaAndIdxLoadJob( 97 colTypes []types.Type, 98 colNames []string, 99 nullables []bool, 100 block objectio.BlockObject, 101 idx int, 102 ) *tasks.Job { 103 exec := func(_ context.Context) (result *tasks.JobResult) { 104 bat, err := r.LoadBlkColumnsByMetaAndIdx( 105 colTypes, 106 colNames, 107 nullables, 108 block, 109 idx) 110 return &tasks.JobResult{ 111 Err: err, 112 Res: bat, 113 } 114 } 115 return tasks.NewJob(uuid.NewString(), r.readCxt, exec) 116 } 117 118 func (r *Reader) LoadBlkColumnsByMeta( 119 colTypes []types.Type, 120 colNames []string, 121 nullables []bool, 122 block objectio.BlockObject) (*containers.Batch, error) { 123 bat := containers.NewBatch() 124 if block.GetExtent().End() == 0 { 125 return bat, nil 126 } 127 idxs := make([]uint16, len(colNames)) 128 for i := range colNames { 129 idxs[i] = uint16(i) 130 } 131 ioResult, err := r.reader.Read(r.readCxt, block.GetExtent(), idxs, nil) 132 if err != nil { 133 return nil, err 134 } 135 136 for i := range colNames { 137 pkgVec := vector.New(colTypes[i]) 138 data := make([]byte, len(ioResult.Entries[i].Object.([]byte))) 139 copy(data, ioResult.Entries[i].Object.([]byte)) 140 if err = pkgVec.Read(data); err != nil && !errors.Is(err, io.EOF) { 141 return bat, err 142 } 143 var vec containers.Vector 144 if pkgVec.Length() == 0 { 145 vec = containers.MakeVector(colTypes[i], nullables[i]) 146 } else { 147 vec = containers.NewVectorWithSharedMemory(pkgVec, nullables[i]) 148 } 149 bat.AddVector(colNames[i], vec) 150 bat.Vecs[i] = vec 151 152 } 153 return bat, nil 154 } 155 156 func (r *Reader) LoadBlkColumnsByMetaAndIdx( 157 colTypes []types.Type, 158 colNames []string, 159 nullables []bool, 160 block objectio.BlockObject, 161 idx int) (*containers.Batch, error) { 162 bat := containers.NewBatch() 163 164 if block.GetExtent().End() == 0 { 165 return nil, nil 166 } 167 col, err := block.GetColumn(uint16(idx)) 168 if err != nil { 169 return bat, err 170 } 171 data, err := col.GetData(r.readCxt, nil) 172 if err != nil { 173 return bat, err 174 } 175 pkgVec := vector.New(colTypes[0]) 176 v := make([]byte, len(data.Entries[0].Object.([]byte))) 177 copy(v, data.Entries[0].Object.([]byte)) 178 if err = pkgVec.Read(v); err != nil && !errors.Is(err, io.EOF) { 179 return bat, err 180 } 181 var vec containers.Vector 182 if pkgVec.Length() == 0 { 183 vec = containers.MakeVector(colTypes[0], nullables[0]) 184 } else { 185 vec = containers.NewVectorWithSharedMemory(pkgVec, nullables[0]) 186 } 187 bat.AddVector(colNames[0], vec) 188 return bat, nil 189 } 190 191 func (r *Reader) ReadMeta(m *mpool.MPool) (objectio.BlockObject, error) { 192 extents := make([]objectio.Extent, 1) 193 extents[0] = r.meta.GetLoc() 194 block, err := r.reader.ReadMeta(r.readCxt, extents, m) 195 if err != nil { 196 return nil, err 197 } 198 return block[0], err 199 } 200 201 func (r *Reader) ReadMetas(m *mpool.MPool) ([]objectio.BlockObject, error) { 202 block, err := r.reader.ReadMeta(r.readCxt, r.locs, m) 203 return block, err 204 } 205 206 func (r *Reader) GetDataObject(idx uint16, m *mpool.MPool) objectio.ColumnObject { 207 block, err := r.ReadMeta(m) 208 if err != nil { 209 panic(any(err)) 210 } 211 if block == nil { 212 return nil 213 } 214 object, err := block.GetColumn(idx) 215 if err != nil { 216 panic(any(err)) 217 } 218 return object 219 }