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 }