Testing pthread mutex for MHM #644

If MHM_PTHREAD_MUTEX is defined MySQL_HostGroups_Manager.h ,
MySQL_HostGroups_Manager() is compiled using pthread mutex instead od spin loop.

As a lot of computation is protected by mutex, maybe it is better not to use spin loop.
pull/739/head
René Cannaò 10 years ago
parent 74c4bf3210
commit 8ce083fb20

@ -10,6 +10,8 @@
#define STRESSTEST_POOL
*/
#define MHM_PTHREAD_MUTEX
#define MYHGM_MYSQL_SERVERS "CREATE TABLE mysql_servers ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , status INT CHECK (status IN (0, 1, 2, 3, 4)) NOT NULL DEFAULT 0 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , mem_pointer INT NOT NULL DEFAULT 0 , PRIMARY KEY (hostgroup_id, hostname, port) )"
#define MYHGM_MYSQL_SERVERS_INCOMING "CREATE TABLE mysql_servers_incoming ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , status INT CHECK (status IN (0, 1, 2, 3, 4)) NOT NULL DEFAULT 0 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port))"
#define MYHGM_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))"
@ -121,7 +123,11 @@ class MySQL_HostGroups_Manager {
private:
SQLite3DB *admindb;
SQLite3DB *mydb;
#ifdef MHM_PTHREAD_MUTEX
pthread_mutex_t lock;
#else
rwlock_t rwlock;
#endif
PtrArray *MyHostGroups;
MyHGC * MyHGC_find(unsigned int);
@ -156,8 +162,8 @@ class MySQL_HostGroups_Manager {
} status;
MySQL_HostGroups_Manager();
~MySQL_HostGroups_Manager();
void rdlock();
void rdunlock();
// void rdlock();
// void rdunlock();
void wrlock();
void wrunlock();
bool server_add(unsigned int hid, char *add, uint16_t p=3306, unsigned int _weight=1, enum MySerStatus status=MYSQL_SERVER_STATUS_ONLINE, unsigned int _comp=0, unsigned int _max_connections=100, unsigned int _max_replication_lag=0, unsigned int _use_ssl=0, unsigned int _max_latency_ms=0, char *comment=NULL);

@ -279,7 +279,11 @@ MySQL_HostGroups_Manager::MySQL_HostGroups_Manager() {
status.autocommit_cnt_filtered=0;
status.commit_cnt_filtered=0;
status.rollback_cnt_filtered=0;
#ifdef MHM_PTHREAD_MUTEX
pthread_mutex_init(&lock, NULL);
#else
spinlock_rwlock_init(&rwlock);
#endif
admindb=NULL; // initialized only if needed
mydb=new SQLite3DB();
mydb->open((char *)"file:mem_mydb?mode=memory&cache=shared", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX);
@ -300,8 +304,12 @@ MySQL_HostGroups_Manager::~MySQL_HostGroups_Manager() {
if (admindb) {
delete admindb;
}
#ifdef MHM_PTHREAD_MUTEX
pthread_mutex_destroy(&lock);
#endif
}
/*
void MySQL_HostGroups_Manager::rdlock() {
spin_wrlock(&rwlock);
}
@ -309,15 +317,23 @@ void MySQL_HostGroups_Manager::rdlock() {
void MySQL_HostGroups_Manager::rdunlock() {
spin_wrunlock(&rwlock);
}
*/
// wrlock() is only required during commit()
void MySQL_HostGroups_Manager::wrlock() {
#ifdef MHM_PTHREAD_MUTEX
pthread_mutex_lock(&lock);
#else
spin_wrlock(&rwlock);
#endif
}
void MySQL_HostGroups_Manager::wrunlock() {
#ifdef MHM_PTHREAD_MUTEX
pthread_mutex_unlock(&lock);
#else
spin_wrunlock(&rwlock);
#endif
}
unsigned int MySQL_HostGroups_Manager::get_servers_table_version() {

Loading…
Cancel
Save