Disable multi thread for content write

It's not necessarely faster, so better to be safe
and avoid possible slowdown.
Also, the original reason of this feature was to detect
potential memory errors, but the original issue triggering this need
was instead not related to it. It was instead the problem to empty links.
This commit is contained in:
Andrea Mazzoleni 2016-01-01 17:42:37 +01:00
parent 354d51725b
commit b059457190
2 changed files with 30 additions and 6 deletions

View file

@ -6,6 +6,10 @@ SnapRAID HISTORY
* Fixes support for symlinks pointing to an empty target. Before they
were only partially supported, and their presence could result in
a content file not readable.
This also disables multi threads content write, as this was the issue
we tried to detect with this feature, as in fact it doesn't provide
a performance advantage. Content verification is instead still multi
threads because it provides a performance advantage.
* Autorename disks using the matching UUID. To rename a disk you can
now change directly the name in the configuration file.
* Improves the physical offset ordering for the Btrfs filesystem,

View file

@ -27,6 +27,26 @@
#include "raid/raid.h"
#include "raid/cpu.h"
/**
* Configure the multithread support.
*
* Multi thread for write could be either faster or slower, depending
* on the specific conditions. With multithreads it's likely faster
* writing to disk, but you'll need to access multiple times the same data,
* being potentially slower.
*
* For upcoming SnapRAID version it's planned to add a mutex protection
* at the filesystem structure, slowing down multiple data access,
* so we disable it.
*
* Multi thread for verify is instead always generally faster,
* so we enable it if possible.
*/
#if HAVE_PTHREAD_CREATE
/* #define HAVE_MT_WRITE 1 */
#define HAVE_MT_VERIFY 1
#endif
const char* lev_name(unsigned l)
{
switch (l) {
@ -2567,7 +2587,7 @@ static void state_read_content(struct snapraid_state* state, const char* path, S
struct state_write_thread_context {
struct snapraid_state* state;
#if HAVE_PTHREAD_CREATE
#if HAVE_MT_WRITE
pthread_t thread;
#endif
/* input */
@ -3016,7 +3036,7 @@ static void* state_write_thread(void* arg)
static void state_write_content(struct snapraid_state* state, uint32_t* out_crc)
{
#ifdef HAVE_PTHREAD_CREATE
#if HAVE_MT_WRITE
int fail;
int first;
#else
@ -3098,7 +3118,7 @@ static void state_write_content(struct snapraid_state* state, uint32_t* out_crc)
}
}
#ifdef HAVE_PTHREAD_CREATE
#if HAVE_MT_WRITE
/* start all writing threads */
i = tommy_list_head(&state->contentlist);
while (i) {
@ -3470,7 +3490,7 @@ void state_read(struct snapraid_state* state)
struct state_verify_thread_context {
struct snapraid_state* state;
struct snapraid_content* content;
#if HAVE_PTHREAD_CREATE
#if HAVE_MT_VERIFY
pthread_t thread;
#else
void* retval;
@ -3556,7 +3576,7 @@ static void state_verify_content(struct snapraid_state* state, uint32_t crc)
context->crc = crc;
context->f = f;
#if HAVE_PTHREAD_CREATE
#if HAVE_MT_VERIFY
if (pthread_create(&context->thread, 0, state_verify_thread, context) != 0) {
/* LCOV_EXCL_START */
log_fatal("Failed to create thread.\n");
@ -3578,7 +3598,7 @@ static void state_verify_content(struct snapraid_state* state, uint32_t crc)
struct state_verify_thread_context* context = content->context;
void* retval;
#if HAVE_PTHREAD_CREATE
#if HAVE_MT_VERIFY
if (pthread_join(context->thread, &retval) != 0) {
/* LCOV_EXCL_START */
log_fatal("Failed to join thread.\n");