1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

manager clean-up ( added pid-file and kill in mysql-test-run when things go wrong)

fixes for IO_CACHE
need to pull Monty's fixes - this is not final, will not be pushed
This commit is contained in:
sasha@mysql.sashanet.com
2001-11-07 16:17:40 -07:00
parent 4f106fe87e
commit cc95bc5765
5 changed files with 158 additions and 69 deletions

View File

@ -46,6 +46,7 @@ static void my_aiowait(my_aio_result *result);
#endif
static void init_read_function(IO_CACHE* info, enum cache_type type);
static void init_write_function(IO_CACHE* info, enum cache_type type);
static void init_read_function(IO_CACHE* info, enum cache_type type)
{
@ -69,6 +70,18 @@ static void init_read_function(IO_CACHE* info, enum cache_type type)
}
}
static void init_write_function(IO_CACHE* info, enum cache_type type)
{
switch (type)
{
case SEQ_READ_APPEND:
info->write_function = _my_b_append;
break;
default:
info->write_function = _my_b_write;
}
}
/*
** if cachesize == 0 then use default cachesize (from s-file)
** if file == -1 then real_open_cached_file() will be called.
@ -91,6 +104,7 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
if (! (cachesize= my_default_record_cache_size))
DBUG_RETURN(1); /* No cache requested */
min_cache=use_async_io ? IO_SIZE*4 : IO_SIZE*2;
info->alloced_buffer = 0;
if (type == READ_CACHE || type == SEQ_READ_APPEND)
{ /* Assume file isn't growing */
if (cache_myflags & MY_DONT_CHECK_FILESIZE)
@ -117,7 +131,6 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
}
}
}
info->alloced_buffer = 0;
if ((int) type < (int) READ_NET)
{
uint buffer_block;
@ -156,8 +169,9 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
info->rc_request_pos=info->rc_pos=info->buffer;
if (type == SEQ_READ_APPEND)
{
info->append_read_pos = info->append_write_pos = info->append_buffer;
info->append_end = info->append_buffer + info->buffer_length;
info->append_read_pos = info->write_pos = info->append_buffer;
info->write_end = info->append_end =
info->append_buffer + info->buffer_length;
#ifdef THREAD
pthread_mutex_init(&info->append_buffer_lock,MY_MUTEX_INIT_FAST);
#endif
@ -170,7 +184,9 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
}
else /* type == WRITE_CACHE */
{
info->rc_end=info->buffer+info->buffer_length- (seek_offset & (IO_SIZE-1));
info->write_end=
info->buffer+info->buffer_length- (seek_offset & (IO_SIZE-1));
info->write_pos = info->buffer;
}
/* end_of_file may be changed by user later */
info->end_of_file= ((type == READ_NET || type == READ_FIFO ) ? 0
@ -178,6 +194,7 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
info->type=type;
info->error=0;
init_read_function(info,type);
init_write_function(info,type);
#ifdef HAVE_AIOWAIT
if (use_async_io && ! my_disable_async_io)
{
@ -238,16 +255,22 @@ my_bool reinit_io_cache(IO_CACHE *info, enum cache_type type,
{ /* use current buffer */
if (info->type == WRITE_CACHE && type == READ_CACHE)
{
info->rc_end=info->rc_pos;
info->rc_end=info->write_pos;
info->end_of_file=my_b_tell(info);
}
else if (type == WRITE_CACHE)
{
if (info->type == READ_CACHE)
info->rc_end=info->buffer+info->buffer_length;
{
info->write_end=info->buffer+info->buffer_length;
info->write_pos=info->rc_pos;
}
info->end_of_file = ~(my_off_t) 0;
}
info->rc_pos=info->rc_request_pos+(seek_offset-info->pos_in_file);
if (type == WRITE_CACHE)
info->write_pos=info->rc_request_pos+(seek_offset-info->pos_in_file);
else
info->rc_pos=info->rc_request_pos+(seek_offset-info->pos_in_file);
#ifdef HAVE_AIOWAIT
my_aiowait(&info->aio_result); /* Wait for outstanding req */
#endif
@ -283,11 +306,12 @@ my_bool reinit_io_cache(IO_CACHE *info, enum cache_type type,
}
if (info->type == SEQ_READ_APPEND)
{
info->append_read_pos = info->append_write_pos = info->append_buffer;
info->append_read_pos = info->write_pos = info->append_buffer;
}
info->type=type;
info->error=0;
init_read_function(info,type);
init_write_function(info,type);
#ifdef HAVE_AIOWAIT
if (type != READ_NET)
{
@ -473,8 +497,8 @@ read_append_buffer:
if (!Count) return 0;
{
uint copy_len = (uint)(info->append_read_pos -
info->append_write_pos);
dbug_assert(info->append_read_pos <= info->append_write_pos);
info->write_pos);
dbug_assert(info->append_read_pos <= info->write_pos);
if (copy_len > Count)
copy_len = Count;
memcpy(Buffer, info->append_read_pos,
@ -679,11 +703,11 @@ int _my_b_write(register IO_CACHE *info, const byte *Buffer, uint Count)
{
uint rest_length,length;
rest_length=(uint) (info->rc_end - info->rc_pos);
memcpy(info->rc_pos,Buffer,(size_t) rest_length);
rest_length=(uint) (info->write_end - info->write_pos);
memcpy(info->write_pos,Buffer,(size_t) rest_length);
Buffer+=rest_length;
Count-=rest_length;
info->rc_pos+=rest_length;
info->write_pos+=rest_length;
if (info->pos_in_file+info->buffer_length > info->end_of_file)
{
my_errno=errno=EFBIG;
@ -705,8 +729,8 @@ int _my_b_write(register IO_CACHE *info, const byte *Buffer, uint Count)
Buffer+=length;
info->pos_in_file+=length;
}
memcpy(info->rc_pos,Buffer,(size_t) Count);
info->rc_pos+=Count;
memcpy(info->write_pos,Buffer,(size_t) Count);
info->write_pos+=Count;
return 0;
}
@ -715,11 +739,11 @@ int _my_b_append(register IO_CACHE *info, const byte *Buffer, uint Count)
uint rest_length,length;
rest_length=(uint) (info->append_end -
info->append_write_pos);
memcpy(info->append_write_pos,Buffer,(size_t) rest_length);
info->write_pos);
memcpy(info->write_pos,Buffer,(size_t) rest_length);
Buffer+=rest_length;
Count-=rest_length;
info->append_write_pos+=rest_length;
info->write_pos+=rest_length;
if (flush_io_cache(info))
return 1;
if (Count >= IO_SIZE)
@ -730,8 +754,8 @@ int _my_b_append(register IO_CACHE *info, const byte *Buffer, uint Count)
Count-=length;
Buffer+=length;
}
memcpy(info->append_write_pos,Buffer,(size_t) Count);
info->append_write_pos+=Count;
memcpy(info->write_pos,Buffer,(size_t) Count);
info->write_pos+=Count;
return 0;
}
@ -775,8 +799,8 @@ int my_block_write(register IO_CACHE *info, const byte *Buffer, uint Count,
Buffer+=length;
Count-= length;
/* Fix length of buffer if the new data was larger */
if (info->buffer+length > info->rc_pos)
info->rc_pos=info->buffer+length;
if (info->buffer+length > info->write_pos)
info->write_pos=info->buffer+length;
if (!Count)
return (error);
}
@ -786,62 +810,61 @@ int my_block_write(register IO_CACHE *info, const byte *Buffer, uint Count,
return error;
}
/* avoid warning about empty if body */
#ifdef THREAD
#define IF_APPEND_CACHE if (append_cache)
#else
#define IF_APPEND_CACHE
#endif
/* Flush write cache */
int flush_io_cache(IO_CACHE *info)
{
uint length;
int append_cache;
DBUG_ENTER("flush_io_cache");
if (info->type == WRITE_CACHE)
append_cache = (info->type == SEQ_READ_APPEND);
if (info->type == WRITE_CACHE || append_cache)
{
if (info->file == -1)
{
if (real_open_cached_file(info))
DBUG_RETURN((info->error= -1));
}
if (info->rc_pos != info->buffer)
IF_APPEND_CACHE
lock_append_buffer(info);
if (info->write_pos != info->buffer)
{
length=(uint) (info->rc_pos - info->buffer);
length=(uint) (info->write_pos - info->buffer);
if (info->seek_not_done)
{ /* File touched, do seek */
if (my_seek(info->file,info->pos_in_file,MY_SEEK_SET,MYF(0)) ==
MY_FILEPOS_ERROR)
{
IF_APPEND_CACHE
unlock_append_buffer(info);
DBUG_RETURN((info->error= -1));
}
info->seek_not_done=0;
}
info->rc_pos=info->buffer;
info->write_pos=info->buffer;
info->pos_in_file+=length;
info->rc_end=(info->buffer+info->buffer_length-
info->write_end=(info->buffer+info->buffer_length-
(info->pos_in_file & (IO_SIZE-1)));
if (my_write(info->file,info->buffer,length,info->myflags | MY_NABP))
DBUG_RETURN((info->error= -1));
DBUG_RETURN(0);
}
}
else if (info->type == SEQ_READ_APPEND)
{
if (info->file == -1)
{
if (real_open_cached_file(info))
DBUG_RETURN((info->error= -1));
}
lock_append_buffer(info);
if (info->append_write_pos != info->append_buffer)
{
length=(uint) (info->append_write_pos - info->append_buffer);
info->append_read_pos=info->append_write_pos=info->append_buffer;
info->append_end=(info->append_buffer+info->buffer_length-
(info->pos_in_file & (IO_SIZE-1)));
if (my_write(info->file,info->buffer,length,info->myflags | MY_NABP))
if (append_cache)
{
unlock_append_buffer(info);
DBUG_RETURN((info->error= -1));
info->append_read_pos = info->buffer;
info->append_end = info->write_end;
}
unlock_append_buffer(info);
DBUG_RETURN(0);
if (my_write(info->file,info->buffer,length,info->myflags | MY_NABP))
info->error= -1;
else
info->error= 0;
IF_APPEND_CACHE
unlock_append_buffer(info);
DBUG_RETURN(info->error);
}
unlock_append_buffer(info);
}
#ifdef HAVE_AIOWAIT
else if (info->type != READ_NET)
@ -867,6 +890,7 @@ int end_io_cache(IO_CACHE *info)
error=flush_io_cache(info);
my_free((gptr) info->buffer,MYF(MY_WME));
info->buffer=info->rc_pos=(byte*) 0;
info->alloced_buffer = 0;
}
DBUG_RETURN(error);
} /* end_io_cache */