Resend fragments ASAP to improve flow

This commit is contained in:
frekky 2015-11-10 20:51:12 +08:00
parent 8d25974867
commit f96bd3735d

View File

@ -143,7 +143,7 @@ send_raw(int fd, uint8_t *buf, size_t buflen, int user, int cmd, struct sockaddr
#define QMEM_DEBUG(l, u, ...) \ #define QMEM_DEBUG(l, u, ...) \
if (debug >= l) {\ if (debug >= l) {\
fprintf(stderr, "[QMEM u%d (%lu/%u)] ", u, users[u].qmem.num_pending, users[u].outgoing->windowsize); \ TIMEPRINT("[QMEM u%d (%lu/%u)] ", u, users[u].qmem.num_pending, users[u].outgoing->windowsize); \
fprintf(stderr, __VA_ARGS__);\ fprintf(stderr, __VA_ARGS__);\
fprintf(stderr, "\n");\ fprintf(stderr, "\n");\
} }
@ -291,10 +291,10 @@ qmem_max_wait(struct dnsfd *dns_fds, int *touser, struct query **sendq)
* - the user has excess pending queries (>downstream window size) * - the user has excess pending queries (>downstream window size)
* Returns largest safe time to wait before next timeout */ * Returns largest safe time to wait before next timeout */
{ {
struct timeval now, timeout, soonest, tmp, age; struct timeval now, timeout, soonest, tmp, age, nextresend;
soonest.tv_sec = 10; soonest.tv_sec = 10;
soonest.tv_usec = 0; soonest.tv_usec = 0;
int userid, qnum, nextuser = -1, immediate; int userid, qnum, nextuser = -1, immediate, resend = 0;
struct query *q = NULL, *nextq = NULL; struct query *q = NULL, *nextq = NULL;
size_t sending, total, sent; size_t sending, total, sent;
time_t age_ms; time_t age_ms;
@ -312,7 +312,15 @@ qmem_max_wait(struct dnsfd *dns_fds, int *touser, struct query **sendq)
/* Keep track of how many fragments we can send */ /* Keep track of how many fragments we can send */
if (u->lazy) { if (u->lazy) {
total = window_sending(u->outgoing); total = window_sending(u->outgoing, &nextresend);
if ((nextresend.tv_sec != 0 || nextresend.tv_usec != 0)
&& u->qmem.num_pending >= 1) {
/* will use nextresend as max wait time if it is smallest
* and if user has spare queries */
resend = 1;
soonest = nextresend;
}
if (u->qmem.num_pending > u->outgoing->windowsize) { if (u->qmem.num_pending > u->outgoing->windowsize) {
/* calculate number of "excess" queries */ /* calculate number of "excess" queries */
total = MAX(total, u->qmem.num_pending - u->outgoing->windowsize); total = MAX(total, u->qmem.num_pending - u->outgoing->windowsize);
@ -347,7 +355,7 @@ qmem_max_wait(struct dnsfd *dns_fds, int *touser, struct query **sendq)
sent++; sent++;
QMEM_DEBUG(4, userid, "ANSWER q id %d, ACK %d; sent %lu of %lu + sending another %lu", QMEM_DEBUG(4, userid, "ANSWER q id %d, ACK %d; sent %lu of %lu + sending another %lu",
q->id, u->next_upstream_ack, sent, total, sending); q->id, u->next_upstream_ack, sent, total, sending);
send_data_or_ping(dns_fds, userid, q, 0, immediate); send_data_or_ping(dns_fds, userid, q, 0, immediate);
@ -375,9 +383,12 @@ qmem_max_wait(struct dnsfd *dns_fds, int *touser, struct query **sendq)
} else { } else {
if (nextuser < 0) if (nextuser < 0)
nextuser = 0; nextuser = 0;
/* sanity check: soonest_ms should always be default value here (ie. 10000) */ if (soonest_ms != 10000 && resend) {
if (soonest_ms != 10000) /* only if resending some frags */
QMEM_DEBUG(1, nextuser, "Don't need to send anything to any users, waiting %lu ms", soonest_ms); QMEM_DEBUG(5, nextuser, "Resending some fragments")
} else {
QMEM_DEBUG(2, nextuser, "Don't need to send anything to any users, waiting %lu ms", soonest_ms);
}
} }
} }