Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
9503c7e5
Commit
9503c7e5
authored
Dec 02, 2005
by
patg@krsna.patg.net
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
WORKLOG #2983 Post review fixes
parent
094d91fd
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
107 additions
and
198 deletions
+107
-198
client/mysqlslap.c
client/mysqlslap.c
+102
-192
mysql-test/r/mysqlslap.result
mysql-test/r/mysqlslap.result
+5
-6
No files found.
client/mysqlslap.c
View file @
9503c7e5
...
@@ -19,51 +19,62 @@
...
@@ -19,51 +19,62 @@
/*
/*
MySQL Slap
MySQL Slap
A simple program designed to work as if multiple clients querying the database,
A simple program designed to work as if multiple clients querying the database,
then reporting the timing of each stage.
then reporting the timing of each stage.
MySQL slap runs three stages:
MySQL slap runs three stages:
1) Create
Schema
(single client)
1) Create
table
(single client)
2) Insert data (many clients)
2) Insert data (many clients)
3) Load test (many clients)
3) Load test (many clients)
4) Cleanup (disconnection, drop table if specified, single client)
4) Cleanup (disconnection, drop table if specified, single client)
Examples:
Examples:
Supply your own create, insert and query SQL statements, with 5 clients
Supply your own create, insert and query SQL statements, with eight
loading (10 inserts for each), 50 clients querying:
clients loading data (eight inserts for each) and 50 clients querying (200
selects for each):
./mysqlslap --create="CREATE TABLE A (a int)" --data="INSERT INTO A (23)" --iterations=200
mysqlslap --create="CREATE TABLE A (a int)" \
--query="SELECT * FROM A" --number-rows=10 --concurrency=50 --load-concurrency=5
--data="INSERT INTO A (23)" --load-concurrency=8 --number-rows=8 \
--query="SELECT * FROM A" --concurrency=50 --iterations=200 \
--load-concurrency=5
Let the program build create, insert and query SQL statements with a table of
Let the program build create, insert and query SQL statements with a table
two int columns, 3 varchar columns, with 5 clients loading data
of two int columns, three varchar columns, with five clients loading data
(12 inserts each), 5 clients querying, drop schema before creating:
(12 inserts each), five clients querying (20 times each), and drop schema
before creating:
./mysqlslap --concurrency=5 --concurrency-load=5 --iterations=20 --number-int-cols=2 --number-char-cols=3 --number-rows=12 --auto-generate-sql
mysqlslap --concurrency=5 --concurrency-load=5 --iterations=20 \
--number-int-cols=2 --number-char-cols=3 --number-rows=12 \
--auto-generate-sql
Let the program build the query SQL statement with a table of
Let the program build the query SQL statement with a table of two int
two int columns, 3 varchar columns, 5 clients querying, don't
columns, three varchar columns, five clients querying (20 times each),
create the table or insert the data (using the previous test's schema
don't create the table or insert the data (using the previous test's
and data)
schema and data):
./mysqlslap --concurrency=5 --iterations=20 --number-int-cols=2 --number-char-cols=3 --number-rows=12 --auto-generate-sql --skip-data-load --skip-create-schema
mysqlslap --concurrency=5 --iterations=20 \
--number-int-cols=2 --number-char-cols=3 \
--number-rows=12 --auto-generate-sql \
--skip-data-load --skip-create-schema
Tell the program to load the create, insert and query SQL statements
Tell the program to load the create, insert and query SQL statements from
from the specified files which
the create.sql file has multiple table creation
the specified files, where
the create.sql file has multiple table creation
statements delimited by ';', multiple insert statements delimited by ';',
statements delimited by ';', multiple insert statements delimited by ';',
and multiple queries delimited by ';', run all the load statements with 5
and multiple queries delimited by ';', run all the load statements with
clients, 5 times per client, and run all the queries in the query file with
five clients (five times each), and run all the queries in the query file
5 clients
:
with five clients (five times each)
:
/mysqlslap --drop-schema --concurrency=5 --concurrency-load=5 --iterations=5 --query=query.sql --create=create.sql --data=insert.sql --delimiter=";" --number-rows=5
mysqlslap --drop-schema --concurrency=5 --concurrency-load=5 \
--iterations=5 --query=query.sql --create=create.sql \
--data=insert.sql --delimiter=";" --number-rows=5
Same as the last test run, with short options
Same as the last test run, with short options
./mysqlslap -D -c 5 -l 5 -i 5 -q query.sql --create create.sql -d insert.sql -F ";" -n 5
mysqlslap -D -c 5 -l 5 -i 5 -q query.sql \
--create create.sql -d insert.sql -F ";" -n 5
*/
*/
#define SHOW_VERSION "0.1"
#define SHOW_VERSION "0.1"
...
@@ -88,7 +99,6 @@ Same as the last test run, with short options
...
@@ -88,7 +99,6 @@ Same as the last test run, with short options
static
int
drop_schema
(
MYSQL
*
mysql
,
const
char
*
db
);
static
int
drop_schema
(
MYSQL
*
mysql
,
const
char
*
db
);
unsigned
int
get_random_number
(
void
);
unsigned
int
get_random_string
(
char
*
buf
);
unsigned
int
get_random_string
(
char
*
buf
);
static
int
build_table_string
(
void
);
static
int
build_table_string
(
void
);
static
int
build_insert_string
(
void
);
static
int
build_insert_string
(
void
);
...
@@ -98,20 +108,21 @@ static int run_scheduler(const char *script, int(*task)(const char *),
...
@@ -98,20 +108,21 @@ static int run_scheduler(const char *script, int(*task)(const char *),
unsigned
int
concur
);
unsigned
int
concur
);
int
run_task
(
const
char
*
script
);
int
run_task
(
const
char
*
script
);
int
load_data
(
const
char
*
script
);
int
load_data
(
const
char
*
script
);
static
char
**
defaults_argv
;
static
char
*
host
=
NULL
,
*
opt_password
=
NULL
,
*
user
=
NULL
,
static
char
*
host
=
NULL
,
*
opt_password
=
NULL
,
*
user
=
NULL
,
*
user_supplied_query
=
NULL
,
*
user_supplied_data
=
NULL
,
*
user_supplied_query
=
NULL
,
*
user_supplied_data
=
NULL
,
*
create_string
=
NULL
,
*
default_engine
=
NULL
,
*
delimiter
=
NULL
,
*
create_string
=
NULL
,
*
default_engine
=
NULL
,
*
delimiter
=
NULL
,
*
opt_mysql_unix_port
=
NULL
;
*
opt_mysql_unix_port
=
NULL
;
static
my_bool
opt_compress
=
FALSE
,
opt_count
=
FALSE
,
tty_password
=
FALSE
,
static
my_bool
opt_compress
=
FALSE
,
tty_password
=
FALSE
,
opt_drop
=
FALSE
,
create_string_alloced
=
FALSE
,
opt_drop
=
FALSE
,
create_string_alloced
=
FALSE
,
insert_string_alloced
=
FALSE
,
query_string_alloced
=
FALSE
,
insert_string_alloced
=
FALSE
,
query_string_alloced
=
FALSE
,
generated_insert_flag
=
FALSE
,
opt_silent
=
FALSE
,
generated_insert_flag
=
FALSE
,
opt_silent
=
FALSE
,
auto_generate_sql
=
FALSE
,
opt_skip_create
=
FALSE
,
auto_generate_sql
=
FALSE
,
opt_skip_create
=
FALSE
,
opt_skip_data_load
=
FALSE
,
opt_skip_query
=
FALSE
;
opt_skip_data_load
=
FALSE
,
opt_skip_query
=
FALSE
;
static
int
verbose
=
0
,
num_int_cols
=
-
1
,
num_char_cols
=-
1
,
delimiter_length
=
0
;
static
int
verbose
=
0
,
num_int_cols
=
0
,
num_char_cols
=
0
,
delimiter_length
=
0
;
static
char
*
default_charset
=
(
char
*
)
MYSQL_DEFAULT_CHARSET_NAME
;
static
char
*
default_charset
=
(
char
*
)
MYSQL_DEFAULT_CHARSET_NAME
;
static
unsigned
int
number_of_rows
=
1000
,
number_of_iterations
=
1000
,
static
unsigned
int
number_of_rows
=
1000
,
number_of_iterations
=
1000
,
concurrency
=
1
,
concurrency_load
=
1
,
children_spawned
=
1
;
concurrency
=
1
,
concurrency_load
=
1
,
children_spawned
=
1
;
...
@@ -120,30 +131,31 @@ const char *default_dbug_option="d:t:o,/tmp/mysqlslap.trace";
...
@@ -120,30 +131,31 @@ const char *default_dbug_option="d:t:o,/tmp/mysqlslap.trace";
static
uint
opt_protocol
=
0
;
static
uint
opt_protocol
=
0
;
static
void
get_options
(
int
*
argc
,
char
***
argv
);
static
int
get_options
(
int
*
argc
,
char
***
argv
);
static
uint
opt_mysql_port
=
0
;
static
uint
opt_mysql_port
=
0
;
static
const
char
*
load_default_groups
[]
=
{
"mysqlslap"
,
"client"
,
0
};
static
const
char
*
load_default_groups
[]
=
{
"mysqlslap"
,
"client"
,
0
};
#if ELEGANT_SOLUTION
static
const
char
ALPHANUMERICS
[]
=
static
const
char
ALPHANUMERICS
[]
=
"0123456789ABCDEFGHIJKLMNOPQRSTWXYZabcdefghijklmnopqrstuvwxyz"
;
"0123456789ABCDEFGHIJKLMNOPQRSTWXYZabcdefghijklmnopqrstuvwxyz"
;
static
const
ALPHANUMERICS_SIZE
=
(
sizeof
(
ALPHANUMERICS
)
-
1
);
#define ALPHANUMERICS_SIZE (sizeof(ALPHANUMERICS)-1)
#endif
/* returns the time in ms between two timevals */
/* Return the time in ms between two timevals */
static
double
timedif
(
struct
timeval
end
,
struct
timeval
begin
)
static
double
timedif
(
struct
timeval
end
,
struct
timeval
begin
)
{
{
double
seconds
;
double
seconds
;
DBUG_ENTER
(
"timedif"
);
DBUG_ENTER
(
"timedif"
);
seconds
=
(
double
)(
end
.
tv_usec
-
begin
.
tv_usec
)
/
1000000
;
seconds
=
(
double
)(
end
.
tv_usec
-
begin
.
tv_usec
)
/
1000000
;
DBUG_PRINT
(
"info"
,
(
"end.tv_usec %d - begin.tv_usec %d = %d microseconds ( fseconds %f)"
,
DBUG_PRINT
(
"info"
,
(
"end.tv_usec %d - begin.tv_usec %d = "
"%d microseconds ( fseconds %f)"
,
end
.
tv_usec
,
begin
.
tv_usec
,
end
.
tv_usec
,
begin
.
tv_usec
,
(
end
.
tv_usec
-
begin
.
tv_usec
),
(
end
.
tv_usec
-
begin
.
tv_usec
),
seconds
));
seconds
));
seconds
+=
(
double
)(
end
.
tv_sec
-
begin
.
tv_sec
);
seconds
+=
(
double
)(
end
.
tv_sec
-
begin
.
tv_sec
);
DBUG_PRINT
(
"info"
,
(
"end.tv_sec %d - begin.tv_sec %d = %d seconds (fseconds %f)"
,
DBUG_PRINT
(
"info"
,
(
"end.tv_sec %d - begin.tv_sec %d = "
"%d seconds (fseconds %f)"
,
end
.
tv_sec
,
begin
.
tv_sec
,
end
.
tv_sec
,
begin
.
tv_sec
,
(
end
.
tv_sec
-
begin
.
tv_sec
),
seconds
));
(
end
.
tv_sec
-
begin
.
tv_sec
),
seconds
));
...
@@ -154,64 +166,36 @@ static double timedif(struct timeval end, struct timeval begin)
...
@@ -154,64 +166,36 @@ static double timedif(struct timeval end, struct timeval begin)
int
main
(
int
argc
,
char
**
argv
)
int
main
(
int
argc
,
char
**
argv
)
{
{
my_bool
first_argument_uses_wildcards
=
0
;
char
*
wild
;
MYSQL
mysql
;
MYSQL
mysql
;
int
client_flag
=
0
;
int
client_flag
=
0
;
double
time_difference
;
double
time_difference
;
struct
timeval
tmp_time
,
start_time
,
load_time
,
run_time
;
struct
timeval
start_time
,
load_time
,
run_time
;
/* for the string generation later */
DBUG_ENTER
(
"main"
);
DBUG_ENTER
(
"main"
);
MY_INIT
(
argv
[
0
]);
MY_INIT
(
argv
[
0
]);
/*
for any string generation later on
*/
/*
Seed the random number generator if we will be using it.
*/
if
(
auto_generate_sql
)
if
(
auto_generate_sql
)
srandom
((
unsigned
int
)
tmp_time
.
tv_usec
);
srandom
((
unsigned
int
)
time
(
NULL
)
);
bzero
(
&
load_time
,
sizeof
(
struct
timeval
));
bzero
(
&
run_time
,
sizeof
(
struct
timeval
));
load_defaults
(
"my"
,
load_default_groups
,
&
argc
,
&
argv
);
load_defaults
(
"my"
,
load_default_groups
,
&
argc
,
&
argv
);
get_options
(
&
argc
,
&
argv
);
defaults_argv
=
argv
;
if
(
get_options
(
&
argc
,
&
argv
))
{
free_defaults
(
defaults_argv
);
my_end
(
0
);
exit
(
1
);
}
;
/* globals? Yes, so we only have to run strlen once */
/* globals? Yes, so we only have to run strlen once */
if
(
delimiter
)
if
(
delimiter
)
delimiter_length
=
strlen
(
delimiter
);
delimiter_length
=
strlen
(
delimiter
);
wild
=
0
;
if
(
argc
)
{
char
*
pos
=
argv
[
argc
-
1
],
*
to
;
for
(
to
=
pos
;
*
pos
;
pos
++
,
to
++
)
{
switch
(
*
pos
)
{
case
'*'
:
*
pos
=
'%'
;
first_argument_uses_wildcards
=
1
;
break
;
case
'?'
:
*
pos
=
'_'
;
first_argument_uses_wildcards
=
1
;
break
;
case
'%'
:
case
'_'
:
first_argument_uses_wildcards
=
1
;
break
;
case
'\\'
:
pos
++
;
default:
break
;
}
*
to
=
*
pos
;
}
*
to
=
*
pos
;
/* just to copy a '\0' if '\\' was used */
}
if
(
first_argument_uses_wildcards
)
wild
=
argv
[
--
argc
];
else
if
(
argc
==
3
)
/* We only want one field */
wild
=
argv
[
--
argc
];
if
(
argc
>
2
)
if
(
argc
>
2
)
{
{
fprintf
(
stderr
,
"%s: Too many arguments
\n
"
,
my_progname
);
fprintf
(
stderr
,
"%s: Too many arguments
\n
"
,
my_progname
);
free_defaults
(
defaults_argv
);
my_end
(
0
);
exit
(
1
);
exit
(
1
);
}
}
mysql_init
(
&
mysql
);
mysql_init
(
&
mysql
);
...
@@ -232,18 +216,19 @@ int main(int argc, char **argv)
...
@@ -232,18 +216,19 @@ int main(int argc, char **argv)
client_flag
|=
CLIENT_MULTI_RESULTS
;
client_flag
|=
CLIENT_MULTI_RESULTS
;
if
(
!
(
mysql_real_connect
(
&
mysql
,
host
,
user
,
opt_password
,
if
(
!
(
mysql_real_connect
(
&
mysql
,
host
,
user
,
opt_password
,
(
first_argument_uses_wildcards
)
?
""
:
argv
[
0
],
opt_mysql_port
,
opt_mysql_unix_port
,
argv
[
0
],
opt_mysql_port
,
opt_mysql_unix_port
,
client_flag
)))
client_flag
)))
{
{
fprintf
(
stderr
,
"%s: %s
\n
"
,
my_progname
,
mysql_error
(
&
mysql
));
fprintf
(
stderr
,
"%s: %s
\n
"
,
my_progname
,
mysql_error
(
&
mysql
));
free_defaults
(
defaults_argv
);
my_end
(
0
);
exit
(
1
);
exit
(
1
);
}
}
/*
/*
we might not want to load any data, if for instance
we are calling
We might not want to load any data, such as when
we are calling
a stored_procedure that doesn't use data, or we know we already have
a stored_procedure that doesn't use data, or we know we already have
data in the table
data in the table
.
*/
*/
if
(
opt_drop
)
if
(
opt_drop
)
drop_schema
(
&
mysql
,
"mysqlslap"
);
drop_schema
(
&
mysql
,
"mysqlslap"
);
...
@@ -297,6 +282,7 @@ int main(int argc, char **argv)
...
@@ -297,6 +282,7 @@ int main(int argc, char **argv)
if
(
shared_memory_base_name
)
if
(
shared_memory_base_name
)
my_free
(
shared_memory_base_name
,
MYF
(
MY_ALLOW_ZERO_PTR
));
my_free
(
shared_memory_base_name
,
MYF
(
MY_ALLOW_ZERO_PTR
));
#endif
#endif
free_defaults
(
defaults_argv
);
my_end
(
0
);
my_end
(
0
);
DBUG_RETURN
(
0
);
/* No compiler warnings */
DBUG_RETURN
(
0
);
/* No compiler warnings */
...
@@ -304,34 +290,37 @@ int main(int argc, char **argv)
...
@@ -304,34 +290,37 @@ int main(int argc, char **argv)
static
struct
my_option
my_long_options
[]
=
static
struct
my_option
my_long_options
[]
=
{
{
{
"auto-generate-sql"
,
'a'
,
"Generate SQL where not supplied by file or command line."
,
{
"auto-generate-sql"
,
'a'
,
"Generate SQL where not supplied by file or command line."
,
(
gptr
*
)
&
auto_generate_sql
,
(
gptr
*
)
&
auto_generate_sql
,
(
gptr
*
)
&
auto_generate_sql
,
(
gptr
*
)
&
auto_generate_sql
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"compress"
,
'C'
,
"Use compression in server/client protocol."
,
{
"compress"
,
'C'
,
"Use compression in server/client protocol."
,
(
gptr
*
)
&
opt_compress
,
(
gptr
*
)
&
opt_compress
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
(
gptr
*
)
&
opt_compress
,
(
gptr
*
)
&
opt_compress
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
0
,
0
,
0
},
{
"concurrency-load"
,
'l'
,
"Number of clients to
simulate for data load
."
,
{
"concurrency-load"
,
'l'
,
"Number of clients to
use when loading data
."
,
(
gptr
*
)
&
concurrency_load
,
(
gptr
*
)
&
concurrency_load
,
0
,
(
gptr
*
)
&
concurrency_load
,
(
gptr
*
)
&
concurrency_load
,
0
,
GET_UINT
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
GET_UINT
,
REQUIRED_ARG
,
1
,
0
,
0
,
0
,
0
,
0
},
{
"concurrency"
,
'c'
,
"Number of clients to simulate for query to run."
,
{
"concurrency"
,
'c'
,
"Number of clients to simulate for query to run."
,
(
gptr
*
)
&
concurrency
,
(
gptr
*
)
&
concurrency
,
0
,
GET_UINT
,
(
gptr
*
)
&
concurrency
,
(
gptr
*
)
&
concurrency
,
0
,
GET_UINT
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
REQUIRED_ARG
,
1
,
0
,
0
,
0
,
0
,
0
},
{
"create"
,
OPT_CREATE_SLAP_SCHEMA
,
"File or string to use for create."
,
{
"create"
,
OPT_CREATE_SLAP_SCHEMA
,
"File or string to use for create."
,
(
gptr
*
)
&
create_string
,
(
gptr
*
)
&
create_string
,
0
,
GET_STR
,
REQUIRED_ARG
,
(
gptr
*
)
&
create_string
,
(
gptr
*
)
&
create_string
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
0
,
0
,
0
,
0
,
0
,
0
},
{
"data"
,
'd'
,
{
"data"
,
'd'
,
"File or string with INSERT to use for populating
table(s)
."
,
"File or string with INSERT to use for populating
data
."
,
(
gptr
*
)
&
user_supplied_data
,
(
gptr
*
)
&
user_supplied_data
,
0
,
(
gptr
*
)
&
user_supplied_data
,
(
gptr
*
)
&
user_supplied_data
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"debug"
,
'#'
,
"Output debug log. Often this is 'd:t:o,filename'."
,
{
"debug"
,
'#'
,
"Output debug log. Often this is 'd:t:o,filename'."
,
(
gptr
*
)
&
default_dbug_option
,
(
gptr
*
)
&
default_dbug_option
,
0
,
GET_STR
,
(
gptr
*
)
&
default_dbug_option
,
(
gptr
*
)
&
default_dbug_option
,
0
,
GET_STR
,
OPT_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
OPT_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"delimiter"
,
'F'
,
"Delimiter to use in SQL statements supplied in file or command line."
,
{
"delimiter"
,
'F'
,
"Delimiter to use in SQL statements supplied in file or command line."
,
(
gptr
*
)
&
delimiter
,
(
gptr
*
)
&
delimiter
,
0
,
GET_STR
,
REQUIRED_ARG
,
(
gptr
*
)
&
delimiter
,
(
gptr
*
)
&
delimiter
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
0
,
0
,
0
,
0
,
0
,
0
},
{
"drop-schema"
,
'D'
,
{
"drop-schema"
,
'D'
,
"Drop schema if it exists prior to running, and after running"
,
"Drop schema if it exists prior to running and after running."
,
(
gptr
*
)
&
opt_drop
,
(
gptr
*
)
&
opt_drop
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
(
gptr
*
)
&
opt_drop
,
(
gptr
*
)
&
opt_drop
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"engine"
,
'e'
,
"Storage engine to use for creating the table."
,
{
"engine"
,
'e'
,
"Storage engine to use for creating the table."
,
(
gptr
*
)
&
default_engine
,
(
gptr
*
)
&
default_engine
,
0
,
(
gptr
*
)
&
default_engine
,
(
gptr
*
)
&
default_engine
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
...
@@ -340,7 +329,8 @@ static struct my_option my_long_options[] =
...
@@ -340,7 +329,8 @@ static struct my_option my_long_options[] =
{
"host"
,
'h'
,
"Connect to host."
,
(
gptr
*
)
&
host
,
(
gptr
*
)
&
host
,
0
,
GET_STR
,
{
"host"
,
'h'
,
"Connect to host."
,
(
gptr
*
)
&
host
,
(
gptr
*
)
&
host
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"iterations"
,
'i'
,
"Number of iterations."
,
(
gptr
*
)
&
number_of_iterations
,
{
"iterations"
,
'i'
,
"Number of iterations."
,
(
gptr
*
)
&
number_of_iterations
,
(
gptr
*
)
&
number_of_iterations
,
0
,
GET_UINT
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
(
gptr
*
)
&
number_of_iterations
,
0
,
GET_UINT
,
REQUIRED_ARG
,
1000
,
0
,
0
,
0
,
0
,
0
},
{
"number-char-cols"
,
'x'
,
"Number of INT columns to create table with if specifying --sql-generate-sql."
,
{
"number-char-cols"
,
'x'
,
"Number of INT columns to create table with if specifying --sql-generate-sql."
,
(
gptr
*
)
&
num_char_cols
,
(
gptr
*
)
&
num_char_cols
,
0
,
GET_UINT
,
REQUIRED_ARG
,
(
gptr
*
)
&
num_char_cols
,
(
gptr
*
)
&
num_char_cols
,
0
,
GET_UINT
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
0
,
0
,
0
,
0
,
0
,
0
},
...
@@ -417,7 +407,7 @@ static void usage(void)
...
@@ -417,7 +407,7 @@ static void usage(void)
\n
and you are welcome to modify and redistribute it under the GPL \
\n
and you are welcome to modify and redistribute it under the GPL \
license
\n
"
);
license
\n
"
);
puts
(
"Run a query multiple times against the server
\n
"
);
puts
(
"Run a query multiple times against the server
\n
"
);
printf
(
"Usage: %s [OPTIONS]
[database [table [column]]]
\n
"
,
my_progname
);
printf
(
"Usage: %s [OPTIONS]
\n
"
,
my_progname
);
print_defaults
(
"my"
,
load_default_groups
);
print_defaults
(
"my"
,
load_default_groups
);
my_print_help
(
my_long_options
);
my_print_help
(
my_long_options
);
}
}
...
@@ -482,81 +472,20 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
...
@@ -482,81 +472,20 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
}
}
/*
get_random_number()
returns a random number to be used in building an sql statement
*/
unsigned
int
get_random_number
(
void
)
{
int
num
;
char
rstate
[
8
];
struct
timeval
timestruct
;
DBUG_ENTER
(
"get_random_number"
);
gettimeofday
(
&
timestruct
,
NULL
);
initstate
(
timestruct
.
tv_usec
,
rstate
,
sizeof
(
rstate
));
setstate
(
rstate
);
num
=
random
();
DBUG_RETURN
(
num
);
}
unsigned
int
unsigned
int
get_random_string
(
char
*
buf
)
get_random_string
(
char
*
buf
)
{
{
char
*
buf_ptr
=
buf
;
char
*
buf_ptr
=
buf
;
int
x
,
chr
=
0
;
int
x
;
DBUG_ENTER
(
"get_random_string"
);
DBUG_ENTER
(
"get_random_string"
);
for
(
x
=
RAND_STRING_SIZE
;
x
>
0
;
x
--
)
for
(
x
=
RAND_STRING_SIZE
;
x
>
0
;
x
--
)
{
*
buf_ptr
++=
ALPHANUMERICS
[
random
()
%
ALPHANUMERICS_SIZE
];
/*
DBUG_PRINT
(
"info"
,
(
"random string: '%*s'"
,
buf_ptr
-
buf
,
buf
));
why this tmp_num? Because for some reason, x's value gets
DBUG_RETURN
(
buf_ptr
-
buf
);
munged during call of random()
*/
int
tmp_num
=
x
;
chr
=
random
()
%
tmp_num
;
/*
avoiding problematic chars for insert
*/
if
(
chr
>=
48
&&
chr
<=
122
&&
chr
!=
96
&&
chr
!=
92
)
*
buf_ptr
++=
chr
;
}
/*
strlen
*/
DBUG_RETURN
(
buf_ptr
-
buf
);
}
}
#if ELEGANT_SOLUTION
/*
I would like to use this, but for some reason, subsequent calls to
this function result in buf having non-alpha characters added beyond it's
size, which in turn corrupt the insert string.
*/
unsigned
int
get_random_string
(
char
*
buf
)
{
char
*
buf_ptr
=
buf
;
int
x
=
RAND_STRING_SIZE
;
DBUG_ENTER
(
"get_random_string"
);
DBUG_PRINT
(
"info"
,
(
"RANDOM STRING buf %s length %d"
,
buf
,
buf_ptr
-
buf
));
while
(
x
--
)
{
int
tmp_x
=
x
;
*
buf_ptr
++=
ALPHANUMERICS
[
random
()
%
ALPHANUMERICS_SIZE
];
x
=
tmp_x
;
//fprintf(stderr, "get_random_string %s %lx x %d\n", buf_ptr, buf_ptr,
//tmp_x);
}
DBUG_PRINT
(
"info"
,
(
"RANDOM STRING buf %s length %d"
,
buf
,
buf_ptr
-
buf
));
/* strlen */
DBUG_RETURN
(
buf_ptr
-
buf
);
}
#endif
/*
/*
build_table_string
build_table_string
...
@@ -618,16 +547,14 @@ build_insert_string(void)
...
@@ -618,16 +547,14 @@ build_insert_string(void)
char
buf
[
RAND_STRING_SIZE
];
char
buf
[
RAND_STRING_SIZE
];
int
col_count
;
int
col_count
;
DYNAMIC_STRING
insert_string
;
DYNAMIC_STRING
insert_string
;
MYSQL
mysql
;
DBUG_ENTER
(
"build_insert_string"
);
DBUG_ENTER
(
"build_insert_string"
);
mysql_init
(
&
mysql
);
init_dynamic_string
(
&
insert_string
,
""
,
1024
,
1024
);
init_dynamic_string
(
&
insert_string
,
""
,
1024
,
1024
);
dynstr_append_mem
(
&
insert_string
,
"INSERT INTO t1 VALUES ("
,
23
);
dynstr_append_mem
(
&
insert_string
,
"INSERT INTO t1 VALUES ("
,
23
);
for
(
col_count
=
1
;
col_count
<=
num_int_cols
;
col_count
++
)
for
(
col_count
=
1
;
col_count
<=
num_int_cols
;
col_count
++
)
{
{
sprintf
(
buf
,
"%
d"
,
get_random_number
());
sprintf
(
buf
,
"%
ld"
,
random
());
dynstr_append
(
&
insert_string
,
buf
);
dynstr_append
(
&
insert_string
,
buf
);
if
(
col_count
<
num_int_cols
||
num_char_cols
>
0
)
if
(
col_count
<
num_int_cols
||
num_char_cols
>
0
)
...
@@ -635,18 +562,13 @@ build_insert_string(void)
...
@@ -635,18 +562,13 @@ build_insert_string(void)
}
}
for
(
col_count
=
1
;
col_count
<=
num_char_cols
;
col_count
++
)
for
(
col_count
=
1
;
col_count
<=
num_char_cols
;
col_count
++
)
{
{
char
*
buf_tmp
=
(
char
*
)
my_malloc
(
RAND_STRING_SIZE
,
MYF
(
MY_WME
));
int
buf_len
=
get_random_string
(
buf
);
int
buf_len
;
buf_len
=
get_random_string
((
char
*
)
&
buf
);
mysql_real_escape_string
(
&
mysql
,
buf_tmp
,
(
char
*
)
&
buf
,
buf_len
);
dynstr_append_mem
(
&
insert_string
,
"'"
,
1
);
dynstr_append_mem
(
&
insert_string
,
"'"
,
1
);
dynstr_append_mem
(
&
insert_string
,
buf
_tmp
,
buf_len
);
dynstr_append_mem
(
&
insert_string
,
buf
,
buf_len
);
dynstr_append_mem
(
&
insert_string
,
"'"
,
1
);
dynstr_append_mem
(
&
insert_string
,
"'"
,
1
);
my_free
(
buf_tmp
,
MYF
(
0
));
if
(
col_count
<
num_char_cols
)
if
(
col_count
<
num_char_cols
)
dynstr_append_mem
(
&
insert_string
,
","
,
1
);
dynstr_append_mem
(
&
insert_string
,
","
,
1
);
}
}
dynstr_append_mem
(
&
insert_string
,
")"
,
1
);
dynstr_append_mem
(
&
insert_string
,
")"
,
1
);
...
@@ -661,7 +583,6 @@ build_insert_string(void)
...
@@ -661,7 +583,6 @@ build_insert_string(void)
strmov
(
user_supplied_data
,
insert_string
.
str
);
strmov
(
user_supplied_data
,
insert_string
.
str
);
DBUG_PRINT
(
"info"
,
(
"generated_insert_data %s"
,
user_supplied_data
));
DBUG_PRINT
(
"info"
,
(
"generated_insert_data %s"
,
user_supplied_data
));
dynstr_free
(
&
insert_string
);
dynstr_free
(
&
insert_string
);
mysql_close
(
&
mysql
);
DBUG_RETURN
(
insert_string
.
length
+
1
);
DBUG_RETURN
(
insert_string
.
length
+
1
);
}
}
...
@@ -709,7 +630,7 @@ build_query_string(void)
...
@@ -709,7 +630,7 @@ build_query_string(void)
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
}
}
static
void
static
int
get_options
(
int
*
argc
,
char
***
argv
)
get_options
(
int
*
argc
,
char
***
argv
)
{
{
int
ho_error
;
int
ho_error
;
...
@@ -862,15 +783,7 @@ get_options(int *argc,char ***argv)
...
@@ -862,15 +783,7 @@ get_options(int *argc,char ***argv)
if
(
tty_password
)
if
(
tty_password
)
opt_password
=
get_tty_password
(
NullS
);
opt_password
=
get_tty_password
(
NullS
);
if
(
opt_count
)
DBUG_RETURN
(
0
);
{
/*
We need to set verbose to 2 as we need to change the output to include
the number-of-rows column
*/
verbose
=
2
;
}
DBUG_VOID_RETURN
;
}
}
...
@@ -914,9 +827,9 @@ create_schema(MYSQL *mysql,const char *db,const char *script)
...
@@ -914,9 +827,9 @@ create_schema(MYSQL *mysql,const char *db,const char *script)
char
*
retstr
;
char
*
retstr
;
char
buf
[
HUGE_STRING_LENGTH
];
char
buf
[
HUGE_STRING_LENGTH
];
while
((
retstr
=
strstr
(
script
,
delimiter
)))
while
((
retstr
=
strstr
(
script
,
delimiter
)))
{
{
strncpy
(
(
char
*
)
&
buf
,
script
,
retstr
-
script
);
strncpy
(
buf
,
script
,
retstr
-
script
);
buf
[
retstr
-
script
]
=
'\0'
;
buf
[
retstr
-
script
]
=
'\0'
;
script
+=
retstr
-
script
+
delimiter_length
;
script
+=
retstr
-
script
+
delimiter_length
;
DBUG_PRINT
(
"info"
,
(
"running create QUERY %s"
,
(
char
*
)
buf
));
DBUG_PRINT
(
"info"
,
(
"running create QUERY %s"
,
(
char
*
)
buf
));
...
@@ -969,9 +882,7 @@ run_scheduler(const char *script,
...
@@ -969,9 +882,7 @@ run_scheduler(const char *script,
uint
x
;
uint
x
;
DBUG_ENTER
(
"run_scheduler"
);
DBUG_ENTER
(
"run_scheduler"
);
/*
/* reset to 0 */
reset to 0
*/
children_spawned
=
0
;
children_spawned
=
0
;
for
(
x
=
0
;
x
<
concur
;
x
++
)
for
(
x
=
0
;
x
<
concur
;
x
++
)
...
@@ -1055,11 +966,11 @@ run_task(const char *script)
...
@@ -1055,11 +966,11 @@ run_task(const char *script)
while
((
retstr
=
strstr
(
script
,
delimiter
)))
while
((
retstr
=
strstr
(
script
,
delimiter
)))
{
{
strncpy
(
(
char
*
)
&
buf
,
script
,
retstr
-
script
);
strncpy
(
buf
,
script
,
retstr
-
script
);
buf
[
retstr
-
script
]
=
'\0'
;
buf
[
retstr
-
script
]
=
'\0'
;
script
+=
retstr
-
script
+
delimiter_length
;
script
+=
retstr
-
script
+
delimiter_length
;
DBUG_PRINT
(
"info"
,
(
"running QUERY %s"
,
(
char
*
)
buf
));
DBUG_PRINT
(
"info"
,
(
"running QUERY %s"
,
buf
));
if
(
mysql_query
(
&
mysql
,
(
char
*
)
buf
))
if
(
mysql_query
(
&
mysql
,
buf
))
{
{
fprintf
(
stderr
,
"%s: Cannot run query %s ERROR : %s
\n
"
,
fprintf
(
stderr
,
"%s: Cannot run query %s ERROR : %s
\n
"
,
my_progname
,
buf
,
mysql_error
(
&
mysql
));
my_progname
,
buf
,
mysql_error
(
&
mysql
));
...
@@ -1076,7 +987,7 @@ run_task(const char *script)
...
@@ -1076,7 +987,7 @@ run_task(const char *script)
}
}
}
}
if
((
strlen
(
script
))
<
3
)
if
((
strlen
(
script
))
<
3
)
DBUG_RETURN
(
0
)
;
goto
end
;
if
(
mysql_query
(
&
mysql
,
script
))
if
(
mysql_query
(
&
mysql
,
script
))
{
{
fprintf
(
stderr
,
"%s: Cannot run query %s ERROR : %s
\n
"
,
fprintf
(
stderr
,
"%s: Cannot run query %s ERROR : %s
\n
"
,
...
@@ -1092,8 +1003,8 @@ run_task(const char *script)
...
@@ -1092,8 +1003,8 @@ run_task(const char *script)
}
}
end:
mysql_close
(
&
mysql
);
mysql_close
(
&
mysql
);
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
}
}
...
@@ -1126,11 +1037,11 @@ load_data(const char *script)
...
@@ -1126,11 +1037,11 @@ load_data(const char *script)
while
((
retstr
=
strstr
(
script
,
delimiter
)))
while
((
retstr
=
strstr
(
script
,
delimiter
)))
{
{
strncpy
(
(
char
*
)
&
buf
,
script
,
retstr
-
script
);
strncpy
(
buf
,
script
,
retstr
-
script
);
buf
[
retstr
-
script
]
=
'\0'
;
buf
[
retstr
-
script
]
=
'\0'
;
script
+=
retstr
-
script
+
delimiter_length
;
script
+=
retstr
-
script
+
delimiter_length
;
DBUG_PRINT
(
"info"
,
(
"running INSERT %s"
,
(
char
*
)
buf
));
DBUG_PRINT
(
"info"
,
(
"running INSERT %s"
,
buf
));
if
(
mysql_query
(
&
mysql
,
(
char
*
)
buf
))
if
(
mysql_query
(
&
mysql
,
buf
))
{
{
fprintf
(
stderr
,
"%s: Cannot run query %s ERROR : %s
\n
"
,
fprintf
(
stderr
,
"%s: Cannot run query %s ERROR : %s
\n
"
,
my_progname
,
buf
,
mysql_error
(
&
mysql
));
my_progname
,
buf
,
mysql_error
(
&
mysql
));
...
@@ -1139,7 +1050,7 @@ load_data(const char *script)
...
@@ -1139,7 +1050,7 @@ load_data(const char *script)
}
}
}
}
if
((
strlen
(
script
))
<
3
)
if
((
strlen
(
script
))
<
3
)
DBUG_RETURN
(
0
)
;
goto
end
;
if
(
mysql_query
(
&
mysql
,
script
))
if
(
mysql_query
(
&
mysql
,
script
))
{
{
DBUG_PRINT
(
"info"
,
(
"iteration %d with INSERT statement %s"
,
script
));
DBUG_PRINT
(
"info"
,
(
"iteration %d with INSERT statement %s"
,
script
));
...
@@ -1155,8 +1066,7 @@ load_data(const char *script)
...
@@ -1155,8 +1066,7 @@ load_data(const char *script)
}
}
}
}
end:
mysql_close
(
&
mysql
);
mysql_close
(
&
mysql
);
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
}
}
mysql-test/r/mysqlslap.result
View file @
9503c7e5
...
@@ -5,7 +5,7 @@ and you are welcome to modify and redistribute it under the GPL license
...
@@ -5,7 +5,7 @@ and you are welcome to modify and redistribute it under the GPL license
Run a query multiple times against the server
Run a query multiple times against the server
Usage: /home/patg/mysql-build/mysql-5.1-slap/client/.libs/lt-mysqlslap [OPTIONS]
[database [table [column]]]
Usage: /home/patg/mysql-build/mysql-5.1-slap/client/.libs/lt-mysqlslap [OPTIONS]
Default options are read from the following files in the given order:
Default options are read from the following files in the given order:
/etc/my.cnf ~/.my.cnf
/etc/my.cnf ~/.my.cnf
...
@@ -19,17 +19,16 @@ The following options may be given as the first argument:
...
@@ -19,17 +19,16 @@ The following options may be given as the first argument:
Generate SQL where not supplied by file or command line.
Generate SQL where not supplied by file or command line.
-C, --compress Use compression in server/client protocol.
-C, --compress Use compression in server/client protocol.
-l, --concurrency-load=#
-l, --concurrency-load=#
Number of clients to
simulate for data load
.
Number of clients to
use when loading data
.
-c, --concurrency=# Number of clients to simulate for query to run.
-c, --concurrency=# Number of clients to simulate for query to run.
--create=name File or string to use for create.
--create=name File or string to use for create.
-d, --data=name File or string with INSERT to use for populating
-d, --data=name File or string with INSERT to use for populating data.
table(s).
-#, --debug[=name] Output debug log. Often this is 'd:t:o,filename'.
-#, --debug[=name] Output debug log. Often this is 'd:t:o,filename'.
-F, --delimiter=name
-F, --delimiter=name
Delimiter to use in SQL statements supplied in file or
Delimiter to use in SQL statements supplied in file or
command line.
command line.
-D, --drop-schema Drop schema if it exists prior to running
,
and after
-D, --drop-schema Drop schema if it exists prior to running and after
running
running
.
-e, --engine=name Storage engine to use for creating the table.
-e, --engine=name Storage engine to use for creating the table.
-?, --help Display this help and exit.
-?, --help Display this help and exit.
-h, --host=name Connect to host.
-h, --host=name Connect to host.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment