Use an atomic fetch-and-add instead of a global mutex in sb_lua_get_request().

This was a scalability bottleneck with --max-requests>0.
This commit is contained in:
Alexey Kopytov
2016-10-16 23:09:51 +03:00
parent 65c083a6ba
commit bf2924b0fc
2 changed files with 8 additions and 12 deletions

View File

@ -20,6 +20,8 @@
# include "config.h"
#endif
#include <stdlib.h>
#include "script_lua.h"
#include "lua.h"
#include "lualib.h"
@ -29,7 +31,7 @@
#include "db_driver.h"
#include "sb_rnd.h"
#include <stdlib.h>
#include "ck_pr.h"
#define EVENT_FUNC "event"
#define PREPARE_FUNC "prepare"
@ -245,17 +247,11 @@ sb_request_t sb_lua_get_request(int thread_id)
(void) thread_id; /* unused */
if (sb_globals.max_requests > 0)
if (sb_globals.max_requests > 0 &&
ck_pr_faa_uint(&nevents, 1) >= sb_globals.max_requests)
{
SB_THREAD_MUTEX_LOCK();
if (nevents >= sb_globals.max_requests)
{
req.type = SB_REQ_TYPE_NULL;
SB_THREAD_MUTEX_UNLOCK();
return req;
}
nevents++;
SB_THREAD_MUTEX_UNLOCK();
req.type = SB_REQ_TYPE_NULL;
return req;
}
req.type = SB_REQ_TYPE_SCRIPT;

View File

@ -12,6 +12,6 @@ ARGS="--test=${SBTEST_SCRIPTDIR}/oltp.lua $DB_DRIVER_ARGS --oltp-tables-count=8"
sysbench $ARGS prepare
sysbench $ARGS --max-requests=100 --num-threads=1 run
sysbench $ARGS --max-requests=100 --num-threads=2 run
sysbench $ARGS cleanup