client: tune socket bundling

This commit is contained in:
Thomas Schoebel-Theuer 2015-06-15 07:48:54 +02:00
parent f4795b6c74
commit 4793b2c0d2
2 changed files with 38 additions and 6 deletions

View File

@ -208,17 +208,40 @@ void _maintain_bundle(struct client_bundle *bundle)
static static
struct client_channel *_get_channel(struct client_bundle *bundle, int min_channel, int max_channel) struct client_channel *_get_channel(struct client_bundle *bundle, int min_channel, int max_channel)
{ {
struct client_channel *res = NULL; struct client_channel *res;
long best_space = -1; long best_space;
int best_channel;
int i; int i;
_maintain_bundle(bundle);
if (unlikely(max_channel <= 0 || max_channel > MAX_CLIENT_CHANNELS)) if (unlikely(max_channel <= 0 || max_channel > MAX_CLIENT_CHANNELS))
max_channel = MAX_CLIENT_CHANNELS; max_channel = MAX_CLIENT_CHANNELS;
if (unlikely(min_channel < 0 || min_channel >= max_channel)) if (unlikely(min_channel < 0 || min_channel >= max_channel)) {
min_channel = max_channel - 1; min_channel = max_channel - 1;
if (unlikely(min_channel < 0))
min_channel = 0;
}
/* Fast path.
* Speculate that the next channel is already usable,
* and that it has enough room.
*/
best_channel = bundle->old_channel + 1;
if (best_channel >= max_channel)
best_channel = min_channel;
res = &bundle->channel[best_channel];
if (res->is_open && res->is_connected && !res->recv_error && mars_socket_is_alive(&res->socket)) {
res->current_space = mars_socket_send_space_available(&res->socket);
if (res->current_space > (PAGE_SIZE + PAGE_SIZE / 4))
goto found;
}
/* Slow path. Do all the teady work.
*/
_maintain_bundle(bundle);
res = NULL;
best_space = -1;
best_channel = -1;
for (i = min_channel; i < max_channel; i++) { for (i = min_channel; i < max_channel; i++) {
struct client_channel *ch = &bundle->channel[i]; struct client_channel *ch = &bundle->channel[i];
long this_space; long this_space;
@ -236,6 +259,7 @@ struct client_channel *_get_channel(struct client_bundle *bundle, int min_channe
ch->current_space = this_space; ch->current_space = this_space;
/* Always prefer the newly opened channel */ /* Always prefer the newly opened channel */
res = ch; res = ch;
best_channel = i;
break; break;
} }
@ -244,12 +268,16 @@ struct client_channel *_get_channel(struct client_bundle *bundle, int min_channe
ch->current_space = this_space; ch->current_space = this_space;
if (this_space > best_space) { if (this_space > best_space) {
best_space = this_space; best_space = this_space;
best_channel = i;
res = ch; res = ch;
} }
} }
if (unlikely(!res))
goto done;
// send initial connect command // send initial connect command
if (res && !res->is_connected) { if (unlikely(!res->is_connected)) {
struct mars_cmd cmd = { struct mars_cmd cmd = {
.cmd_code = CMD_CONNECT, .cmd_code = CMD_CONNECT,
.cmd_str1 = bundle->path, .cmd_str1 = bundle->path,
@ -264,6 +292,9 @@ struct client_channel *_get_channel(struct client_bundle *bundle, int min_channe
res->is_connected = true; res->is_connected = true;
} }
found:
bundle->old_channel = best_channel;
done: done:
return res; return res;
} }

View File

@ -82,6 +82,7 @@ struct client_bundle {
char *host; char *host;
char *path; char *path;
int thread_count; int thread_count;
int old_channel;
wait_queue_head_t sender_event; wait_queue_head_t sender_event;
struct client_threadinfo sender; struct client_threadinfo sender;
struct client_channel channel[MAX_CLIENT_CHANNELS]; struct client_channel channel[MAX_CLIENT_CHANNELS];