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 }