Commit dc43c6ea authored by unknown's avatar unknown

A fix for Bug#5787 "mysql_stmt_prepare is upto 8 times slower":

it's crucial to disable Nagle algorithm on client for no-reply commands
(like mysql_stmt_free) to always work fast.
Nagle algorithm instructs the sender to buffer (store) data if any 
unacknowledged data is outstanding and the size of to-send data is less than
the network segment. It was exactly the case with COM_STMT_CLOSE after 
COM_STMT_PREPARE, so the client was waiting for Nagle timer to expire or
 for ACK from the server, while the server was holding up ACK because of 
delayed acknowledgement algorithm.
The tricky part is that we have been already disabling Nagle 
algorithm (by setting TCP_NODELAY)
almost everywhere except Windows (and maybe Netware).
It is the reason why the bug was repeatable only with Windows client.


vio/viosocket.c:
  A fix for Bug#5787 "mysql_stmt_prepare is upto 8 times slower":
  if we disable Nagle algorithm, do it everywhere.
parent 4332ac91
...@@ -142,23 +142,29 @@ int vio_fastsend(Vio * vio __attribute__((unused))) ...@@ -142,23 +142,29 @@ int vio_fastsend(Vio * vio __attribute__((unused)))
int r=0; int r=0;
DBUG_ENTER("vio_fastsend"); DBUG_ENTER("vio_fastsend");
#ifdef IPTOS_THROUGHPUT #if defined(IPTOS_THROUGHPUT) && !defined(__EMX__)
{ {
#ifndef __EMX__
int tos = IPTOS_THROUGHPUT; int tos = IPTOS_THROUGHPUT;
if (!setsockopt(vio->sd, IPPROTO_IP, IP_TOS, (void *) &tos, sizeof(tos))) r= setsockopt(vio->sd, IPPROTO_IP, IP_TOS, (void *) &tos, sizeof(tos));
#endif /* !__EMX__ */ }
{ #endif /* IPTOS_THROUGHPUT && !__EMX__ */
int nodelay = 1; if (!r)
if (setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY, (void *) &nodelay, {
sizeof(nodelay))) { #ifdef __WIN__
DBUG_PRINT("warning", BOOL nodelay= 1;
("Couldn't set socket option for fast send")); r= setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY, (const char*) &nodelay,
r= -1; sizeof(nodelay));
} #else
} int nodelay = 1;
r= setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY, (void*) &nodelay,
sizeof(nodelay));
#endif /* __WIN__ */
}
if (r)
{
DBUG_PRINT("warning", ("Couldn't set socket option for fast send"));
r= -1;
} }
#endif /* IPTOS_THROUGHPUT */
DBUG_PRINT("exit", ("%d", r)); DBUG_PRINT("exit", ("%d", r));
DBUG_RETURN(r); DBUG_RETURN(r);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment