@@ -449,13 +449,30 @@ void TaskComputeDbSize(const uint64_t duration_ms, std::atomic<int> &db_size, bu
449
449
}
450
450
}
451
451
452
+ void PrintPlan (bustub::BustubInstance &instance, const std::string &query, bool ensure_index_scan = true ) {
453
+ {
454
+ std::stringstream ss;
455
+ bustub::SimpleStreamWriter writer_ss (ss);
456
+ auto *txn = instance.txn_manager_ ->Begin ();
457
+ instance.ExecuteSqlTxn (" EXPLAIN (o) " + query, writer_ss, txn);
458
+ fmt::println (stderr, " > {}\n [PLAN]\n {}" , query, ss.str ());
459
+ if (ensure_index_scan) {
460
+ if (!bustub::StringUtil::Contains (ss.str (), " IndexScan" )) {
461
+ fmt::println (stderr, " ERROR: index scan not found in plan." );
462
+ std::terminate ();
463
+ }
464
+ }
465
+ }
466
+ }
467
+
452
468
// NOLINTNEXTLINE
453
469
auto main (int argc, char **argv) -> int {
454
470
const auto isolation_lvl = bustub::IsolationLevel::SNAPSHOT_ISOLATION;
455
471
argparse::ArgumentParser program (" bustub-terrier-bench" );
456
472
program.add_argument (" --duration" ).help (" run terrier bench for n milliseconds" );
457
473
program.add_argument (" --terriers" ).help (" number of terriers in the bench" );
458
474
program.add_argument (" --threads" ).help (" number of threads in the bench" );
475
+ program.add_argument (" --commit-threshold" ).help (" number of commits to pass the benchmark" );
459
476
program.add_argument (" --bench-1" )
460
477
.default_value (false )
461
478
.implicit_value (true )
@@ -468,6 +485,7 @@ auto main(int argc, char **argv) -> int {
468
485
size_t bustub_terrier_num = 10 ;
469
486
size_t bustub_thread_cnt = 2 ;
470
487
const size_t bpm_size = 4096 ; // ensure benchmark does not hit BPM
488
+ size_t commit_threshold = 100 ;
471
489
472
490
try {
473
491
program.parse_args (argc, argv);
@@ -483,6 +501,10 @@ auto main(int argc, char **argv) -> int {
483
501
bustub_terrier_num = std::stoi (program.get (" --terriers" ));
484
502
}
485
503
504
+ if (program.present (" --commit-threshold" )) {
505
+ commit_threshold = std::stoi (program.get (" --commit-threshold" ));
506
+ }
507
+
486
508
if (program.present (" --threads" )) {
487
509
bustub_thread_cnt = std::stoi (program.get (" --threads" ));
488
510
}
@@ -509,25 +531,25 @@ auto main(int argc, char **argv) -> int {
509
531
fmt::println (stderr, " x: create schema for benchmark #1" );
510
532
bustub->ExecuteSql (schema, writer);
511
533
fmt::println (stderr, " x: please ensure plans are correct for all queries" );
512
- bustub-> ExecuteSql ( " explain (o) UPDATE terriers SET token = token + 1 WHERE terrier = 0" , writer );
513
- bustub-> ExecuteSql ( " explain (o) UPDATE terriers SET token = token - 1 WHERE terrier = 0" , writer );
514
- bustub-> ExecuteSql ( " explain (o) DELETE FROM terriers WHERE terrier = 0" , writer );
515
- bustub-> ExecuteSql ( " explain (o) INSERT INTO terriers VALUES (0, 0)" , writer );
516
- bustub-> ExecuteSql ( " explain (o) SELECT * from terriers" , writer );
534
+ PrintPlan (*bustub, " UPDATE terriers SET token = token + 1 WHERE terrier = 0" );
535
+ PrintPlan (*bustub, " UPDATE terriers SET token = token - 1 WHERE terrier = 0" );
536
+ PrintPlan (*bustub, " DELETE FROM terriers WHERE terrier = 0" );
537
+ PrintPlan (*bustub, " INSERT INTO terriers VALUES (0, 0)" , false );
538
+ PrintPlan (*bustub, " SELECT * from terriers" , false );
517
539
}
518
540
if (bench_2) {
519
541
auto schema = " CREATE TABLE terriers(terrier int PRIMARY KEY, token int, network int);" ;
520
542
fmt::println (stderr, " x: create schema for benchmark #2" );
521
543
bustub->ExecuteSql (schema, writer);
522
544
fmt::println (stderr, " x: please ensure plans are correct for all queries" );
523
- bustub-> ExecuteSql ( " explain (o) UPDATE terriers SET token = token + 1 WHERE terrier = 0" , writer );
524
- bustub-> ExecuteSql ( " explain (o) UPDATE terriers SET token = token - 1 WHERE terrier = 0" , writer );
525
- bustub-> ExecuteSql ( " explain (o) UPDATE terriers SET network = 1, token = token + 1000 WHERE terrier = 0" , writer );
526
- bustub-> ExecuteSql ( " explain (o) UPDATE terriers SET network = 1, token = token - 1000 WHERE terrier = 0" , writer );
527
- bustub-> ExecuteSql ( " explain (o) SELECT network from terriers WHERE terrier = 0" , writer );
528
- bustub-> ExecuteSql ( " explain (o) DELETE FROM terriers WHERE terrier = 0" , writer );
529
- bustub-> ExecuteSql ( " explain (o) INSERT INTO terriers VALUES (0, 0, 0)" , writer );
530
- bustub-> ExecuteSql ( " explain (o) SELECT * from terriers" , writer );
545
+ PrintPlan (*bustub, " UPDATE terriers SET token = token + 1 WHERE terrier = 0" );
546
+ PrintPlan (*bustub, " UPDATE terriers SET token = token - 1 WHERE terrier = 0" );
547
+ PrintPlan (*bustub, " UPDATE terriers SET network = 1, token = token + 1000 WHERE terrier = 0" );
548
+ PrintPlan (*bustub, " UPDATE terriers SET network = 1, token = token - 1000 WHERE terrier = 0" );
549
+ PrintPlan (*bustub, " SELECT network from terriers WHERE terrier = 0" );
550
+ PrintPlan (*bustub, " DELETE FROM terriers WHERE terrier = 0" );
551
+ PrintPlan (*bustub, " INSERT INTO terriers VALUES (0, 0, 0)" , false );
552
+ PrintPlan (*bustub, " SELECT * from terriers" , false );
531
553
}
532
554
533
555
const int initial_token = 10000 ;
@@ -635,13 +657,15 @@ auto main(int argc, char **argv) -> int {
635
657
636
658
total_metrics.Report (db_size);
637
659
638
- if (total_metrics.committed_transfer_txn_cnt_ <= 100 ) {
639
- fmt::println (stderr, " too many txn are aborted" );
660
+ if (total_metrics.committed_transfer_txn_cnt_ <= commit_threshold) {
661
+ fmt::println (stderr, " too many txn are aborted: {} txn committed, expect more than {}" ,
662
+ total_metrics.committed_transfer_txn_cnt_ , commit_threshold);
640
663
exit (1 );
641
664
}
642
665
643
- if (bench_2 && total_metrics.committed_join_txn_cnt_ <= 100 ) {
644
- fmt::println (stderr, " too many txn are aborted" );
666
+ if (bench_2 && total_metrics.committed_join_txn_cnt_ <= commit_threshold) {
667
+ fmt::println (stderr, " too many txn are aborted: {} txn committed, expect more than {}" ,
668
+ total_metrics.committed_join_txn_cnt_ , commit_threshold);
645
669
exit (1 );
646
670
}
647
671
0 commit comments