Fix for IO_CACHE.

Portability fixes.
This commit is contained in:
monty@hundin.mysql.fi 2001-11-28 03:47:15 +02:00
parent 3c057478c2
commit 5fedd2dda7
9 changed files with 166 additions and 133 deletions

View File

@ -1,7 +1,8 @@
/bin/rm -f */.deps/*.P */*.o
make -k clean
/bin/rm -f */.deps/*.P
/bin/rm -f config.cache
/bin/rm -f */.deps/*.P */*.o
/bin/rm -f */.deps/*.P config.cache innobase/config.cache bdb/build_unix/config.cache mysql-*.tar.gz
aclocal; autoheader; aclocal; automake; autoconf
CFLAGS=-O6 CXX=gcc CXXFLAGS="-O6 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-debug --with-extra-charsets=complex
CFLAGS=-O1 CC=gcc CXX=gcc CXXFLAGS="-O1 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-debug --with-extra-charsets=complex --without-extra-tools
make

View File

@ -110,7 +110,7 @@ int vio_read(Vio * vio, gptr buf, int size)
vio->reading = 1;
if (vio->where_in_packet >= vio->end_of_packet)
{
dbug_assert(vio->packets);
DBUG_ASSERT(vio->packets);
vio->where_in_packet = vio->packets + sizeof(char *) + 4;
vio->end_of_packet = vio->where_in_packet +
uint4korr(vio->packets + sizeof(char *));

View File

@ -21,7 +21,6 @@ insert into t1 (b) select b from t2;
insert into t2 (b) select b from t1;
insert into t1 (b) select b from t2;
drop table t2;
create table t9 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam data directory="/home/sasha/bk/mysql-4.0/mysql-test/var/tmp" index directory="/home/sasha/bk/mysql-4.0/mysql-test/var/run";
insert into t9 select * from t1;
check table t9;
Table Op Msg_type Msg_text
@ -45,18 +44,11 @@ alter table t9 rename t8, add column d int not null;
alter table t8 rename t7;
rename table t7 to t9;
drop table t1;
create table t1 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam data directory="tmp";
Incorrect table name 'tmp'
drop database if exists test_mysqltest;
create database test_mysqltest;
create table test_mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam index directory="/this-dir-does-not-exist";
Can't create/write to file '/this-dir-does-not-exist/t9.MYI' (Errcode: 2)
create table test_mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam index directory="not-hard-path";
Incorrect table name 'not-hard-path'
create table test_mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam index directory="/home/sasha/bk/mysql-4.0/mysql-test/var/run";
Can't create/write to file '/home/sasha/bk/mysql-4.0/mysql-test/var/run/t9.MYI' (Errcode: 17)
create table test_mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam data directory="/home/sasha/bk/mysql-4.0/mysql-test/var/tmp";
Can't create/write to file '/home/sasha/bk/mysql-4.0/mysql-test/var/tmp/t9.MYD' (Errcode: 17)
Got one of the listed errors
Got one of the listed errors
Got one of the listed errors
Got one of the listed errors
Got one of the listed errors
alter table t9 rename test_mysqltest.t9;
select count(*) from test_mysqltest.t9;
count(*)

View File

@ -1,5 +1,7 @@
-- require r/have_symlink.require
disable_query_log;
show variables like "have_symlink";
enable_query_log;
#
# First create little data to play with
@ -33,7 +35,10 @@ drop table t2;
# We use t9 here to not crash with tables generated by the backup test
#
disable_query_log;
eval create table t9 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam data directory="$MYSQL_TEST_DIR/var/tmp" index directory="$MYSQL_TEST_DIR/var/run";
enable_query_log;
insert into t9 select * from t1;
check table t9;
optimize table t9;
@ -53,7 +58,8 @@ drop table t1;
# Note that we are using the above table t9 here!
#
--error 1103
disable_query_log;
--error 1103,1103
create table t1 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam data directory="tmp";
# Check that we cannot link over a table from another database.
@ -61,17 +67,18 @@ create table t1 (a int not null auto_increment, b char(16) not null, primary key
drop database if exists test_mysqltest;
create database test_mysqltest;
--error 1
--error 1,1
create table test_mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam index directory="/this-dir-does-not-exist";
--error 1103
--error 1103,1103
create table test_mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam index directory="not-hard-path";
--error 1
--error 1,1
eval create table test_mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam index directory="$MYSQL_TEST_DIR/var/run";
--error 1
--error 1,1
eval create table test_mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) type=myisam data directory="$MYSQL_TEST_DIR/var/tmp";
enable_query_log;
# Check moving table t9 from default database to test_mysqltest;
# In this case the symlinks should be removed.

View File

@ -32,17 +32,16 @@
void my_b_seek(IO_CACHE *info,my_off_t pos)
{
my_off_t offset = (pos - info->pos_in_file);
DBUG_ENTER("my_b_seek");
DBUG_PRINT("enter",("pos: %lu", (ulong) pos));
if (info->type == READ_CACHE)
{
byte* try_pos=info->read_pos + (pos - info->pos_in_file);
if (try_pos >= info->buffer &&
try_pos <= info->read_end)
if ((ulonglong) offset < (ulonglong) (info->read_end - info->buffer))
{
/* The position is in the current buffer; Reuse it */
info->read_pos = try_pos;
/* The read is in the current buffer; Reuse it */
info->read_pos = info->buffer + offset;
DBUG_VOID_RETURN;
}
else
@ -53,17 +52,14 @@ void my_b_seek(IO_CACHE *info,my_off_t pos)
}
else if (info->type == WRITE_CACHE)
{
byte* try_pos;
/* If write is in current buffer, reuse it */
try_pos = info->write_pos + (pos - info->pos_in_file);
if (try_pos >= info->write_buffer &&
try_pos <= info->write_end)
if ((ulonglong) offset <
(ulonglong) (info->write_end - info->write_buffer))
{
info->write_pos = try_pos;
info->write_pos = info->write_buffer + offset;
DBUG_VOID_RETURN;
}
else
flush_io_cache(info);
flush_io_cache(info);
}
info->pos_in_file=pos;
info->seek_not_done=1;

