diff --git a/src/s3fs.cpp b/src/s3fs.cpp index 4c940b9..5bab8c7 100644 --- a/src/s3fs.cpp +++ b/src/s3fs.cpp @@ -120,6 +120,7 @@ static bool nocopyapi = false; static bool norenameapi = false; static bool nonempty = false; static bool allow_other = false; +static bool fuse_read_mode_set = false; static bool load_iamrole = false; static uid_t s3fs_uid = 0; static gid_t s3fs_gid = 0; @@ -4355,6 +4356,10 @@ static int my_fuse_opt_proc(void* data, const char* arg, int key, struct fuse_ar allow_other = true; return 1; // continue for fuse option } + if(0 == strcmp(arg, "sync_read") || 0 == strcmp(arg, "async_read")){ + fuse_read_mode_set = true; + return 1; // continue for fuse option + } if(0 == STR2NCMP(arg, "mp_umask=")){ mp_umask = strtol(strchr(arg, '=') + sizeof(char), NULL, 0); mp_umask &= (S_IRWXU | S_IRWXG | S_IRWXO); @@ -4925,6 +4930,15 @@ int main(int argc, char* argv[]) exit(EXIT_FAILURE); } + // s3fs read is sync (fdent_lock is locked while reading) + // FUSE is async read by default + // switch FUSE to sync read to avoid hitting FUSE's max_background limit + // as well as to make sure that big read requests that are splitted by the kernel + // are always read in-order + if (!fuse_read_mode_set && 0 != fuse_opt_add_arg(&custom_args, "-osync_read")){ + exit(EXIT_FAILURE); + } + // [NOTE] // exclusive option check here. //