github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/txn/txnimpl/txn_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 txnimpl
    16  
    17  import (
    18  	"fmt"
    19  	"math/rand"
    20  	"path"
    21  	"sync"
    22  	"testing"
    23  	"time"
    24  
    25  	"github.com/matrixorigin/matrixone/pkg/objectio"
    26  
    27  	"github.com/matrixorigin/matrixone/pkg/common/moerr"
    28  	"github.com/matrixorigin/matrixone/pkg/container/types"
    29  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/buffer"
    30  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog"
    31  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common"
    32  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/txnif"
    33  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tables"
    34  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils"
    35  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/txn/txnbase"
    36  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/wal"
    37  	"github.com/panjf2000/ants/v2"
    38  	"github.com/stretchr/testify/assert"
    39  )
    40  
    41  const (
    42  	ModuleName = "TAETXN"
    43  )
    44  
    45  // 1. 30 concurrency
    46  // 2. 10000 node
    47  // 3. 512K buffer
    48  // 4. 1K(30%), 4K(25%), 8K(%20), 16K(%15), 32K(%10)
    49  
    50  func init() {
    51  	rand.Seed(time.Now().UnixNano())
    52  }
    53  
    54  //func getNodes() int {
    55  //	v := rand.Intn(100)
    56  //	if v < 30 {
    57  //		return 1 * 2
    58  //	} else if v < 55 {
    59  //		return 2 * 2
    60  //	} else if v < 75 {
    61  //		return 3 * 2
    62  //	} else if v < 90 {
    63  //		return 4 * 2
    64  //	}
    65  //	return 5 * 2
    66  //}
    67  
    68  //func makeTable(t *testing.T, dir string, colCnt int, pkIdx int, bufSize uint64) *txnTable {
    69  //	mgr := buffer.NewNodeManager(bufSize, nil)
    70  //	driver := wal.NewDriverWithBatchStore(dir, "store", nil)
    71  //	id := common.NextGlobalSeqNum()
    72  //	schema := catalog.MockSchemaAll(colCnt, pkIdx)
    73  //	rel := mockTestRelation(id, schema)
    74  //	txn := txnbase.NewTxn(nil, nil, common.NewTxnIDAllocator().Alloc(), types.NextGlobalTsForTest(), nil)
    75  //	store := newStore(nil, driver, nil, mgr, nil)
    76  //	store.BindTxn(txn)
    77  //	return newTxnTable(store, rel.GetMeta().(*catalog.TableEntry))
    78  //}
    79  
    80  //func TestInsertNode(t *testing.T) {
    81  //	defer testutils.AfterTest(t)()
    82  //	testutils.EnsureNoLeak(t)
    83  //	dir := testutils.InitTestEnv(ModuleName, t)
    84  //	tbl := makeTable(t, dir, 2, 1, common.K*6)
    85  //	defer tbl.store.driver.Close()
    86  //	bat := catalog.MockBatch(tbl.GetSchema(), int(common.K))
    87  //	defer bat.Close()
    88  //	p, _ := ants.NewPool(5)
    89  //	defer p.Release()
    90  //
    91  //	var wg sync.WaitGroup
    92  //	var all uint64
    93  //
    94  //	worker := func(id uint64) func() {
    95  //		return func() {
    96  //			defer wg.Done()
    97  //			cnt := getNodes()
    98  //			nodes := make([]*anode, cnt)
    99  //			for i := 0; i < cnt; i++ {
   100  //				var cid common.ID
   101  //				cid.BlockID = id
   102  //				cid.Idx = uint16(i)
   103  //				n := NewANodeWithID(tbl, tbl.store.nodesMgr, &cid, tbl.store.driver)
   104  //				nodes[i] = n
   105  //				h := tbl.store.nodesMgr.Pin(n.storage.mnode)
   106  //				var err error
   107  //				if err = n.storage.mnode.Expand(common.K*1, func() error {
   108  //					_, err := n.Append(bat, 0)
   109  //					return err
   110  //				}); err != nil {
   111  //					err = n.storage.mnode.Expand(common.K*1, func() error {
   112  //						_, err := n.Append(bat, 0)
   113  //						return err
   114  //					})
   115  //				}
   116  //				if err != nil {
   117  //					assert.NotNil(t, err)
   118  //				}
   119  //				h.Close()
   120  //			}
   121  //			for _, n := range nodes {
   122  //				// n.ToTransient()
   123  //				n.Close()
   124  //			}
   125  //			atomic.AddUint64(&all, uint64(len(nodes)))
   126  //		}
   127  //	}
   128  //	idAlloc := common.NewIdAlloctor(1)
   129  //	for {
   130  //		id := idAlloc.Alloc()
   131  //		if id > 10 {
   132  //			break
   133  //		}
   134  //		wg.Add(1)
   135  //		err := p.Submit(worker(id))
   136  //		assert.Nil(t, err)
   137  //	}
   138  //	wg.Wait()
   139  //	t.Log(all)
   140  //	t.Log(tbl.store.nodesMgr.String())
   141  //}
   142  
   143  func TestTable(t *testing.T) {
   144  	defer testutils.AfterTest(t)()
   145  	testutils.EnsureNoLeak(t)
   146  	dir := testutils.InitTestEnv(ModuleName, t)
   147  	c, mgr, driver := initTestContext(t, dir)
   148  	defer driver.Close()
   149  	defer c.Close()
   150  	defer mgr.Stop()
   151  
   152  	schema := catalog.MockSchemaAll(3, 2)
   153  	schema.BlockMaxRows = 10000
   154  	schema.SegmentMaxBlocks = 10
   155  	{
   156  		txn, _ := mgr.StartTxn(nil)
   157  		db, err := txn.CreateDatabase("db", "")
   158  		assert.Nil(t, err)
   159  		rel, _ := db.CreateRelation(schema)
   160  		bat := catalog.MockBatch(schema, int(common.K)*100)
   161  		defer bat.Close()
   162  		bats := bat.Split(100)
   163  		for _, data := range bats {
   164  			err := rel.Append(data)
   165  			assert.Nil(t, err)
   166  		}
   167  		tDB, _ := txn.GetStore().(*txnStore).getOrSetDB(db.GetID())
   168  		tbl, _ := tDB.getOrSetTable(rel.ID())
   169  		err = tbl.RangeDeleteLocalRows(1024+20, 1024+30)
   170  		assert.Nil(t, err)
   171  		err = tbl.RangeDeleteLocalRows(1024*2+38, 1024*2+40)
   172  		assert.Nil(t, err)
   173  		err = tbl.RangeDeleteLocalRows(1024*10+38, 1024*40+40)
   174  		assert.Nil(t, err)
   175  		assert.True(t, tbl.IsLocalDeleted(1024+20))
   176  		assert.True(t, tbl.IsLocalDeleted(1024+30))
   177  		assert.True(t, tbl.IsLocalDeleted(1024*10+38))
   178  		assert.True(t, tbl.IsLocalDeleted(1024*40+40))
   179  		assert.True(t, tbl.IsLocalDeleted(1024*30+40))
   180  		assert.False(t, tbl.IsLocalDeleted(1024+19))
   181  		assert.False(t, tbl.IsLocalDeleted(1024+31))
   182  		assert.False(t, tbl.IsLocalDeleted(1024*10+37))
   183  		assert.False(t, tbl.IsLocalDeleted(1024*40+41))
   184  		err = txn.Commit()
   185  		assert.Nil(t, err)
   186  	}
   187  }
   188  
   189  func TestAppend(t *testing.T) {
   190  	defer testutils.AfterTest(t)()
   191  	testutils.EnsureNoLeak(t)
   192  	dir := testutils.InitTestEnv(ModuleName, t)
   193  	c, mgr, driver := initTestContext(t, dir)
   194  	defer driver.Close()
   195  	defer c.Close()
   196  	defer mgr.Stop()
   197  
   198  	schema := catalog.MockSchemaAll(3, 1)
   199  	schema.BlockMaxRows = 10000
   200  	schema.SegmentMaxBlocks = 10
   201  
   202  	txn, _ := mgr.StartTxn(nil)
   203  	db, _ := txn.CreateDatabase("db", "")
   204  	rel, _ := db.CreateRelation(schema)
   205  	tDB, _ := txn.GetStore().(*txnStore).getOrSetDB(db.GetID())
   206  	tbl, _ := tDB.getOrSetTable(rel.ID())
   207  	rows := uint64(txnbase.MaxNodeRows) / 8 * 3
   208  	brows := rows / 3
   209  
   210  	bat := catalog.MockBatch(tbl.GetSchema(), int(rows))
   211  	defer bat.Close()
   212  	bats := bat.Split(3)
   213  
   214  	err := tbl.BatchDedupLocal(bats[0])
   215  	assert.Nil(t, err)
   216  	err = tbl.Append(bats[0])
   217  	assert.Nil(t, err)
   218  	assert.Equal(t, int(brows), int(tbl.UncommittedRows()))
   219  	assert.Equal(t, int(brows), int(tbl.localSegment.index.Count()))
   220  
   221  	err = tbl.BatchDedupLocal(bats[0])
   222  	assert.NotNil(t, err)
   223  
   224  	err = tbl.BatchDedupLocal(bats[1])
   225  	assert.Nil(t, err)
   226  	err = tbl.Append(bats[1])
   227  	assert.Nil(t, err)
   228  	assert.Equal(t, 2*int(brows), int(tbl.UncommittedRows()))
   229  	assert.Equal(t, 2*int(brows), int(tbl.localSegment.index.Count()))
   230  
   231  	err = tbl.BatchDedupLocal(bats[2])
   232  	assert.Nil(t, err)
   233  	err = tbl.Append(bats[2])
   234  	assert.Nil(t, err)
   235  	assert.Equal(t, 3*int(brows), int(tbl.UncommittedRows()))
   236  	assert.Equal(t, 3*int(brows), int(tbl.localSegment.index.Count()))
   237  	assert.NoError(t, txn.Commit())
   238  }
   239  
   240  func TestIndex(t *testing.T) {
   241  	defer testutils.AfterTest(t)()
   242  	testutils.EnsureNoLeak(t)
   243  	index := NewSimpleTableIndex()
   244  	err := index.Insert(1, 10)
   245  	assert.Nil(t, err)
   246  	err = index.Insert("one", 10)
   247  	assert.Nil(t, err)
   248  	row, err := index.Search("one")
   249  	assert.Nil(t, err)
   250  	assert.Equal(t, 10, int(row))
   251  	err = index.Delete("one")
   252  	assert.Nil(t, err)
   253  	_, err = index.Search("one")
   254  	assert.NotNil(t, err)
   255  
   256  	schema := catalog.MockSchemaAll(14, 1)
   257  	bat := catalog.MockBatch(schema, 500)
   258  	defer bat.Close()
   259  
   260  	idx := NewSimpleTableIndex()
   261  	err = idx.BatchDedup(bat.Attrs[0], bat.Vecs[0])
   262  	assert.Nil(t, err)
   263  	err = idx.BatchInsert(bat.Attrs[0], bat.Vecs[0], 0, bat.Vecs[0].Length(), 0, false)
   264  	assert.NotNil(t, err)
   265  
   266  	err = idx.BatchDedup(bat.Attrs[1], bat.Vecs[1])
   267  	assert.Nil(t, err)
   268  	err = idx.BatchInsert(bat.Attrs[1], bat.Vecs[1], 0, bat.Vecs[1].Length(), 0, false)
   269  	assert.Nil(t, err)
   270  
   271  	window := bat.Vecs[1].Window(20, 2)
   272  	assert.Equal(t, 2, window.Length())
   273  	err = idx.BatchDedup(bat.Attrs[1], window)
   274  	assert.NotNil(t, err)
   275  
   276  	schema = catalog.MockSchemaAll(14, 12)
   277  	bat = catalog.MockBatch(schema, 500)
   278  	defer bat.Close()
   279  	idx = NewSimpleTableIndex()
   280  	err = idx.BatchDedup(bat.Attrs[12], bat.Vecs[12])
   281  	assert.Nil(t, err)
   282  	err = idx.BatchInsert(bat.Attrs[12], bat.Vecs[12], 0, bat.Vecs[12].Length(), 0, false)
   283  	assert.Nil(t, err)
   284  
   285  	window = bat.Vecs[12].Window(20, 2)
   286  	assert.Equal(t, 2, window.Length())
   287  	err = idx.BatchDedup(bat.Attrs[12], window)
   288  	assert.Error(t, err)
   289  }
   290  
   291  func TestLoad(t *testing.T) {
   292  	defer testutils.AfterTest(t)()
   293  	testutils.EnsureNoLeak(t)
   294  	dir := testutils.InitTestEnv(ModuleName, t)
   295  	c, mgr, driver := initTestContext(t, dir)
   296  	defer driver.Close()
   297  	defer c.Close()
   298  	defer mgr.Stop()
   299  
   300  	schema := catalog.MockSchemaAll(14, 13)
   301  	schema.BlockMaxRows = 10000
   302  	schema.SegmentMaxBlocks = 10
   303  
   304  	bat := catalog.MockBatch(schema, 60000)
   305  	defer bat.Close()
   306  	bats := bat.Split(5)
   307  
   308  	txn, _ := mgr.StartTxn(nil)
   309  	db, _ := txn.CreateDatabase("db", "")
   310  	rel, _ := db.CreateRelation(schema)
   311  	tDB, _ := txn.GetStore().(*txnStore).getOrSetDB(db.GetID())
   312  	tbl, _ := tDB.getOrSetTable(rel.ID())
   313  
   314  	err := tbl.Append(bats[0])
   315  	assert.NoError(t, err)
   316  
   317  	t.Log(tbl.store.nodesMgr.String())
   318  	v, err := tbl.GetLocalValue(100, 0)
   319  	assert.NoError(t, err)
   320  	t.Log(tbl.store.nodesMgr.String())
   321  	t.Logf("Row %d, Col %d, Val %v", 100, 0, v)
   322  	assert.NoError(t, txn.Commit())
   323  }
   324  
   325  func TestNodeCommand(t *testing.T) {
   326  	defer testutils.AfterTest(t)()
   327  	testutils.EnsureNoLeak(t)
   328  	dir := testutils.InitTestEnv(ModuleName, t)
   329  	c, mgr, driver := initTestContext(t, dir)
   330  	defer driver.Close()
   331  	defer c.Close()
   332  	defer mgr.Stop()
   333  
   334  	schema := catalog.MockSchemaAll(14, 13)
   335  	schema.BlockMaxRows = 10000
   336  	schema.SegmentMaxBlocks = 10
   337  
   338  	bat := catalog.MockBatch(schema, 15000)
   339  	defer bat.Close()
   340  
   341  	txn, _ := mgr.StartTxn(nil)
   342  	db, _ := txn.CreateDatabase("db", "")
   343  	rel, _ := db.CreateRelation(schema)
   344  
   345  	tDB, _ := txn.GetStore().(*txnStore).getOrSetDB(db.GetID())
   346  	tbl, _ := tDB.getOrSetTable(rel.ID())
   347  	err := tbl.Append(bat)
   348  	assert.Nil(t, err)
   349  
   350  	err = tbl.RangeDeleteLocalRows(100, 200)
   351  	assert.NoError(t, err)
   352  
   353  	for i, inode := range tbl.localSegment.nodes {
   354  		cmd, err := inode.MakeCommand(uint32(i))
   355  		assert.NoError(t, err)
   356  		assert.Equal(t, 1, len(cmd.(*AppendCmd).Cmds))
   357  		//if entry != nil {
   358  		//	_ = entry.WaitDone()
   359  		//	entry.Free()
   360  		//}
   361  		if cmd != nil {
   362  			t.Log(cmd.String())
   363  		}
   364  	}
   365  	assert.NoError(t, txn.Commit())
   366  }
   367  
   368  func TestTxnManager1(t *testing.T) {
   369  	defer testutils.AfterTest(t)()
   370  	testutils.EnsureNoLeak(t)
   371  	mgr := txnbase.NewTxnManager(TxnStoreFactory(nil, nil, nil, nil, nil),
   372  		TxnFactory(nil), types.NewMockHLCClock(1))
   373  	mgr.Start()
   374  	txn, _ := mgr.StartTxn(nil)
   375  	txn.MockIncWriteCnt()
   376  
   377  	lock := sync.Mutex{}
   378  	seqs := make([]int, 0)
   379  
   380  	txn.SetPrepareCommitFn(func(_ txnif.AsyncTxn) error {
   381  		time.Sleep(time.Millisecond * 100)
   382  		lock.Lock()
   383  		seqs = append(seqs, 2)
   384  		lock.Unlock()
   385  		return nil
   386  	})
   387  
   388  	var wg sync.WaitGroup
   389  	short := func() {
   390  		defer wg.Done()
   391  		txn2, _ := mgr.StartTxn(nil)
   392  		txn2.MockIncWriteCnt()
   393  		txn2.SetPrepareCommitFn(func(_ txnif.AsyncTxn) error {
   394  			lock.Lock()
   395  			seqs = append(seqs, 4)
   396  			lock.Unlock()
   397  			return nil
   398  		})
   399  		time.Sleep(10 * time.Millisecond)
   400  		lock.Lock()
   401  		seqs = append(seqs, 1)
   402  		lock.Unlock()
   403  		txn.GetTxnState(true)
   404  		lock.Lock()
   405  		seqs = append(seqs, 3)
   406  		lock.Unlock()
   407  		err := txn2.Commit()
   408  		assert.Nil(t, err)
   409  	}
   410  
   411  	for i := 0; i < 1; i++ {
   412  		wg.Add(1)
   413  		go short()
   414  	}
   415  
   416  	err := txn.Commit()
   417  	assert.Nil(t, err)
   418  	wg.Wait()
   419  	defer mgr.Stop()
   420  	expected := []int{1, 2, 3, 4}
   421  	assert.Equal(t, expected, seqs)
   422  }
   423  
   424  func initTestContext(t *testing.T, dir string) (*catalog.Catalog, *txnbase.TxnManager, wal.Driver) {
   425  	c := catalog.MockCatalog(nil)
   426  	driver := wal.NewDriverWithBatchStore(dir, "store", nil)
   427  	txnBufMgr := buffer.NewNodeManager(common.G, nil)
   428  	mutBufMgr := buffer.NewNodeManager(common.G, nil)
   429  	serviceDir := path.Join(dir, "data")
   430  	service := objectio.TmpNewFileservice(path.Join(dir, "data"))
   431  	fs := objectio.NewObjectFS(service, serviceDir)
   432  	factory := tables.NewDataFactory(fs, mutBufMgr, nil, dir)
   433  	mgr := txnbase.NewTxnManager(TxnStoreFactory(c, driver, nil, txnBufMgr, factory),
   434  		TxnFactory(c), types.NewMockHLCClock(1))
   435  	mgr.Start()
   436  	return c, mgr, driver
   437  }
   438  
   439  // 1. Txn1 create database "db" and table "tb1". Commit
   440  // 2. Txn2 drop database
   441  // 3. Txn3 create table "tb2"
   442  // 4. Txn2 commit
   443  // 5. Txn3 commit
   444  func TestTransaction1(t *testing.T) {
   445  	defer testutils.AfterTest(t)()
   446  	testutils.EnsureNoLeak(t)
   447  	dir := testutils.InitTestEnv(ModuleName, t)
   448  	c, mgr, driver := initTestContext(t, dir)
   449  	defer driver.Close()
   450  	defer c.Close()
   451  	defer mgr.Stop()
   452  
   453  	txn1, _ := mgr.StartTxn(nil)
   454  	name := "db"
   455  	schema := catalog.MockSchema(1, 0)
   456  	db, err := txn1.CreateDatabase(name, "")
   457  	assert.Nil(t, err)
   458  	_, err = db.CreateRelation(schema)
   459  	assert.Nil(t, err)
   460  	err = txn1.Commit()
   461  	assert.Nil(t, err)
   462  	t.Log(c.SimplePPString(common.PPL1))
   463  
   464  	txn2, _ := mgr.StartTxn(nil)
   465  	db2, err := txn2.DropDatabase(name)
   466  	assert.Nil(t, err)
   467  	t.Log(db2.String())
   468  
   469  	txn3, _ := mgr.StartTxn(nil)
   470  	db3, err := txn3.GetDatabase(name)
   471  	assert.Nil(t, err)
   472  	t.Log(db3.String())
   473  	schema = catalog.MockSchema(1, 0)
   474  	rel, err := db3.CreateRelation(schema)
   475  	assert.Nil(t, err)
   476  	t.Log(rel.String())
   477  
   478  	err = txn2.Commit()
   479  	assert.Nil(t, err)
   480  	err = txn3.Commit()
   481  	assert.NoError(t, err)
   482  	// assert.Equal(t, txnif.TxnStateRollbacked, txn3.GetTxnState(true))
   483  	t.Log(txn3.String())
   484  	t.Log(db2.String())
   485  	t.Log(rel.String())
   486  	t.Log(c.SimplePPString(common.PPL1))
   487  }
   488  
   489  func TestTransaction2(t *testing.T) {
   490  	defer testutils.AfterTest(t)()
   491  	testutils.EnsureNoLeak(t)
   492  	dir := testutils.InitTestEnv(ModuleName, t)
   493  	c, mgr, driver := initTestContext(t, dir)
   494  	defer driver.Close()
   495  	defer c.Close()
   496  	defer mgr.Stop()
   497  
   498  	name := "db"
   499  	txn1, _ := mgr.StartTxn(nil)
   500  	db, err := txn1.CreateDatabase(name, "")
   501  	assert.Nil(t, err)
   502  	t.Log(db.String())
   503  
   504  	schema := catalog.MockSchema(1, 0)
   505  	rel, err := db.CreateRelation(schema)
   506  	assert.Nil(t, err)
   507  	t.Log(rel.String())
   508  
   509  	err = txn1.Commit()
   510  	assert.Nil(t, err)
   511  	t.Log(db.String())
   512  	assert.Equal(t, txn1.GetCommitTS(), db.GetMeta().(*catalog.DBEntry).GetCreatedAt())
   513  	assert.True(t, db.GetMeta().(*catalog.DBEntry).IsCommitted())
   514  	assert.Equal(t, txn1.GetCommitTS(), rel.GetMeta().(*catalog.TableEntry).GetCreatedAt())
   515  	assert.True(t, rel.GetMeta().(*catalog.TableEntry).IsCommitted())
   516  
   517  	txn2, _ := mgr.StartTxn(nil)
   518  	get, err := txn2.GetDatabase(name)
   519  	assert.Nil(t, err)
   520  	t.Log(get.String())
   521  
   522  	dropped, err := txn2.DropDatabase(name)
   523  	assert.Nil(t, err)
   524  	t.Log(dropped.String())
   525  
   526  	_, err = txn2.GetDatabase(name)
   527  	assert.True(t, moerr.IsMoErrCode(err, moerr.ErrBadDB))
   528  	t.Log(err)
   529  
   530  	txn3, _ := mgr.StartTxn(nil)
   531  
   532  	db3, err := txn3.GetDatabase(name)
   533  	assert.Nil(t, err)
   534  
   535  	rel, err = db3.GetRelationByName(schema.Name)
   536  	assert.Nil(t, err)
   537  	t.Log(rel.String())
   538  }
   539  
   540  func TestTransaction3(t *testing.T) {
   541  	defer testutils.AfterTest(t)()
   542  	testutils.EnsureNoLeak(t)
   543  	dir := testutils.InitTestEnv(ModuleName, t)
   544  	c, mgr, driver := initTestContext(t, dir)
   545  	defer driver.Close()
   546  	defer mgr.Stop()
   547  	defer c.Close()
   548  
   549  	pool, _ := ants.NewPool(20)
   550  	defer pool.Release()
   551  
   552  	var wg sync.WaitGroup
   553  
   554  	flow := func(i int) func() {
   555  		return func() {
   556  			defer wg.Done()
   557  			txn, _ := mgr.StartTxn(nil)
   558  			name := fmt.Sprintf("db-%d", i)
   559  			db, err := txn.CreateDatabase(name, "")
   560  			assert.Nil(t, err)
   561  			schema := catalog.MockSchemaAll(13, 12)
   562  			_, err = db.CreateRelation(schema)
   563  			assert.Nil(t, err)
   564  			err = txn.Commit()
   565  			assert.Nil(t, err)
   566  		}
   567  	}
   568  
   569  	for i := 0; i < 100; i++ {
   570  		wg.Add(1)
   571  		err := pool.Submit(flow(i))
   572  		assert.Nil(t, err)
   573  	}
   574  	wg.Wait()
   575  }
   576  
   577  func TestSegment1(t *testing.T) {
   578  	defer testutils.AfterTest(t)()
   579  	testutils.EnsureNoLeak(t)
   580  	dir := testutils.InitTestEnv(ModuleName, t)
   581  	c, mgr, driver := initTestContext(t, dir)
   582  	defer driver.Close()
   583  	defer mgr.Stop()
   584  	defer c.Close()
   585  
   586  	txn1, _ := mgr.StartTxn(nil)
   587  	name := "db"
   588  	schema := catalog.MockSchema(1, 0)
   589  	db, err := txn1.CreateDatabase(name, "")
   590  	assert.Nil(t, err)
   591  	rel, err := db.CreateRelation(schema)
   592  	assert.Nil(t, err)
   593  	_, err = rel.CreateSegment(false)
   594  	assert.Nil(t, err)
   595  	err = txn1.Commit()
   596  	assert.Nil(t, err)
   597  
   598  	txn2, _ := mgr.StartTxn(nil)
   599  	db, err = txn2.GetDatabase(name)
   600  	assert.Nil(t, err)
   601  	rel, err = db.GetRelationByName(schema.Name)
   602  	assert.Nil(t, err)
   603  	segIt := rel.MakeSegmentIt()
   604  	cnt := 0
   605  	for segIt.Valid() {
   606  		iseg := segIt.GetSegment()
   607  		t.Log(iseg.String())
   608  		cnt++
   609  		segIt.Next()
   610  	}
   611  	assert.Equal(t, 1, cnt)
   612  
   613  	_, err = rel.CreateSegment(false)
   614  	assert.Nil(t, err)
   615  
   616  	segIt = rel.MakeSegmentIt()
   617  	cnt = 0
   618  	for segIt.Valid() {
   619  		iseg := segIt.GetSegment()
   620  		t.Log(iseg.String())
   621  		cnt++
   622  		segIt.Next()
   623  	}
   624  	assert.Equal(t, 2, cnt)
   625  
   626  	txn3, _ := mgr.StartTxn(nil)
   627  	db, _ = txn3.GetDatabase(name)
   628  	rel, _ = db.GetRelationByName(schema.Name)
   629  	segIt = rel.MakeSegmentIt()
   630  	cnt = 0
   631  	for segIt.Valid() {
   632  		iseg := segIt.GetSegment()
   633  		t.Log(iseg.String())
   634  		cnt++
   635  		segIt.Next()
   636  	}
   637  	assert.Equal(t, 1, cnt)
   638  
   639  	err = txn2.Commit()
   640  	assert.Nil(t, err)
   641  
   642  	segIt = rel.MakeSegmentIt()
   643  	cnt = 0
   644  	for segIt.Valid() {
   645  		iseg := segIt.GetSegment()
   646  		t.Log(iseg.String())
   647  		cnt++
   648  		segIt.Next()
   649  	}
   650  	assert.Equal(t, 1, cnt)
   651  }
   652  
   653  func TestSegment2(t *testing.T) {
   654  	defer testutils.AfterTest(t)()
   655  	testutils.EnsureNoLeak(t)
   656  	dir := testutils.InitTestEnv(ModuleName, t)
   657  	c, mgr, driver := initTestContext(t, dir)
   658  	defer driver.Close()
   659  	defer mgr.Stop()
   660  	defer c.Close()
   661  
   662  	txn1, _ := mgr.StartTxn(nil)
   663  	db, _ := txn1.CreateDatabase("db", "")
   664  	schema := catalog.MockSchema(1, 0)
   665  	rel, _ := db.CreateRelation(schema)
   666  	segCnt := 10
   667  	for i := 0; i < segCnt; i++ {
   668  		_, err := rel.CreateSegment(false)
   669  		assert.Nil(t, err)
   670  	}
   671  
   672  	it := rel.MakeSegmentIt()
   673  	cnt := 0
   674  	for it.Valid() {
   675  		cnt++
   676  		// iseg := it.GetSegment()
   677  		it.Next()
   678  	}
   679  	assert.Equal(t, segCnt, cnt)
   680  	// err := txn1.Commit()
   681  	// assert.Nil(t, err)
   682  	t.Log(c.SimplePPString(common.PPL1))
   683  }
   684  
   685  func TestBlock1(t *testing.T) {
   686  	defer testutils.AfterTest(t)()
   687  	testutils.EnsureNoLeak(t)
   688  	dir := testutils.InitTestEnv(ModuleName, t)
   689  	c, mgr, driver := initTestContext(t, dir)
   690  	defer driver.Close()
   691  	defer mgr.Stop()
   692  	defer c.Close()
   693  
   694  	txn1, _ := mgr.StartTxn(nil)
   695  	db, _ := txn1.CreateDatabase("db", "")
   696  	schema := catalog.MockSchema(1, 0)
   697  	rel, _ := db.CreateRelation(schema)
   698  	seg, _ := rel.CreateSegment(false)
   699  
   700  	blkCnt := 100
   701  	for i := 0; i < blkCnt; i++ {
   702  		_, err := seg.CreateBlock(false)
   703  		assert.Nil(t, err)
   704  	}
   705  
   706  	it := seg.MakeBlockIt()
   707  	cnt := 0
   708  	for it.Valid() {
   709  		cnt++
   710  		it.Next()
   711  	}
   712  	assert.Equal(t, blkCnt, cnt)
   713  
   714  	err := txn1.Commit()
   715  	assert.Nil(t, err)
   716  	txn2, _ := mgr.StartTxn(nil)
   717  	db, _ = txn2.GetDatabase("db")
   718  	rel, _ = db.GetRelationByName(schema.Name)
   719  	segIt := rel.MakeSegmentIt()
   720  	cnt = 0
   721  	for segIt.Valid() {
   722  		seg = segIt.GetSegment()
   723  		it = seg.MakeBlockIt()
   724  		for it.Valid() {
   725  			cnt++
   726  			it.Next()
   727  		}
   728  		segIt.Next()
   729  	}
   730  	assert.Equal(t, blkCnt, cnt)
   731  }
   732  
   733  func TestDedup1(t *testing.T) {
   734  	defer testutils.AfterTest(t)()
   735  	testutils.EnsureNoLeak(t)
   736  	dir := testutils.InitTestEnv(ModuleName, t)
   737  	c, mgr, driver := initTestContext(t, dir)
   738  	defer driver.Close()
   739  	defer c.Close()
   740  	defer mgr.Stop()
   741  
   742  	schema := catalog.MockSchemaAll(4, 2)
   743  	schema.BlockMaxRows = 20
   744  	schema.SegmentMaxBlocks = 4
   745  	cnt := uint64(10)
   746  	rows := uint64(schema.BlockMaxRows) / 2 * cnt
   747  	bat := catalog.MockBatch(schema, int(rows))
   748  	defer bat.Close()
   749  	bats := bat.Split(int(cnt))
   750  	{
   751  		txn, _ := mgr.StartTxn(nil)
   752  		db, _ := txn.CreateDatabase("db", "")
   753  		_, err := db.CreateRelation(schema)
   754  		assert.Nil(t, err)
   755  		assert.Nil(t, txn.Commit())
   756  	}
   757  	{
   758  		txn, _ := mgr.StartTxn(nil)
   759  		db, _ := txn.GetDatabase("db")
   760  		rel, _ := db.GetRelationByName(schema.Name)
   761  		err := rel.Append(bats[0])
   762  		assert.NoError(t, err)
   763  		err = rel.Append(bats[0])
   764  		assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
   765  		assert.Nil(t, txn.Rollback())
   766  	}
   767  
   768  	{
   769  		txn, _ := mgr.StartTxn(nil)
   770  		db, _ := txn.GetDatabase("db")
   771  		rel, _ := db.GetRelationByName(schema.Name)
   772  		err := rel.Append(bats[0])
   773  		assert.Nil(t, err)
   774  		assert.Nil(t, txn.Commit())
   775  	}
   776  	{
   777  		txn, _ := mgr.StartTxn(nil)
   778  		db, _ := txn.GetDatabase("db")
   779  		rel, _ := db.GetRelationByName(schema.Name)
   780  		err := rel.Append(bats[0])
   781  		assert.True(t, moerr.IsMoErrCode(err, moerr.ErrDuplicateEntry))
   782  		assert.Nil(t, txn.Rollback())
   783  	}
   784  	{
   785  		txn, _ := mgr.StartTxn(nil)
   786  		db, _ := txn.GetDatabase("db")
   787  		rel, _ := db.GetRelationByName(schema.Name)
   788  		err := rel.Append(bats[1])
   789  		assert.Nil(t, err)
   790  
   791  		txn2, _ := mgr.StartTxn(nil)
   792  		db2, _ := txn2.GetDatabase("db")
   793  		rel2, _ := db2.GetRelationByName(schema.Name)
   794  		err = rel2.Append(bats[2])
   795  		assert.Nil(t, err)
   796  		err = rel2.Append(bats[3])
   797  		assert.Nil(t, err)
   798  		assert.Nil(t, txn2.Commit())
   799  
   800  		txn3, _ := mgr.StartTxn(nil)
   801  		db3, _ := txn3.GetDatabase("db")
   802  		rel3, _ := db3.GetRelationByName(schema.Name)
   803  		err = rel3.Append(bats[4])
   804  		assert.Nil(t, err)
   805  		err = rel3.Append(bats[5])
   806  		assert.Nil(t, err)
   807  		assert.Nil(t, txn3.Commit())
   808  
   809  		err = rel.Append(bats[3])
   810  		assert.NoError(t, err)
   811  		err = txn.Commit()
   812  		assert.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnWWConflict))
   813  	}
   814  	t.Log(c.SimplePPString(common.PPL1))
   815  }