Add an extra block to avoid that DBUG_ENTER declare variables after code

parent 02f56cc1
...@@ -322,159 +322,165 @@ pthread_handler_t thr_find_all_keys(void *arg) ...@@ -322,159 +322,165 @@ pthread_handler_t thr_find_all_keys(void *arg)
if (my_thread_init()) if (my_thread_init())
goto err; goto err;
DBUG_ENTER("thr_find_all_keys");
DBUG_PRINT("enter", ("master: %d", sort_param->master));
if (sort_param->sort_info->got_error)
goto err;
if (sort_param->keyinfo->flag & HA_VAR_LENGTH_KEY)
{
sort_param->write_keys= write_keys_varlen;
sort_param->read_to_buffer= read_to_buffer_varlen;
sort_param->write_key= write_merge_key_varlen;
}
else
{
sort_param->write_keys= write_keys;
sort_param->read_to_buffer= read_to_buffer;
sort_param->write_key= write_merge_key;
}
my_b_clear(&sort_param->tempfile);
my_b_clear(&sort_param->tempfile_for_exceptions);
bzero((char*) &sort_param->buffpek, sizeof(sort_param->buffpek));
bzero((char*) &sort_param->unique, sizeof(sort_param->unique));
sort_keys= (uchar **) NULL;
memavl= max(sort_param->sortbuff_size, MIN_SORT_MEMORY); { /* Add extra block since DBUG_ENTER declare variables */
idx= sort_param->sort_info->max_records; DBUG_ENTER("thr_find_all_keys");
sort_length= sort_param->key_length; DBUG_PRINT("enter", ("master: %d", sort_param->master));
maxbuffer= 1; if (sort_param->sort_info->got_error)
goto err;
while (memavl >= MIN_SORT_MEMORY) if (sort_param->keyinfo->flag & HA_VAR_LENGTH_KEY)
{ {
if ((my_off_t) (idx+1)*(sort_length+sizeof(char*)) <= sort_param->write_keys= write_keys_varlen;
(my_off_t) memavl) sort_param->read_to_buffer= read_to_buffer_varlen;
keys= idx+1; sort_param->write_key= write_merge_key_varlen;
}
else else
{ {
uint skr; sort_param->write_keys= write_keys;
do sort_param->read_to_buffer= read_to_buffer;
sort_param->write_key= write_merge_key;
}
my_b_clear(&sort_param->tempfile);
my_b_clear(&sort_param->tempfile_for_exceptions);
bzero((char*) &sort_param->buffpek, sizeof(sort_param->buffpek));
bzero((char*) &sort_param->unique, sizeof(sort_param->unique));
sort_keys= (uchar **) NULL;
memavl= max(sort_param->sortbuff_size, MIN_SORT_MEMORY);
idx= sort_param->sort_info->max_records;
sort_length= sort_param->key_length;
maxbuffer= 1;
while (memavl >= MIN_SORT_MEMORY)
{
if ((my_off_t) (idx+1)*(sort_length+sizeof(char*)) <=
(my_off_t) memavl)
keys= idx+1;
else
{ {
skr=maxbuffer; uint skr;
if (memavl < sizeof(BUFFPEK)*maxbuffer || do
(keys=(memavl-sizeof(BUFFPEK)*maxbuffer)/
(sort_length+sizeof(char*))) <= 1 ||
keys < (uint) maxbuffer)
{ {
mi_check_print_error(sort_param->sort_info->param, skr= maxbuffer;
"sort_buffer_size is to small"); if (memavl < sizeof(BUFFPEK)*maxbuffer ||
goto err; (keys=(memavl-sizeof(BUFFPEK)*maxbuffer)/
(sort_length+sizeof(char*))) <= 1 ||
keys < (uint) maxbuffer)
{
mi_check_print_error(sort_param->sort_info->param,
"sort_buffer_size is to small");
goto err;
}
} }
while ((maxbuffer= (int) (idx/(keys-1)+1)) != skr);
} }
while ((maxbuffer= (int) (idx/(keys-1)+1)) != skr); if ((sort_keys= (uchar**)
} my_malloc(keys*(sort_length+sizeof(char*))+
if ((sort_keys= (uchar**) ((sort_param->keyinfo->flag & HA_FULLTEXT) ?
my_malloc(keys*(sort_length+sizeof(char*))+ HA_FT_MAXBYTELEN : 0), MYF(0))))
((sort_param->keyinfo->flag & HA_FULLTEXT) ?
HA_FT_MAXBYTELEN : 0), MYF(0))))
{
if (my_init_dynamic_array(&sort_param->buffpek, sizeof(BUFFPEK),
maxbuffer, maxbuffer/2))
{ {
my_free((gptr) sort_keys,MYF(0)); if (my_init_dynamic_array(&sort_param->buffpek, sizeof(BUFFPEK),
sort_keys= (uchar **) NULL; /* for err: label */ maxbuffer, maxbuffer/2))
{
my_free((gptr) sort_keys,MYF(0));
sort_keys= (uchar **) NULL; /* for err: label */
}
else
break;
} }
else old_memavl= memavl;
break; if ((memavl= memavl/4*3) < MIN_SORT_MEMORY &&
old_memavl > MIN_SORT_MEMORY)
memavl= MIN_SORT_MEMORY;
}
if (memavl < MIN_SORT_MEMORY)
{
mi_check_print_error(sort_param->sort_info->param,
"Sort buffer too small");
goto err; /* purecov: tested */
} }
old_memavl=memavl;
if ((memavl=memavl/4*3) < MIN_SORT_MEMORY && old_memavl > MIN_SORT_MEMORY)
memavl=MIN_SORT_MEMORY;
}
if (memavl < MIN_SORT_MEMORY)
{
mi_check_print_error(sort_param->sort_info->param, "Sort buffer too small");
goto err; /* purecov: tested */
}
if (sort_param->sort_info->param->testflag & T_VERBOSE) if (sort_param->sort_info->param->testflag & T_VERBOSE)
printf("Key %d - Allocating buffer for %d keys\n", printf("Key %d - Allocating buffer for %d keys\n",
sort_param->key + 1, keys); sort_param->key + 1, keys);
sort_param->sort_keys= sort_keys; sort_param->sort_keys= sort_keys;
idx=error=0; idx= error= 0;
sort_keys[0]=(uchar*) (sort_keys+keys); sort_keys[0]= (uchar*) (sort_keys+keys);
DBUG_PRINT("info", ("reading keys")); DBUG_PRINT("info", ("reading keys"));
while (!(error= sort_param->sort_info->got_error) && while (!(error= sort_param->sort_info->got_error) &&
!(error= (*sort_param->key_read)(sort_param, sort_keys[idx]))) !(error= (*sort_param->key_read)(sort_param, sort_keys[idx])))
{
if (sort_param->real_key_length > sort_param->key_length)
{ {
if (write_key(sort_param, sort_keys[idx], if (sort_param->real_key_length > sort_param->key_length)
&sort_param->tempfile_for_exceptions)) {
goto err; if (write_key(sort_param, sort_keys[idx],
continue; &sort_param->tempfile_for_exceptions))
} goto err;
continue;
}
if (++idx == keys) if (++idx == keys)
{
if (sort_param->write_keys(sort_param, sort_keys, idx - 1,
(BUFFPEK*) alloc_dynamic(&sort_param->buffpek),
&sort_param->tempfile))
goto err;
sort_keys[0]= (uchar*) (sort_keys+keys);
memcpy(sort_keys[0], sort_keys[idx - 1], (size_t) sort_param->key_length);
idx= 1;
}
sort_keys[idx]= sort_keys[idx - 1] + sort_param->key_length;
}
if (error > 0)
goto err;
if (sort_param->buffpek.elements)
{ {
if (sort_param->write_keys(sort_param, sort_keys, idx - 1, if (sort_param->write_keys(sort_param, sort_keys, idx,
(BUFFPEK*) alloc_dynamic(&sort_param->buffpek), (BUFFPEK*) alloc_dynamic(&sort_param->buffpek),
&sort_param->tempfile)) &sort_param->tempfile))
goto err; goto err;
sort_keys[0]=(uchar*) (sort_keys+keys); sort_param->keys= (sort_param->buffpek.elements - 1) * (keys - 1) + idx;
memcpy(sort_keys[0], sort_keys[idx - 1], (size_t) sort_param->key_length);
idx=1;
} }
sort_keys[idx]= sort_keys[idx - 1] + sort_param->key_length; else
} sort_param->keys= idx;
if (error > 0)
goto err;
if (sort_param->buffpek.elements)
{
if (sort_param->write_keys(sort_param, sort_keys, idx,
(BUFFPEK*) alloc_dynamic(&sort_param->buffpek),
&sort_param->tempfile))
goto err;
sort_param->keys= (sort_param->buffpek.elements - 1) * (keys - 1) + idx;
}
else
sort_param->keys= idx;
sort_param->sort_keys_length= keys; sort_param->sort_keys_length= keys;
goto ok; goto ok;
err: err:
DBUG_PRINT("error", ("got some error")); DBUG_PRINT("error", ("got some error"));
sort_param->sort_info->got_error= 1; /* no need to protect with a mutex */ sort_param->sort_info->got_error= 1; /* no need to protect with a mutex */
if (sort_keys) if (sort_keys)
my_free((gptr) sort_keys,MYF(0)); my_free((gptr) sort_keys,MYF(0));
sort_param->sort_keys= 0; sort_param->sort_keys= 0;
delete_dynamic(& sort_param->buffpek); delete_dynamic(& sort_param->buffpek);
close_cached_file(&sort_param->tempfile); close_cached_file(&sort_param->tempfile);
close_cached_file(&sort_param->tempfile_for_exceptions); close_cached_file(&sort_param->tempfile_for_exceptions);
ok: ok:
/* /*
Detach from the share if the writer is involved. Avoid others to Detach from the share if the writer is involved. Avoid others to
be blocked. This includes a flush of the write buffer. This will be blocked. This includes a flush of the write buffer. This will
also indicate EOF to the readers. also indicate EOF to the readers.
*/ */
if (sort_param->sort_info->info->rec_cache.share) if (sort_param->sort_info->info->rec_cache.share)
remove_io_thread(&sort_param->sort_info->info->rec_cache); remove_io_thread(&sort_param->sort_info->info->rec_cache);
/* Readers detach from the share if any. Avoid others to be blocked. */ /* Readers detach from the share if any. Avoid others to be blocked. */
if (sort_param->read_cache.share) if (sort_param->read_cache.share)
remove_io_thread(&sort_param->read_cache); remove_io_thread(&sort_param->read_cache);
pthread_mutex_lock(&sort_param->sort_info->mutex); pthread_mutex_lock(&sort_param->sort_info->mutex);
if (!--sort_param->sort_info->threads_running) if (!--sort_param->sort_info->threads_running)
pthread_cond_signal(&sort_param->sort_info->cond); pthread_cond_signal(&sort_param->sort_info->cond);
pthread_mutex_unlock(&sort_param->sort_info->mutex); pthread_mutex_unlock(&sort_param->sort_info->mutex);
DBUG_PRINT("exit", ("======== ending thread ========")); DBUG_PRINT("exit", ("======== ending thread ========"));
}
my_thread_end(); my_thread_end();
return NULL; return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment