Commit 978f3e3c authored by unknown's avatar unknown

Fixes to bugs and compiler warnings detected by pushbuild

Don't compare uuid's on maria_open() if table is not transactional
Fixed that my_microtime() works on windows (patch added from 5.1)


mysql-test/r/create.result:
  Portability fix
mysql-test/t/create.test:
  Portability fix
mysql-test/t/maria.test:
  Remove warnings, to make test portable to windows
mysys/my_getsystime.c:
  Add missed merge from 5.1
  This fixes that timing works on windows and fixes that that failed becasuse slow_query_log didn't get any queries
storage/maria/ma_check.c:
  Removed not needed setting of variable
storage/maria/ma_loghandler.c:
  Fixed compiler warnings
storage/maria/ma_open.c:
  Don't compare uuid's if table is not transactional
KNOWN_BUGS.txt:
  New BitKeeper file ``KNOWN_BUGS.txt''
parent e689fbc4
This file should contain all know fatal bugs in the Maria storage
engine for the last source or binary release. Minor bugs, extensions
and feature request and bugs found since this release can be find in the
MySQL bugs databases at: http://bugs.mysql.com/
There shouldn't normally be any bugs that affects normal operations in
any Maria release. Still, there are always exceptions and edge cases
and that's what this file is for.
For the first few Alpha releases of Maria there may be some edge cases
that crashes during recovery; We don't like that but we think it's
better to get the Maria alpha out early to get things tested and get
more developers on the code early than wait until these are fixed. We
do however think that the bugs are not seriously enough to stop anyone
from starting to test and even use Maria for real (as long as they are
prepared to upgrade to next MySQL-Maria release ASAP).
If you have found a bug that is not listed here, please add it to
http://bugs.mysql.com/ so that we can either fix it for next release
or in the worst case add it here for others to know!
Known bugs that are planned to be fixed before next minor release
=================================================================
- If mysqld crashed or is killed during REPAIR or OPTIMIZE, Maria will not
be able to automaticly repair the table again; You must manually run
REPAIR on the table again after mysqld is started.
- If mysqld crashes during batch insert into an empty table,
(This includes LOAD DATA INFILE, SELECT ... INSERT and INSERT (many rows))
Maria repair may not be able to recreate the empty table. In this case
You must manually run either REPAIR TABLE or TRUNCATE to fix the table.
- If the log files are damaged or inconsistent, Maria may fail to start.
We should fix that if this happens and mysqld is restarted (thanks to
mysqld_safe, instance manager or other script) it should disregard the
old logs, start anyway and automaticly repair any tables that was found
to be crashed on open.
Temporary fix is to remove or maria_log.???????? files from the data
directory, restart mysqld and run CHECK TABLE / REPAIR TABLE or
mysqlcheck on your Maria tables
Known bugs that are planned to be fixed before Beta
===================================================
- 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
transactional tables that are changed as crashed.
For the moment, if this happens, you have to take down mysqld,
remove all logs, restart mysqld and repair your tables.
If you get the related error:
"Disk is full writing '/usr/local/mysql/var/maria_log.????????' (Errcode: 28)
Waiting for someone to free space..."
you should either free disk space, in which Maria will continue as before
or kill mysqld, remove logs and repair tables.
Missing features that is planned to fix before Beta
===================================================
- We will add an maria-recover option to automaticly repair any
crashed tables on open. (This is needed for not transactional tables
and also in edge cases for transactional tables when the table
crashed because of a bug in MySQL or Maria code)
- 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)
- Recovery of fulltext and GIS indexes.
Features planned for future releases
====================================
http://forge.mysql.com/worklog/
...@@ -1717,7 +1717,7 @@ t1 CREATE TABLE `t1` ( ...@@ -1717,7 +1717,7 @@ t1 CREATE TABLE `t1` (
`TIME` bigint(7) NOT NULL DEFAULT '0', `TIME` bigint(7) NOT NULL DEFAULT '0',
`STATE` varchar(64) DEFAULT NULL, `STATE` varchar(64) DEFAULT NULL,
`INFO` longtext `INFO` longtext
) ENGINE=MARIA DEFAULT CHARSET=utf8 ) DEFAULT CHARSET=utf8
drop table t1; drop table t1;
create temporary table t1 like information_schema.processlist; create temporary table t1 like information_schema.processlist;
show create table t1; show create table t1;
......
...@@ -1332,7 +1332,7 @@ drop function f1; ...@@ -1332,7 +1332,7 @@ drop function f1;
# Bug#25629 CREATE TABLE LIKE does not work with INFORMATION_SCHEMA # Bug#25629 CREATE TABLE LIKE does not work with INFORMATION_SCHEMA
# #
create table t1 like information_schema.processlist; create table t1 like information_schema.processlist;
--replace_result ENGINE=MyISAM "" ENGINE=Maria "" " PAGE_CHECKSUM=1" "" --replace_result ENGINE=MyISAM "" ENGINE=MARIA "" " PAGE_CHECKSUM=1" ""
show create table t1; show create table t1;
drop table t1; drop table t1;
create temporary table t1 like information_schema.processlist; create temporary table t1 like information_schema.processlist;
......
...@@ -989,7 +989,9 @@ connect (session2,localhost,root,,); ...@@ -989,7 +989,9 @@ connect (session2,localhost,root,,);
connection session1; connection session1;
disable_query_log; disable_query_log;
disable_warnings;
eval create temporary table t1 (a int) data directory="$MYSQLTEST_VARDIR/tmp" select 9 a; eval create temporary table t1 (a int) data directory="$MYSQLTEST_VARDIR/tmp" select 9 a;
enable_warnings;
enable_query_log; enable_query_log;
disable_result_log; disable_result_log;
show create table t1; show create table t1;
...@@ -997,7 +999,10 @@ enable_result_log; ...@@ -997,7 +999,10 @@ enable_result_log;
connection session2; connection session2;
disable_query_log; disable_query_log;
disable_warnings;
eval create temporary table t1 (a int) data directory="$MYSQLTEST_VARDIR/tmp" select 99 a; eval create temporary table t1 (a int) data directory="$MYSQLTEST_VARDIR/tmp" select 99 a;
enable_warnings;
enable_query_log; enable_query_log;
disable_result_log; disable_result_log;
show create table t1; show create table t1;
......
...@@ -35,9 +35,9 @@ ulonglong my_getsystime() ...@@ -35,9 +35,9 @@ ulonglong my_getsystime()
if (query_performance_frequency) if (query_performance_frequency)
{ {
QueryPerformanceCounter(&t_cnt); QueryPerformanceCounter(&t_cnt);
return (t_cnt.QuadPart / query_performance_frequency * 10000000+ return ((t_cnt.QuadPart / query_performance_frequency * 10000000) +
t_cnt.QuadPart % query_performance_frequency * 10000000/ (t_cnt.QuadPart % query_performance_frequency * 10000000 /
query_performance_frequency+query_performance_offset); query_performance_frequency) + query_performance_offset);
} }
return 0; return 0;
#elif defined(__NETWARE__) #elif defined(__NETWARE__)
...@@ -108,16 +108,20 @@ ulonglong my_micro_time() ...@@ -108,16 +108,20 @@ ulonglong my_micro_time()
if (query_performance_frequency) if (query_performance_frequency)
{ {
QueryPerformanceCounter((LARGE_INTEGER*) &newtime); QueryPerformanceCounter((LARGE_INTEGER*) &newtime);
newtime/= (query_performance_frequency * 1000000); newtime= ((new_time / query_performance_frequency * 10000000) +
(new_time % query_performance_frequency * 10000000 /
query_performance_frequency));
} }
else else
newtime= (GetTickCount() * 1000); /* GetTickCount only returns milliseconds */ newtime= (GetTickCount() * 1000); /* GetTickCount only returns millisec. */
return newtime; return newtime;
#elif defined(HAVE_GETHRTIME) #elif defined(HAVE_GETHRTIME)
return gethrtime()/1000; return gethrtime()/1000;
#else #else
struct timeval t; struct timeval t;
/* The following loop is here because gettimeofday may fail on some systems */ /*
The following loop is here because gettimeofday may fail on some systems
*/
while (gettimeofday(&t, NULL) != 0) while (gettimeofday(&t, NULL) != 0)
{} {}
newtime= (ulonglong)t.tv_sec * 1000000 + t.tv_usec; newtime= (ulonglong)t.tv_sec * 1000000 + t.tv_usec;
...@@ -131,18 +135,18 @@ ulonglong my_micro_time() ...@@ -131,18 +135,18 @@ ulonglong my_micro_time()
SYNOPSIS SYNOPSIS
my_micro_time_and_time() my_micro_time_and_time()
time_arg Will be set to seconds since epoch (00:00:00 UTC, January 1, time_arg Will be set to seconds since epoch (00:00:00 UTC,
1970) January 1, 1970)
NOTES NOTES
This function is to be useful when we need both the time and microtime. This function is to be useful when we need both the time and microtime.
For example in MySQL this is used to get the query time start of a query and For example in MySQL this is used to get the query time start of a query
to measure the time of a query (for the slow query log) and to measure the time of a query (for the slow query log)
IMPLEMENTATION IMPLEMENTATION
Value of time is as in time() call. Value of time is as in time() call.
Value of microtime is same as my_micro_time(), which may be totally unrealated Value of microtime is same as my_micro_time(), which may be totally
to time() unrealated to time()
RETURN RETURN
Value in microseconds from some undefined point in time Value in microseconds from some undefined point in time
...@@ -157,16 +161,18 @@ ulonglong my_micro_time_and_time(time_t *time_arg) ...@@ -157,16 +161,18 @@ ulonglong my_micro_time_and_time(time_t *time_arg)
if (query_performance_frequency) if (query_performance_frequency)
{ {
QueryPerformanceCounter((LARGE_INTEGER*) &newtime); QueryPerformanceCounter((LARGE_INTEGER*) &newtime);
newtime/= (query_performance_frequency * 1000000); newtime= ((new_time / query_performance_frequency * 10000000) +
(new_time % query_performance_frequency * 10000000 /
query_performance_frequency));
} }
else else
newtime= (GetTickCount() * 1000); /* GetTickCount only returns milliseconds */ newtime= (GetTickCount() * 1000); /* GetTickCount only returns millisec. */
(void) time(time_arg); (void) time(time_arg);
return newtime; return newtime;
#elif defined(HAVE_GETHRTIME) #elif defined(HAVE_GETHRTIME)
/* /*
Solaris has a very slow time() call. We optimize this by using the very fast Solaris has a very slow time() call. We optimize this by using the very
gethrtime() call and only calling time() every 1/2 second fast gethrtime() call and only calling time() every 1/2 second
*/ */
static hrtime_t prev_gethrtime= 0; static hrtime_t prev_gethrtime= 0;
static time_t cur_time= 0; static time_t cur_time= 0;
...@@ -184,7 +190,9 @@ ulonglong my_micro_time_and_time(time_t *time_arg) ...@@ -184,7 +190,9 @@ ulonglong my_micro_time_and_time(time_t *time_arg)
return cur_gethrtime/1000; return cur_gethrtime/1000;
#else #else
struct timeval t; struct timeval t;
/* The following loop is here because gettimeofday may fail on some systems */ /*
The following loop is here because gettimeofday may fail on some systems
*/
while (gettimeofday(&t, NULL) != 0) while (gettimeofday(&t, NULL) != 0)
{} {}
*time_arg= t.tv_sec; *time_arg= t.tv_sec;
...@@ -203,8 +211,8 @@ ulonglong my_micro_time_and_time(time_t *time_arg) ...@@ -203,8 +211,8 @@ ulonglong my_micro_time_and_time(time_t *time_arg)
NOTES NOTES
This function returns the current time. The microtime argument is only used This function returns the current time. The microtime argument is only used
if my_micro_time() uses a function that can safely be converted to the current if my_micro_time() uses a function that can safely be converted to the
time. current time.
RETURN RETURN
current time current time
......
...@@ -5907,7 +5907,6 @@ static my_bool create_new_data_handle(MARIA_SORT_PARAM *param, File new_file) ...@@ -5907,7 +5907,6 @@ static my_bool create_new_data_handle(MARIA_SORT_PARAM *param, File new_file)
HA_OPEN_COPY | HA_OPEN_FOR_REPAIR))) HA_OPEN_COPY | HA_OPEN_FOR_REPAIR)))
DBUG_RETURN(1); DBUG_RETURN(1);
info->s->now_transactional= 0;
new_info= sort_info->new_info; new_info= sort_info->new_info;
_ma_bitmap_set_pagecache_callbacks(&new_info->s->bitmap.file, _ma_bitmap_set_pagecache_callbacks(&new_info->s->bitmap.file,
new_info->s); new_info->s);
......
...@@ -2235,7 +2235,7 @@ static uint16 translog_get_total_chunk_length(uchar *page, uint16 offset) ...@@ -2235,7 +2235,7 @@ static uint16 translog_get_total_chunk_length(uchar *page, uint16 offset)
DBUG_PRINT("info", ("TRANSLOG_CHUNK_LSN")); DBUG_PRINT("info", ("TRANSLOG_CHUNK_LSN"));
rec_len= translog_variable_record_1group_decode_len(&ptr); rec_len= translog_variable_record_1group_decode_len(&ptr);
chunk_len= uint2korr(ptr); chunk_len= uint2korr(ptr);
header_len= (ptr -start) + 2; header_len= (uint16) (ptr -start) + 2;
DBUG_PRINT("info", ("rec len: %lu chunk len: %u header len: %u", DBUG_PRINT("info", ("rec len: %lu chunk len: %u header len: %u",
(ulong) rec_len, (uint) chunk_len, (uint) header_len)); (ulong) rec_len, (uint) chunk_len, (uint) header_len));
if (chunk_len) if (chunk_len)
...@@ -2998,7 +2998,7 @@ static uint16 translog_get_chunk_header_length(uchar *chunk) ...@@ -2998,7 +2998,7 @@ static uint16 translog_get_chunk_header_length(uchar *chunk)
DBUG_PRINT("info", ("TRANSLOG_CHUNK_LSN")); DBUG_PRINT("info", ("TRANSLOG_CHUNK_LSN"));
rec_len= translog_variable_record_1group_decode_len(&ptr); rec_len= translog_variable_record_1group_decode_len(&ptr);
chunk_len= uint2korr(ptr); chunk_len= uint2korr(ptr);
header_len= (ptr - start) +2; header_len= (uint16) (ptr - start) +2;
DBUG_PRINT("info", ("rec len: %lu chunk len: %u header len: %u", DBUG_PRINT("info", ("rec len: %lu chunk len: %u header len: %u",
(ulong) rec_len, (uint) chunk_len, (uint) header_len)); (ulong) rec_len, (uint) chunk_len, (uint) header_len));
if (chunk_len) if (chunk_len)
......
...@@ -396,7 +396,8 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) ...@@ -396,7 +396,8 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
goto err; goto err;
} }
if (share->state.changed & STATE_NOT_MOVABLE && if ((share->state.changed & STATE_NOT_MOVABLE) &&
share->now_transactional &&
!(open_flags & HA_OPEN_IGNORE_MOVED_STATE) && !(open_flags & HA_OPEN_IGNORE_MOVED_STATE) &&
memcmp(share->base.uuid, maria_uuid, MY_UUID_SIZE)) memcmp(share->base.uuid, maria_uuid, MY_UUID_SIZE))
{ {
......
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