github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/db/tables_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 "bytes" 19 "sync" 20 "testing" 21 "time" 22 23 "github.com/matrixorigin/matrixone/pkg/common/moerr" 24 "github.com/matrixorigin/matrixone/pkg/container/types" 25 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog" 26 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" 27 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/containers" 28 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/handle" 29 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/options" 30 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tables" 31 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tables/jobs" 32 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils" 33 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils/config" 34 "github.com/panjf2000/ants/v2" 35 "github.com/stretchr/testify/assert" 36 ) 37 38 func TestTables1(t *testing.T) { 39 defer testutils.AfterTest(t)() 40 testutils.EnsureNoLeak(t) 41 db := initDB(t, nil) 42 defer db.Close() 43 txn, _ := db.StartTxn(nil) 44 database, _ := txn.CreateDatabase("db", "") 45 schema := catalog.MockSchema(1, 0) 46 schema.BlockMaxRows = 1000 47 schema.SegmentMaxBlocks = 2 48 rel, _ := database.CreateRelation(schema) 49 tableMeta := rel.GetMeta().(*catalog.TableEntry) 50 dataFactory := tables.NewDataFactory(db.Fs, db.MTBufMgr, db.Scheduler, db.Dir) 51 tableFactory := dataFactory.MakeTableFactory() 52 table := tableFactory(tableMeta) 53 handle := table.GetHandle() 54 _, err := handle.GetAppender() 55 assert.True(t, moerr.IsMoErrCode(err, moerr.ErrAppendableSegmentNotFound)) 56 seg, _ := rel.CreateSegment(false) 57 blk, _ := seg.CreateBlock(false) 58 id := blk.GetMeta().(*catalog.BlockEntry).AsCommonID() 59 appender := handle.SetAppender(id) 60 assert.NotNil(t, appender) 61 62 blkCnt := 3 63 rows := schema.BlockMaxRows * uint32(blkCnt) 64 _, _, toAppend, err := appender.PrepareAppend(rows, nil) 65 assert.Equal(t, schema.BlockMaxRows, toAppend) 66 assert.Nil(t, err) 67 t.Log(toAppend) 68 69 _, _, toAppend, err = appender.PrepareAppend(rows-toAppend, nil) 70 assert.Nil(t, err) 71 assert.Equal(t, uint32(0), toAppend) 72 73 _, err = handle.GetAppender() 74 assert.True(t, moerr.IsMoErrCode(err, moerr.ErrAppendableBlockNotFound)) 75 76 blk, _ = seg.CreateBlock(false) 77 id = blk.GetMeta().(*catalog.BlockEntry).AsCommonID() 78 appender = handle.SetAppender(id) 79 80 _, _, toAppend, err = appender.PrepareAppend(rows-toAppend, nil) 81 assert.Nil(t, err) 82 assert.Equal(t, schema.BlockMaxRows, toAppend) 83 84 _, err = handle.GetAppender() 85 assert.True(t, moerr.IsMoErrCode(err, moerr.ErrAppendableSegmentNotFound)) 86 87 seg, _ = rel.CreateSegment(false) 88 blk, _ = seg.CreateBlock(false) 89 90 id = blk.GetMeta().(*catalog.BlockEntry).AsCommonID() 91 appender = handle.SetAppender(id) 92 _, _, toAppend, err = appender.PrepareAppend(rows-2*toAppend, nil) 93 assert.Nil(t, err) 94 assert.Equal(t, schema.BlockMaxRows, toAppend) 95 t.Log(db.Opts.Catalog.SimplePPString(common.PPL1)) 96 err = txn.Rollback() 97 assert.Nil(t, err) 98 t.Log(db.Opts.Catalog.SimplePPString(common.PPL1)) 99 } 100 101 func TestTxn1(t *testing.T) { 102 defer testutils.AfterTest(t)() 103 testutils.EnsureNoLeak(t) 104 db := initDB(t, nil) 105 defer db.Close() 106 107 schema := catalog.MockSchema(3, 2) 108 schema.BlockMaxRows = 10000 109 schema.SegmentMaxBlocks = 4 110 batchRows := schema.BlockMaxRows * 2 / 5 111 cnt := uint32(20) 112 bat := catalog.MockBatch(schema, int(batchRows*cnt)) 113 defer bat.Close() 114 bats := bat.Split(20) 115 { 116 txn, _ := db.StartTxn(nil) 117 database, err := txn.CreateDatabase("db", "") 118 assert.Nil(t, err) 119 _, err = database.CreateRelation(schema) 120 assert.Nil(t, err) 121 err = txn.Commit() 122 assert.Nil(t, err) 123 } 124 var wg sync.WaitGroup 125 now := time.Now() 126 doAppend := func(b *containers.Batch) func() { 127 return func() { 128 defer wg.Done() 129 txn, _ := db.StartTxn(nil) 130 database, _ := txn.GetDatabase("db") 131 rel, err := database.GetRelationByName(schema.Name) 132 assert.Nil(t, err) 133 err = rel.Append(b) 134 assert.Nil(t, err) 135 err = txn.Commit() 136 assert.Nil(t, err) 137 } 138 } 139 p, err := ants.NewPool(4) 140 assert.Nil(t, err) 141 defer p.Release() 142 for _, toAppend := range bats { 143 wg.Add(1) 144 err := p.Submit(doAppend(toAppend)) 145 assert.Nil(t, err) 146 } 147 148 wg.Wait() 149 150 t.Logf("Append takes: %s", time.Since(now)) 151 // expectBlkCnt := (uint32(batchRows)*uint32(batchCnt)*uint32(loopCnt)-1)/schema.BlockMaxRows + 1 152 expectBlkCnt := (uint32(batchRows)*uint32(cnt)-1)/schema.BlockMaxRows + 1 153 expectSegCnt := (expectBlkCnt-1)/uint32(schema.SegmentMaxBlocks) + 1 154 // t.Log(expectBlkCnt) 155 // t.Log(expectSegCnt) 156 { 157 txn, _ := db.StartTxn(nil) 158 database, _ := txn.GetDatabase("db") 159 rel, _ := database.GetRelationByName(schema.Name) 160 seg, err := rel.CreateSegment(false) 161 assert.Nil(t, err) 162 _, err = seg.CreateBlock(false) 163 assert.Nil(t, err) 164 } 165 { 166 txn, _ := db.StartTxn(nil) 167 database, _ := txn.GetDatabase("db") 168 rel, _ := database.GetRelationByName(schema.Name) 169 segIt := rel.MakeSegmentIt() 170 segCnt := uint32(0) 171 blkCnt := uint32(0) 172 for segIt.Valid() { 173 segCnt++ 174 blkIt := segIt.GetSegment().MakeBlockIt() 175 for blkIt.Valid() { 176 blkCnt++ 177 blkIt.Next() 178 } 179 segIt.Next() 180 } 181 assert.Equal(t, expectSegCnt, segCnt) 182 assert.Equal(t, expectBlkCnt, blkCnt) 183 } 184 t.Log(db.Opts.Catalog.SimplePPString(common.PPL1)) 185 } 186 187 func TestTxn2(t *testing.T) { 188 defer testutils.AfterTest(t)() 189 testutils.EnsureNoLeak(t) 190 db := initDB(t, nil) 191 defer db.Close() 192 193 var wg sync.WaitGroup 194 run := func() { 195 defer wg.Done() 196 txn, _ := db.StartTxn(nil) 197 if _, err := txn.CreateDatabase("db", ""); err != nil { 198 assert.Nil(t, txn.Rollback()) 199 } else { 200 assert.Nil(t, txn.Commit()) 201 } 202 t.Log(txn.String()) 203 } 204 wg.Add(2) 205 go run() 206 go run() 207 wg.Wait() 208 t.Log(db.Opts.Catalog.SimplePPString(common.PPL1)) 209 } 210 211 func TestTxn4(t *testing.T) { 212 defer testutils.AfterTest(t)() 213 testutils.EnsureNoLeak(t) 214 db := initDB(t, nil) 215 defer db.Close() 216 217 schema := catalog.MockSchemaAll(4, 2) 218 schema.BlockMaxRows = 40000 219 schema.SegmentMaxBlocks = 8 220 { 221 txn, _ := db.StartTxn(nil) 222 database, _ := txn.CreateDatabase("db", "") 223 rel, _ := database.CreateRelation(schema) 224 pk := containers.MakeVector(schema.GetSingleSortKey().Type, schema.GetSingleSortKey().Nullable()) 225 defer pk.Close() 226 pk.AppendMany(int32(1), int32(2), int32(1)) 227 provider := containers.NewMockDataProvider() 228 provider.AddColumnProvider(schema.GetSingleSortKeyIdx(), pk) 229 bat := containers.MockBatch(schema.Types(), 3, schema.GetSingleSortKeyIdx(), provider) 230 defer bat.Close() 231 err := rel.Append(bat) 232 t.Log(err) 233 assert.NotNil(t, err) 234 assert.Nil(t, txn.Commit()) 235 } 236 } 237 238 func TestTxn5(t *testing.T) { 239 defer testutils.AfterTest(t)() 240 testutils.EnsureNoLeak(t) 241 db := initDB(t, nil) 242 defer db.Close() 243 244 schema := catalog.MockSchemaAll(4, 2) 245 schema.BlockMaxRows = 20 246 schema.SegmentMaxBlocks = 4 247 cnt := uint32(10) 248 rows := schema.BlockMaxRows / 2 * cnt 249 bat := catalog.MockBatch(schema, int(rows)) 250 defer bat.Close() 251 bats := bat.Split(int(cnt)) 252 { 253 txn, _ := db.StartTxn(nil) 254 database, _ := txn.CreateDatabase("db", "") 255 _, err := database.CreateRelation(schema) 256 assert.Nil(t, err) 257 assert.Nil(t, txn.Commit()) 258 } 259 { 260 txn, _ := db.StartTxn(nil) 261 database, _ := txn.GetDatabase("db") 262 rel, _ := database.GetRelationByName(schema.Name) 263 err := rel.Append(bats[0]) 264 assert.Nil(t, err) 265 err = rel.Append(bats[0]) 266 assert.NotNil(t, err) 267 assert.Nil(t, txn.Rollback()) 268 } 269 270 { 271 txn, _ := db.StartTxn(nil) 272 database, _ := txn.GetDatabase("db") 273 rel, _ := database.GetRelationByName(schema.Name) 274 err := rel.Append(bats[0]) 275 assert.Nil(t, err) 276 assert.Nil(t, txn.Commit()) 277 } 278 { 279 txn, _ := db.StartTxn(nil) 280 database, _ := txn.GetDatabase("db") 281 rel, _ := database.GetRelationByName(schema.Name) 282 err := rel.Append(bats[0]) 283 assert.NotNil(t, err) 284 assert.Nil(t, txn.Rollback()) 285 } 286 { 287 txn, _ := db.StartTxn(nil) 288 database, _ := txn.GetDatabase("db") 289 rel, _ := database.GetRelationByName(schema.Name) 290 err := rel.Append(bats[1]) 291 assert.Nil(t, err) 292 293 txn2, _ := db.StartTxn(nil) 294 db2, _ := txn2.GetDatabase("db") 295 rel2, _ := db2.GetRelationByName(schema.Name) 296 err = rel2.Append(bats[1]) 297 assert.Nil(t, err) 298 err = rel2.Append(bats[2]) 299 assert.Nil(t, err) 300 301 assert.Nil(t, txn2.Commit()) 302 assert.Error(t, txn.Commit()) 303 t.Log(txn2.String()) 304 t.Log(txn.String()) 305 } 306 t.Log(db.Opts.Catalog.SimplePPString(common.PPL1)) 307 } 308 309 func TestTxn6(t *testing.T) { 310 defer testutils.AfterTest(t)() 311 testutils.EnsureNoLeak(t) 312 db := initDB(t, nil) 313 defer db.Close() 314 315 schema := catalog.MockSchemaAll(4, 2) 316 schema.BlockMaxRows = 20 317 schema.SegmentMaxBlocks = 4 318 cnt := uint32(10) 319 rows := schema.BlockMaxRows / 2 * cnt 320 bat := catalog.MockBatch(schema, int(rows)) 321 defer bat.Close() 322 bats := bat.Split(int(cnt)) 323 { 324 txn, _ := db.StartTxn(nil) 325 database, _ := txn.CreateDatabase("db", "") 326 rel, _ := database.CreateRelation(schema) 327 err := rel.Append(bats[0]) 328 assert.Nil(t, err) 329 assert.Nil(t, txn.Commit()) 330 } 331 { 332 txn, _ := db.StartTxn(nil) 333 database, _ := txn.GetDatabase("db") 334 rel, _ := database.GetRelationByName(schema.Name) 335 filter := new(handle.Filter) 336 filter.Op = handle.FilterEq 337 filter.Val = int32(5) 338 339 err := rel.UpdateByFilter(filter, uint16(3), int64(33)) 340 assert.NoError(t, err) 341 342 err = rel.UpdateByFilter(filter, uint16(3), int64(44)) 343 assert.NoError(t, err) 344 v, err := rel.GetValueByFilter(filter, 3) 345 assert.NoError(t, err) 346 assert.Equal(t, int64(44), v) 347 348 filter.Val = int32(6) 349 err = rel.UpdateByFilter(filter, uint16(3), int64(77)) 350 assert.NoError(t, err) 351 352 err = rel.DeleteByFilter(filter) 353 assert.NoError(t, err) 354 355 // Double delete in a same txn -- FAIL 356 err = rel.DeleteByFilter(filter) 357 assert.Error(t, err) 358 359 { 360 txn, _ := db.StartTxn(nil) 361 database, _ := txn.GetDatabase("db") 362 rel, _ := database.GetRelationByName(schema.Name) 363 364 filter.Val = int32(5) 365 v, err := rel.GetValueByFilter(filter, 3) 366 assert.NoError(t, err) 367 assert.NotEqual(t, int64(44), v) 368 369 err = rel.UpdateByFilter(filter, uint16(3), int64(55)) 370 assert.Error(t, err) 371 372 filter.Val = int32(7) 373 err = rel.UpdateByFilter(filter, uint16(3), int64(88)) 374 assert.NoError(t, err) 375 376 // Update row that has uncommitted delete -- FAIL 377 filter.Val = int32(6) 378 err = rel.UpdateByFilter(filter, uint16(3), int64(55)) 379 assert.Error(t, err) 380 _, err = rel.GetValueByFilter(filter, 3) 381 assert.NoError(t, err) 382 err = txn.Rollback() 383 assert.NoError(t, err) 384 } 385 filter.Val = int32(7) 386 err = rel.UpdateByFilter(filter, uint16(3), int64(99)) 387 assert.NoError(t, err) 388 389 assert.NoError(t, txn.Commit()) 390 391 { 392 txn, _ := db.StartTxn(nil) 393 database, _ := txn.GetDatabase("db") 394 rel, _ := database.GetRelationByName(schema.Name) 395 396 filter.Val = int32(5) 397 v, err := rel.GetValueByFilter(filter, 3) 398 assert.NoError(t, err) 399 assert.Equal(t, int64(44), v) 400 401 filter.Val = int32(7) 402 v, err = rel.GetValueByFilter(filter, 3) 403 assert.NoError(t, err) 404 assert.Equal(t, int64(99), v) 405 406 filter.Val = int32(6) 407 _, err = rel.GetValueByFilter(filter, 3) 408 assert.Error(t, err) 409 410 var buffer bytes.Buffer 411 it := rel.MakeBlockIt() 412 for it.Valid() { 413 buffer.Reset() 414 blk := it.GetBlock() 415 view, err := blk.GetColumnDataByName(schema.ColDefs[3].Name, &buffer) 416 assert.Nil(t, err) 417 defer view.Close() 418 assert.NotEqual(t, bats[0].Length(), view.Length()) 419 t.Log(view.DeleteMask.String()) 420 assert.Equal(t, bats[0].Length()-1, view.ApplyDeletes().Length()) 421 it.Next() 422 } 423 } 424 } 425 } 426 427 func TestMergeBlocks1(t *testing.T) { 428 defer testutils.AfterTest(t)() 429 testutils.EnsureNoLeak(t) 430 opts := new(options.Options) 431 db := initDB(t, opts) 432 defer db.Close() 433 schema := catalog.MockSchemaAll(13, 2) 434 schema.BlockMaxRows = 5 435 schema.SegmentMaxBlocks = 8 436 col3Data := []int64{10, 8, 1, 6, 15, 7, 3, 12, 11, 4, 9, 5, 14, 13, 2} 437 // col3Data := []int64{2, 9, 11, 13, 15, 1, 4, 7, 10, 14, 3, 5, 6, 8, 12} 438 pkData := []int32{2, 9, 11, 13, 15, 1, 4, 7, 10, 14, 3, 5, 6, 8, 12} 439 pk := containers.MakeVector(schema.GetSingleSortKey().Type, schema.GetSingleSortKey().Nullable()) 440 defer pk.Close() 441 col3 := containers.MakeVector(schema.ColDefs[3].Type, schema.ColDefs[3].Nullable()) 442 defer col3.Close() 443 mapping := make(map[int32]int64) 444 for i, v := range pkData { 445 pk.Append(v) 446 col3.Append(col3Data[i]) 447 mapping[v] = col3Data[i] 448 } 449 450 provider := containers.NewMockDataProvider() 451 provider.AddColumnProvider(schema.GetSingleSortKeyIdx(), pk) 452 provider.AddColumnProvider(3, col3) 453 bat := containers.MockBatch(schema.Types(), int(schema.BlockMaxRows*3), schema.GetSingleSortKeyIdx(), provider) 454 defer bat.Close() 455 { 456 txn, _ := db.StartTxn(nil) 457 database, _ := txn.CreateDatabase("db", "") 458 rel, _ := database.CreateRelation(schema) 459 err := rel.Append(bat) 460 assert.Nil(t, err) 461 assert.Nil(t, txn.Commit()) 462 } 463 464 { 465 txn, _ := db.StartTxn(nil) 466 database, _ := txn.GetDatabase("db") 467 rel, _ := database.GetRelationByName(schema.Name) 468 blks := make([]*catalog.BlockEntry, 0) 469 it := rel.MakeBlockIt() 470 for it.Valid() { 471 blk := it.GetBlock() 472 meta := blk.GetMeta().(*catalog.BlockEntry) 473 blks = append(blks, meta) 474 it.Next() 475 } 476 { 477 txn, _ := db.StartTxn(nil) 478 database, _ := txn.GetDatabase("db") 479 rel, _ := database.GetRelationByName(schema.Name) 480 it := rel.MakeBlockIt() 481 blk := it.GetBlock() 482 err := blk.RangeDelete(4, 4, handle.DT_Normal) 483 assert.Nil(t, err) 484 assert.Nil(t, txn.Commit()) 485 } 486 start := time.Now() 487 factory := jobs.MergeBlocksIntoSegmentTaskFctory(blks, blks[0].GetSegment(), db.Scheduler) 488 // err = task.WaitDone() 489 // assert.Nil(t, err) 490 { 491 task, err := factory(nil, txn) 492 assert.Nil(t, err) 493 err = task.OnExec() 494 assert.Nil(t, err) 495 } 496 assert.Nil(t, txn.Commit()) 497 t.Logf("MergeSort takes: %s", time.Since(start)) 498 t.Log(db.Opts.Catalog.SimplePPString(common.PPL1)) 499 } 500 { 501 txn, _ := db.StartTxn(nil) 502 database, _ := txn.GetDatabase("db") 503 rel, _ := database.GetRelationByName(schema.Name) 504 it := rel.MakeBlockIt() 505 for it.Valid() { 506 blk := it.GetBlock() 507 view, _ := blk.GetColumnDataById(3, nil) 508 assert.NotNil(t, view) 509 defer view.Close() 510 if view.DeleteMask != nil { 511 t.Log(view.DeleteMask.String()) 512 } 513 pkView, _ := blk.GetColumnDataById(schema.GetSingleSortKeyIdx(), nil) 514 defer pkView.Close() 515 for i := 0; i < pkView.Length(); i++ { 516 pkv := pkView.GetValue(i) 517 colv := view.GetValue(i) 518 assert.Equal(t, mapping[pkv.(int32)], colv) 519 } 520 it.Next() 521 } 522 } 523 // testutils.WaitExpect(1000, func() bool { 524 // return db.Wal.GetPenddingCnt() == 0 525 // }) 526 // assert.Equal(t, uint64(0), db.Wal.GetPenddingCnt()) 527 t.Logf("Checkpointed: %d", db.Wal.GetCheckpointed()) 528 t.Logf("PendingCnt: %d", db.Wal.GetPenddingCnt()) 529 } 530 531 func TestMergeBlocks2(t *testing.T) { 532 defer testutils.AfterTest(t)() 533 testutils.EnsureNoLeak(t) 534 opts := config.WithQuickScanAndCKPOpts(nil) 535 tae := initDB(t, opts) 536 schema := catalog.MockSchemaAll(13, 2) 537 schema.BlockMaxRows = 5 538 schema.SegmentMaxBlocks = 2 539 col3Data := []int64{10, 8, 1, 6, 15, 7, 3, 12, 11, 4, 9, 5, 14, 13, 2} 540 // col3Data := []int64{2, 9, 11, 13, 15, 1, 4, 7, 10, 14, 3, 5, 6, 8, 12} 541 pkData := []int32{2, 9, 11, 13, 15, 1, 4, 7, 10, 14, 3, 5, 6, 8, 12} 542 543 pk := containers.MakeVector(schema.GetSingleSortKey().Type, schema.GetSingleSortKey().Nullable()) 544 col3 := containers.MakeVector(schema.ColDefs[3].Type, schema.ColDefs[3].Nullable()) 545 mapping := make(map[int32]int64) 546 for i, v := range pkData { 547 pk.Append(v) 548 col3.Append(col3Data[i]) 549 mapping[v] = col3Data[i] 550 } 551 552 provider := containers.NewMockDataProvider() 553 provider.AddColumnProvider(schema.GetSingleSortKeyIdx(), pk) 554 provider.AddColumnProvider(3, col3) 555 bat := containers.MockBatch(schema.Types(), int(schema.BlockMaxRows*3), schema.GetSingleSortKeyIdx(), provider) 556 { 557 txn, _ := tae.StartTxn(nil) 558 database, _ := txn.CreateDatabase("db", "") 559 rel, _ := database.CreateRelation(schema) 560 err := rel.Append(bat) 561 assert.Nil(t, err) 562 assert.Nil(t, txn.Commit()) 563 } 564 pk.Close() 565 col3.Close() 566 bat.Close() 567 start := time.Now() 568 testutils.WaitExpect(2000, func() bool { 569 return tae.Wal.GetPenddingCnt() == 0 570 }) 571 t.Logf("Wait %s", time.Since(start)) 572 // assert.Equal(t, uint64(0), tae.Wal.GetPenddingCnt()) 573 t.Logf("Checkpointed: %d", tae.Wal.GetCheckpointed()) 574 t.Logf("PendingCnt: %d", tae.Wal.GetPenddingCnt()) 575 tae.Close() 576 } 577 578 func TestCompaction1(t *testing.T) { 579 defer testutils.AfterTest(t)() 580 testutils.EnsureNoLeak(t) 581 db := initDB(t, nil) 582 defer db.Close() 583 584 schema := catalog.MockSchemaAll(4, 2) 585 schema.BlockMaxRows = 20 586 schema.SegmentMaxBlocks = 4 587 cnt := uint32(2) 588 rows := schema.BlockMaxRows / 2 * cnt 589 bat := catalog.MockBatch(schema, int(rows)) 590 defer bat.Close() 591 bats := bat.Split(int(cnt)) 592 { 593 txn, _ := db.StartTxn(nil) 594 database, _ := txn.CreateDatabase("db", "") 595 rel, _ := database.CreateRelation(schema) 596 err := rel.Append(bats[0]) 597 assert.Nil(t, err) 598 assert.Nil(t, txn.Commit()) 599 } 600 { 601 txn, _ := db.StartTxn(nil) 602 database, _ := txn.GetDatabase("db") 603 rel, _ := database.GetRelationByName(schema.Name) 604 it := rel.MakeBlockIt() 605 for it.Valid() { 606 blk := it.GetBlock() 607 view, _ := blk.GetColumnDataById(3, nil) 608 assert.NotNil(t, view) 609 view.Close() 610 assert.True(t, blk.GetMeta().(*catalog.BlockEntry).GetBlockData().IsAppendable()) 611 it.Next() 612 } 613 } 614 { 615 txn, _ := db.StartTxn(nil) 616 database, _ := txn.GetDatabase("db") 617 rel, _ := database.GetRelationByName(schema.Name) 618 err := rel.Append(bats[1]) 619 assert.Nil(t, err) 620 assert.Nil(t, txn.Commit()) 621 } 622 { 623 txn, _ := db.StartTxn(nil) 624 database, _ := txn.GetDatabase("db") 625 rel, _ := database.GetRelationByName(schema.Name) 626 it := rel.MakeBlockIt() 627 for it.Valid() { 628 blk := it.GetBlock() 629 view, _ := blk.GetColumnDataById(3, nil) 630 assert.NotNil(t, view) 631 view.Close() 632 assert.False(t, blk.GetMeta().(*catalog.BlockEntry).GetBlockData().IsAppendable()) 633 it.Next() 634 } 635 } 636 } 637 638 func TestCompaction2(t *testing.T) { 639 defer testutils.AfterTest(t)() 640 testutils.EnsureNoLeak(t) 641 opts := config.WithQuickScanAndCKPOpts(nil) 642 db := initDB(t, opts) 643 defer db.Close() 644 645 schema := catalog.MockSchemaAll(4, 2) 646 schema.BlockMaxRows = 21 647 schema.SegmentMaxBlocks = 4 648 cnt := uint32(3) 649 rows := schema.BlockMaxRows 650 bat := catalog.MockBatch(schema, int(rows)) 651 defer bat.Close() 652 bats := bat.Split(int(cnt)) 653 { 654 txn, _ := db.StartTxn(nil) 655 database, _ := txn.CreateDatabase("db", "") 656 rel, _ := database.CreateRelation(schema) 657 err := rel.Append(bats[0]) 658 assert.Nil(t, err) 659 assert.Nil(t, txn.Commit()) 660 } 661 662 testutils.WaitExpect(5000, func() bool { 663 dirty := db.BGCheckpointRunner.GetDirtyCollector().ScanInRangePruned(types.TS{}, types.MaxTs()) 664 return dirty.GetTree().Compact() 665 }) 666 { 667 txn, _ := db.StartTxn(nil) 668 database, _ := txn.GetDatabase("db") 669 rel, _ := database.GetRelationByName(schema.Name) 670 it := rel.MakeBlockIt() 671 for it.Valid() { 672 blk := it.GetBlock() 673 view, _ := blk.GetColumnDataById(3, nil) 674 assert.NotNil(t, view) 675 view.Close() 676 assert.False(t, blk.GetMeta().(*catalog.BlockEntry).IsAppendable()) 677 assert.False(t, blk.GetMeta().(*catalog.BlockEntry).GetBlockData().IsAppendable()) 678 it.Next() 679 } 680 } 681 { 682 txn, _ := db.StartTxn(nil) 683 database, _ := txn.GetDatabase("db") 684 rel, _ := database.GetRelationByName(schema.Name) 685 it := rel.MakeBlockIt() 686 for it.Valid() { 687 blk := it.GetBlock() 688 view, _ := blk.GetColumnDataById(3, nil) 689 assert.NotNil(t, view) 690 view.Close() 691 assert.False(t, blk.GetMeta().(*catalog.BlockEntry).IsAppendable()) 692 assert.False(t, blk.GetMeta().(*catalog.BlockEntry).GetBlockData().IsAppendable()) 693 it.Next() 694 } 695 } 696 } 697 698 // TestCompaction3 is a case for testing block refcount, 699 // which requires modification of the data block to test. 700 /*func TestCompaction3(t *testing.T) { 701 defer testutils.AfterTest(t)() 702 testutils.EnsureNoLeak(t) 703 opts := config.WithQuickScanAndCKPOpts(nil) 704 db := initDB(t, opts) 705 defer db.Close() 706 707 schema := catalog.MockSchemaAll(4, 2) 708 schema.BlockMaxRows = 21 709 schema.SegmentMaxBlocks = 4 710 schema.Name = tables.ForTestBlockRefName 711 cnt := uint32(3) 712 rows := schema.BlockMaxRows / 3 * cnt 713 bat := catalog.MockBatch(schema, int(rows)) 714 defer bat.Close() 715 bats := bat.Split(int(cnt)) 716 { 717 txn, _ := db.StartTxn(nil) 718 database, _ := txn.CreateDatabase("db") 719 rel, _ := database.CreateRelation(schema) 720 err := rel.Append(bats[0]) 721 assert.Nil(t, err) 722 assert.Nil(t, txn.Commit()) 723 } 724 go func() { 725 txn, _ := db.StartTxn(nil) 726 database, _ := txn.GetDatabase("db") 727 rel, _ := database.GetRelationByName(schema.Name) 728 err := rel.Append(bats[1]) 729 assert.Nil(t, err) 730 assert.Nil(t, txn.Commit()) 731 }() 732 { 733 txn, _ := db.StartTxn(nil) 734 database, _ := txn.GetDatabase("db") 735 rel, _ := database.GetRelationByName(schema.Name) 736 it := rel.MakeBlockIt() 737 for it.Valid() { 738 blk := it.GetBlock() 739 view, _ := blk.GetColumnDataById(3, nil) 740 assert.NotNil(t, view) 741 view.Close() 742 assert.True(t, blk.GetMeta().(*catalog.BlockEntry).IsAppendable()) 743 it.Next() 744 } 745 } 746 time.Sleep(400 * time.Millisecond) 747 { 748 txn, _ := db.StartTxn(nil) 749 database, _ := txn.GetDatabase("db") 750 rel, _ := database.GetRelationByName(schema.Name) 751 it := rel.MakeBlockIt() 752 for it.Valid() { 753 blk := it.GetBlock() 754 view, _ := blk.GetColumnDataById(3, nil) 755 assert.NotNil(t, view) 756 view.Close() 757 assert.False(t, blk.GetMeta().(*catalog.BlockEntry).IsAppendable()) 758 assert.False(t, blk.GetMeta().(*catalog.BlockEntry).GetBlockData().IsAppendable()) 759 it.Next() 760 } 761 } 762 }*/