Fixed bug in stall connections

If clients are on slow network, the new polling algorithm in 1.3.0 can cause connections to stall.

Also removed some annoying compiler warnings
pull/762/head
René Cannaò 10 years ago
parent 8b64f76e6a
commit 7d5c870f26

@ -1893,7 +1893,7 @@ void MySQL_ResultSet::add_err(MySQL_Data_Stream *_myds) {
char sqlstate[10];
sprintf(sqlstate,"%s",mysql_sqlstate(_mysql));
if (_myds && _myds->killed_at) { // see case #750
myprot->generate_pkt_ERR(false,&pkt.ptr,&pkt.size,sid,1907,sqlstate,"Query execution was interrupted, query_timeout exceeded");
myprot->generate_pkt_ERR(false,&pkt.ptr,&pkt.size,sid,1907,sqlstate,(char *)"Query execution was interrupted, query_timeout exceeded");
} else {
myprot->generate_pkt_ERR(false,&pkt.ptr,&pkt.size,sid,mysql_errno(_mysql),sqlstate,mysql_error(_mysql));
}

@ -2964,7 +2964,7 @@ void MySQL_Session::MySQL_Result_to_MySQL_wire(MYSQL *mysql, MySQL_ResultSet *My
char sqlstate[10];
sprintf(sqlstate,"%s",mysql_sqlstate(mysql));
if (_myds && _myds->killed_at) { // see case #750
client_myds->myprot.generate_pkt_ERR(true,NULL,NULL,client_myds->pkt_sid+1,1907,sqlstate,"Query execution was interrupted, query_timeout exceeded");
client_myds->myprot.generate_pkt_ERR(true,NULL,NULL,client_myds->pkt_sid+1,1907,sqlstate,(char *)"Query execution was interrupted, query_timeout exceeded");
} else {
client_myds->myprot.generate_pkt_ERR(true,NULL,NULL,client_myds->pkt_sid+1,mysql_errno(mysql),sqlstate,mysql_error(mysql));
}

@ -2012,10 +2012,11 @@ __run_skip_1:
if (myds) {
//if (GloMTH->num_threads >= MIN_THREADS_FOR_MAINTENANCE && idle_maintenance_thread==false) {
// here we try to move it to the maintenance thread
if (mypolls.last_recv[n] < curtime - mysql_thread___session_idle_ms) {
if (myds->myds_type==MYDS_FRONTEND && myds->sess) {
if (myds->sess->client_myds == myds) { // extra check
if (myds->DSS==STATE_SLEEP && myds->sess->status==WAITING_CLIENT_DATA) {
if (myds->myds_type==MYDS_FRONTEND && myds->sess) {
if (myds->DSS==STATE_SLEEP && myds->sess->status==WAITING_CLIENT_DATA) {
unsigned long long _tmp_idle = mypolls.last_recv[n] > mypolls.last_sent[n] ? mypolls.last_recv[n] : mypolls.last_sent[n] ;
if (_tmp_idle > curtime - mysql_thread___session_idle_ms) {
if (myds->sess->client_myds == myds && myds->PSarrayOUT->len==0 && (myds->queueOUT.head - myds->queueOUT.tail)==0 ) { // extra check
unsigned int j;
int conns=0;
for (j=0;j<myds->sess->mybes->len;j++) {
@ -2073,7 +2074,8 @@ __run_skip_1:
if (myds) myds->revents=0;
if (mypolls.myds[n] && mypolls.myds[n]->myds_type!=MYDS_LISTENER) {
if (myds && myds->myds_type==MYDS_FRONTEND && myds->DSS==STATE_SLEEP && myds->sess && myds->sess->status==WAITING_CLIENT_DATA) {
mypolls.fds[n].events = POLLIN;
//mypolls.fds[n].events = POLLIN;
mypolls.myds[n]->set_pollout();
} else {
if (mypolls.myds[n]->DSS > STATE_MARIADB_BEGIN && mypolls.myds[n]->DSS < STATE_MARIADB_END) {
mypolls.fds[n].events = POLLIN;

@ -2280,7 +2280,7 @@ static void * admin_main_loop(void *arg)
//size_t c;
//int sd;
struct sockaddr_in addr;
size_t mystacksize=256*1024;
//size_t mystacksize=256*1024;
struct pollfd *fds=((struct _main_args *)arg)->fds;
int nfds=((struct _main_args *)arg)->nfds;
int *callback_func=((struct _main_args *)arg)->callback_func;
@ -2490,7 +2490,7 @@ void ProxySQL_Admin::print_version() {
bool ProxySQL_Admin::init() {
//int i;
cpu_timer cpt;
size_t mystacksize=256*1024;
//size_t mystacksize=256*1024;
child_func[0]=child_mysql;
child_func[1]=child_telnet;

Loading…
Cancel
Save