Skip to content

Commit 635b930

Browse files
committed
fixed a minor performance issue
1 parent f5f7443 commit 635b930

File tree

3 files changed

+78
-33
lines changed

3 files changed

+78
-33
lines changed

client/hstest.cpp

Lines changed: 65 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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\t1\t%s\t%s\tPRIMARY\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=\t1\t%d\n", k);
844-
} else if (op == 'U') {
845-
wbuflen = snprintf(wbuf, sizeof(wbuf),
846-
"1\t=\t1\t%d\t1\t0\tU\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=\t1\t\t%d\t0\t@\t0\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=\t1\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=\t1\t%d\t1\t0\tU\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) {

handlersocket/database.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -788,9 +788,6 @@ dbcontext::cmd_find_internal(dbcallback_i& cb, const prep_stmt& pst,
788788
}
789789
hnd->ha_index_or_rnd_end();
790790
hnd->ha_index_init(pst.get_idxnum(), 1);
791-
#if 0
792-
statistic_increment(index_exec_count, &LOCK_status);
793-
#endif
794791
if (need_resp_record) {
795792
cb.dbcb_resp_begin(pst.get_ret_fields().size());
796793
}

handlersocket/hstcpsvr_worker.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#define DBG_FD(x)
2828
#define DBG_TR(x)
2929
#define DBG_EP(x)
30+
#define DBG_MULTI(x)
3031

3132
/* TODO */
3233
#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(MSG_NOSIGNAL)
@@ -40,13 +41,15 @@ struct dbconnstate {
4041
string_buffer writebuf;
4142
std::vector<prep_stmt> prep_stmts;
4243
size_t resp_begin_pos;
44+
size_t find_nl_pos;
4345
void reset() {
4446
readbuf.clear();
4547
writebuf.clear();
4648
prep_stmts.clear();
4749
resp_begin_pos = 0;
50+
find_nl_pos = 0;
4851
}
49-
dbconnstate() : resp_begin_pos(0) { }
52+
dbconnstate() : resp_begin_pos(0), find_nl_pos(0) { }
5053
};
5154

5255
struct hstcpsvr_conn;
@@ -395,6 +398,7 @@ hstcpsvr_worker::run_one_nb()
395398
vshared.shutdown = 1;
396399
} else if (ch == '/') {
397400
conn.cstate.readbuf.clear();
401+
conn.cstate.find_nl_pos = 0;
398402
conn.cstate.writebuf.clear();
399403
conn.read_finished = true;
400404
conn.write_finished = true;
@@ -542,6 +546,7 @@ hstcpsvr_worker::run_one_ep()
542546
vshared.shutdown = 1;
543547
} else if (ch == '/') {
544548
conn->cstate.readbuf.clear();
549+
conn->cstate.find_nl_pos = 0;
545550
conn->cstate.writebuf.clear();
546551
conn->read_finished = true;
547552
conn->write_finished = true;
@@ -649,19 +654,24 @@ hstcpsvr_worker::run_one_ep()
649654
void
650655
hstcpsvr_worker::execute_lines(hstcpsvr_conn& conn)
651656
{
657+
DBG_MULTI(int cnt = 0);
652658
dbconnstate& cstate = conn.cstate;
653659
char *buf_end = cstate.readbuf.end();
654660
char *line_begin = cstate.readbuf.begin();
661+
char *find_pos = line_begin + cstate.find_nl_pos;
655662
while (true) {
656-
char *const nl = memchr_char(line_begin, '\n', buf_end - line_begin);
663+
char *const nl = memchr_char(find_pos, '\n', buf_end - find_pos);
657664
if (nl == 0) {
658665
break;
659666
}
660667
char *const lf = (line_begin != nl && nl[-1] == '\r') ? nl - 1 : nl;
668+
DBG_MULTI(cnt++);
661669
execute_line(line_begin, lf, conn);
662-
line_begin = nl + 1;
670+
find_pos = line_begin = nl + 1;
663671
}
664672
cstate.readbuf.erase_front(line_begin - cstate.readbuf.begin());
673+
cstate.find_nl_pos = cstate.readbuf.size();
674+
DBG_MULTI(fprintf(stderr, "cnt=%d\n", cnt));
665675
}
666676

667677
void

0 commit comments

Comments
 (0)