@@ -47,11 +47,14 @@ SISL_OPTION_GROUP(
4747 (write_pct, " " , " write_pct" , " Write percentage" , ::cxxopts::value< uint32_t >()->default_value(" 50" ), "number"),
4848 (io_size_kb_range, " " , " io_size_kb_range" , " Write size range in kb" , ::cxxopts::value< std::vector< uint32_t > >(),
4949 "number"),
50- (io_size_kb_values, " " , " io_size_kb_values" , " Write size values in kb" , ::cxxopts::value< std::vector< uint32_t > >(),
51- "number"),
52- (io_size_kb_weights, " " , " io_size_kb_weights" , " Write size weights in kb" , ::cxxopts::value< std::vector< uint32_t > >(),
53- "number"),
54- (read_verify, " " , " read_verify" , " Read and verify all data in long running tests" , ::cxxopts::value< bool >()->default_value(" false" ), "true or false"));
50+ (io_size_kb_values, " " , " io_size_kb_values" , " Write size values in kb" ,
51+ ::cxxopts::value< std::vector< uint32_t > >(), "number"),
52+ (io_size_kb_weights, " " , " io_size_kb_weights" , " Write size weights in kb" ,
53+ ::cxxopts::value< std::vector< uint32_t > >(), "number"),
54+ (num_restarts, " " , " num_restarts" , " number of restarts during long running tests" ,
55+ ::cxxopts::value< uint32_t >()->default_value(" 0" ), "number"),
56+ (read_verify, " " , " read_verify" , " Read and verify all data in long running tests" ,
57+ ::cxxopts::value< bool >()->default_value(" false" ), "true or false"));
5558
5659SISL_OPTIONS_ENABLE (logging, test_common_setup, test_volume_io_setup, homeblocks, config)
5760SISL_LOGGING_DECL(test_volume_io)
@@ -429,7 +432,7 @@ class VolumeIOTest : public ::testing::Test {
429432 }
430433
431434 auto generate_random_io (shared< VolumeIOImpl > vol = nullptr , lba_t start_lba = 0 , uint32_t nblks = 0 ,
432- bool wait = true ) {
435+ bool wait = true ) {
433436 auto r_no = get_random_number< uint32_t >(1 , 100 );
434437 if (r_no <= SISL_OPTIONS[" write_pct" ].as < uint32_t >()) {
435438 return generate_write_io (vol, start_lba, nblks, wait);
@@ -578,45 +581,57 @@ TEST_F(VolumeIOTest, MultipleVolumeWriteData) {
578581
579582TEST_F (VolumeIOTest, LongRunningRandomIO) {
580583 auto run_time = SISL_OPTIONS[" run_time" ].as < uint64_t >();
581- LOGINFO (" Long running random read and write on num_vols={} run_time={}" , SISL_OPTIONS[" num_vols" ].as < uint32_t >(),
582- run_time);
584+ auto const num_restarts = SISL_OPTIONS[" num_restarts" ].as < uint32_t >();
585+ LOGINFO (" Long running random read and write on num_vols={} run_time={}, num_restarts={}" ,
586+ SISL_OPTIONS[" num_vols" ].as < uint32_t >(), run_time, num_restarts);
583587
584- uint64_t total_reads{0 }, total_writes{0 };
585- auto start_time = std::chrono::high_resolution_clock::now ();
586- do {
587- std::vector< folly::Future< folly::Unit > > futs;
588+ for (uint32_t restarted_cnt = 0 ; restarted_cnt <= num_restarts; restarted_cnt++) {
589+ uint64_t total_reads{0 }, total_writes{0 };
590+ auto start_time = std::chrono::high_resolution_clock::now ();
591+ do {
592+ std::vector< folly::Future< folly::Unit > > futs;
588593
589- // Generate write's on all volumes with random lba and nblks on all volumes.
590- auto writes = generate_write_io (nullptr /* vol */ , 0 /* start_lba */ , 0 /* nblks */ , false /* wait */ );
594+ // Generate write's on all volumes with random lba and nblks on all volumes.
595+ auto writes = generate_write_io (nullptr /* vol */ , 0 /* start_lba */ , 0 /* nblks */ , false /* wait */ );
591596
592- // In parallel, generate reads on all volumes with random lba and nblks on all volumes.
593- auto reads = generate_read_io (nullptr /* vol */ , 0 /* start_lba */ , 0 /* nblks */ , false /* wait */ );
597+ // In parallel, generate reads on all volumes with random lba and nblks on all volumes.
598+ auto reads = generate_read_io (nullptr /* vol */ , 0 /* start_lba */ , 0 /* nblks */ , false /* wait */ );
594599
595- futs.insert (futs.end (), std::make_move_iterator (writes.begin ()), std::make_move_iterator (writes.end ()));
596- futs.insert (futs.end (), std::make_move_iterator (reads.begin ()), std::make_move_iterator (reads.end ()));
597- folly::collectAll (futs).get ();
600+ futs.insert (futs.end (), std::make_move_iterator (writes.begin ()), std::make_move_iterator (writes.end ()));
601+ futs.insert (futs.end (), std::make_move_iterator (reads.begin ()), std::make_move_iterator (reads.end ()));
602+ folly::collectAll (futs).get ();
598603
599- total_reads += get_total_reads ();
600- total_writes += get_total_writes ();
601- std::chrono::duration< double > elapsed = std::chrono::high_resolution_clock::now () - start_time;
602- auto elapsed_seconds = static_cast < uint64_t >(elapsed.count ());
603- static uint64_t log_pct = 0 ;
604- if (auto done_pct = (run_time > 0 ) ? (elapsed_seconds * 100 ) / run_time : 100 ; done_pct > log_pct) {
605- LOGINFO (" total_read={} total_write={} elapsed={}, done pct={}" , total_reads, total_writes, elapsed_seconds,
606- done_pct);
607- log_pct += 5 ;
608- }
604+ total_reads += get_total_reads ();
605+ total_writes += get_total_writes ();
606+ std::chrono::duration< double > elapsed = std::chrono::high_resolution_clock::now () - start_time;
607+ auto elapsed_seconds = static_cast < uint64_t >(elapsed.count ());
609608
610- if (elapsed_seconds >= run_time) {
611- LOGINFO (" total_read={} total_write={} elapsed={}, done pct=100" , total_reads, total_writes, elapsed_seconds);
612- if (SISL_OPTIONS[" read_verify" ].as < bool >()) {
613- LOGINFO (" Verifying all data written so far" );
614- verify_all_data ();
615- LOGINFO (" Read verification done" );
609+ if (elapsed_seconds > 120 ) {
610+ // log read write count every 2 mins;
611+ LOGINFO (" total_read={} total_write={} elapsed={}" , total_reads, total_writes, elapsed_seconds);
616612 }
617- break ;
618- }
619- } while (true );
613+
614+ static uint64_t log_pct = 0 ;
615+ if (auto done_pct = (run_time > 0 ) ? (elapsed_seconds * 100 ) / run_time : 100 ; done_pct > log_pct) {
616+ LOGINFO (" total_read={} total_write={} elapsed={}, done pct={}" , total_reads, total_writes,
617+ elapsed_seconds, done_pct);
618+ log_pct += 5 ;
619+ }
620+
621+ if (elapsed_seconds >= run_time) {
622+ LOGINFO (" total_read={} total_write={} elapsed={}, done pct=100" , total_reads, total_writes,
623+ elapsed_seconds);
624+ if (SISL_OPTIONS[" read_verify" ].as < bool >()) {
625+ LOGINFO (" Verifying all data written so far" );
626+ verify_all_data ();
627+ LOGINFO (" Read verification done" );
628+ }
629+ break ;
630+ }
631+ } while (true );
632+
633+ restart (5 );
634+ }
620635}
621636
622637TEST_F (VolumeIOTest, LongRunningSequentialIO) {
@@ -657,8 +672,9 @@ TEST_F(VolumeIOTest, LongRunningSequentialIO) {
657672 cur_lba += nblks;
658673 }
659674
660- if (elapsed_seconds >= run_time) {
661- LOGINFO (" total_read={} total_write={} elapsed={}, done pct=100" , total_reads, total_writes, elapsed_seconds);
675+ if (elapsed_seconds >= run_time) {
676+ LOGINFO (" total_read={} total_write={} elapsed={}, done pct=100" , total_reads, total_writes,
677+ elapsed_seconds);
662678 if (SISL_OPTIONS[" read_verify" ].as < bool >()) {
663679 LOGINFO (" Verifying all data written so far" );
664680 verify_all_data ();
@@ -671,12 +687,10 @@ TEST_F(VolumeIOTest, LongRunningSequentialIO) {
671687
672688TEST_F (VolumeIOTest, PerfRandomIo) {
673689 auto run_time = SISL_OPTIONS[" run_time" ].as < uint64_t >();
674- LOGINFO (" Performance random ios on num_vols={} run_time={}" , SISL_OPTIONS[" num_vols" ].as < uint32_t >(),
675- run_time);
690+ LOGINFO (" Performance random ios on num_vols={} run_time={}" , SISL_OPTIONS[" num_vols" ].as < uint32_t >(), run_time);
676691
677692 // create a distribution based on write_pct
678693
679-
680694 auto start_time = std::chrono::high_resolution_clock::now ();
681695 do {
682696 std::vector< folly::Future< folly::Unit > > futs;
@@ -702,8 +716,8 @@ TEST_F(VolumeIOTest, PerfRandomIo) {
702716
703717TEST_F (VolumeIOTest, PerfSequentialIo) {
704718 auto run_time = SISL_OPTIONS[" run_time" ].as < uint64_t >();
705- LOGINFO (" Performance sequential ios on num_vols={} run_time={}" ,
706- SISL_OPTIONS[ " num_vols " ]. as < uint32_t >(), run_time);
719+ LOGINFO (" Performance sequential ios on num_vols={} run_time={}" , SISL_OPTIONS[ " num_vols " ]. as < uint32_t >(),
720+ run_time);
707721
708722 uint64_t volume_size = SISL_OPTIONS[" vol_size_gb" ].as < uint32_t >() * Gi;
709723 auto start_time = std::chrono::high_resolution_clock::now ();
@@ -769,6 +783,7 @@ TEST_F(VolumeIOTest, WriteCrash) {
769783 g_helper->remove_flip (flip);
770784 }
771785
786+ generate_write_io_single (vol, 1000 /* start_lba */ , 100 /* nblks*/ );
772787 LOGINFO (" WriteCrash test done" );
773788}
774789
@@ -814,7 +829,8 @@ int main(int argc, char* argv[]) {
814829 g_http_server = std::make_unique< test_http_server >();
815830 g_http_server->start ();
816831 if (SISL_OPTIONS[" num_io_reactors" ].as < uint32_t >() > 0 ) {
817- g_io_fiber_pool = std::make_shared< test_common::io_fiber_pool >(SISL_OPTIONS[" num_io_reactors" ].as < uint32_t >());
832+ g_io_fiber_pool =
833+ std::make_shared< test_common::io_fiber_pool >(SISL_OPTIONS[" num_io_reactors" ].as < uint32_t >());
818834 }
819835 auto ret = RUN_ALL_TESTS ();
820836 g_helper->teardown ();
0 commit comments