reduce FSync option to a boolean

there is no use for Thorough mode any more, so simplify the
configuration.
This commit is contained in:
Oswald Buddenhagen 2013-11-02 21:42:34 +01:00
parent 29a56e2dc4
commit 71524cb6b0
6 changed files with 17 additions and 35 deletions

View File

@ -38,7 +38,7 @@ channel_conf_t global_conf;
store_conf_t *stores; store_conf_t *stores;
channel_conf_t *channels; channel_conf_t *channels;
group_conf_t *groups; group_conf_t *groups;
int FSyncLevel = FSYNC_NORMAL; int UseFSync = 1;
#define ARG_OPTIONAL 0 #define ARG_OPTIONAL 0
#define ARG_REQUIRED 1 #define ARG_REQUIRED 1
@ -470,13 +470,7 @@ load_config( const char *where, int pseudo )
} }
else if (!strcasecmp( "FSync", cfile.cmd )) else if (!strcasecmp( "FSync", cfile.cmd ))
{ {
arg = cfile.val; UseFSync = parse_bool( &cfile );
if (!strcasecmp( "None", arg ))
FSyncLevel = FSYNC_NONE;
else if (!strcasecmp( "Normal", arg ))
FSyncLevel = FSYNC_NORMAL;
else if (!strcasecmp( "Thorough", arg ))
FSyncLevel = FSYNC_THOROUGH;
} }
else if (!getopt_helper( &cfile, &gcops, &global_conf )) else if (!getopt_helper( &cfile, &gcops, &global_conf ))
{ {

View File

@ -439,7 +439,7 @@ maildir_store_uid( maildir_store_t *ctx )
n = sprintf( buf, "%d\n%d\n", ctx->gen.uidvalidity, ctx->nuid ); n = sprintf( buf, "%d\n%d\n", ctx->gen.uidvalidity, ctx->nuid );
lseek( ctx->uvfd, 0, SEEK_SET ); lseek( ctx->uvfd, 0, SEEK_SET );
if (write( ctx->uvfd, buf, n ) != n || ftruncate( ctx->uvfd, n ) || (FSyncLevel >= FSYNC_NORMAL && fdatasync( ctx->uvfd ))) { if (write( ctx->uvfd, buf, n ) != n || ftruncate( ctx->uvfd, n ) || (UseFSync && fdatasync( ctx->uvfd ))) {
error( "Maildir error: cannot write UIDVALIDITY.\n" ); error( "Maildir error: cannot write UIDVALIDITY.\n" );
return DRV_BOX_BAD; return DRV_BOX_BAD;
} }
@ -1213,7 +1213,7 @@ maildir_store_msg( store_t *gctx, msg_data_t *data, int to_trash,
} }
ret = write( fd, data->data, data->len ); ret = write( fd, data->data, data->len );
free( data->data ); free( data->data );
if (ret != data->len || ((FSyncLevel >= FSYNC_NORMAL) && (ret = fsync( fd )))) { if (ret != data->len || (UseFSync && (ret = fsync( fd )))) {
if (ret < 0) if (ret < 0)
sys_error( "Maildir error: cannot write %s", buf ); sys_error( "Maildir error: cannot write %s", buf );
else else

View File

@ -488,12 +488,7 @@ extern driver_t *drivers[N_DRIVERS];
extern channel_conf_t global_conf; extern channel_conf_t global_conf;
extern channel_conf_t *channels; extern channel_conf_t *channels;
extern group_conf_t *groups; extern group_conf_t *groups;
extern int UseFSync;
#define FSYNC_NONE 0
#define FSYNC_NORMAL 1
#define FSYNC_THOROUGH 2
extern int FSyncLevel;
int parse_bool( conffile_t *cfile ); int parse_bool( conffile_t *cfile );
int parse_int( conffile_t *cfile ); int parse_int( conffile_t *cfile );

View File

@ -534,23 +534,16 @@ times within a Group.
.. ..
.SS Global Options .SS Global Options
.TP .TP
\fBFSync\fR {\fINone\fR|\fINormal\fR|\fIThorough\fR} \fBFSync\fR \fIyes\fR|\fIno\fR
.br .br
Select the amount of forced flushing \fBmbsync\fR performs, which determines Selects whether \fBmbsync\fR performs forced flushing, which determines
the level of data safety after system crashes and power outages: the level of data safety after system crashes and power outages.
.br Disabling it is reasonably safe for file systems which are mounted with
\fBNone\fR - no flushing at all. This is reasonably safe for file systems data=ordered mode.
which are mounted with data=ordered mode. Enabling it is a wise choice for file systems mounted with data=writeback,
.br in particular modern systems like ext4, btrfs and xfs. The performance impact
\fBNormal\fR - message and critical metadata writes are flushed. No data on older file systems may be disproportionate.
should be lost due to crashes, though it is still possible that messages (Default: \fIyes\fR)
are duplicated after crashes. This is the default, and is a wise choice for
file systems mounted with data=writeback, in particular modern systems like
ext4, btrfs and xfs. The performance impact on older file systems may be
disproportionate.
.br
\fBThorough\fR - this avoids message duplication after crashes as well,
at some additional performance cost.
.. ..
.SH INHERENT PROBLEMS .SH INHERENT PROBLEMS
Changes done after \fBmbsync\fR has retrieved the message list will not be Changes done after \fBmbsync\fR has retrieved the message list will not be

View File

@ -249,7 +249,7 @@ sub writecfg($$$)
open(FILE, ">", ".mbsyncrc") or open(FILE, ">", ".mbsyncrc") or
die "Cannot open .mbsyncrc.\n"; die "Cannot open .mbsyncrc.\n";
print FILE print FILE
"FSync None "FSync no
MaildirStore master MaildirStore master
Path ./ Path ./

View File

@ -44,7 +44,7 @@ const char *str_ms[] = { "master", "slave" }, *str_hl[] = { "push", "pull" };
void void
Fclose( FILE *f, int safe ) Fclose( FILE *f, int safe )
{ {
if ((safe && (fflush( f ) || (FSyncLevel >= FSYNC_NORMAL && fdatasync( fileno( f ) )))) || fclose( f ) == EOF) { if ((safe && (fflush( f ) || (UseFSync && fdatasync( fileno( f ) )))) || fclose( f ) == EOF) {
sys_error( "Error: cannot close file. Disk full?" ); sys_error( "Error: cannot close file. Disk full?" );
exit( 1 ); exit( 1 );
} }
@ -1511,7 +1511,7 @@ box_loaded( int sts, void *aux )
} }
debug( "propagating new messages\n" ); debug( "propagating new messages\n" );
if (FSyncLevel >= FSYNC_NORMAL) if (UseFSync)
fdatasync( fileno( svars->jfp ) ); fdatasync( fileno( svars->jfp ) );
for (t = 0; t < 2; t++) { for (t = 0; t < 2; t++) {
Fprintf( svars->jfp, "%c %d\n", "{}"[t], svars->ctx[t]->uidnext ); Fprintf( svars->jfp, "%c %d\n", "{}"[t], svars->ctx[t]->uidnext );