From 235ba41c5b5adde50ec44deebcd4a5d97e2eb995 Mon Sep 17 00:00:00 2001 From: Ryo Nakamura Date: Mon, 29 Apr 2024 19:36:22 +0900 Subject: [PATCH] default chunk size is filesize/(nr_conn*4) (Issue #20) and clean-up chunk_sz related parts. --- doc/mscp.1.in | 6 +++++- doc/mscp.rst | 6 ++++-- src/main.c | 2 +- src/mscp.c | 14 +++----------- src/path.c | 7 ++----- 5 files changed, 15 insertions(+), 20 deletions(-) diff --git a/doc/mscp.1.in b/doc/mscp.1.in index 150d1a0..3c1802e 100644 --- a/doc/mscp.1.in +++ b/doc/mscp.1.in @@ -198,7 +198,11 @@ parallel. The default value is 16M bytes. .TP .B \-S \fIMAX_CHUNK_SIZE\fR Specifies the maximum chunk size. The default is file size divided by -the number of connections. +the number of connections and devided by 4. If the calculated value +is smarller than the +.B MIN_CHUNK_SIZE +value, +MIN_CHUNK_SIZE is used. .TP .B \-a \fINR_AHEAD\fR diff --git a/doc/mscp.rst b/doc/mscp.rst index 41ae876..f2109f1 100644 --- a/doc/mscp.rst +++ b/doc/mscp.rst @@ -2,7 +2,7 @@ MSCP ==== -:Date: v0.2.0-8-gef2dd55 +:Date: v0.2.0-9-g675126a NAME ==== @@ -102,7 +102,9 @@ OPTIONS **-S MAX_CHUNK_SIZE** Specifies the maximum chunk size. The default is file size divided by - the number of connections. + the number of connections and devided by 4. If the calculated value + is smarller than the **MIN_CHUNK_SIZE** value, MIN_CHUNK_SIZE is + used. **-a NR_AHEAD** Specifies the number of inflight SFTP commands. The default value is diff --git a/src/main.c b/src/main.c index 2e66202..d3c15fb 100644 --- a/src/main.c +++ b/src/main.c @@ -47,7 +47,7 @@ void usage(bool print_help) " -R CHECKPOINT resume transferring from the checkpoint\n" "\n" " -s MIN_CHUNK_SIZE min chunk size (default: 16M bytes)\n" - " -S MAX_CHUNK_SIZE max chunk size (default: filesize/nr_conn)\n" + " -S MAX_CHUNK_SIZE max chunk size (default: filesize/nr_conn/4)\n" " -a NR_AHEAD number of inflight SFTP commands (default: 32)\n" " -b BUF_SZ buffer size for i/o and transfer\n" " -L LIMIT_BITRATE Limit the bitrate, n[KMG] (default: 0, no limit)\n" diff --git a/src/mscp.c b/src/mscp.c index 1cb60ef..996f797 100644 --- a/src/mscp.c +++ b/src/mscp.c @@ -330,18 +330,10 @@ int mscp_set_dst_path(struct mscp *m, const char *dst_path) return 0; } -static int get_page_mask(void) +static size_t get_page_mask(void) { - long page_sz = sysconf(_SC_PAGESIZE); - size_t page_mask = 0; - int n; - - for (n = 0; page_sz > 0; page_sz >>= 1, n++) { - page_mask <<= 1; - page_mask |= 1; - } - - return page_mask >> 1; + size_t page_sz = sysconf(_SC_PAGESIZE); + return ~(page_sz - 1); } static void mscp_stop_copy_thread(struct mscp *m) diff --git a/src/path.c b/src/path.c index f85e20f..140ad36 100644 --- a/src/path.c +++ b/src/path.c @@ -102,13 +102,10 @@ static int resolve_chunk(struct path *p, size_t size, struct path_resolve_args * size_t chunk_sz, off, len; size_t remaind; - if (size <= a->min_chunk_sz) - chunk_sz = size; - else if (a->max_chunk_sz) + if (a->max_chunk_sz) chunk_sz = a->max_chunk_sz; else { - chunk_sz = (size - (size % a->nr_conn)) / a->nr_conn; - chunk_sz &= ~a->chunk_align; /* align with page_sz */ + chunk_sz = (size / (a->nr_conn * 4)) & a->chunk_align; if (chunk_sz <= a->min_chunk_sz) chunk_sz = a->min_chunk_sz; }