Commit c5805837 authored by Michael Widenius's avatar Michael Widenius

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
parents d29e7f74 97a0501e
...@@ -27,9 +27,10 @@ Known bugs that we are working on and will be fixed shortly ...@@ -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 - We have some instabilities in log writing that is under investigatation
This causes mainly assert to triggers in the code and sometimes This causes mainly assert to triggers in the code and sometimes
the log handler doesn't start up after restart. 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 - 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 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 ...@@ -44,15 +45,22 @@ Known bugs that are planned to be fixed before Beta
or kill mysqld, remove logs and repair tables. 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 - INSERT/REPLACE ... SELECT on an empty table may cause crashes or
with full MVCC control. Note that UPDATE and DELETE will still be wrong results if someone else is doing writes on the table during repair
blocking (as with MyISAM) or someone is doing selects during the repair index phase.
- COUNT(*) and TABLE CHECKSUM under MVCC (ie, they are instant and kept up
to date even with multiple inserter)
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 Features planned for future releases
==================================== ====================================
......
...@@ -134,6 +134,12 @@ extern size_t my_bcmp(const uchar *s1,const uchar *s2,size_t len); ...@@ -134,6 +134,12 @@ extern size_t my_bcmp(const uchar *s1,const uchar *s2,size_t len);
#define bzero_if_purify(A,B) #define bzero_if_purify(A,B)
#endif /* HAVE_purify */ #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 #ifndef bmove512
extern void bmove512(uchar *dst,const uchar *src,size_t len); extern void bmove512(uchar *dst,const uchar *src,size_t len);
#endif #endif
......
...@@ -1714,7 +1714,7 @@ int ha_maria::enable_indexes(uint mode) ...@@ -1714,7 +1714,7 @@ int ha_maria::enable_indexes(uint mode)
/* This should never fail normally */ /* This should never fail normally */
DBUG_ASSERT(0); DBUG_ASSERT(0);
/* Repairing by sort failed. Now try standard repair method. */ /* 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, &param, 0) != HA_ADMIN_OK); error= (repair(thd, &param, 0) != HA_ADMIN_OK);
/* /*
If the standard repair succeeded, clear all error messages which If the standard repair succeeded, clear all error messages which
...@@ -2473,6 +2473,10 @@ THR_LOCK_DATA **ha_maria::store_lock(THD *thd, ...@@ -2473,6 +2473,10 @@ THR_LOCK_DATA **ha_maria::store_lock(THD *thd,
thd->lex->sql_command != SQLCOM_LOCK_TABLES) && thd->lex->sql_command != SQLCOM_LOCK_TABLES) &&
mysql_bin_log.is_open()) mysql_bin_log.is_open())
lock_type= TL_READ_NO_INSERT; 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; file->lock.type= lock_type;
} }
*to++= &file->lock; *to++= &file->lock;
......
...@@ -4428,8 +4428,8 @@ static int sort_key_read(MARIA_SORT_PARAM *sort_param, uchar *key) ...@@ -4428,8 +4428,8 @@ static int sort_key_read(MARIA_SORT_PARAM *sort_param, uchar *key)
int error; int error;
MARIA_SORT_INFO *sort_info= sort_param->sort_info; MARIA_SORT_INFO *sort_info= sort_param->sort_info;
MARIA_HA *info= sort_info->info; MARIA_HA *info= sort_info->info;
DBUG_ENTER("sort_key_read");
MARIA_KEY int_key; MARIA_KEY int_key;
DBUG_ENTER("sort_key_read");
if ((error=sort_get_next_record(sort_param))) if ((error=sort_get_next_record(sort_param)))
DBUG_RETURN(error); DBUG_RETURN(error);
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include "m_ctype.h" #include "m_ctype.h"
#include "ma_sp_defs.h" #include "ma_sp_defs.h"
#include "ma_blockrec.h" /* For ROW_FLAG_TRANSID */ #include "ma_blockrec.h" /* For ROW_FLAG_TRANSID */
#include <trnman.h> #include "trnman.h"
#ifdef HAVE_IEEEFP_H #ifdef HAVE_IEEEFP_H
#include <ieeefp.h> #include <ieeefp.h>
#endif #endif
......
...@@ -95,6 +95,10 @@ typedef union ...@@ -95,6 +95,10 @@ typedef union
#define MAX_NUMBER_OF_LSNS_PER_RECORD 2 #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 */ /* log write buffer descriptor */
struct st_translog_buffer struct st_translog_buffer
{ {
...@@ -2093,9 +2097,7 @@ static my_bool translog_buffer_next(TRANSLOG_ADDRESS *horizon, ...@@ -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; log_descriptor.buffers[old_buffer_no].next_buffer_offset= new_buffer->offset;
new_buffer->prev_last_lsn= new_buffer->prev_last_lsn=
((log_descriptor.buffers[old_buffer_no].last_lsn != LSN_IMPOSSIBLE) ? BUFFER_MAX_LSN(log_descriptor.buffers + old_buffer_no);
log_descriptor.buffers[old_buffer_no].last_lsn :
log_descriptor.buffers[old_buffer_no].prev_last_lsn);
DBUG_PRINT("info", ("prev_last_lsn set to (%lu,0x%lx) buffer: 0x%lx", DBUG_PRINT("info", ("prev_last_lsn set to (%lu,0x%lx) buffer: 0x%lx",
LSN_IN_PARTS(new_buffer->prev_last_lsn), LSN_IN_PARTS(new_buffer->prev_last_lsn),
(ulong) new_buffer)); (ulong) new_buffer));
...@@ -7515,7 +7517,7 @@ my_bool translog_flush(TRANSLOG_ADDRESS lsn) ...@@ -7515,7 +7517,7 @@ my_bool translog_flush(TRANSLOG_ADDRESS lsn)
{ {
/* fix lsn if it was horizon */ /* fix lsn if it was horizon */
if (cmp_translog_addr(lsn, log_descriptor.bc.buffer->last_lsn) > 0) 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); translog_flush_wait_for_end(lsn);
pthread_mutex_unlock(&log_descriptor.log_flush_lock); pthread_mutex_unlock(&log_descriptor.log_flush_lock);
DBUG_RETURN(0); DBUG_RETURN(0);
...@@ -7550,11 +7552,24 @@ my_bool translog_flush(TRANSLOG_ADDRESS lsn) ...@@ -7550,11 +7552,24 @@ my_bool translog_flush(TRANSLOG_ADDRESS lsn)
i= (i + 1) % TRANSLOG_BUFFERS_NO) {} i= (i + 1) % TRANSLOG_BUFFERS_NO) {}
start_buffer_no= i; start_buffer_no= i;
/* if we have to flush last buffer then we will finish it */ DBUG_PRINT("info",
if (cmp_translog_addr(lsn, log_descriptor.bc.buffer->prev_last_lsn) > 0) ("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; struct st_translog_buffer *buffer= log_descriptor.bc.buffer;
lsn= log_descriptor.bc.buffer->last_lsn; /* fix lsn if it was horizon */ 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; last_buffer_no= log_descriptor.bc.buffer_no;
log_descriptor.is_everything_flushed= 1; log_descriptor.is_everything_flushed= 1;
translog_force_current_buffer_to_finish(); translog_force_current_buffer_to_finish();
......
...@@ -1349,6 +1349,7 @@ uint _ma_state_info_read_dsk(File file, MARIA_STATE_INFO *state) ...@@ -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]; uchar buff[MARIA_STATE_INFO_SIZE + MARIA_STATE_EXTRA_SIZE];
#ifdef EXTERNAL_LOCKING
/* trick to detect transactional tables */ /* trick to detect transactional tables */
DBUG_ASSERT(state->create_rename_lsn == LSN_IMPOSSIBLE); DBUG_ASSERT(state->create_rename_lsn == LSN_IMPOSSIBLE);
if (!maria_single_user) if (!maria_single_user)
...@@ -1357,6 +1358,7 @@ uint _ma_state_info_read_dsk(File file, MARIA_STATE_INFO *state) ...@@ -1357,6 +1358,7 @@ uint _ma_state_info_read_dsk(File file, MARIA_STATE_INFO *state)
return 1; return 1;
_ma_state_info_read(buff, state); _ma_state_info_read(buff, state);
} }
#endif
return 0; return 0;
} }
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include "maria_def.h" #include "maria_def.h"
#include "ma_blockrec.h" /* For ROW_FLAG_TRANSID */ #include "ma_blockrec.h" /* For ROW_FLAG_TRANSID */
#include <trnman.h> #include "trnman.h"
#ifdef HAVE_SPATIAL #ifdef HAVE_SPATIAL
......
...@@ -396,6 +396,7 @@ static int _ma_ck_write_btree_with_log(MARIA_HA *info, MARIA_KEY *key, ...@@ -396,6 +396,7 @@ static int _ma_ck_write_btree_with_log(MARIA_HA *info, MARIA_KEY *key,
MARIA_KEY org_key; MARIA_KEY org_key;
DBUG_ENTER("_ma_ck_write_btree_with_log"); DBUG_ENTER("_ma_ck_write_btree_with_log");
LINT_INIT_STRUCT(org_key);
if (share->now_transactional) if (share->now_transactional)
{ {
/* Save original value as the key may change */ /* Save original value as the key may change */
......
...@@ -519,17 +519,24 @@ my_bool trnman_end_trn(TRN *trn, my_bool commit) ...@@ -519,17 +519,24 @@ my_bool trnman_end_trn(TRN *trn, my_bool commit)
*/ */
void trnman_free_trn(TRN *trn) 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); my_atomic_rwlock_wrlock(&LOCK_pool);
do 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 down after the loop at -O2
*/ */
*(TRN * volatile *)&(trn->next)= tmp; *(TRN * volatile *)&(trn->next)= tmp.trn;
} while (!my_atomic_casptr((void **)&pool, (void **)&tmp, trn)); } while (!my_atomic_casptr((void **)&pool, &tmp.v, trn));
my_atomic_rwlock_wrunlock(&LOCK_pool); my_atomic_rwlock_wrunlock(&LOCK_pool);
} }
......
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