From dd0880b8ee67f9a69802a2a3ef26cd5df6881129 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Mon, 24 Feb 2020 14:13:01 +0100 Subject: [SERVER] Introduce ignoreAllocErrors If enabled, a failed fallocate will not abort image replication, but retry with sparse mode. --- src/server/globals.c | 3 +++ src/server/globals.h | 6 ++++++ src/server/image.c | 9 +++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/server/globals.c b/src/server/globals.c index f8c3f66..2e87400 100644 --- a/src/server/globals.c +++ b/src/server/globals.c @@ -21,6 +21,7 @@ atomic_int _backgroundReplication = BGR_FULL; atomic_int _bgrMinClients = 0; atomic_bool _lookupMissingForProxy = true; atomic_bool _sparseFiles = false; +atomic_bool _ignoreAllocErrors = false; atomic_bool _removeMissingImages = true; atomic_int _uplinkTimeout = SOCKET_TIMEOUT_UPLINK; atomic_int _clientTimeout = SOCKET_TIMEOUT_CLIENT; @@ -75,6 +76,7 @@ static int ini_handler(void *custom UNUSED, const char* section, const char* key SAVE_TO_VAR_INT( dnbd3, bgrMinClients ); SAVE_TO_VAR_BOOL( dnbd3, lookupMissingForProxy ); SAVE_TO_VAR_BOOL( dnbd3, sparseFiles ); + SAVE_TO_VAR_BOOL( dnbd3, ignoreAllocErrors ); SAVE_TO_VAR_BOOL( dnbd3, removeMissingImages ); SAVE_TO_VAR_BOOL( dnbd3, closeUnusedFd ); SAVE_TO_VAR_UINT( dnbd3, serverPenalty ); @@ -322,6 +324,7 @@ size_t globals_dumpConfig(char *buffer, size_t size) PINT(bgrMinClients); PBOOL(lookupMissingForProxy); PBOOL(sparseFiles); + PBOOL(ignoreAllocErrors); PBOOL(removeMissingImages); PINT(uplinkTimeout); PINT(clientTimeout); diff --git a/src/server/globals.h b/src/server/globals.h index df8c595..b1336dc 100644 --- a/src/server/globals.h +++ b/src/server/globals.h @@ -254,6 +254,12 @@ extern atomic_bool _lookupMissingForProxy; */ extern atomic_bool _sparseFiles; +/** + * If true, don't abort image replication if preallocating + * the image fails, but retry with sparse file. + */ +extern atomic_bool _ignoreAllocErrors; + /** * Port to listen on (default: #define PORT (5003)) */ diff --git a/src/server/image.c b/src/server/image.c index 16dae45..6017e59 100644 --- a/src/server/image.c +++ b/src/server/image.c @@ -1111,14 +1111,19 @@ bool image_create(char *image, int revision, uint64_t size) logadd( LOG_DEBUG1, "Could not allocate %d bytes for %s (errno=%d)", mapsize, cache, err ); } // Now write image + bool fallback = false; if ( !_sparseFiles && !file_alloc( fdImage, 0, size ) ) { logadd( LOG_ERROR, "Could not allocate %" PRIu64 " bytes for %s (errno=%d)", size, path, errno ); logadd( LOG_ERROR, "It is highly recommended to use a file system that supports preallocating disk" " space without actually writing all zeroes to the block device." ); logadd( LOG_ERROR, "If you cannot fix this, try setting sparseFiles=true, but don't expect" " divine performance during replication." ); - goto failure_cleanup; - } else if ( _sparseFiles && !file_setSize( fdImage, size ) ) { + if ( !_ignoreAllocErrors ) { + goto failure_cleanup; + } + fallback = true; + } + if ( ( _sparseFiles || fallback ) && !file_setSize( fdImage, size ) ) { logadd( LOG_ERROR, "Could not create sparse file of %" PRIu64 " bytes for %s (errno=%d)", size, path, errno ); logadd( LOG_ERROR, "Make sure you have enough disk space, check directory permissions, fs errors etc." ); goto failure_cleanup; -- cgit v1.2.3-55-g7522