mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
fixed bug in parallel repair
This commit is contained in:
@@ -441,7 +441,7 @@ void init_io_cache_share(IO_CACHE *info, IO_CACHE_SHARE *s, uint num_threads)
|
||||
DBUG_ASSERT(info->type == READ_CACHE);
|
||||
pthread_mutex_init(&s->mutex, MY_MUTEX_INIT_FAST);
|
||||
pthread_cond_init (&s->cond, 0);
|
||||
s->count=num_threads-1;
|
||||
s->total=s->count=num_threads-1;
|
||||
s->active=0; /* to catch errors */
|
||||
info->share=s;
|
||||
info->read_function=_my_b_read_r;
|
||||
@@ -456,32 +456,36 @@ void init_io_cache_share(IO_CACHE *info, IO_CACHE_SHARE *s, uint num_threads)
|
||||
*/
|
||||
void remove_io_thread(IO_CACHE *info)
|
||||
{
|
||||
pthread_mutex_lock(&info->share->mutex);
|
||||
if (! info->share->count--)
|
||||
pthread_cond_signal(&info->share->cond);
|
||||
pthread_mutex_unlock(&info->share->mutex);
|
||||
IO_CACHE_SHARE *s=info->share;
|
||||
|
||||
pthread_mutex_lock(&s->mutex);
|
||||
s->total--;
|
||||
if (! s->count--)
|
||||
pthread_cond_signal(&s->cond);
|
||||
pthread_mutex_unlock(&s->mutex);
|
||||
}
|
||||
|
||||
static int lock_io_cache(IO_CACHE *info)
|
||||
{
|
||||
pthread_mutex_lock(&info->share->mutex);
|
||||
if (!info->share->count)
|
||||
int total;
|
||||
IO_CACHE_SHARE *s=info->share;
|
||||
|
||||
pthread_mutex_lock(&s->mutex);
|
||||
if (!s->count)
|
||||
{
|
||||
s->count=s->total;
|
||||
return 1;
|
||||
}
|
||||
|
||||
total=s->total;
|
||||
s->count--;
|
||||
pthread_cond_wait(&s->cond, &s->mutex);
|
||||
|
||||
if (s->total < total)
|
||||
return 1;
|
||||
|
||||
--(info->share->count);
|
||||
pthread_cond_wait(&info->share->cond, &info->share->mutex);
|
||||
/*
|
||||
count can be -1 here, if one thread was removed (remove_io_thread)
|
||||
while all others were locked (lock_io_cache).
|
||||
If this is the case, this thread behaves as if count was 0 from the
|
||||
very beginning, that is returns 1 and does not unlock the mutex.
|
||||
*/
|
||||
if (++(info->share->count))
|
||||
{
|
||||
pthread_mutex_unlock(&info->share->mutex);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
pthread_mutex_unlock(&s->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void unlock_io_cache(IO_CACHE *info)
|
||||
@@ -1132,19 +1136,15 @@ int end_io_cache(IO_CACHE *info)
|
||||
DBUG_ENTER("end_io_cache");
|
||||
|
||||
#ifdef THREAD
|
||||
/*
|
||||
if IO_CACHE is shared between several threads, only one
|
||||
thread needs to call end_io_cache() - just as init_io_cache()
|
||||
should be called only once and then memcopy'ed
|
||||
*/
|
||||
if (info->share)
|
||||
{
|
||||
#ifdef SAFE_MUTEX
|
||||
/* simple protection against multi-close: destroying share first */
|
||||
if (pthread_cond_destroy (&info->share->cond) |
|
||||
pthread_mutex_destroy(&info->share->mutex))
|
||||
{
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
#else
|
||||
pthread_cond_destroy (&info->share->cond);
|
||||
pthread_mutex_destroy(&info->share->mutex);
|
||||
#endif
|
||||
info->share=0;
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user