View File

@ -1,5 +1,4 @@
#!@PERL@
#
# Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
#
# This library is free software; you can redistribute it and/or
@ -28,7 +27,7 @@ use warnings;
$opt_groups=27; # Characters are 'A' -> Z
$opt_loop_count=100000; # Change this to make test harder/easier
$opt_loop_count=10000; # Change this to make test harder/easier
$opt_medium_loop_count=100; # Change this to make test harder/easier
chomp($pwd = `pwd`); $pwd = "." if ($pwd eq '');
@ -113,6 +112,128 @@ sub test_insert
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
###
### Test rollback performance
###
print "Test transactions rollback performance\n" if($opt_debug);
##
## Insert rollback test
##
#
# Test is done by inserting 100 rows in a table with lots of rows and
# then doing a rollback on these
#
{
my ($id,$rev_id,$grp,$region,$end,$loop_time,$end_time,$commit_loop,$count);
$dbh->{AutoCommit} = 0;
$loop_time=new Benchmark;
$end=$opt_loop_count*2;
$count=0;
for ($commit_loop=1, $id=$opt_loop_count ; $id < $end ;
$id++, $commit_loop++)
{
$rev_id=$end-$id;
$grp=$id/$opt_groups;
$region=chr(65+$id%$opt_groups);
do_query($dbh,"insert into bench1 values ($id,$rev_id,'$region',$grp,0)");
if ($commit_loop >= $opt_medium_loop_count)
{
$dbh->rollback;
$commit_loop=0;
$count++;
}
}
if ($commit_loop > 1)
{
$dbh->rollback;
$count++;
}
$end_time=new Benchmark;
print "Time for insert_rollback ($count:$opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
##
## Update rollback test
##
#
# Test is done by updating 100 rows in a table with lots of rows and
# then doing a rollback on these
#
{
my ($id,$loop_time,$end_time,$commit_loop,$count);
$dbh->{AutoCommit} = 0;
$loop_time=new Benchmark;
$end=$opt_loop_count*2;
$count=0;
for ($commit_loop=1, $id=0 ; $id < $opt_loop_count ; $id++, $commit_loop++)
{
do_query($dbh,"update bench1 set updated=2 where idn=$id");
if ($commit_loop >= $opt_medium_loop_count)
{
$dbh->rollback;
$commit_loop=0;
$count++;
}
}
if ($commit_loop > 1)
{
$dbh->rollback;
$count++;
}
$end_time=new Benchmark;
print "Time for update_rollback ($count:$opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
##
## Delete rollback test
##
#
# Test is done by deleting 100 rows in a table with lots of rows and
# then doing a rollback on these
#
{
my ($id,$loop_time,$end_time,$commit_loop,$count);
$dbh->{AutoCommit} = 0;
$loop_time=new Benchmark;
$end=$opt_loop_count*2;
$count=0;
for ($commit_loop=1, $id=0 ; $id < $opt_loop_count ; $id++, $commit_loop++)
{
do_query($dbh,"delete from bench1 where idn=$id");
if ($commit_loop >= $opt_medium_loop_count)
{
$dbh->rollback;
$commit_loop=0;
$count++;
}
}
if ($commit_loop > 1)
{
$dbh->rollback;
$count++;
}
$end_time=new Benchmark;
print "Time for delete_rollback ($count:$opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
###
### Test update perfomance
###
@ -164,99 +285,6 @@ sub test_delete
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
###
### Test rollback performance
###
print "Test transactions rollback performance\n" if($opt_debug);
##
## Insert rollback test
##
#
# Test is done by inserting 10 rows in a table with lots of rows and
# then doing a rollback on these
#
{
my ($id,$rev_id,$grp,$region,$end,$loop_time,$end_time,$commit_loop,$count);
$dbh->{AutoCommit} = 0;
$loop_time=new Benchmark;
$end=$opt_loop_count*2;
$count=0;
for ($commit_loop=1, $id=$opt_loop_count ; $id < $end ;
$id++, $commit_loop++)
{
$rev_id=$end-$id;
$grp=$id/$opt_groups;
$region=chr(65+$id%$opt_groups);
do_query($dbh,"insert into bench1 values ($id,$rev_id,'$region',$grp,0)");
if ($commit_loop >= $opt_medium_loop_count)
{
$dbh->rollback;
$commit_loop=0;
$count++;
}
}
if ($commit_loop > 1)
{
$dbh->rollback;
$count++;
}
$end_time=new Benchmark;
print "Time for insert_rollback ($count:$opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
###
### Update rollback test
###
if (0)
{
$dbh->{AutoCommit} = 0;
$loop_time=new Benchmark;
for ($id=0,$rev_id=$opt_medium_loop_count ; $id < $opt_medium_loop_count; $id++,$rev_id--)
{
$grp=$id/$opt_groups;
$region=chr(65+$id%$opt_groups);
do_query($dbh,"update bench1 set region='$region',grp=$grp where idn=$id");
}
$dbh->rollback;
$end_time=new Benchmark;
print "Time for update rollback (" . ($opt_medium_loop_count) . "): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
### Delete rollback test
$dbh->{AutoCommit} = 0;
$loop_time=new Benchmark;
for ($id=0,$rev_id=$opt_medium_loop_count; $id < $opt_medium_loop_count; $id++,$rev_id--)
{
$grp=$id/$opt_groups;
$region=chr(65+$id%$opt_groups);
do_query($dbh,"delete from bench1 where idn=$id");
}
$dbh->rollback;
$end_time=new Benchmark;
print "Time for delete rollback (" . ($opt_medium_loop_count) . "): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
$dbh->{AutoCommit} = 1;
}
####
#### End of benchmark
####

View File

@ -686,6 +686,11 @@ pthread_handler_decl(kill_server_thread,arg __attribute__((unused)))
}
#endif
#if defined(__amiga__)
#undef sigset
#define sigset signal
#endif
static sig_handler print_signal_warning(int sig)
{
sql_print_error("Warning: Got signal %d from thread %d",
@ -1310,7 +1315,11 @@ static void init_signals(void)
sigprocmask(SIG_SETMASK,&sa.sa_mask,NULL);
init_stacktrace();
#if defined(__amiga__)
sa.sa_handler=(void(*)())handle_segfault;
#else
sa.sa_handler=handle_segfault;
#endif
sigaction(SIGSEGV, &sa, NULL);
#ifdef SIGBUS
sigaction(SIGBUS, &sa, NULL);

View File

@ -779,10 +779,10 @@ int wild_compare(const char *str,const char *str_end,
{
while (str != str_end && *str != cmp)
str++;
if (str++ == str_end)
if (str++ == str_end)
{
DBUG_RETURN(-1)
};
DBUG_RETURN(-1);
}
{
int tmp=wild_compare(str,str_end,wildstr,wildend,escape);
if (tmp <= 0)

View File

@ -218,7 +218,7 @@ void write_core(int sig)
{
signal(sig, SIG_DFL);
pthread_kill(pthread_self(), sig);
#if defined(P_MYID)
#if defined(P_MYID) && !defined(SCO)
/* On Solaris, the above kill is not enough */
sigsend(P_PID,P_MYID,sig);
#endif