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  }