@@ -552,7 +552,8 @@ hstest_thread::test_9(int test_num)
552552 " moreflds_prefix" , " column0123456789_" );
553553 const int use_handler = arg.sh .conf .get_int (" handler" , 0 );
554554 const int sched_flag = arg.sh .conf .get_int (" sched" , 0 );
555- const int ssps = arg.sh .conf .get_int (" ssps" , 0 );
555+ const int use_in = arg.sh .conf .get_int (" in" , 0 );
556+ const int ssps = use_in ? 0 : arg.sh .conf .get_int (" ssps" , 0 );
556557 std::string flds = " v" ;
557558 for (int i = 0 ; i < moreflds; ++i) {
558559 char buf[1024 ];
@@ -561,6 +562,7 @@ hstest_thread::test_9(int test_num)
561562 }
562563 int connected = 0 ;
563564 std::auto_ptr<auto_mysql_stmt> stmt;
565+ string_buffer wbuf;
564566 for (int i = 0 ; i < num; ++i) {
565567 const double tm1 = gettimeofday_double ();
566568 const int flags = 0 ;
@@ -623,6 +625,20 @@ hstest_thread::test_9(int test_num)
623625 // TODO: moreflds
624626 } else if (ssps) {
625627 //
628+ } else if (use_in) {
629+ wbuf.clear ();
630+ char *p = wbuf.make_space (1024 );
631+ int len = snprintf (p, 1024 , " select %s from hstest_table1 where k in ('%d'" , flds.c_str (), k);
632+ wbuf.space_wrote (len);
633+ for (int j = 1 ; j < use_in; ++j) {
634+ /* generate more key */
635+ drand48_r (&randbuf, &kf);
636+ k = int (kf * tablesize);
637+ p = wbuf.make_space (1024 );
638+ int len = snprintf (p, 1024 , " , '%d'" , k);
639+ wbuf.space_wrote (len);
640+ }
641+ wbuf.append_literal (" )" );
626642 } else {
627643 buf_query_len = snprintf (buf_query, sizeof (buf_query),
628644 " select %s from hstest_table1 where k = '%d'" , flds.c_str (), k);
@@ -651,6 +667,8 @@ hstest_thread::test_9(int test_num)
651667 }
652668 r = mysql_stmt_execute (*stmt);
653669 // fprintf(stderr, "stmt exec\n");
670+ } else if (use_in) {
671+ r = mysql_real_query (db, wbuf.begin (), wbuf.size ());
654672 } else {
655673 r = mysql_real_query (db, buf_query, buf_query_len);
656674 // fprintf(stderr, "real query\n");
@@ -694,7 +712,7 @@ hstest_thread::test_9(int test_num)
694712 num_flds = mysql_num_fields (res);
695713 MYSQL_ROW row = 0 ;
696714 while ((row = mysql_fetch_row (res)) != 0 ) {
697- got_data = 1 ;
715+ got_data + = 1 ;
698716 unsigned long *const lengths = mysql_fetch_lengths (res);
699717 if (verbose >= 2 ) {
700718 for (unsigned int i = 0 ; i < num_flds; ++i) {
@@ -706,7 +724,10 @@ hstest_thread::test_9(int test_num)
706724 }
707725 }
708726 } else {
709- got_data = 1 ;
727+ MYSQL_ROW row = 0 ;
728+ while ((row = mysql_fetch_row (res)) != 0 ) {
729+ got_data += 1 ;
730+ }
710731 }
711732 } else {
712733 if (mysql_field_count (db) == 0 ) {
@@ -730,7 +751,7 @@ hstest_thread::test_9(int test_num)
730751 if (err == 0 ) {
731752 ++io_success_count;
732753 if (num_affected_rows > 0 || got_data > 0 ) {
733- ++ op_success_count;
754+ op_success_count += got_data ;
734755 } else {
735756 if (verbose >= 1 ) {
736757 fprintf (stderr, " k=%d numaff=%u gotdata=%d\n " ,
@@ -779,6 +800,7 @@ hstest_thread::test_10(int test_num)
779800 const std::string table = arg.sh .conf .get_str (" table" , " hstest_table1" );
780801 const std::string index = arg.sh .conf .get_str (" index" , " PRIMARY" );
781802 const std::string field = arg.sh .conf .get_str (" field" , " v" );
803+ const int use_in = arg.sh .conf .get_int (" in" , 0 );
782804 const std::string moreflds_prefix = arg.sh .conf .get_str (
783805 " moreflds_prefix" , " column0123456789_" );
784806 const int dump = arg.sh .dump ;
@@ -789,8 +811,8 @@ hstest_thread::test_10(int test_num)
789811 snprintf (sbuf, sizeof (sbuf), " ,%s%d" , moreflds_prefix.c_str (), i);
790812 moreflds_str += std::string (sbuf);
791813 }
792- char wbuf[ 16384 ], rbuf[ 16384 ] ;
793- int wbuflen = 0 ;
814+ string_buffer wbuf;
815+ char rbuf[ 16384 ] ;
794816 for (size_t i = 0 ; i < arg.sh .loop ; ++i) {
795817 int len = 0 , rlen = 0 , wlen = 0 ;
796818 #if 0
@@ -801,15 +823,18 @@ hstest_thread::test_10(int test_num)
801823 fprintf (stderr, " connect: %d %s\n " , errno, strerror (errno));
802824 return ;
803825 }
804- len = snprintf (wbuf, sizeof (wbuf),
826+ char *wp = wbuf.make_space (1024 );
827+ len = snprintf (wp, 1024 ,
805828 " P\t 1\t %s\t %s\t PRIMARY\t %s%s\n " , dbname.c_str (), table.c_str (),
806829 field.c_str (), moreflds_str.c_str ());
807830 /* pst_num, db, table, index, retflds */
808- wlen = write (fd.get (), wbuf, len);
831+ wbuf.space_wrote (len);
832+ wlen = write (fd.get (), wbuf.begin (), len);
809833 if (len != wlen) {
810834 fprintf (stderr, " write: %d %d\n " , len, wlen);
811835 return ;
812836 }
837+ wbuf.clear ();
813838 rlen = read (fd.get (), rbuf, sizeof (rbuf));
814839 if (rlen <= 0 || rbuf[rlen - 1 ] != ' \n ' ) {
815840 fprintf (stderr, " read: rlen=%d errno=%d\n " , rlen, errno);
@@ -824,27 +849,13 @@ hstest_thread::test_10(int test_num)
824849 const double tm1 = gettimeofday_double ();
825850 for (size_t j = 0 ; j < arg.sh .pipe ; ++j) {
826851 int k = 0 , v = 0 ;
827- wbuflen = 0 ;
828852 {
829853 while (true ) {
830854 double kf = 0 , vf = 0 ;
831855 drand48_r (&randbuf, &kf);
832856 drand48_r (&randbuf, &vf);
833857 k = int (kf * tablesize) + firstkey;
834858 v = int (vf * tablesize) + firstkey;
835- // k = rand_r(&seed);
836- // v = rand_r(&seed); /* unused */
837- #if 0
838- if (tablesize != 0) {
839- k &= tablesize;
840- }
841- #endif
842- if (op == ' G' ) {
843- wbuflen = snprintf (wbuf, sizeof (wbuf), " 1\t =\t 1\t %d\n " , k);
844- } else if (op == ' U' ) {
845- wbuflen = snprintf (wbuf, sizeof (wbuf),
846- " 1\t =\t 1\t %d\t 1\t 0\t U\t %d_%d%s\n " , k, v, k, suffix.c_str ());
847- }
848859 if (k - firstkey < arg.sh .keygen_size ) {
849860 volatile char *const ptr = arg.sh .keygen + (k - firstkey);
850861 // int oldv = __sync_fetch_and_or(ptr, 1);
@@ -864,15 +875,42 @@ hstest_thread::test_10(int test_num)
864875 continue ;
865876 }
866877 }
878+ size_t len = 0 ;
879+ if (op == ' G' ) {
880+ if (use_in) {
881+ char *wp = wbuf.make_space (1024 );
882+ len = snprintf (wp, 1024 , " 1\t =\t 1\t\t %d\t 0\t @\t 0\t %d\t %d" ,
883+ use_in, use_in, k);
884+ wbuf.space_wrote (len);
885+ for (int j = 1 ; j < use_in; ++j) {
886+ drand48_r (&randbuf, &kf);
887+ k = int (kf * tablesize) + firstkey;
888+ char *wp = wbuf.make_space (1024 );
889+ len = snprintf (wp, 1024 , " \t %d" , k);
890+ wbuf.space_wrote (len);
891+ }
892+ wbuf.append_literal (" \n " );
893+ } else {
894+ char *wp = wbuf.make_space (1024 );
895+ len = snprintf (wp, 1024 , " 1\t =\t 1\t %d\n " , k);
896+ wbuf.space_wrote (len);
897+ }
898+ } else if (op == ' U' ) {
899+ char *wp = wbuf.make_space (1024 );
900+ len = snprintf (wp, 1024 ,
901+ " 1\t =\t 1\t %d\t 1\t 0\t U\t %d_%d%s\n " , k, v, k, suffix.c_str ());
902+ wbuf.space_wrote (len);
903+ }
867904 break ;
868905 }
869906 }
870- wlen = write (fd.get (), wbuf, wbuflen);
871- if (wlen != wbuflen) {
872- fprintf (stderr, " write: %d %d\n " , wbuflen, wlen);
873- return ;
874- }
875907 }
908+ wlen = write (fd.get (), wbuf.begin (), wbuf.size ());
909+ if (wlen != wbuf.size ()) {
910+ fprintf (stderr, " write: %d %d\n " , (int )wbuf.size (), wlen);
911+ return ;
912+ }
913+ wbuf.clear ();
876914 size_t read_cnt = 0 ;
877915 size_t read_pos = 0 ;
878916 while (read_cnt < arg.sh .pipe ) {
0 commit comments