diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 44ac6d3b9..9da9d6684 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -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); diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 2fa4baa91..980f5ca18 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -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() {