github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/db/tables_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 db
    16  
    17  import (
    18  	"bytes"
    19  	"sync"
    20  	"testing"
    21  	"time"
    22  
    23  	"github.com/matrixorigin/matrixone/pkg/common/moerr"
    24  	"github.com/matrixorigin/matrixone/pkg/container/types"
    25  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog"
    26  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common"
    27  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/containers"
    28  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/handle"
    29  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/options"
    30  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tables"
    31  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tables/jobs"
    32  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils"
    33  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils/config"
    34  	"github.com/panjf2000/ants/v2"
    35  	"github.com/stretchr/testify/assert"
    36  )
    37  
    38  func TestTables1(t *testing.T) {
    39  	defer testutils.AfterTest(t)()
    40  	testutils.EnsureNoLeak(t)
    41  	db := initDB(t, nil)
    42  	defer db.Close()
    43  	txn, _ := db.StartTxn(nil)
    44  	database, _ := txn.CreateDatabase("db", "")
    45  	schema := catalog.MockSchema(1, 0)
    46  	schema.BlockMaxRows = 1000
    47  	schema.SegmentMaxBlocks = 2
    48  	rel, _ := database.CreateRelation(schema)
    49  	tableMeta := rel.GetMeta().(*catalog.TableEntry)
    50  	dataFactory := tables.NewDataFactory(db.Fs, db.MTBufMgr, db.Scheduler, db.Dir)
    51  	tableFactory := dataFactory.MakeTableFactory()
    52  	table := tableFactory(tableMeta)
    53  	handle := table.GetHandle()
    54  	_, err := handle.GetAppender()
    55  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrAppendableSegmentNotFound))
    56  	seg, _ := rel.CreateSegment(false)
    57  	blk, _ := seg.CreateBlock(false)
    58  	id := blk.GetMeta().(*catalog.BlockEntry).AsCommonID()
    59  	appender := handle.SetAppender(id)
    60  	assert.NotNil(t, appender)
    61  
    62  	blkCnt := 3
    63  	rows := schema.BlockMaxRows * uint32(blkCnt)
    64  	_, _, toAppend, err := appender.PrepareAppend(rows, nil)
    65  	assert.Equal(t, schema.BlockMaxRows, toAppend)
    66  	assert.Nil(t, err)
    67  	t.Log(toAppend)
    68  
    69  	_, _, toAppend, err = appender.PrepareAppend(rows-toAppend, nil)
    70  	assert.Nil(t, err)
    71  	assert.Equal(t, uint32(0), toAppend)
    72  
    73  	_, err = handle.GetAppender()
    74  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrAppendableBlockNotFound))
    75  
    76  	blk, _ = seg.CreateBlock(false)
    77  	id = blk.GetMeta().(*catalog.BlockEntry).AsCommonID()
    78  	appender = handle.SetAppender(id)
    79  
    80  	_, _, toAppend, err = appender.PrepareAppend(rows-toAppend, nil)
    81  	assert.Nil(t, err)
    82  	assert.Equal(t, schema.BlockMaxRows, toAppend)
    83  
    84  	_, err = handle.GetAppender()
    85  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrAppendableSegmentNotFound))
    86  
    87  	seg, _ = rel.CreateSegment(false)
    88  	blk, _ = seg.CreateBlock(false)
    89  
    90  	id = blk.GetMeta().(*catalog.BlockEntry).AsCommonID()
    91  	appender = handle.SetAppender(id)
    92  	_, _, toAppend, err = appender.PrepareAppend(rows-2*toAppend, nil)
    93  	assert.Nil(t, err)
    94  	assert.Equal(t, schema.BlockMaxRows, toAppend)
    95  	t.Log(db.Opts.Catalog.SimplePPString(common.PPL1))
    96  	err = txn.Rollback()
    97  	assert.Nil(t, err)
    98  	t.Log(db.Opts.Catalog.SimplePPString(common.PPL1))
    99  }
   100  
   101  func TestTxn1(t *testing.T) {
   102  	defer testutils.AfterTest(t)()
   103  	testutils.EnsureNoLeak(t)
   104  	db := initDB(t, nil)
   105  	defer db.Close()
   106  
   107  	schema := catalog.MockSchema(3, 2)
   108  	schema.BlockMaxRows = 10000
   109  	schema.SegmentMaxBlocks = 4
   110  	batchRows := schema.BlockMaxRows * 2 / 5
   111  	cnt := uint32(20)
   112  	bat := catalog.MockBatch(schema, int(batchRows*cnt))
   113  	defer bat.Close()
   114  	bats := bat.Split(20)
   115  	{
   116  		txn, _ := db.StartTxn(nil)
   117  		database, err := txn.CreateDatabase("db", "")
   118  		assert.Nil(t, err)
   119  		_, err = database.CreateRelation(schema)
   120  		assert.Nil(t, err)
   121  		err = txn.Commit()
   122  		assert.Nil(t, err)
   123  	}
   124  	var wg sync.WaitGroup
   125  	now := time.Now()
   126  	doAppend := func(b *containers.Batch) func() {
   127  		return func() {
   128  			defer wg.Done()
   129  			txn, _ := db.StartTxn(nil)
   130  			database, _ := txn.GetDatabase("db")
   131  			rel, err := database.GetRelationByName(schema.Name)
   132  			assert.Nil(t, err)
   133  			err = rel.Append(b)
   134  			assert.Nil(t, err)
   135  			err = txn.Commit()
   136  			assert.Nil(t, err)
   137  		}
   138  	}
   139  	p, err := ants.NewPool(4)
   140  	assert.Nil(t, err)
   141  	defer p.Release()
   142  	for _, toAppend := range bats {
   143  		wg.Add(1)
   144  		err := p.Submit(doAppend(toAppend))
   145  		assert.Nil(t, err)
   146  	}
   147  
   148  	wg.Wait()
   149  
   150  	t.Logf("Append takes: %s", time.Since(now))
   151  	// expectBlkCnt := (uint32(batchRows)*uint32(batchCnt)*uint32(loopCnt)-1)/schema.BlockMaxRows + 1
   152  	expectBlkCnt := (uint32(batchRows)*uint32(cnt)-1)/schema.BlockMaxRows + 1
   153  	expectSegCnt := (expectBlkCnt-1)/uint32(schema.SegmentMaxBlocks) + 1
   154  	// t.Log(expectBlkCnt)
   155  	// t.Log(expectSegCnt)
   156  	{
   157  		txn, _ := db.StartTxn(nil)
   158  		database, _ := txn.GetDatabase("db")
   159  		rel, _ := database.GetRelationByName(schema.Name)
   160  		seg, err := rel.CreateSegment(false)
   161  		assert.Nil(t, err)
   162  		_, err = seg.CreateBlock(false)
   163  		assert.Nil(t, err)
   164  	}
   165  	{
   166  		txn, _ := db.StartTxn(nil)
   167  		database, _ := txn.GetDatabase("db")
   168  		rel, _ := database.GetRelationByName(schema.Name)
   169  		segIt := rel.MakeSegmentIt()
   170  		segCnt := uint32(0)
   171  		blkCnt := uint32(0)
   172  		for segIt.Valid() {
   173  			segCnt++
   174  			blkIt := segIt.GetSegment().MakeBlockIt()
   175  			for blkIt.Valid() {
   176  				blkCnt++
   177  				blkIt.Next()
   178  			}
   179  			segIt.Next()
   180  		}
   181  		assert.Equal(t, expectSegCnt, segCnt)
   182  		assert.Equal(t, expectBlkCnt, blkCnt)
   183  	}
   184  	t.Log(db.Opts.Catalog.SimplePPString(common.PPL1))
   185  }
   186  
   187  func TestTxn2(t *testing.T) {
   188  	defer testutils.AfterTest(t)()
   189  	testutils.EnsureNoLeak(t)
   190  	db := initDB(t, nil)
   191  	defer db.Close()
   192  
   193  	var wg sync.WaitGroup
   194  	run := func() {
   195  		defer wg.Done()
   196  		txn, _ := db.StartTxn(nil)
   197  		if _, err := txn.CreateDatabase("db", ""); err != nil {
   198  			assert.Nil(t, txn.Rollback())
   199  		} else {
   200  			assert.Nil(t, txn.Commit())
   201  		}
   202  		t.Log(txn.String())
   203  	}
   204  	wg.Add(2)
   205  	go run()
   206  	go run()
   207  	wg.Wait()
   208  	t.Log(db.Opts.Catalog.SimplePPString(common.PPL1))
   209  }
   210  
   211  func TestTxn4(t *testing.T) {
   212  	defer testutils.AfterTest(t)()
   213  	testutils.EnsureNoLeak(t)
   214  	db := initDB(t, nil)
   215  	defer db.Close()
   216  
   217  	schema := catalog.MockSchemaAll(4, 2)
   218  	schema.BlockMaxRows = 40000
   219  	schema.SegmentMaxBlocks = 8
   220  	{
   221  		txn, _ := db.StartTxn(nil)
   222  		database, _ := txn.CreateDatabase("db", "")
   223  		rel, _ := database.CreateRelation(schema)
   224  		pk := containers.MakeVector(schema.GetSingleSortKey().Type, schema.GetSingleSortKey().Nullable())
   225  		defer pk.Close()
   226  		pk.AppendMany(int32(1), int32(2), int32(1))
   227  		provider := containers.NewMockDataProvider()
   228  		provider.AddColumnProvider(schema.GetSingleSortKeyIdx(), pk)
   229  		bat := containers.MockBatch(schema.Types(), 3, schema.GetSingleSortKeyIdx(), provider)
   230  		defer bat.Close()
   231  		err := rel.Append(bat)
   232  		t.Log(err)
   233  		assert.NotNil(t, err)
   234  		assert.Nil(t, txn.Commit())
   235  	}
   236  }
   237  
   238  func TestTxn5(t *testing.T) {
   239  	defer testutils.AfterTest(t)()
   240  	testutils.EnsureNoLeak(t)
   241  	db := initDB(t, nil)
   242  	defer db.Close()
   243  
   244  	schema := catalog.MockSchemaAll(4, 2)
   245  	schema.BlockMaxRows = 20
   246  	schema.SegmentMaxBlocks = 4
   247  	cnt := uint32(10)
   248  	rows := schema.BlockMaxRows / 2 * cnt
   249  	bat := catalog.MockBatch(schema, int(rows))
   250  	defer bat.Close()
   251  	bats := bat.Split(int(cnt))
   252  	{
   253  		txn, _ := db.StartTxn(nil)
   254  		database, _ := txn.CreateDatabase("db", "")
   255  		_, err := database.CreateRelation(schema)
   256  		assert.Nil(t, err)
   257  		assert.Nil(t, txn.Commit())
   258  	}
   259  	{
   260  		txn, _ := db.StartTxn(nil)
   261  		database, _ := txn.GetDatabase("db")
   262  		rel, _ := database.GetRelationByName(schema.Name)
   263  		err := rel.Append(bats[0])
   264  		assert.Nil(t, err)
   265  		err = rel.Append(bats[0])
   266  		assert.NotNil(t, err)
   267  		assert.Nil(t, txn.Rollback())
   268  	}
   269  
   270  	{
   271  		txn, _ := db.StartTxn(nil)
   272  		database, _ := txn.GetDatabase("db")
   273  		rel, _ := database.GetRelationByName(schema.Name)
   274  		err := rel.Append(bats[0])
   275  		assert.Nil(t, err)
   276  		assert.Nil(t, txn.Commit())
   277  	}
   278  	{
   279  		txn, _ := db.StartTxn(nil)
   280  		database, _ := txn.GetDatabase("db")
   281  		rel, _ := database.GetRelationByName(schema.Name)
   282  		err := rel.Append(bats[0])
   283  		assert.NotNil(t, err)
   284  		assert.Nil(t, txn.Rollback())
   285  	}
   286  	{
   287  		txn, _ := db.StartTxn(nil)
   288  		database, _ := txn.GetDatabase("db")
   289  		rel, _ := database.GetRelationByName(schema.Name)
   290  		err := rel.Append(bats[1])
   291  		assert.Nil(t, err)
   292  
   293  		txn2, _ := db.StartTxn(nil)
   294  		db2, _ := txn2.GetDatabase("db")
   295  		rel2, _ := db2.GetRelationByName(schema.Name)
   296  		err = rel2.Append(bats[1])
   297  		assert.Nil(t, err)
   298  		err = rel2.Append(bats[2])
   299  		assert.Nil(t, err)
   300  
   301  		assert.Nil(t, txn2.Commit())
   302  		assert.Error(t, txn.Commit())
   303  		t.Log(txn2.String())
   304  		t.Log(txn.String())
   305  	}
   306  	t.Log(db.Opts.Catalog.SimplePPString(common.PPL1))
   307  }
   308  
   309  func TestTxn6(t *testing.T) {
   310  	defer testutils.AfterTest(t)()
   311  	testutils.EnsureNoLeak(t)
   312  	db := initDB(t, nil)
   313  	defer db.Close()
   314  
   315  	schema := catalog.MockSchemaAll(4, 2)
   316  	schema.BlockMaxRows = 20
   317  	schema.SegmentMaxBlocks = 4
   318  	cnt := uint32(10)
   319  	rows := schema.BlockMaxRows / 2 * cnt
   320  	bat := catalog.MockBatch(schema, int(rows))
   321  	defer bat.Close()
   322  	bats := bat.Split(int(cnt))
   323  	{
   324  		txn, _ := db.StartTxn(nil)
   325  		database, _ := txn.CreateDatabase("db", "")
   326  		rel, _ := database.CreateRelation(schema)
   327  		err := rel.Append(bats[0])
   328  		assert.Nil(t, err)
   329  		assert.Nil(t, txn.Commit())
   330  	}
   331  	{
   332  		txn, _ := db.StartTxn(nil)
   333  		database, _ := txn.GetDatabase("db")
   334  		rel, _ := database.GetRelationByName(schema.Name)
   335  		filter := new(handle.Filter)
   336  		filter.Op = handle.FilterEq
   337  		filter.Val = int32(5)
   338  
   339  		err := rel.UpdateByFilter(filter, uint16(3), int64(33))
   340  		assert.NoError(t, err)
   341  
   342  		err = rel.UpdateByFilter(filter, uint16(3), int64(44))
   343  		assert.NoError(t, err)
   344  		v, err := rel.GetValueByFilter(filter, 3)
   345  		assert.NoError(t, err)
   346  		assert.Equal(t, int64(44), v)
   347  
   348  		filter.Val = int32(6)
   349  		err = rel.UpdateByFilter(filter, uint16(3), int64(77))
   350  		assert.NoError(t, err)
   351  
   352  		err = rel.DeleteByFilter(filter)
   353  		assert.NoError(t, err)
   354  
   355  		// Double delete in a same txn -- FAIL
   356  		err = rel.DeleteByFilter(filter)
   357  		assert.Error(t, err)
   358  
   359  		{
   360  			txn, _ := db.StartTxn(nil)
   361  			database, _ := txn.GetDatabase("db")
   362  			rel, _ := database.GetRelationByName(schema.Name)
   363  
   364  			filter.Val = int32(5)
   365  			v, err := rel.GetValueByFilter(filter, 3)
   366  			assert.NoError(t, err)
   367  			assert.NotEqual(t, int64(44), v)
   368  
   369  			err = rel.UpdateByFilter(filter, uint16(3), int64(55))
   370  			assert.Error(t, err)
   371  
   372  			filter.Val = int32(7)
   373  			err = rel.UpdateByFilter(filter, uint16(3), int64(88))
   374  			assert.NoError(t, err)
   375  
   376  			// Update row that has uncommitted delete -- FAIL
   377  			filter.Val = int32(6)
   378  			err = rel.UpdateByFilter(filter, uint16(3), int64(55))
   379  			assert.Error(t, err)
   380  			_, err = rel.GetValueByFilter(filter, 3)
   381  			assert.NoError(t, err)
   382  			err = txn.Rollback()
   383  			assert.NoError(t, err)
   384  		}
   385  		filter.Val = int32(7)
   386  		err = rel.UpdateByFilter(filter, uint16(3), int64(99))
   387  		assert.NoError(t, err)
   388  
   389  		assert.NoError(t, txn.Commit())
   390  
   391  		{
   392  			txn, _ := db.StartTxn(nil)
   393  			database, _ := txn.GetDatabase("db")
   394  			rel, _ := database.GetRelationByName(schema.Name)
   395  
   396  			filter.Val = int32(5)
   397  			v, err := rel.GetValueByFilter(filter, 3)
   398  			assert.NoError(t, err)
   399  			assert.Equal(t, int64(44), v)
   400  
   401  			filter.Val = int32(7)
   402  			v, err = rel.GetValueByFilter(filter, 3)
   403  			assert.NoError(t, err)
   404  			assert.Equal(t, int64(99), v)
   405  
   406  			filter.Val = int32(6)
   407  			_, err = rel.GetValueByFilter(filter, 3)
   408  			assert.Error(t, err)
   409  
   410  			var buffer bytes.Buffer
   411  			it := rel.MakeBlockIt()
   412  			for it.Valid() {
   413  				buffer.Reset()
   414  				blk := it.GetBlock()
   415  				view, err := blk.GetColumnDataByName(schema.ColDefs[3].Name, &buffer)
   416  				assert.Nil(t, err)
   417  				defer view.Close()
   418  				assert.NotEqual(t, bats[0].Length(), view.Length())
   419  				t.Log(view.DeleteMask.String())
   420  				assert.Equal(t, bats[0].Length()-1, view.ApplyDeletes().Length())
   421  				it.Next()
   422  			}
   423  		}
   424  	}
   425  }
   426  
   427  func TestMergeBlocks1(t *testing.T) {
   428  	defer testutils.AfterTest(t)()
   429  	testutils.EnsureNoLeak(t)
   430  	opts := new(options.Options)
   431  	db := initDB(t, opts)
   432  	defer db.Close()
   433  	schema := catalog.MockSchemaAll(13, 2)
   434  	schema.BlockMaxRows = 5
   435  	schema.SegmentMaxBlocks = 8
   436  	col3Data := []int64{10, 8, 1, 6, 15, 7, 3, 12, 11, 4, 9, 5, 14, 13, 2}
   437  	// col3Data := []int64{2, 9, 11, 13, 15, 1, 4, 7, 10, 14, 3, 5, 6, 8, 12}
   438  	pkData := []int32{2, 9, 11, 13, 15, 1, 4, 7, 10, 14, 3, 5, 6, 8, 12}
   439  	pk := containers.MakeVector(schema.GetSingleSortKey().Type, schema.GetSingleSortKey().Nullable())
   440  	defer pk.Close()
   441  	col3 := containers.MakeVector(schema.ColDefs[3].Type, schema.ColDefs[3].Nullable())
   442  	defer col3.Close()
   443  	mapping := make(map[int32]int64)
   444  	for i, v := range pkData {
   445  		pk.Append(v)
   446  		col3.Append(col3Data[i])
   447  		mapping[v] = col3Data[i]
   448  	}
   449  
   450  	provider := containers.NewMockDataProvider()
   451  	provider.AddColumnProvider(schema.GetSingleSortKeyIdx(), pk)
   452  	provider.AddColumnProvider(3, col3)
   453  	bat := containers.MockBatch(schema.Types(), int(schema.BlockMaxRows*3), schema.GetSingleSortKeyIdx(), provider)
   454  	defer bat.Close()
   455  	{
   456  		txn, _ := db.StartTxn(nil)
   457  		database, _ := txn.CreateDatabase("db", "")
   458  		rel, _ := database.CreateRelation(schema)
   459  		err := rel.Append(bat)
   460  		assert.Nil(t, err)
   461  		assert.Nil(t, txn.Commit())
   462  	}
   463  
   464  	{
   465  		txn, _ := db.StartTxn(nil)
   466  		database, _ := txn.GetDatabase("db")
   467  		rel, _ := database.GetRelationByName(schema.Name)
   468  		blks := make([]*catalog.BlockEntry, 0)
   469  		it := rel.MakeBlockIt()
   470  		for it.Valid() {
   471  			blk := it.GetBlock()
   472  			meta := blk.GetMeta().(*catalog.BlockEntry)
   473  			blks = append(blks, meta)
   474  			it.Next()
   475  		}
   476  		{
   477  			txn, _ := db.StartTxn(nil)
   478  			database, _ := txn.GetDatabase("db")
   479  			rel, _ := database.GetRelationByName(schema.Name)
   480  			it := rel.MakeBlockIt()
   481  			blk := it.GetBlock()
   482  			err := blk.RangeDelete(4, 4, handle.DT_Normal)
   483  			assert.Nil(t, err)
   484  			assert.Nil(t, txn.Commit())
   485  		}
   486  		start := time.Now()
   487  		factory := jobs.MergeBlocksIntoSegmentTaskFctory(blks, blks[0].GetSegment(), db.Scheduler)
   488  		// err = task.WaitDone()
   489  		// assert.Nil(t, err)
   490  		{
   491  			task, err := factory(nil, txn)
   492  			assert.Nil(t, err)
   493  			err = task.OnExec()
   494  			assert.Nil(t, err)
   495  		}
   496  		assert.Nil(t, txn.Commit())
   497  		t.Logf("MergeSort takes: %s", time.Since(start))
   498  		t.Log(db.Opts.Catalog.SimplePPString(common.PPL1))
   499  	}
   500  	{
   501  		txn, _ := db.StartTxn(nil)
   502  		database, _ := txn.GetDatabase("db")
   503  		rel, _ := database.GetRelationByName(schema.Name)
   504  		it := rel.MakeBlockIt()
   505  		for it.Valid() {
   506  			blk := it.GetBlock()
   507  			view, _ := blk.GetColumnDataById(3, nil)
   508  			assert.NotNil(t, view)
   509  			defer view.Close()
   510  			if view.DeleteMask != nil {
   511  				t.Log(view.DeleteMask.String())
   512  			}
   513  			pkView, _ := blk.GetColumnDataById(schema.GetSingleSortKeyIdx(), nil)
   514  			defer pkView.Close()
   515  			for i := 0; i < pkView.Length(); i++ {
   516  				pkv := pkView.GetValue(i)
   517  				colv := view.GetValue(i)
   518  				assert.Equal(t, mapping[pkv.(int32)], colv)
   519  			}
   520  			it.Next()
   521  		}
   522  	}
   523  	// testutils.WaitExpect(1000, func() bool {
   524  	// 	return db.Wal.GetPenddingCnt() == 0
   525  	// })
   526  	// assert.Equal(t, uint64(0), db.Wal.GetPenddingCnt())
   527  	t.Logf("Checkpointed: %d", db.Wal.GetCheckpointed())
   528  	t.Logf("PendingCnt: %d", db.Wal.GetPenddingCnt())
   529  }
   530  
   531  func TestMergeBlocks2(t *testing.T) {
   532  	defer testutils.AfterTest(t)()
   533  	testutils.EnsureNoLeak(t)
   534  	opts := config.WithQuickScanAndCKPOpts(nil)
   535  	tae := initDB(t, opts)
   536  	schema := catalog.MockSchemaAll(13, 2)
   537  	schema.BlockMaxRows = 5
   538  	schema.SegmentMaxBlocks = 2
   539  	col3Data := []int64{10, 8, 1, 6, 15, 7, 3, 12, 11, 4, 9, 5, 14, 13, 2}
   540  	// col3Data := []int64{2, 9, 11, 13, 15, 1, 4, 7, 10, 14, 3, 5, 6, 8, 12}
   541  	pkData := []int32{2, 9, 11, 13, 15, 1, 4, 7, 10, 14, 3, 5, 6, 8, 12}
   542  
   543  	pk := containers.MakeVector(schema.GetSingleSortKey().Type, schema.GetSingleSortKey().Nullable())
   544  	col3 := containers.MakeVector(schema.ColDefs[3].Type, schema.ColDefs[3].Nullable())
   545  	mapping := make(map[int32]int64)
   546  	for i, v := range pkData {
   547  		pk.Append(v)
   548  		col3.Append(col3Data[i])
   549  		mapping[v] = col3Data[i]
   550  	}
   551  
   552  	provider := containers.NewMockDataProvider()
   553  	provider.AddColumnProvider(schema.GetSingleSortKeyIdx(), pk)
   554  	provider.AddColumnProvider(3, col3)
   555  	bat := containers.MockBatch(schema.Types(), int(schema.BlockMaxRows*3), schema.GetSingleSortKeyIdx(), provider)
   556  	{
   557  		txn, _ := tae.StartTxn(nil)
   558  		database, _ := txn.CreateDatabase("db", "")
   559  		rel, _ := database.CreateRelation(schema)
   560  		err := rel.Append(bat)
   561  		assert.Nil(t, err)
   562  		assert.Nil(t, txn.Commit())
   563  	}
   564  	pk.Close()
   565  	col3.Close()
   566  	bat.Close()
   567  	start := time.Now()
   568  	testutils.WaitExpect(2000, func() bool {
   569  		return tae.Wal.GetPenddingCnt() == 0
   570  	})
   571  	t.Logf("Wait %s", time.Since(start))
   572  	// assert.Equal(t, uint64(0), tae.Wal.GetPenddingCnt())
   573  	t.Logf("Checkpointed: %d", tae.Wal.GetCheckpointed())
   574  	t.Logf("PendingCnt: %d", tae.Wal.GetPenddingCnt())
   575  	tae.Close()
   576  }
   577  
   578  func TestCompaction1(t *testing.T) {
   579  	defer testutils.AfterTest(t)()
   580  	testutils.EnsureNoLeak(t)
   581  	db := initDB(t, nil)
   582  	defer db.Close()
   583  
   584  	schema := catalog.MockSchemaAll(4, 2)
   585  	schema.BlockMaxRows = 20
   586  	schema.SegmentMaxBlocks = 4
   587  	cnt := uint32(2)
   588  	rows := schema.BlockMaxRows / 2 * cnt
   589  	bat := catalog.MockBatch(schema, int(rows))
   590  	defer bat.Close()
   591  	bats := bat.Split(int(cnt))
   592  	{
   593  		txn, _ := db.StartTxn(nil)
   594  		database, _ := txn.CreateDatabase("db", "")
   595  		rel, _ := database.CreateRelation(schema)
   596  		err := rel.Append(bats[0])
   597  		assert.Nil(t, err)
   598  		assert.Nil(t, txn.Commit())
   599  	}
   600  	{
   601  		txn, _ := db.StartTxn(nil)
   602  		database, _ := txn.GetDatabase("db")
   603  		rel, _ := database.GetRelationByName(schema.Name)
   604  		it := rel.MakeBlockIt()
   605  		for it.Valid() {
   606  			blk := it.GetBlock()
   607  			view, _ := blk.GetColumnDataById(3, nil)
   608  			assert.NotNil(t, view)
   609  			view.Close()
   610  			assert.True(t, blk.GetMeta().(*catalog.BlockEntry).GetBlockData().IsAppendable())
   611  			it.Next()
   612  		}
   613  	}
   614  	{
   615  		txn, _ := db.StartTxn(nil)
   616  		database, _ := txn.GetDatabase("db")
   617  		rel, _ := database.GetRelationByName(schema.Name)
   618  		err := rel.Append(bats[1])
   619  		assert.Nil(t, err)
   620  		assert.Nil(t, txn.Commit())
   621  	}
   622  	{
   623  		txn, _ := db.StartTxn(nil)
   624  		database, _ := txn.GetDatabase("db")
   625  		rel, _ := database.GetRelationByName(schema.Name)
   626  		it := rel.MakeBlockIt()
   627  		for it.Valid() {
   628  			blk := it.GetBlock()
   629  			view, _ := blk.GetColumnDataById(3, nil)
   630  			assert.NotNil(t, view)
   631  			view.Close()
   632  			assert.False(t, blk.GetMeta().(*catalog.BlockEntry).GetBlockData().IsAppendable())
   633  			it.Next()
   634  		}
   635  	}
   636  }
   637  
   638  func TestCompaction2(t *testing.T) {
   639  	defer testutils.AfterTest(t)()
   640  	testutils.EnsureNoLeak(t)
   641  	opts := config.WithQuickScanAndCKPOpts(nil)
   642  	db := initDB(t, opts)
   643  	defer db.Close()
   644  
   645  	schema := catalog.MockSchemaAll(4, 2)
   646  	schema.BlockMaxRows = 21
   647  	schema.SegmentMaxBlocks = 4
   648  	cnt := uint32(3)
   649  	rows := schema.BlockMaxRows
   650  	bat := catalog.MockBatch(schema, int(rows))
   651  	defer bat.Close()
   652  	bats := bat.Split(int(cnt))
   653  	{
   654  		txn, _ := db.StartTxn(nil)
   655  		database, _ := txn.CreateDatabase("db", "")
   656  		rel, _ := database.CreateRelation(schema)
   657  		err := rel.Append(bats[0])
   658  		assert.Nil(t, err)
   659  		assert.Nil(t, txn.Commit())
   660  	}
   661  
   662  	testutils.WaitExpect(5000, func() bool {
   663  		dirty := db.BGCheckpointRunner.GetDirtyCollector().ScanInRangePruned(types.TS{}, types.MaxTs())
   664  		return dirty.GetTree().Compact()
   665  	})
   666  	{
   667  		txn, _ := db.StartTxn(nil)
   668  		database, _ := txn.GetDatabase("db")
   669  		rel, _ := database.GetRelationByName(schema.Name)
   670  		it := rel.MakeBlockIt()
   671  		for it.Valid() {
   672  			blk := it.GetBlock()
   673  			view, _ := blk.GetColumnDataById(3, nil)
   674  			assert.NotNil(t, view)
   675  			view.Close()
   676  			assert.False(t, blk.GetMeta().(*catalog.BlockEntry).IsAppendable())
   677  			assert.False(t, blk.GetMeta().(*catalog.BlockEntry).GetBlockData().IsAppendable())
   678  			it.Next()
   679  		}
   680  	}
   681  	{
   682  		txn, _ := db.StartTxn(nil)
   683  		database, _ := txn.GetDatabase("db")
   684  		rel, _ := database.GetRelationByName(schema.Name)
   685  		it := rel.MakeBlockIt()
   686  		for it.Valid() {
   687  			blk := it.GetBlock()
   688  			view, _ := blk.GetColumnDataById(3, nil)
   689  			assert.NotNil(t, view)
   690  			view.Close()
   691  			assert.False(t, blk.GetMeta().(*catalog.BlockEntry).IsAppendable())
   692  			assert.False(t, blk.GetMeta().(*catalog.BlockEntry).GetBlockData().IsAppendable())
   693  			it.Next()
   694  		}
   695  	}
   696  }
   697  
   698  // TestCompaction3 is a case for testing block refcount,
   699  // which requires modification of the data block to test.
   700  /*func TestCompaction3(t *testing.T) {
   701  	defer testutils.AfterTest(t)()
   702  	testutils.EnsureNoLeak(t)
   703  	opts := config.WithQuickScanAndCKPOpts(nil)
   704  	db := initDB(t, opts)
   705  	defer db.Close()
   706  
   707  	schema := catalog.MockSchemaAll(4, 2)
   708  	schema.BlockMaxRows = 21
   709  	schema.SegmentMaxBlocks = 4
   710      schema.Name = tables.ForTestBlockRefName
   711  	cnt := uint32(3)
   712  	rows := schema.BlockMaxRows / 3 * cnt
   713  	bat := catalog.MockBatch(schema, int(rows))
   714  	defer bat.Close()
   715  	bats := bat.Split(int(cnt))
   716  	{
   717  		txn, _ := db.StartTxn(nil)
   718  		database, _ := txn.CreateDatabase("db")
   719  		rel, _ := database.CreateRelation(schema)
   720  		err := rel.Append(bats[0])
   721  		assert.Nil(t, err)
   722  		assert.Nil(t, txn.Commit())
   723  	}
   724  	go func() {
   725  		txn, _ := db.StartTxn(nil)
   726  		database, _ := txn.GetDatabase("db")
   727  		rel, _ := database.GetRelationByName(schema.Name)
   728  		err := rel.Append(bats[1])
   729  		assert.Nil(t, err)
   730  		assert.Nil(t, txn.Commit())
   731  	}()
   732  	{
   733  		txn, _ := db.StartTxn(nil)
   734  		database, _ := txn.GetDatabase("db")
   735  		rel, _ := database.GetRelationByName(schema.Name)
   736  		it := rel.MakeBlockIt()
   737  		for it.Valid() {
   738  			blk := it.GetBlock()
   739  			view, _ := blk.GetColumnDataById(3, nil)
   740  			assert.NotNil(t, view)
   741  			view.Close()
   742  			assert.True(t, blk.GetMeta().(*catalog.BlockEntry).IsAppendable())
   743  			it.Next()
   744  		}
   745  	}
   746  	time.Sleep(400 * time.Millisecond)
   747  	{
   748  		txn, _ := db.StartTxn(nil)
   749  		database, _ := txn.GetDatabase("db")
   750  		rel, _ := database.GetRelationByName(schema.Name)
   751  		it := rel.MakeBlockIt()
   752  		for it.Valid() {
   753  			blk := it.GetBlock()
   754  			view, _ := blk.GetColumnDataById(3, nil)
   755  			assert.NotNil(t, view)
   756  			view.Close()
   757  			assert.False(t, blk.GetMeta().(*catalog.BlockEntry).IsAppendable())
   758  			assert.False(t, blk.GetMeta().(*catalog.BlockEntry).GetBlockData().IsAppendable())
   759  			it.Next()
   760  		}
   761  	}
   762  }*/