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 /storage/maria | |
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
Diffstat (limited to 'storage/maria')
-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 |
8 files changed, 43 insertions, 14 deletions
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); } |