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 }