diff options
author | Michael Widenius <monty@mysql.com> | 2008-06-28 16:57:00 +0300 |
---|---|---|
committer | Michael Widenius <monty@mysql.com> | 2008-06-28 16:57:00 +0300 |
commit | c580583756a6c56d00245d63663ce38e28a7023c (patch) | |
tree | aca78afe59121840b99e42d9bf544db9188cd363 | |
parent | d29e7f747209f428458a97c128678a21abf2680d (diff) | |
parent | 97a0501e9211738d8f2fdc20f85e7a13844d1dbf (diff) | |
download | mariadb-git-c580583756a6c56d00245d63663ce38e28a7023c.tar.gz |
Automatic merge
Added some minor changes that was done in my tree while waiting for test to run:
- Remove in Maria T_QUICK when retrying repair for enabling indexes, as the record file may be in use by other threads
- Disable code that is only relevant for EXTERNAL_LOCKING
include/m_string.h:
Automatic merge
storage/maria/ha_maria.cc:
Remove T_QUICK when retrying repair for enabling indexes, as the record file may be in use by other threads
storage/maria/ma_check.c:
Automatic merge
storage/maria/ma_key.c:
Automatic merge
storage/maria/ma_loghandler.c:
Automatic merge
storage/maria/ma_open.c:
Disable code that is only relevant for EXTERNAL_LOCKING
storage/maria/ma_sp_key.c:
Automatic merge
storage/maria/ma_write.c:
Automatic merge
storage/maria/trnman.c:
Automatic merge
-rw-r--r-- | KNOWN_BUGS.txt | 26 | ||||
-rw-r--r-- | include/m_string.h | 6 | ||||
-rw-r--r-- | storage/maria/ha_maria.cc | 6 | ||||
-rw-r--r-- | storage/maria/ma_check.c | 2 | ||||
-rw-r--r-- | storage/maria/ma_key.c | 2 | ||||
-rw-r--r-- | storage/maria/ma_loghandler.c | 27 | ||||
-rw-r--r-- | storage/maria/ma_open.c | 2 | ||||
-rw-r--r-- | storage/maria/ma_sp_key.c | 2 | ||||
-rw-r--r-- | storage/maria/ma_write.c | 1 | ||||
-rw-r--r-- | storage/maria/trnman.c | 15 |
10 files changed, 66 insertions, 23 deletions
diff --git a/KNOWN_BUGS.txt b/KNOWN_BUGS.txt index 3fd1a22d129..980dd5f0da9 100644 --- a/KNOWN_BUGS.txt +++ b/KNOWN_BUGS.txt @@ -27,9 +27,10 @@ Known bugs that we are working on and will be fixed shortly - We have some instabilities in log writing that is under investigatation This causes mainly assert to triggers in the code and sometimes the log handler doesn't start up after restart. + Most of this should now be fixed... -Known bugs that are planned to be fixed before Beta -=================================================== +Known bugs that are planned to be fixed before Gamma/RC +======================================================= - If we get a write failure on disk (disk full or disk error) for the log, we should stop all usage of transactional tables and mark all @@ -44,15 +45,22 @@ Known bugs that are planned to be fixed before Beta or kill mysqld, remove logs and repair tables. -Missing features that is planned to fix before Beta -=================================================== +Known bugs that are planned to be fixed later +============================================= + +LOCK TABLES .. WRITE CONCURRENT is mainly done for testing MVCC. Don't +use this in production. Things that is not working if you are using +this on a table: -- Multiple concurrent inserts & multiple concurrent readers at same time - with full MVCC control. Note that UPDATE and DELETE will still be - blocking (as with MyISAM) -- COUNT(*) and TABLE CHECKSUM under MVCC (ie, they are instant and kept up - to date even with multiple inserter) +- INSERT/REPLACE ... SELECT on an empty table may cause crashes or + wrong results if someone else is doing writes on the table during repair + or someone is doing selects during the repair index phase. +INSERT ... SELECT and REPLACE ... SELECT are blocking inserts and +SELECT for the table. + +Missing features that is planned to fix before Beta +=================================================== Features planned for future releases ==================================== diff --git a/include/m_string.h b/include/m_string.h index 75734d51360..2fadd11af89 100644 --- a/include/m_string.h +++ b/include/m_string.h @@ -134,6 +134,12 @@ extern size_t my_bcmp(const uchar *s1,const uchar *s2,size_t len); #define bzero_if_purify(A,B) #endif /* HAVE_purify */ +#if defined(_lint) || defined(FORCE_INIT_OF_VARS) +#define LINT_INIT_STRUCT(var) bzero(&var, sizeof(var)) /* No uninitialize-warning */ +#else +#define LINT_INIT_STRUCT(var) +#endif + #ifndef bmove512 extern void bmove512(uchar *dst,const uchar *src,size_t len); #endif diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 34199fd085e..a0be7e956e3 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -1714,7 +1714,7 @@ int ha_maria::enable_indexes(uint mode) /* This should never fail normally */ DBUG_ASSERT(0); /* Repairing by sort failed. Now try standard repair method. */ - param.testflag &= ~(T_REP_BY_SORT | T_QUICK); + param.testflag &= ~T_REP_BY_SORT; error= (repair(thd, ¶m, 0) != HA_ADMIN_OK); /* If the standard repair succeeded, clear all error messages which @@ -2473,6 +2473,10 @@ THR_LOCK_DATA **ha_maria::store_lock(THD *thd, thd->lex->sql_command != SQLCOM_LOCK_TABLES) && mysql_bin_log.is_open()) lock_type= TL_READ_NO_INSERT; + else if (lock_type == TL_WRITE_CONCURRENT_INSERT && + (thd->lex->sql_command == SQLCOM_REPLACE_SELECT || + thd->lex->sql_command == SQLCOM_REPLACE_SELECT)) + lock_type= TL_WRITE; file->lock.type= lock_type; } *to++= &file->lock; diff --git a/storage/maria/ma_check.c b/storage/maria/ma_check.c index cf347ebb121..36507ab29d9 100644 --- a/storage/maria/ma_check.c +++ b/storage/maria/ma_check.c @@ -4428,8 +4428,8 @@ static int sort_key_read(MARIA_SORT_PARAM *sort_param, uchar *key) int error; MARIA_SORT_INFO *sort_info= sort_param->sort_info; MARIA_HA *info= sort_info->info; - DBUG_ENTER("sort_key_read"); MARIA_KEY int_key; + DBUG_ENTER("sort_key_read"); if ((error=sort_get_next_record(sort_param))) DBUG_RETURN(error); diff --git a/storage/maria/ma_key.c b/storage/maria/ma_key.c index 9dfc0128b70..1fdb3d15f55 100644 --- a/storage/maria/ma_key.c +++ b/storage/maria/ma_key.c @@ -19,7 +19,7 @@ #include "m_ctype.h" #include "ma_sp_defs.h" #include "ma_blockrec.h" /* For ROW_FLAG_TRANSID */ -#include <trnman.h> +#include "trnman.h" #ifdef HAVE_IEEEFP_H #include <ieeefp.h> #endif diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c index 82fe6a371e8..85921dd294c 100644 --- a/storage/maria/ma_loghandler.c +++ b/storage/maria/ma_loghandler.c @@ -95,6 +95,10 @@ typedef union #define MAX_NUMBER_OF_LSNS_PER_RECORD 2 +/* max lsn calculation for buffer */ +#define BUFFER_MAX_LSN(B) \ + ((B)->last_lsn == LSN_IMPOSSIBLE ? (B)->prev_last_lsn : (B)->last_lsn) + /* log write buffer descriptor */ struct st_translog_buffer { @@ -2093,9 +2097,7 @@ static my_bool translog_buffer_next(TRANSLOG_ADDRESS *horizon, } log_descriptor.buffers[old_buffer_no].next_buffer_offset= new_buffer->offset; new_buffer->prev_last_lsn= - ((log_descriptor.buffers[old_buffer_no].last_lsn != LSN_IMPOSSIBLE) ? - log_descriptor.buffers[old_buffer_no].last_lsn : - log_descriptor.buffers[old_buffer_no].prev_last_lsn); + BUFFER_MAX_LSN(log_descriptor.buffers + old_buffer_no); DBUG_PRINT("info", ("prev_last_lsn set to (%lu,0x%lx) buffer: 0x%lx", LSN_IN_PARTS(new_buffer->prev_last_lsn), (ulong) new_buffer)); @@ -7515,7 +7517,7 @@ my_bool translog_flush(TRANSLOG_ADDRESS lsn) { /* fix lsn if it was horizon */ if (cmp_translog_addr(lsn, log_descriptor.bc.buffer->last_lsn) > 0) - lsn= log_descriptor.bc.buffer->last_lsn; + lsn= BUFFER_MAX_LSN(log_descriptor.bc.buffer); translog_flush_wait_for_end(lsn); pthread_mutex_unlock(&log_descriptor.log_flush_lock); DBUG_RETURN(0); @@ -7550,11 +7552,24 @@ my_bool translog_flush(TRANSLOG_ADDRESS lsn) i= (i + 1) % TRANSLOG_BUFFERS_NO) {} start_buffer_no= i; - /* if we have to flush last buffer then we will finish it */ - if (cmp_translog_addr(lsn, log_descriptor.bc.buffer->prev_last_lsn) > 0) + DBUG_PRINT("info", + ("start from: %u current: %u prev last lsn: (%lu,0x%lx)", + (uint) start_buffer_no, (uint) log_descriptor.bc.buffer_no, + LSN_IN_PARTS(log_descriptor.bc.buffer->prev_last_lsn))); + + + /* + if LSN up to which we have to flush bigger then maximum LSN of previous + buffer and at least one LSN was saved in the current buffer (last_lsn != + LSN_IMPOSSIBLE) then we better finish the current buffer. + */ + if (cmp_translog_addr(lsn, log_descriptor.bc.buffer->prev_last_lsn) > 0 && + log_descriptor.bc.buffer->last_lsn != LSN_IMPOSSIBLE) { struct st_translog_buffer *buffer= log_descriptor.bc.buffer; lsn= log_descriptor.bc.buffer->last_lsn; /* fix lsn if it was horizon */ + DBUG_PRINT("info", ("LSN to flush fixed to last lsn: (%lu,0x%lx)", + LSN_IN_PARTS(log_descriptor.bc.buffer->last_lsn))); last_buffer_no= log_descriptor.bc.buffer_no; log_descriptor.is_everything_flushed= 1; translog_force_current_buffer_to_finish(); diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index d95a305446d..2616304910a 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -1349,6 +1349,7 @@ uint _ma_state_info_read_dsk(File file, MARIA_STATE_INFO *state) { uchar buff[MARIA_STATE_INFO_SIZE + MARIA_STATE_EXTRA_SIZE]; +#ifdef EXTERNAL_LOCKING /* trick to detect transactional tables */ DBUG_ASSERT(state->create_rename_lsn == LSN_IMPOSSIBLE); if (!maria_single_user) @@ -1357,6 +1358,7 @@ uint _ma_state_info_read_dsk(File file, MARIA_STATE_INFO *state) return 1; _ma_state_info_read(buff, state); } +#endif return 0; } diff --git a/storage/maria/ma_sp_key.c b/storage/maria/ma_sp_key.c index d9e6b5570f2..22944a5db0a 100644 --- a/storage/maria/ma_sp_key.c +++ b/storage/maria/ma_sp_key.c @@ -15,7 +15,7 @@ #include "maria_def.h" #include "ma_blockrec.h" /* For ROW_FLAG_TRANSID */ -#include <trnman.h> +#include "trnman.h" #ifdef HAVE_SPATIAL diff --git a/storage/maria/ma_write.c b/storage/maria/ma_write.c index 06ea4d9c845..223673a4c81 100644 --- a/storage/maria/ma_write.c +++ b/storage/maria/ma_write.c @@ -396,6 +396,7 @@ static int _ma_ck_write_btree_with_log(MARIA_HA *info, MARIA_KEY *key, MARIA_KEY org_key; DBUG_ENTER("_ma_ck_write_btree_with_log"); + LINT_INIT_STRUCT(org_key); if (share->now_transactional) { /* Save original value as the key may change */ diff --git a/storage/maria/trnman.c b/storage/maria/trnman.c index b24203f4535..163305a1fb5 100644 --- a/storage/maria/trnman.c +++ b/storage/maria/trnman.c @@ -519,17 +519,24 @@ my_bool trnman_end_trn(TRN *trn, my_bool commit) */ void trnman_free_trn(TRN *trn) { - TRN *tmp= pool; + /* + union is to solve strict aliasing issue. + without it gcc 3.4.3 doesn't notice that updating *(void **)&tmp + modifies the value of tmp. + */ + union { TRN *trn; void *v; } tmp; + + tmp.trn= pool; my_atomic_rwlock_wrlock(&LOCK_pool); do { /* - without this volatile cast gcc-3.4.4 moved the assignment + without this volatile cast gcc-3.4.4 moves the assignment down after the loop at -O2 */ - *(TRN * volatile *)&(trn->next)= tmp; - } while (!my_atomic_casptr((void **)&pool, (void **)&tmp, trn)); + *(TRN * volatile *)&(trn->next)= tmp.trn; + } while (!my_atomic_casptr((void **)&pool, &tmp.v, trn)); my_atomic_rwlock_wrunlock(&LOCK_pool); } |