Commit 298541f7 authored by unknown's avatar unknown

Merge bk-internal.mysql.com:/home/bk/mysql-maria

into  mysql.com:/home/my/mysql-maria


storage/maria/ma_blockrec.c:
  Auto merged
storage/maria/ma_check.c:
  Auto merged
storage/maria/ma_loghandler.c:
  Auto merged
storage/maria/maria_def.h:
  Auto merged
parents f7df9add 8224c76f
...@@ -330,8 +330,7 @@ static pthread_mutex_t THR_LOCK_dbug; ...@@ -330,8 +330,7 @@ static pthread_mutex_t THR_LOCK_dbug;
static CODE_STATE *code_state(void) static CODE_STATE *code_state(void)
{ {
CODE_STATE *cs=0; CODE_STATE *cs, **cs_ptr;
my_bool error;
if (!init_done) if (!init_done)
{ {
...@@ -342,7 +341,9 @@ static CODE_STATE *code_state(void) ...@@ -342,7 +341,9 @@ static CODE_STATE *code_state(void)
init_done=TRUE; init_done=TRUE;
} }
if (!(cs= (CODE_STATE*) my_thread_var_get_dbug(&error)) && !error) if (!(cs_ptr= (CODE_STATE**) my_thread_var_dbug()))
return 0; /* Thread not initialised */
if (!(cs= *cs_ptr))
{ {
cs=(CODE_STATE*) DbugMalloc(sizeof(*cs)); cs=(CODE_STATE*) DbugMalloc(sizeof(*cs));
bzero((uchar*) cs,sizeof(*cs)); bzero((uchar*) cs,sizeof(*cs));
...@@ -350,7 +351,7 @@ static CODE_STATE *code_state(void) ...@@ -350,7 +351,7 @@ static CODE_STATE *code_state(void)
cs->func="?func"; cs->func="?func";
cs->file="?file"; cs->file="?file";
cs->stack=&init_settings; cs->stack=&init_settings;
my_thread_var_set_dbug((void*) cs); *cs_ptr= cs;
} }
return cs; return cs;
} }
......
...@@ -446,7 +446,7 @@ int my_pthread_mutex_trylock(pthread_mutex_t *mutex); ...@@ -446,7 +446,7 @@ int my_pthread_mutex_trylock(pthread_mutex_t *mutex);
typedef struct st_safe_mutex_t typedef struct st_safe_mutex_t
{ {
pthread_mutex_t global,mutex; pthread_mutex_t global,mutex;
const char *file; const char *file, *name;
uint line,count; uint line,count;
pthread_t thread; pthread_t thread;
#ifdef SAFE_MUTEX_DETECT_DESTROY #ifdef SAFE_MUTEX_DETECT_DESTROY
...@@ -471,7 +471,7 @@ typedef struct st_safe_mutex_info_t ...@@ -471,7 +471,7 @@ typedef struct st_safe_mutex_info_t
#endif /* SAFE_MUTEX_DETECT_DESTROY */ #endif /* SAFE_MUTEX_DETECT_DESTROY */
int safe_mutex_init(safe_mutex_t *mp, const pthread_mutexattr_t *attr, int safe_mutex_init(safe_mutex_t *mp, const pthread_mutexattr_t *attr,
const char *file, uint line); const char *file, uint line, const char *name);
int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line); int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line);
int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line); int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line);
int safe_mutex_destroy(safe_mutex_t *mp,const char *file, uint line); int safe_mutex_destroy(safe_mutex_t *mp,const char *file, uint line);
...@@ -494,7 +494,7 @@ void safe_mutex_end(FILE *file); ...@@ -494,7 +494,7 @@ void safe_mutex_end(FILE *file);
#undef pthread_cond_wait #undef pthread_cond_wait
#undef pthread_cond_timedwait #undef pthread_cond_timedwait
#undef pthread_mutex_trylock #undef pthread_mutex_trylock
#define pthread_mutex_init(A,B) safe_mutex_init((A),(B),__FILE__,__LINE__) #define pthread_mutex_init(A,B) safe_mutex_init((A),(B),__FILE__,__LINE__,#A)
#define pthread_mutex_lock(A) safe_mutex_lock((A),__FILE__,__LINE__) #define pthread_mutex_lock(A) safe_mutex_lock((A),__FILE__,__LINE__)
#define pthread_mutex_unlock(A) safe_mutex_unlock((A),__FILE__,__LINE__) #define pthread_mutex_unlock(A) safe_mutex_unlock((A),__FILE__,__LINE__)
#define pthread_mutex_destroy(A) safe_mutex_destroy((A),__FILE__,__LINE__) #define pthread_mutex_destroy(A) safe_mutex_destroy((A),__FILE__,__LINE__)
...@@ -680,8 +680,7 @@ struct st_my_thread_var ...@@ -680,8 +680,7 @@ struct st_my_thread_var
}; };
extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const)); extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const));
extern void *my_thread_var_get_dbug(my_bool *error); extern void **my_thread_var_dbug();
extern void my_thread_var_set_dbug(void *dbug);
extern uint my_thread_end_wait_time; extern uint my_thread_end_wait_time;
#define my_thread_var (_my_thread_var()) #define my_thread_var (_my_thread_var())
#define my_errno my_thread_var->thr_errno #define my_errno my_thread_var->thr_errno
......
...@@ -386,27 +386,13 @@ struct st_my_thread_var *_my_thread_var(void) ...@@ -386,27 +386,13 @@ struct st_my_thread_var *_my_thread_var(void)
} }
#ifndef DBUG_OFF #ifndef DBUG_OFF
/* Return pointer to DBUG for holding current state */
extern void *my_thread_var_get_dbug(my_bool *error) extern void **my_thread_var_dbug()
{ {
struct st_my_thread_var *tmp= struct st_my_thread_var *tmp=
my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys); my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys);
my_bool tmp_error; return tmp ? &tmp->dbug : 0;
if (!error)
error= &tmp_error;
if (tmp)
{
*error= 0;
return tmp->dbug;
}
*error= 1; /* no THR_KEY_mysys */
return (void*) 0;
}
extern void my_thread_var_set_dbug(void *dbug)
{
struct st_my_thread_var *tmp= _my_thread_var();
tmp->dbug= dbug;
} }
#endif #endif
......
...@@ -54,7 +54,7 @@ void safe_mutex_global_init(void) ...@@ -54,7 +54,7 @@ void safe_mutex_global_init(void)
int safe_mutex_init(safe_mutex_t *mp, int safe_mutex_init(safe_mutex_t *mp,
const pthread_mutexattr_t *attr __attribute__((unused)), const pthread_mutexattr_t *attr __attribute__((unused)),
const char *file, const char *file,
uint line) uint line, const char *name)
{ {
bzero((char*) mp,sizeof(*mp)); bzero((char*) mp,sizeof(*mp));
pthread_mutex_init(&mp->global,MY_MUTEX_INIT_ERRCHK); pthread_mutex_init(&mp->global,MY_MUTEX_INIT_ERRCHK);
...@@ -62,6 +62,8 @@ int safe_mutex_init(safe_mutex_t *mp, ...@@ -62,6 +62,8 @@ int safe_mutex_init(safe_mutex_t *mp,
/* Mark that mutex is initialized */ /* Mark that mutex is initialized */
mp->file= file; mp->file= file;
mp->line= line; mp->line= line;
/* Skip the very common '&' prefix from the autogenerated name */
mp->name= name[0] == '&' ? name + 1 : name;
#ifdef SAFE_MUTEX_DETECT_DESTROY #ifdef SAFE_MUTEX_DETECT_DESTROY
/* /*
...@@ -94,10 +96,8 @@ int safe_mutex_init(safe_mutex_t *mp, ...@@ -94,10 +96,8 @@ int safe_mutex_init(safe_mutex_t *mp,
int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line) int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line)
{ {
int error; int error;
#ifndef DBUG_OFF DBUG_PRINT("mutex", ("%s (0x%lx) locking", mp->name ? mp->name : "Null",
if (my_thread_var_get_dbug((my_bool*) 0)) (ulong) mp));
DBUG_PRINT("mutex", ("0x%lx locking", (ulong) mp));
#endif
if (!mp->file) if (!mp->file)
{ {
fprintf(stderr, fprintf(stderr,
...@@ -110,8 +110,8 @@ int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line) ...@@ -110,8 +110,8 @@ int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line)
pthread_mutex_lock(&mp->global); pthread_mutex_lock(&mp->global);
if (mp->count > 0 && pthread_equal(pthread_self(),mp->thread)) if (mp->count > 0 && pthread_equal(pthread_self(),mp->thread))
{ {
fprintf(stderr,"safe_mutex: Trying to lock mutex at %s, line %d, when the mutex was already locked at %s, line %d in thread %s\n", fprintf(stderr,"safe_mutex: Trying to lock mutex %s at %s, line %d, when the mutex was already locked at %s, line %d in thread %s\n",
file,line,mp->file, mp->line, my_thread_name()); mp->name, file,line,mp->file, mp->line, my_thread_name());
fflush(stderr); fflush(stderr);
abort(); abort();
} }
...@@ -119,26 +119,23 @@ int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line) ...@@ -119,26 +119,23 @@ int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line)
error=pthread_mutex_lock(&mp->mutex); error=pthread_mutex_lock(&mp->mutex);
if (error || (error=pthread_mutex_lock(&mp->global))) if (error || (error=pthread_mutex_lock(&mp->global)))
{ {
fprintf(stderr,"Got error %d when trying to lock mutex at %s, line %d\n", fprintf(stderr,"Got error %d when trying to lock mutex %s at %s, line %d\n",
error, file, line); error, mp->name, file, line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
mp->thread= pthread_self(); mp->thread= pthread_self();
if (mp->count++) if (mp->count++)
{ {
fprintf(stderr,"safe_mutex: Error in thread libray: Got mutex at %s, \ fprintf(stderr,"safe_mutex: Error in thread libray: Got mutex %s at %s, "
line %d more than 1 time\n", file,line); "line %d more than 1 time\n", mp->name, file,line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
mp->file= file; mp->file= file;
mp->line=line; mp->line= line;
pthread_mutex_unlock(&mp->global); pthread_mutex_unlock(&mp->global);
#ifndef DBUG_OFF DBUG_PRINT("mutex", ("%s (0x%lx) locked", mp->name, (ulong) mp));
if (my_thread_var_get_dbug((my_bool*) 0))
DBUG_PRINT("mutex", ("0x%lx locked", (ulong) mp));
#endif
return error; return error;
} }
...@@ -146,22 +143,22 @@ line %d more than 1 time\n", file,line); ...@@ -146,22 +143,22 @@ line %d more than 1 time\n", file,line);
int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line) int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line)
{ {
int error; int error;
#ifndef DBUG_OFF DBUG_PRINT("mutex", ("%s (0x%lx) unlocking", mp->name, (ulong) mp));
if (my_thread_var_get_dbug((my_bool*) 0))
DBUG_PRINT("mutex", ("0x%lx unlocking", (ulong) mp));
#endif
pthread_mutex_lock(&mp->global); pthread_mutex_lock(&mp->global);
if (mp->count == 0) if (mp->count == 0)
{ {
fprintf(stderr,"safe_mutex: Trying to unlock mutex that wasn't locked at %s, line %d\n Last used at %s, line: %d\n", fprintf(stderr,"safe_mutex: Trying to unlock mutex %s that wasn't locked at %s, line %d\n"
file,line,mp->file ? mp->file : "",mp->line); "Last used at %s, line: %d\n",
mp->name ? mp->name : "Null", file, line,
mp->file ? mp->file : "Null", mp->line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
if (!pthread_equal(pthread_self(),mp->thread)) if (!pthread_equal(pthread_self(),mp->thread))
{ {
fprintf(stderr,"safe_mutex: Trying to unlock mutex at %s, line %d that was locked by another thread at: %s, line: %d\n", fprintf(stderr,"safe_mutex: Trying to unlock mutex %s at %s, line %d that was locked by "
file,line,mp->file,mp->line); "another thread at: %s, line: %d\n",
mp->name, file, line, mp->file, mp->line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
...@@ -174,7 +171,8 @@ int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line) ...@@ -174,7 +171,8 @@ int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line)
error=pthread_mutex_unlock(&mp->mutex); error=pthread_mutex_unlock(&mp->mutex);
if (error) if (error)
{ {
fprintf(stderr,"safe_mutex: Got error: %d (%d) when trying to unlock mutex at %s, line %d\n", error, errno, file, line); fprintf(stderr,"safe_mutex: Got error: %d (%d) when trying to unlock mutex %s at %s, "
"line %d\n", error, errno, mp->name, file, line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
...@@ -191,22 +189,24 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file, ...@@ -191,22 +189,24 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file,
pthread_mutex_lock(&mp->global); pthread_mutex_lock(&mp->global);
if (mp->count == 0) if (mp->count == 0)
{ {
fprintf(stderr,"safe_mutex: Trying to cond_wait on a unlocked mutex at %s, line %d\n",file,line); fprintf(stderr,"safe_mutex: Trying to cond_wait on a unlocked mutex %s at %s, line %d\n",
mp->name ? mp->name : "Null", file, line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
if (!pthread_equal(pthread_self(),mp->thread)) if (!pthread_equal(pthread_self(),mp->thread))
{ {
fprintf(stderr,"safe_mutex: Trying to cond_wait on a mutex at %s, line %d that was locked by another thread at: %s, line: %d\n", fprintf(stderr,"safe_mutex: Trying to cond_wait on a mutex %s at %s, line %d that was "
file,line,mp->file,mp->line); "locked by another thread at: %s, line: %d\n",
mp->name, file, line, mp->file, mp->line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
if (mp->count-- != 1) if (mp->count-- != 1)
{ {
fprintf(stderr,"safe_mutex: Count was %d on locked mutex at %s, line %d\n", fprintf(stderr,"safe_mutex: Count was %d on locked mutex %s at %s, line %d\n",
mp->count+1, file, line); mp->count+1, mp->name, file, line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
...@@ -215,7 +215,8 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file, ...@@ -215,7 +215,8 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file,
pthread_mutex_lock(&mp->global); pthread_mutex_lock(&mp->global);
if (error) if (error)
{ {
fprintf(stderr,"safe_mutex: Got error: %d (%d) when doing a safe_mutex_wait at %s, line %d\n", error, errno, file, line); fprintf(stderr,"safe_mutex: Got error: %d (%d) when doing a safe_mutex_wait on %s at %s, "
"line %d\n", error, errno, mp->name, file, line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
...@@ -223,8 +224,8 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file, ...@@ -223,8 +224,8 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file,
if (mp->count++) if (mp->count++)
{ {
fprintf(stderr, fprintf(stderr,
"safe_mutex: Count was %d in thread 0x%lx when locking mutex at %s, line %d\n", "safe_mutex: Count was %d in thread 0x%lx when locking mutex %s at %s, line %d\n",
mp->count-1, my_thread_dbug_id(), file, line); mp->count-1, my_thread_dbug_id(), mp->name, file, line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
...@@ -243,7 +244,8 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp, ...@@ -243,7 +244,8 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,
pthread_mutex_lock(&mp->global); pthread_mutex_lock(&mp->global);
if (mp->count != 1 || !pthread_equal(pthread_self(),mp->thread)) if (mp->count != 1 || !pthread_equal(pthread_self(),mp->thread))
{ {
fprintf(stderr,"safe_mutex: Trying to cond_wait at %s, line %d on a not hold mutex\n",file,line); fprintf(stderr,"safe_mutex: Trying to cond_wait at %s, line %d on a not hold mutex %s\n",
file, line, mp->name ? mp->name : "Null");
fflush(stderr); fflush(stderr);
abort(); abort();
} }
...@@ -253,7 +255,10 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp, ...@@ -253,7 +255,10 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
if (error && (error != EINTR && error != ETIMEDOUT && error != ETIME)) if (error && (error != EINTR && error != ETIMEDOUT && error != ETIME))
{ {
fprintf(stderr,"safe_mutex: Got error: %d (%d) when doing a safe_mutex_timedwait at %s, line %d\n", error, errno, file, line); fprintf(stderr,
"safe_mutex: Got error: %d (%d) when doing a safe_mutex_timedwait on %s at %s, "
"line %d\n",
error, errno, mp->name, file, line);
} }
#endif #endif
pthread_mutex_lock(&mp->global); pthread_mutex_lock(&mp->global);
...@@ -261,8 +266,10 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp, ...@@ -261,8 +266,10 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,
if (mp->count++) if (mp->count++)
{ {
fprintf(stderr, fprintf(stderr,
"safe_mutex: Count was %d in thread 0x%lx when locking mutex at %s, line %d (error: %d (%d))\n", "safe_mutex: Count was %d in thread 0x%lx when locking mutex %s at %s, line %d "
mp->count-1, my_thread_dbug_id(), file, line, error, error); "(error: %d (%d))\n",
mp->count-1, my_thread_dbug_id(), mp->name, file, line,
error, error);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
...@@ -286,8 +293,9 @@ int safe_mutex_destroy(safe_mutex_t *mp, const char *file, uint line) ...@@ -286,8 +293,9 @@ int safe_mutex_destroy(safe_mutex_t *mp, const char *file, uint line)
} }
if (mp->count != 0) if (mp->count != 0)
{ {
fprintf(stderr,"safe_mutex: Trying to destroy a mutex that was locked at %s, line %d at %s, line %d\n", fprintf(stderr,"safe_mutex: Trying to destroy a mutex %s that was locked at %s, "
mp->file,mp->line, file, line); "line %d at %s, line %d\n",
mp->name, mp->file, mp->line, file, line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
...@@ -359,8 +367,8 @@ void safe_mutex_end(FILE *file __attribute__((unused))) ...@@ -359,8 +367,8 @@ void safe_mutex_end(FILE *file __attribute__((unused)))
struct st_safe_mutex_info_t *ptr; struct st_safe_mutex_info_t *ptr;
for (ptr= safe_mutex_root ; ptr ; ptr= ptr->next) for (ptr= safe_mutex_root ; ptr ; ptr= ptr->next)
{ {
fprintf(file, "\tMutex initiated at line %4u in '%s'\n", fprintf(file, "\tMutex %s initiated at line %4u in '%s'\n",
ptr->init_line, ptr->init_file); ptr->name, ptr->init_line, ptr->init_file);
(void) fflush(file); (void) fflush(file);
} }
} }
......
...@@ -147,18 +147,20 @@ void wqueue_release_queue(WQUEUE *wqueue) ...@@ -147,18 +147,20 @@ void wqueue_release_queue(WQUEUE *wqueue)
*/ */
void wqueue_add_and_wait(WQUEUE *wqueue, void wqueue_add_and_wait(WQUEUE *wqueue,
struct st_my_thread_var *thread, pthread_mutex_t *lock) struct st_my_thread_var *thread,
pthread_mutex_t *lock)
{ {
DBUG_ENTER("wqueue_add_and_wait"); DBUG_ENTER("wqueue_add_and_wait");
DBUG_PRINT("enter", ("thread ox%lxcond 0x%lx, mutex 0x%lx", DBUG_PRINT("enter",
(ulong) thread, (ulong) &thread->suspend, (ulong) lock)); ("thread: 0x%lx cond: 0x%lx mutex: 0x%lx",
(ulong) thread, (ulong) &thread->suspend, (ulong) lock));
wqueue_add_to_queue(wqueue, thread); wqueue_add_to_queue(wqueue, thread);
do do
{ {
DBUG_PRINT("info", ("wait... cond 0x%lx, mutex 0x%lx", DBUG_PRINT("info", ("wait... cond: 0x%lx mutex: 0x%lx",
(ulong) &thread->suspend, (ulong) lock)); (ulong) &thread->suspend, (ulong) lock));
pthread_cond_wait(&thread->suspend, lock); pthread_cond_wait(&thread->suspend, lock);
DBUG_PRINT("info", ("wait done cond 0x%lx, mutex 0x%lx, next 0x%lx", DBUG_PRINT("info", ("wait done cond: 0x%lx mutex: 0x%lx next: 0x%lx",
(ulong) &thread->suspend, (ulong) lock, (ulong) &thread->suspend, (ulong) lock,
(ulong) thread->next)); (ulong) thread->next));
} }
......
...@@ -169,5 +169,8 @@ SUFFIXES = .sh ...@@ -169,5 +169,8 @@ SUFFIXES = .sh
@CHMOD@ +x $@-t @CHMOD@ +x $@-t
@MV@ $@-t $@ @MV@ $@-t $@
tags:
etags *.h *.c *.cc
# Don't update the files from bitkeeper # Don't update the files from bitkeeper
%::SCCS/s.% %::SCCS/s.%
...@@ -1060,8 +1060,8 @@ static void calc_record_size(MARIA_HA *info, const uchar *record, ...@@ -1060,8 +1060,8 @@ static void calc_record_size(MARIA_HA *info, const uchar *record,
row->normal_length + row->normal_length +
row->char_length + row->varchar_length); row->char_length + row->varchar_length);
row->total_length= (row->head_length + row->blob_length); row->total_length= (row->head_length + row->blob_length);
if (row->total_length < share->base.min_row_length) if (row->total_length < share->base.min_block_length)
row->total_length= share->base.min_row_length; row->total_length= share->base.min_block_length;
DBUG_PRINT("exit", ("head_length: %lu total_length: %lu", DBUG_PRINT("exit", ("head_length: %lu total_length: %lu",
(ulong) row->head_length, (ulong) row->total_length)); (ulong) row->head_length, (ulong) row->total_length));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -2084,12 +2084,13 @@ static my_bool write_block_record(MARIA_HA *info, ...@@ -2084,12 +2084,13 @@ static my_bool write_block_record(MARIA_HA *info,
uint length= (uint) (data - row_pos->data); uint length= (uint) (data - row_pos->data);
DBUG_PRINT("info", ("Used head length on page: %u", length)); DBUG_PRINT("info", ("Used head length on page: %u", length));
DBUG_ASSERT(data <= end_of_data); DBUG_ASSERT(data <= end_of_data);
if (length < info->s->base.min_row_length) if (length < info->s->base.min_block_length)
{ {
uint diff_length= info->s->base.min_row_length - length; /* Extend row to be of size min_block_length */
uint diff_length= info->s->base.min_block_length - length;
bzero(data, diff_length); bzero(data, diff_length);
data+= diff_length; data+= diff_length;
length= info->s->base.min_row_length; length= info->s->base.min_block_length;
} }
int2store(row_pos->dir + 2, length); int2store(row_pos->dir + 2, length);
/* update empty space at start of block */ /* update empty space at start of block */
...@@ -3576,7 +3577,7 @@ static my_bool read_long_data(MARIA_HA *info, uchar *to, ulong length, ...@@ -3576,7 +3577,7 @@ static my_bool read_long_data(MARIA_HA *info, uchar *to, ulong length,
Fields are never split in middle. This means that if length > rest-of-data Fields are never split in middle. This means that if length > rest-of-data
we should start reading from the next extent. The reason we may have we should start reading from the next extent. The reason we may have
data left on the page is that if the fixed part of the row was less than data left on the page is that if the fixed part of the row was less than
min_row_length the head block was extended to min_row_length. min_block_length the head block was extended to min_block_length.
This may change in the future, which is why we have the loop written This may change in the future, which is why we have the loop written
the way it's written. the way it's written.
...@@ -3907,11 +3908,11 @@ int _ma_read_block_record2(MARIA_HA *info, uchar *record, ...@@ -3907,11 +3908,11 @@ int _ma_read_block_record2(MARIA_HA *info, uchar *record,
DBUG_PRINT("info", ("Row read")); DBUG_PRINT("info", ("Row read"));
/* /*
data should normally point to end_of_date. The only exception is if data should normally point to end_of_date. The only exception is if
the row is very short in which case we allocated 'min_row_length' data the row is very short in which case we allocated 'min_block_length' data
for allowing the row to expand. for allowing the row to expand.
*/ */
if (data != end_of_data && (uint) (end_of_data - start_of_data) > if (data != end_of_data && (uint) (end_of_data - start_of_data) >
info->s->base.min_row_length) info->s->base.min_block_length)
goto err; goto err;
} }
...@@ -5829,8 +5830,8 @@ my_bool _ma_apply_undo_row_delete(MARIA_HA *info, LSN undo_lsn, ...@@ -5829,8 +5830,8 @@ my_bool _ma_apply_undo_row_delete(MARIA_HA *info, LSN undo_lsn,
row.normal_length + row.normal_length +
row.char_length + row.varchar_length); row.char_length + row.varchar_length);
row.total_length= (row.head_length + row.blob_length); row.total_length= (row.head_length + row.blob_length);
if (row.total_length < share->base.min_row_length) if (row.total_length < share->base.min_block_length)
row.total_length= share->base.min_row_length; row.total_length= share->base.min_block_length;
/* Row is now up to date. Time to insert the record */ /* Row is now up to date. Time to insert the record */
......
This diff is collapsed.
...@@ -205,7 +205,10 @@ int maria_create(const char *name, enum data_file_type datafile_type, ...@@ -205,7 +205,10 @@ int maria_create(const char *name, enum data_file_type datafile_type,
if (!column->null_bit) if (!column->null_bit)
min_pack_length+= column->length; min_pack_length+= column->length;
else else
{
/* Only BLOCK_RECORD skips NULL fields for all field values */
not_block_record_extra_length+= column->length; not_block_record_extra_length+= column->length;
}
column->empty_pos= 0; column->empty_pos= 0;
column->empty_bit= 0; column->empty_bit= 0;
} }
...@@ -237,11 +240,13 @@ int maria_create(const char *name, enum data_file_type datafile_type, ...@@ -237,11 +240,13 @@ int maria_create(const char *name, enum data_file_type datafile_type,
/* We can't use checksum with static length rows */ /* We can't use checksum with static length rows */
flags&= ~HA_CREATE_CHECKSUM; flags&= ~HA_CREATE_CHECKSUM;
options&= ~HA_OPTION_CHECKSUM; options&= ~HA_OPTION_CHECKSUM;
min_pack_length+= varchar_length; min_pack_length= reclength;
packed= 0; packed= 0;
} }
if (datafile_type != BLOCK_RECORD) else if (datafile_type != BLOCK_RECORD)
min_pack_length+= not_block_record_extra_length; min_pack_length+= not_block_record_extra_length;
else
min_pack_length+= 5; /* Min row overhead */
if ((packed & 7) == 1) if ((packed & 7) == 1)
{ {
...@@ -311,8 +316,8 @@ int maria_create(const char *name, enum data_file_type datafile_type, ...@@ -311,8 +316,8 @@ int maria_create(const char *name, enum data_file_type datafile_type,
extra_header_size= TRANS_MAX_FIXED_HEADER_SIZE; extra_header_size= TRANS_MAX_FIXED_HEADER_SIZE;
DBUG_PRINT("info",("creating a transactional table")); DBUG_PRINT("info",("creating a transactional table"));
} }
share.base.min_row_length= (extra_header_size + share.base.null_bytes + share.base.min_block_length= (extra_header_size + share.base.null_bytes +
pack_bytes); pack_bytes);
if (!ci->data_file_length && ci->max_rows) if (!ci->data_file_length && ci->max_rows)
{ {
if (pack_reclength == INT_MAX32 || if (pack_reclength == INT_MAX32 ||
...@@ -731,9 +736,7 @@ int maria_create(const char *name, enum data_file_type datafile_type, ...@@ -731,9 +736,7 @@ int maria_create(const char *name, enum data_file_type datafile_type,
sync_dir= MY_SYNC_DIR; sync_dir= MY_SYNC_DIR;
} }
if (datafile_type == BLOCK_RECORD) if (datafile_type == DYNAMIC_RECORD)
share.base.min_block_length= share.base.min_row_length;
else
{ {
share.base.min_block_length= share.base.min_block_length=
(share.base.pack_reclength+3 < MARIA_EXTEND_BLOCK_LENGTH && (share.base.pack_reclength+3 < MARIA_EXTEND_BLOCK_LENGTH &&
...@@ -741,6 +744,9 @@ int maria_create(const char *name, enum data_file_type datafile_type, ...@@ -741,6 +744,9 @@ int maria_create(const char *name, enum data_file_type datafile_type,
max(share.base.pack_reclength,MARIA_MIN_BLOCK_LENGTH) : max(share.base.pack_reclength,MARIA_MIN_BLOCK_LENGTH) :
MARIA_EXTEND_BLOCK_LENGTH; MARIA_EXTEND_BLOCK_LENGTH;
} }
else if (datafile_type == STATIC_RECORD)
share.base.min_block_length= share.base.pack_reclength;
if (! (flags & HA_DONT_TOUCH_DATA)) if (! (flags & HA_DONT_TOUCH_DATA))
share.state.create_time= (long) time((time_t*) 0); share.state.create_time= (long) time((time_t*) 0);
......
...@@ -1263,14 +1263,13 @@ static my_bool translog_create_new_file() ...@@ -1263,14 +1263,13 @@ static my_bool translog_create_new_file()
#ifndef DBUG_OFF #ifndef DBUG_OFF
static my_bool translog_buffer_lock(struct st_translog_buffer *buffer) static my_bool translog_buffer_lock(struct st_translog_buffer *buffer)
{ {
int res; my_bool res;
DBUG_ENTER("translog_buffer_lock"); DBUG_ENTER("translog_buffer_lock");
DBUG_PRINT("enter", DBUG_PRINT("enter",
("Lock buffer #%u: (0x%lx) mutex: 0x%lx", ("Lock buffer #%u: (0x%lx)", (uint) buffer->buffer_no,
(uint) buffer->buffer_no, (ulong) buffer, (ulong) buffer));
(ulong) &buffer->mutex));
res= (pthread_mutex_lock(&buffer->mutex) != 0); res= (pthread_mutex_lock(&buffer->mutex) != 0);
DBUG_RETURN(test(res)); DBUG_RETURN(res);
} }
#else #else
#define translog_buffer_lock(B) \ #define translog_buffer_lock(B) \
...@@ -1293,17 +1292,12 @@ static my_bool translog_buffer_lock(struct st_translog_buffer *buffer) ...@@ -1293,17 +1292,12 @@ static my_bool translog_buffer_lock(struct st_translog_buffer *buffer)
#ifndef DBUG_OFF #ifndef DBUG_OFF
static my_bool translog_buffer_unlock(struct st_translog_buffer *buffer) static my_bool translog_buffer_unlock(struct st_translog_buffer *buffer)
{ {
int res; my_bool res;
DBUG_ENTER("translog_buffer_unlock"); DBUG_ENTER("translog_buffer_unlock");
DBUG_PRINT("enter", ("Unlock buffer... #%u (0x%lx) " DBUG_PRINT("enter", ("Unlock buffer... #%u (0x%lx)",
"mutex: 0x%lx", (uint) buffer->buffer_no, (ulong) buffer));
(uint) buffer->buffer_no, (ulong) buffer,
(ulong) &buffer->mutex));
res= (pthread_mutex_unlock(&buffer->mutex) != 0); res= (pthread_mutex_unlock(&buffer->mutex) != 0);
DBUG_PRINT("exit", ("Unlocked buffer... #%u: 0x%lx mutex: 0x%lx",
(uint) buffer->buffer_no, (ulong) buffer,
(ulong) &buffer->mutex));
DBUG_RETURN(res); DBUG_RETURN(res);
} }
#else #else
...@@ -1562,19 +1556,13 @@ static void translog_wait_for_writers(struct st_translog_buffer *buffer) ...@@ -1562,19 +1556,13 @@ static void translog_wait_for_writers(struct st_translog_buffer *buffer)
while (buffer->copy_to_buffer_in_progress) while (buffer->copy_to_buffer_in_progress)
{ {
DBUG_PRINT("info", ("wait for writers... " DBUG_PRINT("info", ("wait for writers... buffer: #%u 0x%lx",
"buffer: #%u 0x%lx " (uint) buffer->buffer_no, (ulong) buffer));
"mutex: 0x%lx",
(uint) buffer->buffer_no, (ulong) buffer,
(ulong) &buffer->mutex));
DBUG_ASSERT(buffer->file != -1); DBUG_ASSERT(buffer->file != -1);
wqueue_add_and_wait(&buffer->waiting_filling_buffer, thread, wqueue_add_and_wait(&buffer->waiting_filling_buffer, thread,
&buffer->mutex); &buffer->mutex);
DBUG_PRINT("info", ("wait for writers done " DBUG_PRINT("info", ("wait for writers done buffer: #%u 0x%lx",
"buffer: #%u 0x%lx " (uint) buffer->buffer_no, (ulong) buffer));
"mutex: 0x%lx",
(uint) buffer->buffer_no, (ulong) buffer,
(ulong) &buffer->mutex));
} }
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -1607,18 +1595,12 @@ static void translog_wait_for_buffer_free(struct st_translog_buffer *buffer) ...@@ -1607,18 +1595,12 @@ static void translog_wait_for_buffer_free(struct st_translog_buffer *buffer)
while (buffer->file != -1) while (buffer->file != -1)
{ {
DBUG_PRINT("info", ("wait for writers... " DBUG_PRINT("info", ("wait for writers... buffer: #%u 0x%lx",
"buffer: #%u 0x%lx " (uint) buffer->buffer_no, (ulong) buffer));
"mutex: 0x%lx",
(uint) buffer->buffer_no, (ulong) buffer,
(ulong) &buffer->mutex));
wqueue_add_and_wait(&buffer->waiting_filling_buffer, thread, wqueue_add_and_wait(&buffer->waiting_filling_buffer, thread,
&buffer->mutex); &buffer->mutex);
DBUG_PRINT("info", ("wait for writers done. " DBUG_PRINT("info", ("wait for writers done. buffer: #%u 0x%lx",
"buffer: #%u 0x%lx " (uint) buffer->buffer_no, (ulong) buffer));
"mutex: 0x%lx",
(uint) buffer->buffer_no, (ulong) buffer,
(ulong) &buffer->mutex));
} }
DBUG_ASSERT(buffer->copy_to_buffer_in_progress == 0); DBUG_ASSERT(buffer->copy_to_buffer_in_progress == 0);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
......
...@@ -495,7 +495,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) ...@@ -495,7 +495,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
strmov(share->data_file_name, data_name); strmov(share->data_file_name, data_name);
strmov(share->open_file_name, name); strmov(share->open_file_name, name);
share->block_size= share->base.block_size; share->block_size= share->base.block_size; /* Convenience */
{ {
HA_KEYSEG *pos=share->keyparts; HA_KEYSEG *pos=share->keyparts;
for (i=0 ; i < keys ; i++) for (i=0 ; i < keys ; i++)
...@@ -1287,7 +1287,7 @@ uint _ma_base_info_write(File file, MARIA_BASE_INFO *base) ...@@ -1287,7 +1287,7 @@ uint _ma_base_info_write(File file, MARIA_BASE_INFO *base)
mi_int2store(ptr,base->null_bytes); ptr+= 2; mi_int2store(ptr,base->null_bytes); ptr+= 2;
mi_int2store(ptr,base->original_null_bytes); ptr+= 2; mi_int2store(ptr,base->original_null_bytes); ptr+= 2;
mi_int2store(ptr,base->field_offsets); ptr+= 2; mi_int2store(ptr,base->field_offsets); ptr+= 2;
mi_int2store(ptr,base->min_row_length); ptr+= 2; mi_int2store(ptr,0); ptr+= 2; /* reserved */
mi_int2store(ptr,base->block_size); ptr+= 2; mi_int2store(ptr,base->block_size); ptr+= 2;
*ptr++= base->rec_reflength; *ptr++= base->rec_reflength;
*ptr++= base->key_reflength; *ptr++= base->key_reflength;
...@@ -1330,7 +1330,7 @@ static uchar *_ma_base_info_read(uchar *ptr, MARIA_BASE_INFO *base) ...@@ -1330,7 +1330,7 @@ static uchar *_ma_base_info_read(uchar *ptr, MARIA_BASE_INFO *base)
base->null_bytes= mi_uint2korr(ptr); ptr+= 2; base->null_bytes= mi_uint2korr(ptr); ptr+= 2;
base->original_null_bytes= mi_uint2korr(ptr); ptr+= 2; base->original_null_bytes= mi_uint2korr(ptr); ptr+= 2;
base->field_offsets= mi_uint2korr(ptr); ptr+= 2; base->field_offsets= mi_uint2korr(ptr); ptr+= 2;
base->min_row_length= mi_uint2korr(ptr); ptr+= 2; ptr+= 2;
base->block_size= mi_uint2korr(ptr); ptr+= 2; base->block_size= mi_uint2korr(ptr); ptr+= 2;
base->rec_reflength= *ptr++; base->rec_reflength= *ptr++;
......
...@@ -209,9 +209,6 @@ static my_bool _ma_read_pack_info(MARIA_SHARE *share, File file, ...@@ -209,9 +209,6 @@ static my_bool _ma_read_pack_info(MARIA_SHARE *share, File file,
diff_length=(int) rec_reflength - (int) share->base.rec_reflength; diff_length=(int) rec_reflength - (int) share->base.rec_reflength;
if (fix_keys) if (fix_keys)
share->rec_reflength=rec_reflength; share->rec_reflength=rec_reflength;
share->base.min_block_length=share->min_pack_length+1;
if (share->min_pack_length > 254)
share->base.min_block_length+=2;
DBUG_PRINT("info", ("fixed header length: %u", HEAD_LENGTH)); DBUG_PRINT("info", ("fixed header length: %u", HEAD_LENGTH));
DBUG_PRINT("info", ("total header length: %lu", share->pack.header_length)); DBUG_PRINT("info", ("total header length: %lu", share->pack.header_length));
DBUG_PRINT("info", ("pack file version: %u", share->pack.version)); DBUG_PRINT("info", ("pack file version: %u", share->pack.version));
......
...@@ -174,7 +174,6 @@ typedef struct st_ma_base_info ...@@ -174,7 +174,6 @@ typedef struct st_ma_base_info
uint extra_alloc_bytes; uint extra_alloc_bytes;
uint extra_alloc_procent; uint extra_alloc_procent;
uint is_nulls_extended; /* 1 if new null bytes */ uint is_nulls_extended; /* 1 if new null bytes */
uint min_row_length; /* Min possible length of a row */
uint default_row_flag; /* 0 or ROW_FLAG_NULLS_EXTENDED */ uint default_row_flag; /* 0 or ROW_FLAG_NULLS_EXTENDED */
uint block_size; uint block_size;
/* Size of initial record buffer */ /* Size of initial record buffer */
......
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