github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/db/catalog_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  	"sync"
    19  	"testing"
    20  	"time"
    21  
    22  	"github.com/matrixorigin/matrixone/pkg/container/types"
    23  
    24  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog"
    25  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common"
    26  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils"
    27  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils/config"
    28  
    29  	"github.com/panjf2000/ants/v2"
    30  	"github.com/stretchr/testify/assert"
    31  )
    32  
    33  func TestCatalog1(t *testing.T) {
    34  	defer testutils.AfterTest(t)()
    35  	testutils.EnsureNoLeak(t)
    36  	db := initDB(t, nil)
    37  	defer db.Close()
    38  
    39  	schema := catalog.MockSchema(1, 0)
    40  	txn, _, rel := createRelationNoCommit(t, db, defaultTestDB, schema, true)
    41  	// relMeta := rel.GetMeta().(*catalog.TableEntry)
    42  	seg, _ := rel.CreateSegment(false)
    43  	blk, err := seg.CreateBlock(false)
    44  	assert.Nil(t, err)
    45  	assert.Nil(t, txn.Commit())
    46  	t.Log(db.Opts.Catalog.SimplePPString(common.PPL1))
    47  
    48  	txn, rel = getDefaultRelation(t, db, schema.Name)
    49  	sseg, err := rel.GetSegment(seg.GetID())
    50  	assert.Nil(t, err)
    51  	t.Log(sseg.String())
    52  	err = sseg.SoftDeleteBlock(blk.Fingerprint().BlockID)
    53  	assert.Nil(t, err)
    54  
    55  	t.Log(db.Opts.Catalog.SimplePPString(common.PPL1))
    56  	blk2, err := sseg.CreateBlock(false)
    57  	assert.Nil(t, err)
    58  	assert.NotNil(t, blk2)
    59  	assert.Nil(t, txn.Commit())
    60  	t.Log(db.Opts.Catalog.SimplePPString(common.PPL1))
    61  
    62  	{
    63  		_, rel = getDefaultRelation(t, db, schema.Name)
    64  		it := rel.MakeBlockIt()
    65  		cnt := 0
    66  		for it.Valid() {
    67  			block := it.GetBlock()
    68  			cnt++
    69  			t.Log(block.String())
    70  			it.Next()
    71  		}
    72  		assert.Equal(t, 1, cnt)
    73  	}
    74  }
    75  
    76  func TestShowDatabaseNames(t *testing.T) {
    77  	defer testutils.AfterTest(t)()
    78  	testutils.EnsureNoLeak(t)
    79  	tae := initDB(t, nil)
    80  	defer tae.Close()
    81  
    82  	{
    83  		txn, _ := tae.StartTxn(nil)
    84  		_, err := txn.CreateDatabase("db1", "")
    85  		assert.Nil(t, err)
    86  		names := txn.DatabaseNames()
    87  		assert.Equal(t, 2, len(names))
    88  		assert.Equal(t, "db1", names[1])
    89  		assert.Nil(t, txn.Commit())
    90  	}
    91  	{
    92  		txn, _ := tae.StartTxn(nil)
    93  		names := txn.DatabaseNames()
    94  		assert.Equal(t, 2, len(names))
    95  		assert.Equal(t, "db1", names[1])
    96  		_, err := txn.CreateDatabase("db2", "")
    97  		assert.Nil(t, err)
    98  		names = txn.DatabaseNames()
    99  		t.Log(tae.Catalog.SimplePPString(common.PPL1))
   100  		assert.Equal(t, 3, len(names))
   101  		assert.Equal(t, "db1", names[1])
   102  		assert.Equal(t, "db2", names[2])
   103  		{
   104  			txn, _ := tae.StartTxn(nil)
   105  			names := txn.DatabaseNames()
   106  			assert.Equal(t, 2, len(names))
   107  			assert.Equal(t, "db1", names[1])
   108  			_, err := txn.CreateDatabase("db2", "")
   109  			assert.NotNil(t, err)
   110  			err = txn.Rollback()
   111  			assert.Nil(t, err)
   112  		}
   113  		{
   114  			txn, _ := tae.StartTxn(nil)
   115  			_, err := txn.CreateDatabase("db3", "")
   116  			assert.Nil(t, err)
   117  			names := txn.DatabaseNames()
   118  			assert.Equal(t, "db1", names[1])
   119  			assert.Equal(t, "db3", names[2])
   120  			assert.Nil(t, txn.Commit())
   121  		}
   122  		{
   123  			txn, _ := tae.StartTxn(nil)
   124  			names := txn.DatabaseNames()
   125  			assert.Equal(t, 3, len(names))
   126  			assert.Equal(t, "db1", names[1])
   127  			assert.Equal(t, "db3", names[2])
   128  			_, err := txn.DropDatabase("db1")
   129  			assert.Nil(t, err)
   130  			names = txn.DatabaseNames()
   131  			t.Log(tae.Catalog.SimplePPString(common.PPL1))
   132  			t.Log(names)
   133  			assert.Equal(t, 2, len(names))
   134  			assert.Equal(t, "db3", names[1])
   135  			assert.Nil(t, txn.Commit())
   136  		}
   137  		names = txn.DatabaseNames()
   138  		assert.Equal(t, 3, len(names))
   139  		assert.Equal(t, "db1", names[1])
   140  		assert.Equal(t, "db2", names[2])
   141  		assert.Nil(t, txn.Commit())
   142  	}
   143  }
   144  
   145  func TestCheckpointCatalog2(t *testing.T) {
   146  	defer testutils.AfterTest(t)()
   147  	testutils.EnsureNoLeak(t)
   148  	opts := config.WithLongScanAndCKPOpts(nil)
   149  	tae := initDB(t, opts)
   150  	defer tae.Close()
   151  	txn, _ := tae.StartTxn(nil)
   152  	schema := catalog.MockSchemaAll(13, 12)
   153  	db, err := txn.CreateDatabase("db", "")
   154  	assert.Nil(t, err)
   155  	_, err = db.CreateRelation(schema)
   156  	assert.Nil(t, err)
   157  	err = txn.Commit()
   158  	assert.Nil(t, err)
   159  
   160  	pool, _ := ants.NewPool(20)
   161  	defer pool.Release()
   162  	var wg sync.WaitGroup
   163  	mockRes := func() {
   164  		defer wg.Done()
   165  		txn, _ := tae.StartTxn(nil)
   166  		db, _ := txn.GetDatabase("db")
   167  		rel, _ := db.GetRelationByName(schema.Name)
   168  		seg, err := rel.CreateSegment(false)
   169  		assert.Nil(t, err)
   170  		var id *common.ID
   171  		for i := 0; i < 30; i++ {
   172  			blk, err := seg.CreateBlock(false)
   173  			if i == 2 {
   174  				id = blk.Fingerprint()
   175  			}
   176  			assert.Nil(t, err)
   177  		}
   178  		err = txn.Commit()
   179  		assert.Nil(t, err)
   180  
   181  		txn, _ = tae.StartTxn(nil)
   182  		db, _ = txn.GetDatabase("db")
   183  		rel, _ = db.GetRelationByName(schema.Name)
   184  		seg, _ = rel.GetSegment(id.SegmentID)
   185  		err = seg.SoftDeleteBlock(id.BlockID)
   186  		assert.Nil(t, err)
   187  		assert.Nil(t, txn.Commit())
   188  	}
   189  	for i := 0; i < 10; i++ {
   190  		wg.Add(1)
   191  		err := pool.Submit(mockRes)
   192  		assert.Nil(t, err)
   193  	}
   194  	wg.Wait()
   195  	ts := types.BuildTS(time.Now().UTC().UnixNano(), 0)
   196  	err = tae.BGCheckpointRunner.ForceIncrementalCheckpoint(ts)
   197  	assert.NoError(t, err)
   198  	lsn := tae.BGCheckpointRunner.MaxLSNInRange(ts)
   199  	entry, err := tae.Wal.RangeCheckpoint(1, lsn)
   200  	assert.NoError(t, err)
   201  	assert.NoError(t, entry.WaitDone())
   202  	testutils.WaitExpect(1000, func() bool {
   203  		return tae.Scheduler.GetPenddingLSNCnt() == 0
   204  	})
   205  	assert.Equal(t, tae.BGCheckpointRunner.MaxLSN(), tae.Scheduler.GetCheckpointedLSN())
   206  }