mirror of https://github.com/sysown/proxysql
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
266 lines
8.4 KiB
266 lines
8.4 KiB
#include "proxysql.h"
|
|
#include "cpp.h"
|
|
|
|
extern __thread MySQL_Connection_Pool * MyConnPool;
|
|
|
|
/*
|
|
MySQL_Server * MySQL_HostGroups_Handler::server_add(MySQL_Server *srv) {
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Adding MySQL_Server %p in Global Handler\n", srv);
|
|
Servers->add(srv);
|
|
return srv;
|
|
}
|
|
|
|
void MySQL_HostGroups_Handler::reset() {
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Resetting all MSHGE from Global Handler\n");
|
|
// if (MyHostGroups.empty()==false) MyHostGroups.clear();
|
|
while (MyHostGroups->len) {
|
|
MySQL_Hostgroup *myhg=(MySQL_Hostgroup *)MyHostGroups->remove_index_fast(0);
|
|
delete myhg;
|
|
}
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Resetting all MySQL Server from Global Handler\n");
|
|
while (Servers->len) {
|
|
MySQL_Server *srv=(MySQL_Server *)Servers->remove_index_fast(0);
|
|
delete srv;
|
|
}
|
|
}
|
|
|
|
MySQL_Server * MySQL_HostGroups_Handler::server_find(char *add, uint16_t p) {
|
|
unsigned int i;
|
|
for (i=0; i<Servers->len; i++) {
|
|
MySQL_Server *srv=(MySQL_Server *)Servers->index(i);
|
|
if (strcmp(srv->address,add)==0 && srv->port==p) {
|
|
return srv;
|
|
};
|
|
}
|
|
return NULL;
|
|
};
|
|
|
|
size_t MySQL_HostGroups_Handler::servers_in_hostgroup(int hid) {
|
|
MySQL_Hostgroup *myhg=MyHostGroups_idx(hid);
|
|
return myhg->servers_in_hostgroup();
|
|
// if (MyHostGroups->len > (unsigned int)hid) {
|
|
// MySQL_Hostgroup *myhg=(MySQL_Hostgroup *)MyHostGroups->index(hid);
|
|
// return myhg->servers_in_hostgroup();
|
|
// }
|
|
// return 0;
|
|
};
|
|
|
|
|
|
MySQL_Hostgroup_Entry * MySQL_HostGroups_Handler::set_HG_entry_status(unsigned int hid, MySQL_Server *msptr, enum proxysql_server_status _status) {
|
|
MySQL_Hostgroup *myhg=MyHostGroups_idx(hid);
|
|
return myhg->set_HG_entry_status(msptr,_status);
|
|
// if (MyHostGroups->len > hid) {
|
|
// MySQL_Hostgroup *myhg=(MySQL_Hostgroup *)MyHostGroups->index(hid);
|
|
// return myhg->set_HG_entry_status(msptr,_status);
|
|
// }
|
|
// return 0;
|
|
};
|
|
|
|
|
|
MySQL_Hostgroup_Entry * MySQL_HostGroups_Handler::set_HG_entry_status(unsigned int hid, char *add, uint16_t p, enum proxysql_server_status _status) {
|
|
MySQL_Server *msptr=server_find(add,p);
|
|
if (msptr==NULL) return NULL; // server not found
|
|
// if (MyHostGroups->len > hid) {
|
|
// MySQL_Hostgroup *myhg=(MySQL_Hostgroup *)MyHostGroups->index(hid);
|
|
MySQL_Hostgroup *myhg=MyHostGroups_idx(hid);
|
|
MySQL_Hostgroup_Entry *myhge=myhg->set_HG_entry_status(msptr,_status);
|
|
return myhge;
|
|
// }
|
|
//return NULL;
|
|
}
|
|
|
|
//MySQL_Hostgroup_Entry * MySQL_HostGroups_Handler::server_add_hg(unsigned int hid, char *add=NULL, uint16_t p=3306, unsigned int _weight=1) {
|
|
MySQL_Hostgroup_Entry * MySQL_HostGroups_Handler::server_add_hg(unsigned int hid, char *add, uint16_t p, unsigned int _weight) {
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Adding MySQL server %s:%d in Global Handler in hostgroup\n", add, p, hid);
|
|
MySQL_Server *srv=server_add(add,p);
|
|
MySQL_Hostgroup *myhg=MyHostGroups_idx(hid);
|
|
return myhg->server_add(srv, _weight);
|
|
}
|
|
|
|
MySQL_Hostgroup * MySQL_HostGroups_Handler::MyHostGroups_idx(unsigned int hid) {
|
|
if (hid>=MyHostGroups->len) {
|
|
create_hostgroup(hid);
|
|
}
|
|
MySQL_Hostgroup *myhg=(MySQL_Hostgroup *)MyHostGroups->index(hid);
|
|
if (myhg==NULL) {
|
|
create_hostgroup(hid);
|
|
myhg=(MySQL_Hostgroup *)MyHostGroups->index(hid);
|
|
}
|
|
return myhg;
|
|
}
|
|
|
|
MySQL_Hostgroup_Entry * MySQL_HostGroups_Handler::MSHGE_find(unsigned int hid, MySQL_Server *srv) {
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Searching MSHGE for MySQL_Server %p into HID %d\n", srv, hid);
|
|
MySQL_Hostgroup *myhg=MyHostGroups_idx(hid);
|
|
return myhg->MSHGE_find(srv);
|
|
// return myhg->MSHGE_find(srv);
|
|
// if (MyHostGroups->len > hid) {
|
|
// MySQL_Hostgroup *myhg=(MySQL_Hostgroup *)MyHostGroups->index(hid);
|
|
// return myhg->MSHGE_find(srv);
|
|
// }
|
|
// return NULL;
|
|
}
|
|
|
|
MySQL_Hostgroup_Entry * MySQL_HostGroups_Handler::MSHGE_find(unsigned int hid, char *add, uint16_t p) {
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Searching MSHGE for MySQL server %s:%d into HID %d\n", add, p, hid);
|
|
MySQL_Server *srv=server_find(add,p);
|
|
if (srv==NULL) return NULL; // server not found
|
|
return MSHGE_find(hid,srv);
|
|
}
|
|
|
|
void MySQL_HostGroups_Handler::insert_hostgroup(MySQL_Hostgroup *myhg) {
|
|
unsigned int p=myhg->hostgroup_id;
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Inserting hostgroup %p with HID %d in Global Handler\n", myhg, p);
|
|
while (MyHostGroups->len < (p+1) ) {
|
|
MyHostGroups->add(NULL);
|
|
}
|
|
//MyHostGroups.insert(MyHostGroups.begin()+p,myhg);
|
|
//MyHostGroups[p]=myhg;
|
|
MyHostGroups->pdata[p]=myhg;
|
|
}
|
|
|
|
|
|
MySQL_Hostgroup_Entry * MySQL_HostGroups_Handler::get_random_hostgroup_entry(unsigned int hid) {
|
|
MySQL_Hostgroup_Entry *mshge=NULL;
|
|
rdlock();
|
|
MySQL_Hostgroup *myhg=MyHostGroups_idx(hid);
|
|
mshge=myhg->get_random_hostgroup_entry();
|
|
// if (MyHostGroups->len > hid) {
|
|
// MySQL_Hostgroup *mshg=(MySQL_Hostgroup *)MyHostGroups->index(hid);
|
|
// mshge=mshg->get_random_hostgroup_entry();
|
|
// }
|
|
rdunlock();
|
|
return mshge;
|
|
}
|
|
*/
|
|
|
|
void * MySQL_Backend::operator new(size_t size) {
|
|
return l_alloc(size);
|
|
}
|
|
|
|
void MySQL_Backend::operator delete(void *ptr) {
|
|
l_free(sizeof(MySQL_Backend),ptr);
|
|
}
|
|
|
|
MySQL_Backend::MySQL_Backend() {
|
|
hostgroup_id=-1;
|
|
server_myds=NULL;
|
|
myconn=NULL;
|
|
server_bytes_at_cmd.bytes_recv=0;
|
|
server_bytes_at_cmd.bytes_sent=0;
|
|
//mshge=NULL;
|
|
}
|
|
|
|
MySQL_Backend::~MySQL_Backend() {
|
|
}
|
|
|
|
void MySQL_Backend::reset() {
|
|
if (myconn) {
|
|
if (server_myds->DSS==STATE_READY && myconn->reusable==true && ((myconn->myds->sess->myprot_server.prot_status & SERVER_STATUS_IN_TRANS)==0)) {
|
|
//server_myds->myconn=NULL;
|
|
//delete myconn;
|
|
MyHGM->push_MyConn_to_pool(myconn);
|
|
// myconn->return_to_connection_pool();
|
|
myconn=NULL;
|
|
} else {
|
|
// MyConnArray *MCA=MyConnPool->MyConnArray_lookup(myconn->mshge->MSptr->address, myconn->myconn.user, myconn->mshge->MSptr->password, myconn->mshge->MSptr->db, myconn->mshge->MSptr->port);
|
|
MyHGM->destroy_MyConn_from_pool(myconn);
|
|
//delete myconn;
|
|
}
|
|
};
|
|
//if (mshge) {
|
|
// FIXME: what to do with it?
|
|
//}
|
|
if (server_myds) {
|
|
delete server_myds;
|
|
//server_myds=NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
void MySQL_Hostgroup::add(MySQL_Hostgroup_Entry *mshge) {
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Adding MySQL_Hostgroup_Entry %p to Hostgroup %p with HID %d\n", mshge, this, hostgroup_id);
|
|
MSHGEs->add(mshge);
|
|
}
|
|
|
|
void MySQL_Hostgroup::add(MySQL_Server *msptr, unsigned int _weight) {
|
|
MySQL_Hostgroup_Entry *mshge=new MySQL_Hostgroup_Entry(hostgroup_id, msptr, _weight);
|
|
this->add(mshge);
|
|
}
|
|
|
|
bool MySQL_Hostgroup::del(MySQL_Hostgroup_Entry *mshge) {
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Deleting MySQL_Hostgroup_Entry %p from Hostgroup %p with HID %d\n", mshge, this, hostgroup_id);
|
|
MySQL_Hostgroup_Entry *it=NULL;
|
|
unsigned int i;
|
|
for (i=0; i< MSHGEs->len; i++) {
|
|
it=(MySQL_Hostgroup_Entry *)MSHGEs->index(i);
|
|
if (it==mshge) {
|
|
it=(MySQL_Hostgroup_Entry *)MSHGEs->remove_index_fast(i);
|
|
delete it;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool MySQL_Hostgroup::del(MySQL_Server *msptr) {
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Deleting MySQL_Hostgroup_Entry with MySQL_Server %p from Hostgroup %p with HID %d\n", msptr, this, hostgroup_id);
|
|
MySQL_Hostgroup_Entry *it=NULL;
|
|
unsigned int i;
|
|
for (i=0; i< MSHGEs->len; i++) {
|
|
it=(MySQL_Hostgroup_Entry *)MSHGEs->index(i);
|
|
if (it->MSptr==msptr) {
|
|
it=(MySQL_Hostgroup_Entry *)MSHGEs->remove_index_fast(i);
|
|
delete it;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
MySQL_Hostgroup_Entry * MySQL_Hostgroup::MSHGE_find(MySQL_Server *msptr) {
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Searching MySQL_Hostgroup_Entry for MySQL_Server %p from Hostgroup %p with HID %d\n", msptr, this, hostgroup_id);
|
|
MySQL_Hostgroup_Entry *it=NULL;
|
|
unsigned int i;
|
|
for (i=0; i< MSHGEs->len; i++) {
|
|
it=(MySQL_Hostgroup_Entry *)MSHGEs->index(i);
|
|
if (it->MSptr==msptr) {
|
|
return it;
|
|
}
|
|
}
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "MySQL_Hostgroup_Entry not found\n");
|
|
return NULL;
|
|
}
|
|
|
|
|
|
size_t MySQL_Hostgroup::servers_in_hostgroup() {
|
|
return MSHGEs->len;
|
|
}
|
|
|
|
|
|
MySQL_Hostgroup_Entry * MySQL_Hostgroup::get_random_hostgroup_entry() {
|
|
unsigned int i;
|
|
unsigned int sum=0;
|
|
MySQL_Hostgroup_Entry *mshge;
|
|
for (i=0; i<MSHGEs->len; i++) {
|
|
mshge=(MySQL_Hostgroup_Entry *)MSHGEs->index(i);
|
|
sum+=mshge->weight;
|
|
}
|
|
unsigned int j=rand()%sum;
|
|
j++;
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "HID=%d, MSHGEs=%d, total_weight=%d, rand=%d\n" , hostgroup_id, MSHGEs->len, sum, j);
|
|
sum=0;
|
|
for (i=0; i<MSHGEs->len; i++) {
|
|
mshge=(MySQL_Hostgroup_Entry *)MSHGEs->index(i);
|
|
sum+=mshge->weight;
|
|
if (j<=sum) {
|
|
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Returning mshge=%p, host=%s, port=%d\n" , mshge, mshge->MSptr->address, mshge->MSptr->port);
|
|
return mshge;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
*/
|