feat: sendfile works with -m, error on -f + -c/-s
- load_files_multithreaded skips file_load_data when sendfile is active - -f + -m works: sendfile bypasses loader, sender uses sendfile directly - -f combined with -c or -s prints error and exits with rc=1 - Add Sendfile + Multithreading test case
This commit is contained in:
@@ -49,7 +49,7 @@ The client-server communication uses the following status codes:
|
||||
| `-m` | Enable multithreading mode |
|
||||
| `-c [level]` | Enable compression with optional level (1-22, default: 5) |
|
||||
| `-s` | Enable chunk serialization (batch-transfer all files per chunk) |
|
||||
| `-f` | Enable sendfile (zero-copy file transfer, bypasses userspace memory) |
|
||||
| `-f` | Enable sendfile (zero-copy file transfer, bypasses userspace memory). Can be combined with `-m`. Incompatible with `-c` and `-s`. |
|
||||
| `--source-dir <path>` | Source directory to sync (overrides `FASTSYNC_SOURCE_DIR`) |
|
||||
| `--dest-dir <path>` | Server-side destination directory (overrides `FASTSYNC_DEST_DIR`) |
|
||||
| `--save-to-disk` | Persist received files to disk |
|
||||
|
||||
+9
-7
@@ -86,8 +86,10 @@ int load_files_multithreaded(void *pipeline_context) {
|
||||
mtx_unlock(&context->mutex_loader);
|
||||
return thrd_success;
|
||||
}
|
||||
for (int i = 0; i < chunk->element_count; i++)
|
||||
file_load_data(chunk->items[i]);
|
||||
if (!context->config->use_sendfile) {
|
||||
for (int i = 0; i < chunk->element_count; i++)
|
||||
file_load_data(chunk->items[i]);
|
||||
}
|
||||
queue_enqueue_multithreaded(context->queue_loader, chunk,
|
||||
&context->mutex_loader,
|
||||
&context->condition_not_empty_loader,
|
||||
@@ -152,11 +154,6 @@ int send_files(Config *config) {
|
||||
}
|
||||
|
||||
int send_files_multithreaded(Config *config) {
|
||||
if (config->use_sendfile) {
|
||||
log_message(LOG_LEVEL_INFO, "Sendfile enabled, falling back to single-threaded");
|
||||
return send_files(config);
|
||||
}
|
||||
|
||||
PipelineContextSender *context =
|
||||
pipeline_context_sender_create(config, queue_create(100, chunk_destroy),
|
||||
queue_create(100, chunk_destroy));
|
||||
@@ -238,6 +235,11 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
}
|
||||
|
||||
if (config->use_sendfile && (config->use_chunk_serialization || config->use_compression)) {
|
||||
fprintf(stderr, "Error: -f/--sendfile cannot be combined with -c (compression) or -s (chunk serialization)\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (config->use_multithreading)
|
||||
return send_files_multithreaded(config);
|
||||
return send_files(config);
|
||||
|
||||
Reference in New Issue
Block a user