make IMAP pipeline depth configurable

currently, this affects only "clustered" message listings and
flag stores.
This commit is contained in:
Oswald Buddenhagen 2011-03-27 16:58:23 +02:00
parent a266f28f1c
commit a85013d6ff
2 changed files with 18 additions and 2 deletions

View File

@ -40,6 +40,7 @@ typedef struct imap_server_conf {
server_conf_t sconf; server_conf_t sconf;
char *user; char *user;
char *pass; char *pass;
int max_in_progress;
#ifdef HAVE_LIBSSL #ifdef HAVE_LIBSSL
unsigned require_ssl:1; unsigned require_ssl:1;
unsigned require_cram:1; unsigned require_cram:1;
@ -67,7 +68,6 @@ typedef struct _list {
} list_t; } list_t;
struct imap_cmd; struct imap_cmd;
#define max_in_progress 50 /* make this configurable? */
typedef struct imap_store { typedef struct imap_store {
store_t gen; store_t gen;
@ -396,7 +396,7 @@ drain_imap_replies( imap_store_t *ctx )
static int static int
process_imap_replies( imap_store_t *ctx ) process_imap_replies( imap_store_t *ctx )
{ {
while (ctx->num_in_progress > max_in_progress || while (ctx->num_in_progress > ((imap_store_conf_t *)ctx->gen.conf)->server->max_in_progress ||
socket_pending( &ctx->conn )) socket_pending( &ctx->conn ))
if (get_cmd_result( ctx, 0 ) == RESP_CANCEL) if (get_cmd_result( ctx, 0 ) == RESP_CANCEL)
return RESP_CANCEL; return RESP_CANCEL;
@ -1724,6 +1724,7 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep, int *err )
server->require_ssl = 1; server->require_ssl = 1;
server->sconf.use_tlsv1 = 1; server->sconf.use_tlsv1 = 1;
#endif #endif
server->max_in_progress = 50;
while (getcline( cfg ) && cfg->cmd) { while (getcline( cfg ) && cfg->cmd) {
if (!strcasecmp( "Host", cfg->cmd )) { if (!strcasecmp( "Host", cfg->cmd )) {
@ -1750,6 +1751,12 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep, int *err )
server->pass = nfstrdup( cfg->val ); server->pass = nfstrdup( cfg->val );
else if (!strcasecmp( "Port", cfg->cmd )) else if (!strcasecmp( "Port", cfg->cmd ))
server->sconf.port = parse_int( cfg ); server->sconf.port = parse_int( cfg );
else if (!strcasecmp( "PipelineDepth", cfg->cmd )) {
if ((server->max_in_progress = parse_int( cfg )) < 1) {
error( "%s:%d: PipelineDepth must be at least 1\n", cfg->file, cfg->line );
*err = 1;
}
}
#ifdef HAVE_LIBSSL #ifdef HAVE_LIBSSL
else if (!strcasecmp( "CertificateFile", cfg->cmd )) { else if (!strcasecmp( "CertificateFile", cfg->cmd )) {
server->sconf.cert_file = expand_strdup( cfg->val ); server->sconf.cert_file = expand_strdup( cfg->val );

View File

@ -277,6 +277,15 @@ Use SSLv3 for communication with the IMAP server over SSL?
Use TLSv1 for communication with the IMAP server over SSL? Use TLSv1 for communication with the IMAP server over SSL?
(Default: \fIyes\fR) (Default: \fIyes\fR)
.. ..
.TP
\fBPipelineDepth\fR \fIdepth\fR
Maximum number of IMAP commands which can be simultaneously in flight.
Setting this to \fI1\fR disables pipelining.
Setting it to a too big value may deadlock isync.
Currently, this affects only a few commands.
This is mostly a debugging only option.
(Default: \fI50\fR)
..
.SS IMAP Stores .SS IMAP Stores
The reference point for relative \fBPath\fRs is whatever the server likes it The reference point for relative \fBPath\fRs is whatever the server likes it
to be; probably the user's $HOME or $HOME/Mail on that server. The location to be; probably the user's $HOME or $HOME/Mail on that server. The location