github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/db/replay_test.go (about)

     1  // Copyright 2022 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  	"context"
    19  	"math/rand"
    20  	"sync"
    21  	"testing"
    22  	"time"
    23  
    24  	"github.com/matrixorigin/matrixone/pkg/common/moerr"
    25  	"github.com/matrixorigin/matrixone/pkg/container/types"
    26  	"github.com/matrixorigin/matrixone/pkg/logutil"
    27  	"github.com/matrixorigin/matrixone/pkg/pb/plan"
    28  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog"
    29  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common"
    30  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/handle"
    31  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils"
    32  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils/config"
    33  	"github.com/panjf2000/ants/v2"
    34  	"github.com/stretchr/testify/assert"
    35  )
    36  
    37  func TestReplayCatalog1(t *testing.T) {
    38  	defer testutils.AfterTest(t)()
    39  	testutils.EnsureNoLeak(t)
    40  	tae := initDB(t, nil)
    41  	schemas := make([]*catalog.Schema, 4)
    42  	for i := range schemas {
    43  		schemas[i] = catalog.MockSchema(2, 0)
    44  	}
    45  
    46  	txn, _ := tae.StartTxn(nil)
    47  	_, err := txn.CreateDatabase("db", "")
    48  	assert.Nil(t, err)
    49  	assert.Nil(t, txn.Commit())
    50  	createTable := func(schema *catalog.Schema, wg *sync.WaitGroup, forceCkp bool) func() {
    51  		return func() {
    52  			defer wg.Done()
    53  			txn, _ := tae.StartTxn(nil)
    54  			db, err := txn.GetDatabase("db")
    55  			assert.Nil(t, err)
    56  			_, err = db.CreateRelation(schema)
    57  			assert.Nil(t, err)
    58  			assert.Nil(t, txn.Commit())
    59  			txn, _ = tae.StartTxn(nil)
    60  			db, err = txn.GetDatabase("db")
    61  			assert.Nil(t, err)
    62  			rel, err := db.GetRelationByName(schema.Name)
    63  			assert.Nil(t, err)
    64  			segCnt := rand.Intn(5) + 1
    65  			for i := 0; i < segCnt; i++ {
    66  				seg, err := rel.CreateSegment(false)
    67  				assert.Nil(t, err)
    68  				blkCnt := rand.Intn(5) + 1
    69  				for j := 0; j < blkCnt; j++ {
    70  					_, err = seg.CreateBlock(false)
    71  					assert.Nil(t, err)
    72  				}
    73  			}
    74  			assert.Nil(t, txn.Commit())
    75  			if forceCkp || rand.Intn(100) > 80 {
    76  				err := tae.BGCheckpointRunner.ForceIncrementalCheckpoint(tae.TxnMgr.StatMaxCommitTS())
    77  				assert.NoError(t, err)
    78  			}
    79  		}
    80  	}
    81  
    82  	var wg sync.WaitGroup
    83  	pool, err := ants.NewPool(1)
    84  	assert.Nil(t, err)
    85  	defer pool.Release()
    86  	for i, schema := range schemas {
    87  		wg.Add(1)
    88  		ckp := false
    89  		if i == len(schemas)/2 {
    90  			ckp = true
    91  		}
    92  		err := pool.Submit(createTable(schema, &wg, ckp))
    93  		assert.Nil(t, err)
    94  	}
    95  	wg.Wait()
    96  	logutil.Info(tae.Catalog.SimplePPString(common.PPL1))
    97  	t.Logf("GetPenddingLSNCnt: %d", tae.Scheduler.GetPenddingLSNCnt())
    98  	t.Logf("GetCheckpointed: %d", tae.Scheduler.GetCheckpointedLSN())
    99  	tae.Close()
   100  
   101  	tae2, err := Open(tae.Dir, nil)
   102  	assert.Nil(t, err)
   103  	defer tae2.Close()
   104  
   105  	c := tae2.Catalog
   106  	defer c.Close()
   107  
   108  	// logutil.Info(c.SimplePPString(common.PPL1))
   109  	// t.Logf("GetCatalogCheckpointed: %v", tae.Catalog.GetCheckpointed())
   110  	// t.Logf("GetCatalogCheckpointed2: %v", c.GetCheckpointed())
   111  	// assert.Equal(t, tae.Catalog.GetCheckpointed(), c.GetCheckpointed())
   112  }
   113  
   114  func TestReplayCatalog2(t *testing.T) {
   115  	defer testutils.AfterTest(t)()
   116  	testutils.EnsureNoLeak(t)
   117  	tae := initDB(t, nil)
   118  	schema := catalog.MockSchema(2, 0)
   119  	schema2 := catalog.MockSchema(2, 0)
   120  	txn, _ := tae.StartTxn(nil)
   121  	_, err := txn.CreateDatabase("db2", "")
   122  	assert.Nil(t, err)
   123  	assert.Nil(t, txn.Commit())
   124  
   125  	txn, _ = tae.StartTxn(nil)
   126  	db, err := txn.CreateDatabase("db", "")
   127  	assert.Nil(t, err)
   128  	rel, err := db.CreateRelation(schema)
   129  	assert.Nil(t, err)
   130  	seg, err := rel.CreateSegment(false)
   131  	assert.Nil(t, err)
   132  	blk1, err := seg.CreateBlock(false)
   133  	assert.Nil(t, err)
   134  	blk1Meta := blk1.GetMeta().(*catalog.BlockEntry)
   135  	_, err = seg.CreateBlock(false)
   136  	assert.Nil(t, err)
   137  	_, err = db.CreateRelation(schema2)
   138  	assert.Nil(t, err)
   139  	assert.Nil(t, txn.Commit())
   140  
   141  	txn, _ = tae.StartTxn(nil)
   142  	_, err = txn.DropDatabase("db2")
   143  	assert.Nil(t, err)
   144  	assert.Nil(t, txn.Commit())
   145  
   146  	txn, _ = tae.StartTxn(nil)
   147  	db, err = txn.GetDatabase("db")
   148  	assert.Nil(t, err)
   149  	_, err = db.DropRelationByName(schema2.Name)
   150  	assert.Nil(t, err)
   151  	assert.Nil(t, txn.Commit())
   152  
   153  	txn, _ = tae.StartTxn(nil)
   154  	db, err = txn.GetDatabase("db")
   155  	assert.Nil(t, err)
   156  	rel, err = db.GetRelationByName(schema.Name)
   157  	assert.Nil(t, err)
   158  	seg, err = rel.GetSegment(blk1Meta.GetSegment().ID)
   159  	assert.Nil(t, err)
   160  	err = seg.SoftDeleteBlock(blk1Meta.ID)
   161  	assert.Nil(t, err)
   162  	assert.Nil(t, txn.Commit())
   163  
   164  	txn, _ = tae.StartTxn(nil)
   165  	db, err = txn.GetDatabase("db")
   166  	assert.Nil(t, err)
   167  	rel, err = db.GetRelationByName(schema.Name)
   168  	assert.Nil(t, err)
   169  	seg, err = rel.CreateSegment(false)
   170  	assert.Nil(t, err)
   171  	_, err = seg.CreateBlock(false)
   172  	assert.Nil(t, err)
   173  	assert.Nil(t, txn.Commit())
   174  	t.Log(tae.Catalog.SimplePPString(common.PPL1))
   175  	err = tae.BGCheckpointRunner.ForceIncrementalCheckpoint(tae.TxnMgr.StatMaxCommitTS())
   176  	assert.NoError(t, err)
   177  	tae.Close()
   178  
   179  	tae2, err := Open(tae.Dir, nil)
   180  	assert.Nil(t, err)
   181  	defer tae2.Close()
   182  
   183  	c := tae2.Catalog
   184  	defer c.Close()
   185  
   186  	// t.Log(c.SimplePPString(common.PPL1))
   187  	// t.Logf("GetCatalogCheckpointed: %v", tae.Catalog.GetCheckpointed())
   188  	// t.Logf("GetCatalogCheckpointed2: %v", c.GetCheckpointed())
   189  	// assert.Equal(t, tae.Catalog.GetCheckpointed(), c.GetCheckpointed())
   190  }
   191  
   192  func TestReplayCatalog3(t *testing.T) {
   193  	defer testutils.AfterTest(t)()
   194  	testutils.EnsureNoLeak(t)
   195  	tae := initDB(t, nil)
   196  	schema := catalog.MockSchema(2, 0)
   197  	schema2 := catalog.MockSchema(2, 0)
   198  	txn, _ := tae.StartTxn(nil)
   199  	_, err := txn.CreateDatabase("db2", "")
   200  	assert.Nil(t, err)
   201  	assert.Nil(t, txn.Commit())
   202  
   203  	txn, _ = tae.StartTxn(nil)
   204  	db, err := txn.CreateDatabase("db", "")
   205  	assert.Nil(t, err)
   206  	rel, err := db.CreateRelation(schema)
   207  	assert.Nil(t, err)
   208  	seg, err := rel.CreateSegment(false)
   209  	assert.Nil(t, err)
   210  	blk1, err := seg.CreateBlock(false)
   211  	assert.Nil(t, err)
   212  	blk1Meta := blk1.GetMeta().(*catalog.BlockEntry)
   213  	_, err = seg.CreateBlock(false)
   214  	assert.Nil(t, err)
   215  	_, err = db.CreateRelation(schema2)
   216  	assert.Nil(t, err)
   217  	assert.Nil(t, txn.Commit())
   218  
   219  	txn, _ = tae.StartTxn(nil)
   220  	_, err = txn.DropDatabase("db2")
   221  	assert.Nil(t, err)
   222  	assert.Nil(t, txn.Commit())
   223  
   224  	txn, _ = tae.StartTxn(nil)
   225  	db, err = txn.GetDatabase("db")
   226  	assert.Nil(t, err)
   227  	_, err = db.DropRelationByName(schema2.Name)
   228  	assert.Nil(t, err)
   229  	assert.Nil(t, txn.Commit())
   230  
   231  	txn, _ = tae.StartTxn(nil)
   232  	db, err = txn.GetDatabase("db")
   233  	assert.Nil(t, err)
   234  	rel, err = db.GetRelationByName(schema.Name)
   235  	assert.Nil(t, err)
   236  	seg, err = rel.GetSegment(blk1Meta.GetSegment().ID)
   237  	assert.Nil(t, err)
   238  	err = seg.SoftDeleteBlock(blk1Meta.ID)
   239  	assert.Nil(t, err)
   240  	assert.Nil(t, txn.Commit())
   241  
   242  	txn, _ = tae.StartTxn(nil)
   243  	db, err = txn.GetDatabase("db")
   244  	assert.Nil(t, err)
   245  	rel, err = db.GetRelationByName(schema.Name)
   246  	assert.Nil(t, err)
   247  	seg, err = rel.CreateSegment(false)
   248  	assert.Nil(t, err)
   249  	assert.Nil(t, txn.Commit())
   250  
   251  	txn, _ = tae.StartTxn(nil)
   252  	db, err = txn.GetDatabase("db")
   253  	assert.Nil(t, err)
   254  	rel, err = db.GetRelationByName(schema.Name)
   255  	assert.Nil(t, err)
   256  	err = rel.SoftDeleteSegment(seg.GetID())
   257  	assert.Nil(t, err)
   258  	assert.Nil(t, txn.Commit())
   259  
   260  	t.Log(tae.Catalog.SimplePPString(common.PPL1))
   261  	tae.Close()
   262  
   263  	tae2, err := Open(tae.Dir, nil)
   264  	assert.Nil(t, err)
   265  	defer tae2.Close()
   266  
   267  	c := tae2.Catalog
   268  	defer c.Close()
   269  
   270  	// t.Log(c.SimplePPString(common.PPL1))
   271  	// t.Logf("GetCatalogCheckpointed: %v", tae.Catalog.GetCheckpointed())
   272  	// t.Logf("GetCatalogCheckpointed2: %v", c.GetCheckpointed())
   273  	// assert.Equal(t, tae.Catalog.GetCheckpointed(), c.GetCheckpointed())
   274  }
   275  
   276  // catalog and data not checkpoint
   277  // catalog not softdelete
   278  func TestReplay1(t *testing.T) {
   279  	defer testutils.AfterTest(t)()
   280  	testutils.EnsureNoLeak(t)
   281  	tae := initDB(t, nil)
   282  	schema := catalog.MockSchema(2, 1)
   283  	schema.BlockMaxRows = 1000
   284  	schema.SegmentMaxBlocks = 2
   285  	txn, _ := tae.StartTxn(nil)
   286  	assert.Nil(t, txn.Commit())
   287  
   288  	txn, _ = tae.StartTxn(nil)
   289  	db, err := txn.CreateDatabase("db", "")
   290  	assert.Nil(t, err)
   291  	rel, err := db.CreateRelation(schema)
   292  	assert.Nil(t, err)
   293  	seg, err := rel.CreateSegment(false)
   294  	assert.Nil(t, err)
   295  	_, err = seg.CreateBlock(false)
   296  	assert.Nil(t, err)
   297  	assert.Nil(t, txn.Commit())
   298  	logutil.Infof("%d,%d", txn.GetStartTS(), txn.GetCommitTS())
   299  
   300  	t.Log(tae.Catalog.SimplePPString(common.PPL1))
   301  	tae.Close()
   302  
   303  	tae2, err := Open(tae.Dir, nil)
   304  	assert.Nil(t, err)
   305  	c := tae2.Catalog
   306  	t.Log(c.SimplePPString(common.PPL1))
   307  
   308  	bat := catalog.MockBatch(schema, 10000)
   309  	defer bat.Close()
   310  	txn, _ = tae2.StartTxn(nil)
   311  	db, err = txn.GetDatabase("db")
   312  	assert.Nil(t, err)
   313  	rel, err = db.GetRelationByName(schema.Name)
   314  	assert.Nil(t, err)
   315  	err = rel.Append(bat)
   316  	assert.Nil(t, err)
   317  	assert.Nil(t, txn.Commit())
   318  
   319  	txn, _ = tae2.StartTxn(nil)
   320  	db, err = txn.GetDatabase("db")
   321  	assert.Nil(t, err)
   322  	rel, err = db.GetRelationByName(schema.Name)
   323  	assert.Nil(t, err)
   324  	assert.Equal(t, uint64(10000), rel.GetMeta().(*catalog.TableEntry).GetRows())
   325  	filter := handle.NewEQFilter(int32(5))
   326  	err = rel.UpdateByFilter(filter, uint16(0), int32(33))
   327  	assert.Nil(t, err)
   328  	assert.Nil(t, txn.Commit())
   329  
   330  	txn, _ = tae2.StartTxn(nil)
   331  	db, err = txn.GetDatabase("db")
   332  	assert.Nil(t, err)
   333  	rel, err = db.GetRelationByName(schema.Name)
   334  	assert.Nil(t, err)
   335  	assert.Equal(t, uint64(10000), rel.GetMeta().(*catalog.TableEntry).GetRows())
   336  	filter.Val = int32(6)
   337  	err = rel.DeleteByFilter(filter)
   338  	assert.Nil(t, err)
   339  	assert.Nil(t, txn.Commit())
   340  
   341  	t.Log(c.SimplePPString(common.PPL1))
   342  	c.Close()
   343  	tae2.Close()
   344  
   345  	tae3, err := Open(tae.Dir, nil)
   346  	assert.Nil(t, err)
   347  	c3 := tae3.Catalog
   348  	t.Log(c3.SimplePPString(common.PPL1))
   349  
   350  	txn, _ = tae3.StartTxn(nil)
   351  	db, err = txn.GetDatabase("db")
   352  	assert.Nil(t, err)
   353  	rel, err = db.GetRelationByName(schema.Name)
   354  	assert.Nil(t, err)
   355  	assert.Equal(t, uint64(9999), rel.GetMeta().(*catalog.TableEntry).GetRows())
   356  	filter.Val = int32(5)
   357  	val, err := rel.GetValueByFilter(filter, 0)
   358  	assert.Nil(t, err)
   359  	assert.Equal(t, int32(33), val)
   360  
   361  	filter.Val = int32(6)
   362  	_, err = rel.GetValueByFilter(filter, 0)
   363  	assert.NotNil(t, err)
   364  	assert.Nil(t, txn.Commit())
   365  
   366  	c3.Close()
   367  	tae3.Close()
   368  }
   369  
   370  // 1. Create db and tbl, append data   [1]
   371  // 2. Update and delete.               [2]
   372  // 3. Delete first blk                 [3]
   373  // replay (catalog and data not ckp, catalog softdelete)
   374  // check 1. blk not exist, 2. id and row of data
   375  // 1. Checkpoint catalog               [ckp 3, partial 1]
   376  // 2. Append                           [4]
   377  // replay (catalog ckp, data not ckp)
   378  // check id and row of data
   379  // 1. Checkpoint data and catalog      [ckp all]
   380  // replay
   381  // TODO check id and row of data
   382  func TestReplay2(t *testing.T) {
   383  	defer testutils.AfterTest(t)()
   384  	testutils.EnsureNoLeak(t)
   385  	tae := initDB(t, nil)
   386  	schema := catalog.MockSchema(2, 1)
   387  	schema.BlockMaxRows = 1000
   388  	schema.SegmentMaxBlocks = 2
   389  	bat := catalog.MockBatch(schema, 10000)
   390  	defer bat.Close()
   391  	bats := bat.Split(2)
   392  
   393  	txn, err := tae.StartTxn(nil)
   394  	assert.Nil(t, err)
   395  	db, err := txn.CreateDatabase("db", "")
   396  	assert.Nil(t, err)
   397  	rel, err := db.CreateRelation(schema)
   398  	assert.Nil(t, err)
   399  	err = rel.Append(bats[0])
   400  	assert.Nil(t, err)
   401  	assert.Nil(t, txn.Commit())
   402  
   403  	txn, err = tae.StartTxn(nil)
   404  	assert.Nil(t, err)
   405  	db, err = txn.GetDatabase("db")
   406  	assert.Nil(t, err)
   407  	rel, err = db.GetRelationByName(schema.Name)
   408  	assert.Nil(t, err)
   409  
   410  	filter := handle.NewEQFilter(int32(1500))
   411  	id, row, err := rel.GetByFilter(filter)
   412  	assert.Nil(t, err)
   413  	err = rel.UpdateByFilter(filter, uint16(0), int32(33))
   414  	assert.Nil(t, err)
   415  
   416  	err = rel.RangeDelete(id, row+1, row+100, handle.DT_Normal)
   417  	assert.Nil(t, err)
   418  	assert.Nil(t, txn.Commit())
   419  
   420  	txn, err = tae.StartTxn(nil)
   421  	assert.Nil(t, err)
   422  	db, err = txn.GetDatabase("db")
   423  	assert.Nil(t, err)
   424  	rel, err = db.GetRelationByName(schema.Name)
   425  	assert.Nil(t, err)
   426  	blkIterator := rel.MakeBlockIt()
   427  	blk := blkIterator.GetBlock().GetMeta().(*catalog.BlockEntry)
   428  	seg, err := rel.GetSegment(blk.GetSegment().ID)
   429  	assert.Nil(t, err)
   430  	err = seg.SoftDeleteBlock(blk.ID)
   431  	assert.Nil(t, err)
   432  	assert.Nil(t, txn.Commit())
   433  
   434  	t.Log(tae.Catalog.SimplePPString(common.PPL1))
   435  	tae.Close()
   436  	//prevTs := tae.TxnMgr.TsAlloc.Get()
   437  
   438  	tae2, err := Open(tae.Dir, nil)
   439  	assert.Nil(t, err)
   440  	t.Log(tae2.Catalog.SimplePPString(common.PPL1))
   441  
   442  	//currTs := tae2.TxnMgr.TsAlloc.Get()
   443  	//assert.True(t, currTs.GreaterEq(prevTs))
   444  
   445  	txn, err = tae2.StartTxn(nil)
   446  	assert.Nil(t, err)
   447  	db, err = txn.GetDatabase("db")
   448  	assert.Nil(t, err)
   449  	rel, err = db.GetRelationByName(schema.Name)
   450  	assert.Nil(t, err)
   451  	seg, err = rel.GetSegment(seg.GetID())
   452  	assert.Nil(t, err)
   453  	blkh, err := seg.GetBlock(blk.ID)
   454  	assert.Nil(t, err)
   455  	assert.True(t, blkh.GetMeta().(*catalog.BlockEntry).HasDropCommittedLocked())
   456  
   457  	val, err := rel.GetValueByFilter(filter, 0)
   458  	assert.Nil(t, err)
   459  	assert.Equal(t, int32(33), val)
   460  	_, err = rel.GetValue(id, row, 0)
   461  	assert.NotNil(t, err)
   462  	assert.Nil(t, txn.Commit())
   463  
   464  	err = tae2.BGCheckpointRunner.ForceFlush(tae2.TxnMgr.StatMaxCommitTS(), context.Background(), time.Second)
   465  	assert.NoError(t, err)
   466  	err = tae2.BGCheckpointRunner.ForceIncrementalCheckpoint(tae2.TxnMgr.StatMaxCommitTS())
   467  	assert.NoError(t, err)
   468  
   469  	txn, err = tae2.StartTxn(nil)
   470  	assert.Nil(t, err)
   471  	db, err = txn.GetDatabase("db")
   472  	assert.Nil(t, err)
   473  	rel, err = db.GetRelationByName(schema.Name)
   474  	assert.Nil(t, err)
   475  	err = rel.Append(bats[1])
   476  	assert.Nil(t, err)
   477  	assert.Nil(t, txn.Commit())
   478  
   479  	t.Log(tae2.Catalog.SimplePPString(common.PPL1))
   480  	tae2.Close()
   481  
   482  	tae3, err := Open(tae.Dir, nil)
   483  	assert.Nil(t, err)
   484  	t.Log(tae3.Catalog.SimplePPString(common.PPL1))
   485  
   486  	txn, err = tae3.StartTxn(nil)
   487  	assert.Nil(t, err)
   488  	db, err = txn.GetDatabase("db")
   489  	assert.Nil(t, err)
   490  	rel, err = db.GetRelationByName(schema.Name)
   491  	assert.Nil(t, err)
   492  	seg, err = rel.GetSegment(seg.GetID())
   493  	assert.Nil(t, err)
   494  	_, err = seg.GetBlock(blk.ID)
   495  	assert.Nil(t, err)
   496  	val, err = rel.GetValueByFilter(filter, 0)
   497  	assert.Nil(t, err)
   498  	assert.Equal(t, int32(33), val)
   499  	_, err = rel.GetValue(id, row, 0)
   500  	assert.NotNil(t, err)
   501  	assert.Nil(t, txn.Commit())
   502  
   503  	tae3.Close()
   504  
   505  	tae4, err := Open(tae.Dir, nil)
   506  	assert.NoError(t, err)
   507  	tae4.Close()
   508  }
   509  
   510  // update, delete and append in one txn
   511  // 1. Create db and tbl and {Append, Update, Delete} for 100 times in a same txn.
   512  // 2. Append, Update, Delete each in one txn
   513  // replay
   514  // check rows
   515  // 1. Ckp
   516  // TODO check rows
   517  func TestReplay3(t *testing.T) {
   518  	defer testutils.AfterTest(t)()
   519  	testutils.EnsureNoLeak(t)
   520  	tae := newTestEngine(t, nil)
   521  	defer tae.Close()
   522  	schema := catalog.MockSchema(2, 1)
   523  	schema.BlockMaxRows = 1000
   524  	schema.SegmentMaxBlocks = 2
   525  	tae.bindSchema(schema)
   526  	bat := catalog.MockBatch(schema, 1)
   527  	defer bat.Close()
   528  	v := bat.Vecs[schema.GetSingleSortKeyIdx()].Get(0)
   529  	filter := handle.NewEQFilter(v)
   530  
   531  	txn, err := tae.StartTxn(nil)
   532  	assert.Nil(t, err)
   533  	db, err := txn.CreateDatabase("db", "")
   534  	assert.Nil(t, err)
   535  	tbl, err := db.CreateRelation(schema)
   536  	assert.Nil(t, err)
   537  	err = tbl.Append(bat)
   538  	assert.Nil(t, err)
   539  	for i := 0; i < 100; i++ {
   540  		err = tbl.UpdateByFilter(filter, 0, int32(33))
   541  		assert.NoError(t, err)
   542  		err = tbl.Append(bat)
   543  		assert.Error(t, err)
   544  		err = tbl.DeleteByFilter(filter)
   545  		assert.NoError(t, err)
   546  		err = tbl.Append(bat)
   547  		assert.NoError(t, err)
   548  	}
   549  	assert.NoError(t, txn.Commit())
   550  
   551  	for i := 0; i < 10; i++ {
   552  		txn, rel := tae.getRelation()
   553  		err = rel.UpdateByFilter(filter, 0, int32(33))
   554  		assert.NoError(t, err)
   555  		assert.NoError(t, txn.Commit())
   556  
   557  		txn, rel = tae.getRelation()
   558  		blkID, row, err := rel.GetByFilter(filter)
   559  		assert.NoError(t, err)
   560  		err = rel.RangeDelete(blkID, row, row, handle.DT_Normal)
   561  		assert.NoError(t, err)
   562  		assert.NoError(t, txn.Commit())
   563  
   564  		txn, rel = tae.getRelation()
   565  		err = rel.Append(bat)
   566  		assert.Nil(t, err)
   567  		assert.Nil(t, txn.Commit())
   568  	}
   569  
   570  	tae.restart()
   571  
   572  	txn, rel := tae.getRelation()
   573  	assert.Equal(t, uint64(1), rel.GetMeta().(*catalog.TableEntry).GetRows())
   574  	assert.NoError(t, txn.Commit())
   575  
   576  	txn, _ = tae.getRelation()
   577  	err = tae.BGCheckpointRunner.ForceIncrementalCheckpoint(tae.TxnMgr.StatMaxCommitTS())
   578  	assert.NoError(t, err)
   579  	assert.NoError(t, txn.Commit())
   580  }
   581  
   582  // append, delete, compact, mergeblocks, ckp
   583  // 1. Create db and tbl and Append and Delete
   584  // 2. Append and Delete
   585  // replay
   586  // check rows
   587  /* TODO
   588     1. Ckp
   589     replay and check rows
   590     1. compact
   591     replay and check rows */
   592  func TestReplayTableRows(t *testing.T) {
   593  	defer testutils.AfterTest(t)()
   594  	testutils.EnsureNoLeak(t)
   595  	tae := initDB(t, nil)
   596  	schema := catalog.MockSchema(2, 1)
   597  	schema.BlockMaxRows = 1000
   598  	schema.SegmentMaxBlocks = 2
   599  	bat := catalog.MockBatch(schema, 4800)
   600  	defer bat.Close()
   601  	bats := bat.Split(3)
   602  	rows := uint64(0)
   603  
   604  	txn, err := tae.StartTxn(nil)
   605  	assert.Nil(t, err)
   606  	db, err := txn.CreateDatabase("db", "")
   607  	assert.Nil(t, err)
   608  	tbl, err := db.CreateRelation(schema)
   609  	assert.Nil(t, err)
   610  	err = tbl.Append(bats[0])
   611  	assert.Nil(t, err)
   612  	rows += 1600
   613  	blkIterator := tbl.MakeBlockIt()
   614  	blkID := blkIterator.GetBlock().Fingerprint()
   615  	err = tbl.RangeDelete(blkID, 0, 99, handle.DT_Normal)
   616  	assert.Nil(t, err)
   617  	rows -= 100
   618  	assert.Nil(t, txn.Commit())
   619  
   620  	txn, err = tae.StartTxn(nil)
   621  	assert.Nil(t, err)
   622  	db, err = txn.GetDatabase("db")
   623  	assert.Nil(t, err)
   624  	tbl, err = db.GetRelationByName(schema.Name)
   625  	assert.Nil(t, err)
   626  	err = tbl.Append(bats[1])
   627  	assert.Nil(t, err)
   628  	rows += 1600
   629  	err = tbl.RangeDelete(blkID, 0, 99, handle.DT_Normal)
   630  	assert.Nil(t, err)
   631  	rows -= 100
   632  	assert.Nil(t, txn.Commit())
   633  
   634  	tae.Close()
   635  
   636  	tae2, err := Open(tae.Dir, nil)
   637  	assert.Nil(t, err)
   638  
   639  	txn, err = tae2.StartTxn(nil)
   640  	assert.Nil(t, err)
   641  	db, err = txn.GetDatabase("db")
   642  	assert.Nil(t, err)
   643  	tbl, err = db.GetRelationByName(schema.Name)
   644  	assert.Nil(t, err)
   645  	assert.Equal(t, rows, tbl.GetMeta().(*catalog.TableEntry).GetRows())
   646  	assert.Nil(t, txn.Commit())
   647  
   648  	err = tae2.Close()
   649  	assert.Nil(t, err)
   650  
   651  	tae3, err := Open(tae.Dir, nil)
   652  	assert.Nil(t, err)
   653  
   654  	txn, err = tae3.StartTxn(nil)
   655  	assert.Nil(t, err)
   656  	assert.Nil(t, err)
   657  	db, err = txn.GetDatabase("db")
   658  	assert.Nil(t, err)
   659  	tbl, err = db.GetRelationByName(schema.Name)
   660  	assert.Nil(t, err)
   661  	assert.Equal(t, rows, tbl.GetMeta().(*catalog.TableEntry).GetRows())
   662  	assert.Nil(t, txn.Commit())
   663  
   664  	// worker := ops.NewOpWorker("xx")
   665  	// worker.Start()
   666  	// txn, err = tae3.StartTxn(nil)
   667  	// assert.Nil(t, err)
   668  	// db, err = txn.GetDatabase("db")
   669  	// assert.Nil(t, err)
   670  	// tbl, err = db.GetRelationByName(schema.Name)
   671  	// assert.Nil(t, err)
   672  	// blkIterator := tbl.MakeBlockIt()
   673  	// blks := make([]*catalog.BlockEntry, 0)
   674  	// for blkIterator.Valid() {
   675  	// 	blk := blkIterator.GetBlock().GetMeta().(*catalog.BlockEntry)
   676  	// 	blks = append(blks, blk)
   677  	// 	blkIterator.Next()
   678  	// }
   679  	// for _, blk := range blks {
   680  	// 	ctx := &tasks.Context{Waitable: true}
   681  	// 	task, err := jobs.NewCompactBlockTask(ctx, txn, blk, tae3.Scheduler)
   682  	// 	assert.Nil(t, err)
   683  	// 	worker.SendOp(task)
   684  	// 	err = task.WaitDone()
   685  	// 	assert.Nil(t, err)
   686  	// }
   687  	// assert.Nil(t, txn.Commit())
   688  	// worker.Stop()
   689  
   690  	err = tae3.Close()
   691  	assert.Nil(t, err)
   692  
   693  	// tae4, err := Open(tae.Dir, nil)
   694  	// assert.Nil(t, err)
   695  
   696  	// txn, err = tae4.StartTxn(nil)
   697  	// assert.Nil(t, err)
   698  	// assert.Nil(t, err)
   699  	// db, err = txn.GetDatabase("db")
   700  	// assert.Nil(t, err)
   701  	// tbl, err = db.GetRelationByName(schema.Name)
   702  	// assert.Nil(t, err)
   703  	// assert.Equal(t, rows, tbl.GetMeta().(*catalog.TableEntry).GetRows())
   704  	// assert.Nil(t, txn.Commit())
   705  
   706  	// err = tae4.Close()
   707  	// assert.Nil(t, err)
   708  }
   709  
   710  // Testing Steps
   711  func TestReplay4(t *testing.T) {
   712  	defer testutils.AfterTest(t)()
   713  	testutils.EnsureNoLeak(t)
   714  	opts := config.WithLongScanAndCKPOpts(nil)
   715  	tae := initDB(t, opts)
   716  
   717  	schema := catalog.MockSchemaAll(18, 16)
   718  	schema.BlockMaxRows = 10
   719  	schema.SegmentMaxBlocks = 2
   720  	bat := catalog.MockBatch(schema, int(schema.BlockMaxRows*uint32(schema.SegmentMaxBlocks+1)+1))
   721  	defer bat.Close()
   722  	bats := bat.Split(4)
   723  
   724  	createRelationAndAppend(t, 0, tae, defaultTestDB, schema, bats[0], true)
   725  	txn, rel := getDefaultRelation(t, tae, schema.Name)
   726  	checkAllColRowsByScan(t, rel, bats[0].Length(), false)
   727  	assert.NoError(t, txn.Commit())
   728  
   729  	_ = tae.Close()
   730  
   731  	tae2, err := Open(tae.Dir, nil)
   732  	assert.NoError(t, err)
   733  
   734  	txn, rel = getDefaultRelation(t, tae2, schema.Name)
   735  	checkAllColRowsByScan(t, rel, bats[0].Length(), false)
   736  	err = rel.Append(bats[1])
   737  	assert.NoError(t, err)
   738  	checkAllColRowsByScan(t, rel, bats[0].Length()+bats[1].Length(), false)
   739  	assert.NoError(t, txn.Commit())
   740  
   741  	compactBlocks(t, 0, tae2, defaultTestDB, schema, false)
   742  	txn, rel = getDefaultRelation(t, tae2, schema.Name)
   743  	checkAllColRowsByScan(t, rel, bats[0].Length()+bats[1].Length(), false)
   744  	err = rel.Append(bats[2])
   745  	assert.NoError(t, err)
   746  	checkAllColRowsByScan(t, rel,
   747  		bats[0].Length()+bats[1].Length()+bats[2].Length(), false)
   748  	assert.NoError(t, txn.Commit())
   749  
   750  	compactBlocks(t, 0, tae2, defaultTestDB, schema, false)
   751  
   752  	txn, rel = getDefaultRelation(t, tae2, schema.Name)
   753  	checkAllColRowsByScan(t, rel, lenOfBats(bats[0:3]), false)
   754  	assert.NoError(t, txn.Commit())
   755  
   756  	mergeBlocks(t, 0, tae2, defaultTestDB, schema, false)
   757  
   758  	txn, rel = getDefaultRelation(t, tae2, schema.Name)
   759  	checkAllColRowsByScan(t, rel, lenOfBats(bats[0:3]), false)
   760  	err = rel.Append(bats[3])
   761  	assert.NoError(t, err)
   762  	checkAllColRowsByScan(t, rel, bat.Length(), false)
   763  	assert.NoError(t, txn.Commit())
   764  	t.Log(tae2.Catalog.SimplePPString(common.PPL1))
   765  
   766  	tae2.Close()
   767  
   768  	tae3, err := Open(tae.Dir, nil)
   769  	assert.NoError(t, err)
   770  	defer tae3.Close()
   771  }
   772  
   773  // Testing Steps
   774  func TestReplay5(t *testing.T) {
   775  	defer testutils.AfterTest(t)()
   776  	testutils.EnsureNoLeak(t)
   777  	opts := config.WithLongScanAndCKPOpts(nil)
   778  	tae := initDB(t, opts)
   779  
   780  	schema := catalog.MockSchemaAll(18, 16)
   781  	schema.BlockMaxRows = 10
   782  	schema.SegmentMaxBlocks = 2
   783  	bat := catalog.MockBatch(schema, int(schema.BlockMaxRows*uint32(schema.SegmentMaxBlocks+1)+1))
   784  	defer bat.Close()
   785  	bats := bat.Split(8)
   786  
   787  	createRelationAndAppend(t, 0, tae, defaultTestDB, schema, bats[0], true)
   788  	txn, rel := getDefaultRelation(t, tae, schema.Name)
   789  	checkAllColRowsByScan(t, rel, bats[0].Length(), false)
   790  	assert.NoError(t, txn.Commit())
   791  
   792  	_ = tae.Close()
   793  	tae, err := Open(tae.Dir, nil)
   794  	assert.NoError(t, err)
   795  
   796  	txn, rel = getDefaultRelation(t, tae, schema.Name)
   797  	checkAllColRowsByScan(t, rel, bats[0].Length(), false)
   798  	err = rel.Append(bats[0])
   799  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
   800  	err = rel.Append(bats[1])
   801  	assert.NoError(t, err)
   802  	checkAllColRowsByScan(t, rel, lenOfBats(bats[0:2]), false)
   803  	assert.NoError(t, txn.Commit())
   804  	t.Logf("LSN=%d", txn.GetLSN())
   805  
   806  	_ = tae.Close()
   807  	tae, err = Open(tae.Dir, nil)
   808  	assert.NoError(t, err)
   809  
   810  	txn, rel = getDefaultRelation(t, tae, schema.Name)
   811  	checkAllColRowsByScan(t, rel, lenOfBats(bats[0:2]), false)
   812  	err = rel.Append(bats[0])
   813  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
   814  	err = rel.Append(bats[1])
   815  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
   816  	err = rel.Append(bats[2])
   817  	assert.NoError(t, err)
   818  	err = rel.Append(bats[3])
   819  	assert.NoError(t, err)
   820  	assert.NoError(t, txn.Commit())
   821  
   822  	compactBlocks(t, 0, tae, defaultTestDB, schema, false)
   823  	err = tae.BGCheckpointRunner.ForceFlush(tae.TxnMgr.StatMaxCommitTS(), context.Background(), time.Second)
   824  	assert.NoError(t, err)
   825  	err = tae.BGCheckpointRunner.ForceIncrementalCheckpoint(tae.TxnMgr.StatMaxCommitTS())
   826  	assert.NoError(t, err)
   827  	txn, rel = getDefaultRelation(t, tae, schema.Name)
   828  	checkAllColRowsByScan(t, rel, lenOfBats(bats[:4]), false)
   829  	assert.NoError(t, txn.Commit())
   830  
   831  	_ = tae.Close()
   832  	tae, err = Open(tae.Dir, nil)
   833  	assert.NoError(t, err)
   834  
   835  	txn, rel = getDefaultRelation(t, tae, schema.Name)
   836  	checkAllColRowsByScan(t, rel, lenOfBats(bats[:4]), false)
   837  	err = rel.Append(bats[3])
   838  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
   839  	for _, b := range bats[4:8] {
   840  		err = rel.Append(b)
   841  		assert.NoError(t, err)
   842  	}
   843  	assert.NoError(t, txn.Commit())
   844  	compactBlocks(t, 0, tae, defaultTestDB, schema, false)
   845  	err = tae.BGCheckpointRunner.ForceFlush(tae.TxnMgr.StatMaxCommitTS(), context.Background(), time.Second)
   846  	assert.NoError(t, err)
   847  	err = tae.BGCheckpointRunner.ForceIncrementalCheckpoint(tae.TxnMgr.StatMaxCommitTS())
   848  	assert.NoError(t, err)
   849  
   850  	t.Log(tae.Catalog.SimplePPString(common.PPL1))
   851  	printCheckpointStats(t, tae)
   852  	_ = tae.Close()
   853  	tae, err = Open(tae.Dir, nil)
   854  	assert.NoError(t, err)
   855  
   856  	txn, rel = getDefaultRelation(t, tae, schema.Name)
   857  	checkAllColRowsByScan(t, rel, lenOfBats(bats[:8]), false)
   858  	err = rel.Append(bats[0])
   859  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
   860  	assert.NoError(t, txn.Commit())
   861  	// testutils.WaitExpect(3000, func() bool {
   862  	// 	return tae.Wal.GetCheckpointed() == tae.Wal.GetCurrSeqNum()/2
   863  	// })
   864  	// printCheckpointStats(t, tae)
   865  	// assert.Equal(t, tae.Wal.GetCurrSeqNum()/2, tae.Wal.GetCheckpointed())
   866  	mergeBlocks(t, 0, tae, defaultTestDB, schema, false)
   867  
   868  	_ = tae.Close()
   869  	tae, err = Open(tae.Dir, nil)
   870  	assert.NoError(t, err)
   871  	defer tae.Close()
   872  	txn, rel = getDefaultRelation(t, tae, schema.Name)
   873  	checkAllColRowsByScan(t, rel, lenOfBats(bats[:8]), false)
   874  	err = rel.Append(bats[0])
   875  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
   876  	assert.NoError(t, txn.Commit())
   877  
   878  	err = tae.BGCheckpointRunner.ForceFlush(tae.TxnMgr.StatMaxCommitTS(), context.Background(), time.Second)
   879  	assert.NoError(t, err)
   880  	err = tae.BGCheckpointRunner.ForceIncrementalCheckpoint(tae.TxnMgr.StatMaxCommitTS())
   881  	assert.NoError(t, err)
   882  	lsn := tae.BGCheckpointRunner.MaxLSNInRange(tae.TxnMgr.StatMaxCommitTS())
   883  	entry, err := tae.Wal.RangeCheckpoint(1, lsn)
   884  	assert.NoError(t, err)
   885  	assert.NoError(t, entry.WaitDone())
   886  	testutils.WaitExpect(1000, func() bool {
   887  		return tae.Scheduler.GetPenddingLSNCnt() == 0
   888  	})
   889  	printCheckpointStats(t, tae)
   890  	assert.Equal(t, tae.Wal.GetCurrSeqNum(), tae.Wal.GetCheckpointed())
   891  	t.Log(tae.Catalog.SimplePPString(common.PPL1))
   892  }
   893  
   894  func TestReplay6(t *testing.T) {
   895  	defer testutils.AfterTest(t)()
   896  	testutils.EnsureNoLeak(t)
   897  	opts := config.WithLongScanAndCKPOpts(nil)
   898  	tae := initDB(t, opts)
   899  	schema := catalog.MockSchemaAll(18, 15)
   900  	schema.BlockMaxRows = 10
   901  	schema.SegmentMaxBlocks = 2
   902  	bat := catalog.MockBatch(schema, int(schema.BlockMaxRows*10-1))
   903  	defer bat.Close()
   904  	bats := bat.Split(4)
   905  
   906  	createRelationAndAppend(t, 0, tae, defaultTestDB, schema, bats[0], true)
   907  
   908  	_ = tae.Close()
   909  	tae, err := Open(tae.Dir, opts)
   910  	assert.NoError(t, err)
   911  
   912  	txn, rel := getDefaultRelation(t, tae, schema.Name)
   913  	checkAllColRowsByScan(t, rel, lenOfBats(bats[0:1]), false)
   914  	err = rel.Append(bats[0])
   915  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
   916  	err = rel.Append(bats[1])
   917  	assert.NoError(t, err)
   918  	assert.NoError(t, txn.Commit())
   919  
   920  	compactBlocks(t, 0, tae, defaultTestDB, schema, false)
   921  
   922  	_ = tae.Close()
   923  	tae, err = Open(tae.Dir, opts)
   924  	assert.NoError(t, err)
   925  
   926  	txn, rel = getDefaultRelation(t, tae, schema.Name)
   927  	checkAllColRowsByScan(t, rel, lenOfBats(bats[0:2]), false)
   928  	err = rel.Append(bats[0])
   929  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
   930  	err = rel.Append(bats[2])
   931  	assert.NoError(t, err)
   932  	err = rel.Append(bats[3])
   933  	assert.NoError(t, err)
   934  	assert.NoError(t, txn.Commit())
   935  	compactBlocks(t, 0, tae, defaultTestDB, schema, false)
   936  	mergeBlocks(t, 0, tae, defaultTestDB, schema, false)
   937  	err = tae.BGCheckpointRunner.ForceFlush(tae.TxnMgr.StatMaxCommitTS(), context.Background(), time.Second)
   938  	assert.NoError(t, err)
   939  	err = tae.BGCheckpointRunner.ForceIncrementalCheckpoint(tae.TxnMgr.StatMaxCommitTS())
   940  	assert.NoError(t, err)
   941  
   942  	_ = tae.Close()
   943  	tae, err = Open(tae.Dir, opts)
   944  	assert.NoError(t, err)
   945  
   946  	txn, rel = getDefaultRelation(t, tae, schema.Name)
   947  	checkAllColRowsByScan(t, rel, lenOfBats(bats[0:4]), false)
   948  	assert.NoError(t, txn.Commit())
   949  	printCheckpointStats(t, tae)
   950  	_ = tae.Close()
   951  }
   952  
   953  func TestReplay7(t *testing.T) {
   954  	defer testutils.AfterTest(t)()
   955  	t.Skip(any("This case crashes occasionally, is being fixed, skip it for now"))
   956  	testutils.EnsureNoLeak(t)
   957  	opts := config.WithQuickScanAndCKPOpts(nil)
   958  	tae := initDB(t, opts)
   959  	schema := catalog.MockSchemaAll(18, 14)
   960  	schema.BlockMaxRows = 10
   961  	schema.SegmentMaxBlocks = 5
   962  
   963  	bat := catalog.MockBatch(schema, int(schema.BlockMaxRows*15+1))
   964  	defer bat.Close()
   965  	createRelationAndAppend(t, 0, tae, defaultTestDB, schema, bat, true)
   966  	compactBlocks(t, 0, tae, defaultTestDB, schema, true)
   967  	mergeBlocks(t, 0, tae, defaultTestDB, schema, true)
   968  	time.Sleep(time.Millisecond * 100)
   969  
   970  	_ = tae.Close()
   971  	tae, err := Open(tae.Dir, opts)
   972  	assert.NoError(t, err)
   973  	defer tae.Close()
   974  	// t.Log(tae.Catalog.SimplePPString(common.PPL1))
   975  	txn, rel := getDefaultRelation(t, tae, schema.Name)
   976  	checkAllColRowsByScan(t, rel, bat.Length(), false)
   977  	assert.NoError(t, txn.Commit())
   978  }
   979  
   980  func TestReplay8(t *testing.T) {
   981  	defer testutils.AfterTest(t)()
   982  	testutils.EnsureNoLeak(t)
   983  	opts := config.WithLongScanAndCKPOpts(nil)
   984  	tae := newTestEngine(t, opts)
   985  	defer tae.Close()
   986  	schema := catalog.MockSchemaAll(18, 13)
   987  	schema.BlockMaxRows = 10
   988  	schema.SegmentMaxBlocks = 2
   989  	tae.bindSchema(schema)
   990  
   991  	bat := catalog.MockBatch(schema, int(schema.BlockMaxRows*3+1))
   992  	defer bat.Close()
   993  	bats := bat.Split(4)
   994  
   995  	tae.createRelAndAppend(bats[0], true)
   996  	txn, rel := tae.getRelation()
   997  	v := getSingleSortKeyValue(bats[0], schema, 2)
   998  	filter := handle.NewEQFilter(v)
   999  	err := rel.DeleteByFilter(filter)
  1000  	assert.NoError(t, err)
  1001  	assert.NoError(t, txn.Commit())
  1002  
  1003  	txn, rel = tae.getRelation()
  1004  	window := bat.CloneWindow(2, 1)
  1005  	defer window.Close()
  1006  	err = rel.Append(window)
  1007  	assert.NoError(t, err)
  1008  	_ = txn.Rollback()
  1009  
  1010  	tae.restart()
  1011  
  1012  	// Check the total rows by scan
  1013  	txn, rel = tae.getRelation()
  1014  	checkAllColRowsByScan(t, rel, bats[0].Length()-1, true)
  1015  	err = rel.Append(bats[0])
  1016  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
  1017  	assert.NoError(t, txn.Commit())
  1018  
  1019  	// Try to append the delete row and then rollback
  1020  	txn, rel = tae.getRelation()
  1021  	err = rel.Append(window)
  1022  	assert.NoError(t, err)
  1023  	_ = txn.Rollback()
  1024  
  1025  	txn, rel = getDefaultRelation(t, tae.DB, schema.Name)
  1026  	checkAllColRowsByScan(t, rel, bats[0].Length()-1, true)
  1027  	assert.NoError(t, txn.Commit())
  1028  
  1029  	txn, rel = getDefaultRelation(t, tae.DB, schema.Name)
  1030  	err = rel.Append(window)
  1031  	assert.NoError(t, err)
  1032  	_ = txn.Rollback()
  1033  
  1034  	tae.restart()
  1035  
  1036  	txn, rel = getDefaultRelation(t, tae.DB, schema.Name)
  1037  	checkAllColRowsByScan(t, rel, bats[0].Length()-1, true)
  1038  	assert.NoError(t, txn.Commit())
  1039  
  1040  	txn, rel = getDefaultRelation(t, tae.DB, schema.Name)
  1041  	err = rel.Append(window)
  1042  	assert.NoError(t, err)
  1043  	tuple3 := bat.Window(3, 1)
  1044  	err = rel.Append(tuple3)
  1045  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
  1046  	assert.NoError(t, txn.Commit())
  1047  
  1048  	txn, rel = getDefaultRelation(t, tae.DB, schema.Name)
  1049  	checkAllColRowsByScan(t, rel, bats[0].Length(), true)
  1050  	assert.NoError(t, txn.Commit())
  1051  
  1052  	tae.restart()
  1053  
  1054  	txn, rel = getDefaultRelation(t, tae.DB, schema.Name)
  1055  	checkAllColRowsByScan(t, rel, bats[0].Length(), true)
  1056  	err = rel.Append(window)
  1057  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
  1058  	err = rel.Append(bats[1])
  1059  	assert.NoError(t, err)
  1060  	err = rel.Append(bats[2])
  1061  	assert.NoError(t, err)
  1062  	err = rel.Append(bats[3])
  1063  	assert.NoError(t, err)
  1064  	assert.NoError(t, txn.Commit())
  1065  
  1066  	tae.compactBlocks(false)
  1067  	tae.restart()
  1068  
  1069  	txn, rel = tae.getRelation()
  1070  	checkAllColRowsByScan(t, rel, bat.Length(), true)
  1071  	err = rel.Append(window)
  1072  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
  1073  
  1074  	v0_5 := getSingleSortKeyValue(bats[0], schema, 5)
  1075  	filter = handle.NewEQFilter(v0_5)
  1076  	err = rel.DeleteByFilter(filter)
  1077  	assert.NoError(t, err)
  1078  	v1_5 := getSingleSortKeyValue(bats[1], schema, 5)
  1079  	filter = handle.NewEQFilter(v1_5)
  1080  	err = rel.DeleteByFilter(filter)
  1081  	assert.NoError(t, err)
  1082  	v2_5 := getSingleSortKeyValue(bats[2], schema, 5)
  1083  	filter = handle.NewEQFilter(v2_5)
  1084  	err = rel.DeleteByFilter(filter)
  1085  	assert.NoError(t, err)
  1086  	v3_2 := getSingleSortKeyValue(bats[3], schema, 2)
  1087  	filter = handle.NewEQFilter(v3_2)
  1088  	err = rel.DeleteByFilter(filter)
  1089  	assert.NoError(t, err)
  1090  	assert.NoError(t, txn.Commit())
  1091  	// t.Log(tae.Catalog.SimplePPString(common.PPL1))
  1092  
  1093  	tae.restart()
  1094  
  1095  	txn, rel = tae.getRelation()
  1096  	checkAllColRowsByScan(t, rel, bat.Length()-4, true)
  1097  	tuple0_5 := bat.Window(5, 1)
  1098  	err = rel.Append(tuple0_5)
  1099  	assert.NoError(t, err)
  1100  	tuple1_5 := bats[1].Window(5, 1)
  1101  	err = rel.Append(tuple1_5)
  1102  	assert.NoError(t, err)
  1103  	tuple2_5 := bats[2].Window(5, 1)
  1104  	err = rel.Append(tuple2_5)
  1105  	assert.NoError(t, err)
  1106  	tuple3_2 := bats[3].Window(2, 1)
  1107  	err = rel.Append(tuple3_2)
  1108  	assert.NoError(t, err)
  1109  	checkAllColRowsByScan(t, rel, bat.Length(), true)
  1110  	_ = txn.Rollback()
  1111  
  1112  	tae.compactBlocks(false)
  1113  	err = tae.BGCheckpointRunner.ForceFlush(tae.TxnMgr.StatMaxCommitTS(), context.Background(), time.Second)
  1114  	assert.NoError(t, err)
  1115  	err = tae.BGCheckpointRunner.ForceIncrementalCheckpoint(tae.TxnMgr.StatMaxCommitTS())
  1116  	assert.NoError(t, err)
  1117  	tae.restart()
  1118  
  1119  	txn, rel = tae.getRelation()
  1120  	checkAllColRowsByScan(t, rel, bat.Length()-4, true)
  1121  	err = rel.Append(tuple0_5)
  1122  	assert.NoError(t, err)
  1123  	err = rel.Append(tuple1_5)
  1124  	assert.NoError(t, err)
  1125  	err = rel.Append(tuple2_5)
  1126  	assert.NoError(t, err)
  1127  	err = rel.Append(tuple3_2)
  1128  	assert.NoError(t, err)
  1129  	checkAllColRowsByScan(t, rel, bat.Length(), true)
  1130  	_ = txn.Rollback()
  1131  }
  1132  
  1133  func TestReplay9(t *testing.T) {
  1134  	defer testutils.AfterTest(t)()
  1135  	testutils.EnsureNoLeak(t)
  1136  	opts := config.WithLongScanAndCKPOpts(nil)
  1137  	tae := newTestEngine(t, opts)
  1138  	defer tae.Close()
  1139  	schema := catalog.MockSchemaAll(18, 3)
  1140  	schema.BlockMaxRows = 10
  1141  	schema.SegmentMaxBlocks = 2
  1142  	tae.bindSchema(schema)
  1143  	bat := catalog.MockBatch(schema, int(schema.BlockMaxRows*3+2))
  1144  	defer bat.Close()
  1145  	bats := bat.Split(4)
  1146  
  1147  	tae.createRelAndAppend(bats[0], true)
  1148  	txn, rel := tae.getRelation()
  1149  	checkAllColRowsByScan(t, rel, bats[0].Length(), false)
  1150  	v := getSingleSortKeyValue(bats[0], schema, 2)
  1151  	filter := handle.NewEQFilter(v)
  1152  	err := rel.UpdateByFilter(filter, 2, int32(999))
  1153  	assert.NoError(t, err)
  1154  	assert.NoError(t, txn.Commit())
  1155  
  1156  	tae.restart()
  1157  	txn, rel = tae.getRelation()
  1158  	actv, err := rel.GetValueByFilter(filter, 2)
  1159  	assert.NoError(t, err)
  1160  	assert.Equal(t, int32(999), actv)
  1161  	checkAllColRowsByScan(t, rel, bats[0].Length(), true)
  1162  	assert.NoError(t, txn.Commit())
  1163  
  1164  	tae.compactBlocks(false)
  1165  
  1166  	tae.restart()
  1167  	txn, rel = tae.getRelation()
  1168  	_, _, err = rel.GetByFilter(filter)
  1169  	assert.NoError(t, err)
  1170  	actv, err = rel.GetValueByFilter(filter, 2)
  1171  	assert.NoError(t, err)
  1172  	assert.Equal(t, int32(999), actv)
  1173  	checkAllColRowsByScan(t, rel, bats[0].Length(), true)
  1174  	err = rel.Append(bats[1])
  1175  	assert.NoError(t, err)
  1176  	assert.NoError(t, txn.Commit())
  1177  	tae.compactBlocks(false)
  1178  
  1179  	txn, rel = tae.getRelation()
  1180  	v2 := getSingleSortKeyValue(bats[0], schema, 4)
  1181  	filter2 := handle.NewEQFilter(v2)
  1182  	err = rel.UpdateByFilter(filter2, 1, int16(199))
  1183  	assert.NoError(t, err)
  1184  	actv, err = rel.GetValueByFilter(filter2, 1)
  1185  	assert.NoError(t, err)
  1186  	assert.Equal(t, int16(199), actv)
  1187  	assert.NoError(t, txn.Commit())
  1188  
  1189  	tae.restart()
  1190  
  1191  	txn, rel = tae.getRelation()
  1192  	actv, err = rel.GetValueByFilter(filter2, 1)
  1193  	assert.NoError(t, err)
  1194  	assert.Equal(t, int16(199), actv)
  1195  	err = rel.Append(bats[2])
  1196  	assert.NoError(t, err)
  1197  	err = rel.Append(bats[3])
  1198  	assert.NoError(t, err)
  1199  	assert.NoError(t, txn.Commit())
  1200  
  1201  	tae.compactBlocks(false)
  1202  	tae.mergeBlocks(false)
  1203  
  1204  	txn, rel = tae.getRelation()
  1205  	v3 := getSingleSortKeyValue(bats[1], schema, 3)
  1206  	filter3 := handle.NewEQFilter(v3)
  1207  	err = rel.UpdateByFilter(filter3, 5, uint16(88))
  1208  	assert.NoError(t, err)
  1209  	actv, err = rel.GetValueByFilter(filter3, 5)
  1210  	assert.NoError(t, err)
  1211  	assert.Equal(t, uint16(88), actv)
  1212  	assert.NoError(t, txn.Commit())
  1213  
  1214  	tae.restart()
  1215  
  1216  	txn, rel = tae.getRelation()
  1217  	actv, err = rel.GetValueByFilter(filter, 2)
  1218  	assert.NoError(t, err)
  1219  	assert.Equal(t, int32(999), actv)
  1220  	actv, err = rel.GetValueByFilter(filter2, 1)
  1221  	assert.NoError(t, err)
  1222  	assert.Equal(t, int16(199), actv)
  1223  	actv, err = rel.GetValueByFilter(filter3, 5)
  1224  	assert.NoError(t, err)
  1225  	assert.Equal(t, uint16(88), actv)
  1226  	assert.NoError(t, txn.Commit())
  1227  }
  1228  
  1229  func TestReplay10(t *testing.T) {
  1230  	defer testutils.AfterTest(t)()
  1231  	testutils.EnsureNoLeak(t)
  1232  	opts := config.WithQuickScanAndCKPOpts(nil)
  1233  	tae := initDB(t, opts)
  1234  	schema := catalog.MockSchemaAll(3, 2)
  1235  	schema.BlockMaxRows = 10
  1236  	schema.SegmentMaxBlocks = 5
  1237  	expr := &plan.Expr{}
  1238  	exprbuf, err := expr.Marshal()
  1239  	assert.NoError(t, err)
  1240  
  1241  	schema.ColDefs[1].Default, _ = types.Encode(&plan.Default{
  1242  		NullAbility: false,
  1243  		Expr:        &plan.Expr{},
  1244  	})
  1245  	schema.ColDefs[1].OnUpdate, _ = types.Encode(&plan.OnUpdate{
  1246  		Expr: &plan.Expr{},
  1247  	})
  1248  	schema.ColDefs[2].Default, _ = types.Encode(plan.Default{
  1249  		NullAbility: true,
  1250  		Expr:        nil,
  1251  	})
  1252  	schema.ColDefs[2].OnUpdate, _ = types.Encode(plan.OnUpdate{
  1253  		Expr: nil,
  1254  	})
  1255  
  1256  	bat := catalog.MockBatch(schema, int(schema.BlockMaxRows))
  1257  	defer bat.Close()
  1258  	createRelationAndAppend(t, 0, tae, defaultTestDB, schema, bat, true)
  1259  	time.Sleep(time.Millisecond * 100)
  1260  
  1261  	_ = tae.Close()
  1262  	tae, err = Open(tae.Dir, opts)
  1263  	assert.NoError(t, err)
  1264  	defer tae.Close()
  1265  	// t.Log(tae.Catalog.SimplePPString(common.PPL1))
  1266  	txn, rel := getDefaultRelation(t, tae, schema.Name)
  1267  	checkAllColRowsByScan(t, rel, bat.Length(), false)
  1268  	assert.NoError(t, txn.Commit())
  1269  	schema1 := rel.GetMeta().(*catalog.TableEntry).GetSchema()
  1270  
  1271  	d1 := &plan.Default{}
  1272  	assert.NoError(t, types.Decode(schema1.ColDefs[1].Default, d1))
  1273  	buf, _ := d1.Expr.Marshal()
  1274  	assert.Equal(t, exprbuf, buf)
  1275  	u1 := &plan.OnUpdate{}
  1276  	assert.NoError(t, types.Decode(schema1.ColDefs[1].OnUpdate, u1))
  1277  	buf, _ = u1.Expr.Marshal()
  1278  	assert.Equal(t, exprbuf, buf)
  1279  
  1280  	d2 := &plan.Default{}
  1281  	assert.NoError(t, types.Decode(schema1.ColDefs[2].Default, d2))
  1282  	assert.Nil(t, d2.Expr)
  1283  	u2 := &plan.OnUpdate{}
  1284  	assert.NoError(t, types.Decode(schema1.ColDefs[2].OnUpdate, u2))
  1285  	assert.Nil(t, u2.Expr)
  1286  	assert.True(t, d2.NullAbility)
  1287  }
  1288  
  1289  // create db,tbl,seg,blk
  1290  // checkpoint
  1291  // softdelete seg
  1292  // checkpoint
  1293  // restart
  1294  func TestReplaySnapshots(t *testing.T) {
  1295  	defer testutils.AfterTest(t)()
  1296  	opts := config.WithLongScanAndCKPOpts(nil)
  1297  	tae := newTestEngine(t, opts)
  1298  	schema := catalog.MockSchemaAll(1, -1)
  1299  
  1300  	txn, err := tae.StartTxn(nil)
  1301  	assert.NoError(t, err)
  1302  	db, err := txn.CreateDatabase("db", "")
  1303  	assert.NoError(t, err)
  1304  	rel, err := db.CreateRelation(schema)
  1305  	assert.NoError(t, err)
  1306  	seg, err := rel.CreateSegment(false)
  1307  	assert.NoError(t, err)
  1308  	_, err = seg.CreateBlock(false)
  1309  	assert.NoError(t, err)
  1310  	assert.NoError(t, txn.Commit())
  1311  
  1312  	err = tae.BGCheckpointRunner.ForceIncrementalCheckpoint(tae.TxnMgr.StatMaxCommitTS())
  1313  	assert.NoError(t, err)
  1314  
  1315  	txn, err = tae.StartTxn(nil)
  1316  	assert.NoError(t, err)
  1317  	db, err = txn.GetDatabase("db")
  1318  	assert.NoError(t, err)
  1319  	rel, err = db.GetRelationByName(schema.Name)
  1320  	assert.NoError(t, err)
  1321  	err = rel.SoftDeleteSegment(seg.GetID())
  1322  	assert.NoError(t, err)
  1323  	assert.NoError(t, txn.Commit())
  1324  
  1325  	err = tae.BGCheckpointRunner.ForceIncrementalCheckpoint(tae.TxnMgr.StatMaxCommitTS())
  1326  	assert.NoError(t, err)
  1327  	t.Log(tae.Catalog.SimplePPString(3))
  1328  
  1329  	tae.restart()
  1330  	t.Log(tae.Catalog.SimplePPString(3))
  1331  
  1332  	tae.Close()
  1333  }