github.com/matrixorigin/matrixone@v0.7.0/pkg/objectio/writer_test.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 objectio 16 17 import ( 18 "context" 19 "fmt" 20 "time" 21 22 "os" 23 "path" 24 "path/filepath" 25 "testing" 26 27 "github.com/matrixorigin/matrixone/pkg/common/mpool" 28 "github.com/matrixorigin/matrixone/pkg/container/batch" 29 "github.com/matrixorigin/matrixone/pkg/container/types" 30 "github.com/matrixorigin/matrixone/pkg/container/vector" 31 "github.com/matrixorigin/matrixone/pkg/defines" 32 "github.com/matrixorigin/matrixone/pkg/fileservice" 33 "github.com/matrixorigin/matrixone/pkg/testutil" 34 "github.com/stretchr/testify/assert" 35 ) 36 37 const ( 38 ModuleName = "ObjectIo" 39 ) 40 41 func GetDefaultTestPath(module string, t *testing.T) string { 42 return filepath.Join("/tmp", module, t.Name()) 43 } 44 45 func MakeDefaultTestPath(module string, t *testing.T) string { 46 path := GetDefaultTestPath(module, t) 47 err := os.MkdirAll(path, os.FileMode(0755)) 48 assert.Nil(t, err) 49 return path 50 } 51 52 func RemoveDefaultTestPath(module string, t *testing.T) { 53 path := GetDefaultTestPath(module, t) 54 os.RemoveAll(path) 55 } 56 57 func InitTestEnv(module string, t *testing.T) string { 58 RemoveDefaultTestPath(module, t) 59 return MakeDefaultTestPath(module, t) 60 } 61 62 func TestNewObjectWriter(t *testing.T) { 63 dir := InitTestEnv(ModuleName, t) 64 dir = path.Join(dir, "/local") 65 id := 1 66 name := fmt.Sprintf("%d.blk", id) 67 mp := mpool.MustNewZero() 68 bat := newBatch(mp) 69 defer bat.Clean(mp) 70 c := fileservice.Config{ 71 Name: defines.LocalFileServiceName, 72 Backend: "DISK", 73 DataDir: dir, 74 } 75 service, err := fileservice.NewFileService(c) 76 assert.Nil(t, err) 77 78 objectWriter, err := NewObjectWriter(name, service) 79 assert.Nil(t, err) 80 fd, err := objectWriter.Write(bat) 81 assert.Nil(t, err) 82 for i := range bat.Vecs { 83 buf := fmt.Sprintf("test index %d", i) 84 index := NewBloomFilter(uint16(i), 0, []byte(buf)) 85 err = objectWriter.WriteIndex(fd, index) 86 assert.Nil(t, err) 87 88 zbuf := make([]byte, 64) 89 zbuf[31] = 1 90 zbuf[63] = 10 91 index, err = NewZoneMap(uint16(i), zbuf) 92 assert.Nil(t, err) 93 err = objectWriter.WriteIndex(fd, index) 94 assert.Nil(t, err) 95 } 96 _, err = objectWriter.Write(bat) 97 assert.Nil(t, err) 98 ts := time.Now() 99 option := WriteOptions{ 100 Type: WriteTS, 101 Val: ts, 102 } 103 blocks, err := objectWriter.WriteEnd(context.Background(), option) 104 assert.Nil(t, err) 105 assert.Equal(t, 2, len(blocks)) 106 assert.Nil(t, objectWriter.(*ObjectWriter).buffer) 107 108 objectReader, _ := NewObjectReader(name, service) 109 extents := make([]Extent, 2) 110 for i, blk := range blocks { 111 extents[i] = NewExtent(blk.GetID(), blk.GetExtent().offset, blk.GetExtent().length, blk.GetExtent().originSize) 112 } 113 pool, err := mpool.NewMPool("objectio_test", 0, mpool.NoFixed) 114 assert.NoError(t, err) 115 nb0 := pool.CurrNB() 116 bs, err := objectReader.ReadMeta(context.Background(), extents, pool) 117 assert.Nil(t, err) 118 assert.Equal(t, 2, len(bs)) 119 idxs := make([]uint16, 3) 120 idxs[0] = 0 121 idxs[1] = 2 122 idxs[2] = 3 123 vec, err := objectReader.Read(context.Background(), blocks[0].GetExtent(), idxs, pool) 124 assert.Nil(t, err) 125 vector1 := newVector(types.Type{Oid: types.T_int8}, vec.Entries[0].Object.([]byte)) 126 assert.Equal(t, int8(3), vector1.Col.([]int8)[3]) 127 vector2 := newVector(types.Type{Oid: types.T_int32}, vec.Entries[1].Object.([]byte)) 128 assert.Equal(t, int32(3), vector2.Col.([]int32)[3]) 129 vector3 := newVector(types.Type{Oid: types.T_int64}, vec.Entries[2].Object.([]byte)) 130 assert.Equal(t, int64(3), vector3.Col.([]int64)[3]) 131 indexes, err := objectReader.ReadIndex(context.Background(), blocks[0].GetExtent(), idxs, ZoneMapType, pool) 132 assert.Nil(t, err) 133 assert.Equal(t, 3, len(indexes)) 134 assert.Equal(t, uint8(0x1), indexes[0].(*ZoneMap).buf[31]) 135 assert.Equal(t, uint8(0xa), indexes[0].(*ZoneMap).buf[63]) 136 indexes, err = objectReader.ReadIndex(context.Background(), blocks[0].GetExtent(), idxs, BloomFilterType, pool) 137 assert.Nil(t, err) 138 assert.Equal(t, 3, len(indexes)) 139 assert.Equal(t, "test index 0", string(indexes[0].(*BloomFilter).buf)) 140 assert.True(t, nb0 == pool.CurrNB()) 141 142 fs := NewObjectFS(service, dir) 143 dirs, err := fs.ListDir("") 144 assert.Nil(t, err) 145 assert.Equal(t, 1, len(dirs)) 146 objectReader, err = NewObjectReader(name, service) 147 assert.Nil(t, err) 148 bs, err = objectReader.ReadAllMeta(context.Background(), dirs[0].Size, pool) 149 assert.Nil(t, err) 150 assert.Equal(t, 2, len(bs)) 151 assert.Nil(t, err) 152 assert.Equal(t, 2, len(bs)) 153 idxs = make([]uint16, 3) 154 idxs[0] = 0 155 idxs[1] = 2 156 idxs[2] = 3 157 vec, err = objectReader.Read(context.Background(), bs[0].GetExtent(), idxs, pool) 158 assert.Nil(t, err) 159 vector1 = newVector(types.Type{Oid: types.T_int8}, vec.Entries[0].Object.([]byte)) 160 assert.Equal(t, int8(3), vector1.Col.([]int8)[3]) 161 vector2 = newVector(types.Type{Oid: types.T_int32}, vec.Entries[1].Object.([]byte)) 162 assert.Equal(t, int32(3), vector2.Col.([]int32)[3]) 163 vector3 = newVector(types.Type{Oid: types.T_int64}, vec.Entries[2].Object.([]byte)) 164 assert.Equal(t, int64(3), vector3.Col.([]int64)[3]) 165 indexes, err = objectReader.ReadIndex(context.Background(), bs[0].GetExtent(), idxs, ZoneMapType, pool) 166 assert.Nil(t, err) 167 assert.Equal(t, 3, len(indexes)) 168 assert.Equal(t, uint8(0x1), indexes[0].(*ZoneMap).buf[31]) 169 assert.Equal(t, uint8(0xa), indexes[0].(*ZoneMap).buf[63]) 170 indexes, err = objectReader.ReadIndex(context.Background(), bs[0].GetExtent(), idxs, BloomFilterType, pool) 171 assert.Nil(t, err) 172 assert.Equal(t, 3, len(indexes)) 173 assert.Equal(t, "test index 0", string(indexes[0].(*BloomFilter).buf)) 174 assert.True(t, nb0 == pool.CurrNB()) 175 176 } 177 178 func newBatch(mp *mpool.MPool) *batch.Batch { 179 types := []types.Type{ 180 {Oid: types.T_int8}, 181 {Oid: types.T_int16}, 182 {Oid: types.T_int32}, 183 {Oid: types.T_int64}, 184 {Oid: types.T_uint16}, 185 {Oid: types.T_uint32}, 186 {Oid: types.T_uint8}, 187 {Oid: types.T_uint64}, 188 } 189 return testutil.NewBatch(types, false, int(40000*2), mp) 190 } 191 192 func newVector(tye types.Type, buf []byte) *vector.Vector { 193 vector := vector.New(tye) 194 vector.Read(buf) 195 return vector 196 }