Browse Source

Reattempt sending delayed sends immediately after servicing one send successfully.

master
Con Kolivas 10 years ago
parent
commit
873b1b702a
  1. 14
      src/connector.c

14
src/connector.c

@ -340,6 +340,7 @@ void *sender(void *arg)
{ {
conn_instance_t *ci = (conn_instance_t *)arg; conn_instance_t *ci = (conn_instance_t *)arg;
ckpool_t *ckp = ci->pi->ckp; ckpool_t *ckp = ci->pi->ckp;
bool sent = false;
rename_proc("csender"); rename_proc("csender");
@ -349,8 +350,11 @@ void *sender(void *arg)
int ret, fd, ofs = 0; int ret, fd, ofs = 0;
mutex_lock(&sender_lock); mutex_lock(&sender_lock);
/* Poll every 100ms if there are no new sends */ /* Poll every 100ms if there are no new sends. Re-examine
if (!sender_sends) { * delayed sends immediately after a successful send in case
* endless new sends more frequently end up starving the
* delayed sends. */
if (!sender_sends && !sent) {
const ts_t polltime = {0, 100000000}; const ts_t polltime = {0, 100000000};
ts_t timeout_ts; ts_t timeout_ts;
@ -363,8 +367,11 @@ void *sender(void *arg)
DL_DELETE(sender_sends, sender_send); DL_DELETE(sender_sends, sender_send);
mutex_unlock(&sender_lock); mutex_unlock(&sender_lock);
sent = false;
/* Service delayed sends only if we have timed out on the /* Service delayed sends only if we have timed out on the
* conditional with no new sends appearing. */ * conditional with no new sends appearing or have just
* serviced another message successfully. */
if (!sender_send) { if (!sender_send) {
if (!delayed_sends) if (!delayed_sends)
continue; continue;
@ -404,6 +411,7 @@ void *sender(void *arg)
DL_APPEND(delayed_sends, sender_send); DL_APPEND(delayed_sends, sender_send);
continue; continue;
} }
sent = true;
while (sender_send->len) { while (sender_send->len) {
ret = send(fd, sender_send->buf + ofs, sender_send->len , 0); ret = send(fd, sender_send->buf + ofs, sender_send->len , 0);
if (unlikely(ret < 0)) { if (unlikely(ret < 0)) {

Loading…
Cancel
Save