Commit 8b82ebc4 authored by Sinisa@sinisa.nasamreza.org's avatar Sinisa@sinisa.nasamreza.org

Merge sinisa@work.mysql.com:/home/bk/mysql

into sinisa.nasamreza.org:/mnt/work/mysql
parents 90adbe6f ed62ee1c
...@@ -470,6 +470,7 @@ btr_search_check_guess( ...@@ -470,6 +470,7 @@ btr_search_check_guess(
/*===================*/ /*===================*/
/* out: TRUE if success */ /* out: TRUE if success */
btr_cur_t* cursor, /* in: guessed cursor position */ btr_cur_t* cursor, /* in: guessed cursor position */
ibool can_only_compare_to_cursor_rec,
dtuple_t* tuple, /* in: data tuple */ dtuple_t* tuple, /* in: data tuple */
ulint mode, /* in: PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G, ulint mode, /* in: PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G,
or PAGE_CUR_GE */ or PAGE_CUR_GE */
...@@ -528,6 +529,10 @@ btr_search_check_guess( ...@@ -528,6 +529,10 @@ btr_search_check_guess(
} }
} }
if (can_only_compare_to_cursor_rec) {
return(FALSE);
}
match = 0; match = 0;
bytes = 0; bytes = 0;
...@@ -632,6 +637,7 @@ btr_search_guess_on_hash( ...@@ -632,6 +637,7 @@ btr_search_guess_on_hash(
ulint fold; ulint fold;
ulint tuple_n_fields; ulint tuple_n_fields;
dulint tree_id; dulint tree_id;
ibool can_only_compare_to_cursor_rec = TRUE;
#ifdef notdefined #ifdef notdefined
btr_cur_t cursor2; btr_cur_t cursor2;
btr_pcur_t pcur; btr_pcur_t pcur;
...@@ -706,6 +712,8 @@ btr_search_guess_on_hash( ...@@ -706,6 +712,8 @@ btr_search_guess_on_hash(
goto failure; goto failure;
} }
can_only_compare_to_cursor_rec = FALSE;
buf_page_dbg_add_level(page, SYNC_TREE_NODE_FROM_HASH); buf_page_dbg_add_level(page, SYNC_TREE_NODE_FROM_HASH);
} }
...@@ -737,7 +745,9 @@ btr_search_guess_on_hash( ...@@ -737,7 +745,9 @@ btr_search_guess_on_hash(
fold); fold);
*/ */
} else { } else {
success = btr_search_check_guess(cursor, tuple, mode, mtr); success = btr_search_check_guess(cursor,
can_only_compare_to_cursor_rec,
tuple, mode, mtr);
} }
if (!success) { if (!success) {
......
...@@ -8,6 +8,7 @@ Created 10/21/1995 Heikki Tuuri ...@@ -8,6 +8,7 @@ Created 10/21/1995 Heikki Tuuri
#include "os0file.h" #include "os0file.h"
#include "os0sync.h" #include "os0sync.h"
#include "os0thread.h"
#include "ut0mem.h" #include "ut0mem.h"
#include "srv0srv.h" #include "srv0srv.h"
#include "fil0fil.h" #include "fil0fil.h"
...@@ -1083,6 +1084,7 @@ os_file_write( ...@@ -1083,6 +1084,7 @@ os_file_write(
DWORD low; DWORD low;
DWORD high; DWORD high;
ulint i; ulint i;
ulint n_retries = 0;
ut_a((offset & 0xFFFFFFFF) == offset); ut_a((offset & 0xFFFFFFFF) == offset);
...@@ -1091,7 +1093,7 @@ os_file_write( ...@@ -1091,7 +1093,7 @@ os_file_write(
ut_ad(file); ut_ad(file);
ut_ad(buf); ut_ad(buf);
ut_ad(n > 0); ut_ad(n > 0);
retry:
low = offset; low = offset;
high = offset_high; high = offset_high;
...@@ -1135,6 +1137,19 @@ os_file_write( ...@@ -1135,6 +1137,19 @@ os_file_write(
return(TRUE); return(TRUE);
} }
/* If some background file system backup tool is running, then, at
least in Windows 2000, we may get here a specific error. Let us
retry the operation 100 times, with 1 second waits. */
if (GetLastError() == ERROR_LOCK_VIOLATION && n_retries < 100) {
os_thread_sleep(1000000);
n_retries++;
goto retry;
}
if (!os_has_said_disk_full) { if (!os_has_said_disk_full) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
...@@ -1147,7 +1162,7 @@ os_file_write( ...@@ -1147,7 +1162,7 @@ os_file_write(
"InnoDB: what the error number means.\n" "InnoDB: what the error number means.\n"
"InnoDB: Check that your OS and file system support files of this size.\n" "InnoDB: Check that your OS and file system support files of this size.\n"
"InnoDB: Check also that the disk is not full or a disk quota exceeded.\n", "InnoDB: Check also that the disk is not full or a disk quota exceeded.\n",
name, offset_high, offset, n, len, name, offset_high, offset, n, (ulint)len,
(ulint)GetLastError()); (ulint)GetLastError());
os_has_said_disk_full = TRUE; os_has_said_disk_full = TRUE;
...@@ -1170,13 +1185,13 @@ os_file_write( ...@@ -1170,13 +1185,13 @@ os_file_write(
fprintf(stderr, fprintf(stderr,
" InnoDB: Error: Write to file %s failed at offset %lu %lu.\n" " InnoDB: Error: Write to file %s failed at offset %lu %lu.\n"
"InnoDB: %lu bytes should have been written, only %lu were written.\n" "InnoDB: %lu bytes should have been written, only %ld were written.\n"
"InnoDB: Operating system error number %lu.\n" "InnoDB: Operating system error number %lu.\n"
"InnoDB: Look from section 13.2 at http://www.innodb.com/ibman.html\n" "InnoDB: Look from section 13.2 at http://www.innodb.com/ibman.html\n"
"InnoDB: what the error number means or use the perror program of MySQL.\n" "InnoDB: what the error number means or use the perror program of MySQL.\n"
"InnoDB: Check that your OS and file system support files of this size.\n" "InnoDB: Check that your OS and file system support files of this size.\n"
"InnoDB: Check also that the disk is not full or a disk quota exceeded.\n", "InnoDB: Check also that the disk is not full or a disk quota exceeded.\n",
name, offset_high, offset, n, (ulint)ret, name, offset_high, offset, n, (long int)ret,
(ulint)errno); (ulint)errno);
os_has_said_disk_full = TRUE; os_has_said_disk_full = TRUE;
} }
......
...@@ -447,7 +447,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, ...@@ -447,7 +447,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
share.base.records=ci->max_rows; share.base.records=ci->max_rows;
share.base.reloc= ci->reloc_rows; share.base.reloc= ci->reloc_rows;
share.base.reclength=real_reclength; share.base.reclength=real_reclength;
share.base.pack_reclength=reclength+ test(options & HA_OPTION_CHECKSUM);; share.base.pack_reclength=reclength+ test(options & HA_OPTION_CHECKSUM);
share.base.max_pack_length=pack_reclength; share.base.max_pack_length=pack_reclength;
share.base.min_pack_length=min_pack_length; share.base.min_pack_length=min_pack_length;
share.base.pack_bits=packed; share.base.pack_bits=packed;
......
...@@ -3718,6 +3718,16 @@ ha_innobase::store_lock( ...@@ -3718,6 +3718,16 @@ ha_innobase::store_lock(
lock_type = TL_WRITE_ALLOW_WRITE; lock_type = TL_WRITE_ALLOW_WRITE;
} }
/* In queries of type INSERT INTO t1 SELECT ... FROM t2 ...
MySQL would use the lock TL_READ_NO_INSERT on t2, and that
would conflict with TL_WRITE_ALLOW_WRITE, blocking all inserts
to t2. Convert the lock to a normal read lock to allow
concurrent inserts to t2. */
if (lock_type == TL_READ_NO_INSERT && !thd->in_lock_tables) {
lock_type = TL_READ;
}
lock.type=lock_type; lock.type=lock_type;
} }
......
...@@ -206,7 +206,7 @@ net_store_length(char *pkg, ulonglong length) ...@@ -206,7 +206,7 @@ net_store_length(char *pkg, ulonglong length)
} }
*packet++=254; *packet++=254;
int8store(packet,length); int8store(packet,length);
return (char*) packet+9; return (char*) packet+8;
} }
char * char *
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "slave.h" #include "slave.h"
#include <thr_alarm.h> #include <thr_alarm.h>
#include <my_dir.h> #include <my_dir.h>
#include <assert.h>
#define RPL_LOG_NAME (glob_mi.log_file_name[0] ? glob_mi.log_file_name :\ #define RPL_LOG_NAME (glob_mi.log_file_name[0] ? glob_mi.log_file_name :\
"FIRST") "FIRST")
...@@ -362,6 +363,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, ...@@ -362,6 +363,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db,
TABLE_LIST tables; TABLE_LIST tables;
int error= 1; int error= 1;
handler *file; handler *file;
char *query;
if (packet_len == packet_error) if (packet_len == packet_error)
{ {
...@@ -375,15 +377,23 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, ...@@ -375,15 +377,23 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db,
return 1; return 1;
} }
thd->command = COM_TABLE_DUMP; thd->command = COM_TABLE_DUMP;
thd->query = sql_alloc(packet_len + 1); /* Note that we should not set thd->query until the area is initalized */
if (!thd->query) if (!(query = sql_alloc(packet_len + 1)))
{ {
sql_print_error("create_table_from_dump: out of memory"); sql_print_error("create_table_from_dump: out of memory");
net_printf(&thd->net, ER_GET_ERRNO, "Out of memory"); net_printf(&thd->net, ER_GET_ERRNO, "Out of memory");
return 1; return 1;
} }
memcpy(thd->query, net->read_pos, packet_len); memcpy(query, net->read_pos, packet_len);
thd->query[packet_len] = 0; query[packet_len]= 0;
thd->query_length= packet_len;
/*
We make the following lock in an attempt to ensure that the compiler will
not rearrange the code so that thd->query is set too soon
*/
VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query= query;
VOID(pthread_mutex_unlock(&LOCK_thread_count));
thd->current_tablenr = 0; thd->current_tablenr = 0;
thd->query_error = 0; thd->query_error = 0;
thd->net.no_send_ok = 1; thd->net.no_send_ok = 1;
...@@ -967,10 +977,11 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) ...@@ -967,10 +977,11 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
thd->db = rewrite_db((char*)qev->db); thd->db = rewrite_db((char*)qev->db);
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db)) if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
{ {
thd->query = (char*)qev->query; thd->query_length= q_len;
thd->set_time((time_t)qev->when); thd->set_time((time_t)qev->when);
thd->current_tablenr = 0; thd->current_tablenr = 0;
VOID(pthread_mutex_lock(&LOCK_thread_count)); VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query = (char*)qev->query;
thd->query_id = query_id++; thd->query_id = query_id++;
VOID(pthread_mutex_unlock(&LOCK_thread_count)); VOID(pthread_mutex_unlock(&LOCK_thread_count));
thd->last_nx_table = thd->last_nx_db = 0; thd->last_nx_table = thd->last_nx_db = 0;
...@@ -1008,7 +1019,9 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) ...@@ -1008,7 +1019,9 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
else else
{ {
// master could be inconsistent, abort and tell DBA to check/fix it // master could be inconsistent, abort and tell DBA to check/fix it
VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->db = thd->query = 0; thd->db = thd->query = 0;
VOID(pthread_mutex_unlock(&LOCK_thread_count));
thd->convert_set = 0; thd->convert_set = 0;
close_thread_tables(thd); close_thread_tables(thd);
free_root(&thd->mem_root,0); free_root(&thd->mem_root,0);
...@@ -1017,7 +1030,9 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) ...@@ -1017,7 +1030,9 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
} }
} }
thd->db = 0; // prevent db from being freed thd->db = 0; // prevent db from being freed
VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query = 0; // just to be sure thd->query = 0; // just to be sure
VOID(pthread_mutex_unlock(&LOCK_thread_count));
// assume no convert for next query unless set explictly // assume no convert for next query unless set explictly
thd->convert_set = 0; thd->convert_set = 0;
close_thread_tables(thd); close_thread_tables(thd);
...@@ -1059,10 +1074,11 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) ...@@ -1059,10 +1074,11 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
Load_log_event* lev = (Load_log_event*)ev; Load_log_event* lev = (Load_log_event*)ev;
init_sql_alloc(&thd->mem_root, 8192,0); init_sql_alloc(&thd->mem_root, 8192,0);
thd->db = rewrite_db((char*)lev->db); thd->db = rewrite_db((char*)lev->db);
DBUG_ASSERT(thd->query == 0);
thd->query = 0; thd->query = 0;
thd->query_error = 0; thd->query_error = 0;
if(db_ok(thd->db, replicate_do_db, replicate_ignore_db)) if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
{ {
thd->set_time((time_t)lev->when); thd->set_time((time_t)lev->when);
thd->current_tablenr = 0; thd->current_tablenr = 0;
...@@ -1490,8 +1506,10 @@ the slave thread with \"mysqladmin start-slave\". We stopped at log \ ...@@ -1490,8 +1506,10 @@ the slave thread with \"mysqladmin start-slave\". We stopped at log \
sql_print_error("Slave thread exiting, replication stopped in log '%s' at \ sql_print_error("Slave thread exiting, replication stopped in log '%s' at \
position %s", position %s",
RPL_LOG_NAME, llstr(glob_mi.pos,llbuff)); RPL_LOG_NAME, llstr(glob_mi.pos,llbuff));
VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query = thd->db = 0; // extra safety thd->query = thd->db = 0; // extra safety
if(mysql) VOID(pthread_mutex_unlock(&LOCK_thread_count));
if (mysql)
mc_mysql_close(mysql); mc_mysql_close(mysql);
thd->proc_info = "Waiting for slave mutex on exit"; thd->proc_info = "Waiting for slave mutex on exit";
pthread_mutex_lock(&LOCK_slave); pthread_mutex_lock(&LOCK_slave);
......
...@@ -89,9 +89,9 @@ void mysql_create_db(THD *thd, char *db, uint create_options) ...@@ -89,9 +89,9 @@ void mysql_create_db(THD *thd, char *db, uint create_options)
} }
if (!thd->query) if (!thd->query)
{ {
thd->query = path;
thd->query_length = (uint) (strxmov(path,"create database ", db, NullS)- thd->query_length = (uint) (strxmov(path,"create database ", db, NullS)-
path); path);
thd->query = path;
} }
{ {
mysql_update_log.write(thd,thd->query, thd->query_length); mysql_update_log.write(thd,thd->query, thd->query_length);
...@@ -103,8 +103,9 @@ void mysql_create_db(THD *thd, char *db, uint create_options) ...@@ -103,8 +103,9 @@ void mysql_create_db(THD *thd, char *db, uint create_options)
} }
if (thd->query == path) if (thd->query == path)
{ {
VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query = 0; // just in case thd->query = 0; // just in case
thd->query_length = 0; VOID(pthread_mutex_unlock(&LOCK_thread_count));
} }
send_ok(&thd->net, result); send_ok(&thd->net, result);
...@@ -178,9 +179,9 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists) ...@@ -178,9 +179,9 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists)
if (!thd->query) if (!thd->query)
{ {
thd->query = path;
thd->query_length = (uint) (strxmov(path,"drop database ", db, NullS)- thd->query_length = (uint) (strxmov(path,"drop database ", db, NullS)-
path); path);
thd->query = path;
} }
mysql_update_log.write(thd, thd->query, thd->query_length); mysql_update_log.write(thd, thd->query, thd->query_length);
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
...@@ -190,8 +191,9 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists) ...@@ -190,8 +191,9 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists)
} }
if (thd->query == path) if (thd->query == path)
{ {
VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query = 0; // just in case thd->query = 0; // just in case
thd->query_length = 0; VOID(pthread_mutex_unlock(&LOCK_thread_count));
} }
send_ok(&thd->net,(ulong) deleted); send_ok(&thd->net,(ulong) deleted);
} }
......
...@@ -691,14 +691,14 @@ int mysql_table_dump(THD* thd, char* db, char* tbl_name, int fd) ...@@ -691,14 +691,14 @@ int mysql_table_dump(THD* thd, char* db, char* tbl_name, int fd)
thd->free_list = 0; thd->free_list = 0;
thd->query = tbl_name; thd->query = tbl_name;
if((error = mysqld_dump_create_info(thd, table, -1))) if ((error = mysqld_dump_create_info(thd, table, -1)))
{ {
my_error(ER_GET_ERRNO, MYF(0)); my_error(ER_GET_ERRNO, MYF(0));
goto err; goto err;
} }
net_flush(&thd->net); net_flush(&thd->net);
error = table->file->dump(thd,fd); error = table->file->dump(thd,fd);
if(error) if (error)
my_error(ER_GET_ERRNO, MYF(0)); my_error(ER_GET_ERRNO, MYF(0));
err: err:
...@@ -776,9 +776,8 @@ bool do_command(THD *thd) ...@@ -776,9 +776,8 @@ bool do_command(THD *thd)
*tbl_name++ = 0; *tbl_name++ = 0;
memcpy(tbl_name, data + db_len + 2, tbl_len); memcpy(tbl_name, data + db_len + 2, tbl_len);
tbl_name[tbl_len] = 0; tbl_name[tbl_len] = 0;
if(mysql_table_dump(thd, db, tbl_name, -1)) if (mysql_table_dump(thd, db, tbl_name, -1))
send_error(&thd->net); // dump to NET send_error(&thd->net); // dump to NET
break; break;
} }
case COM_CHANGE_USER: case COM_CHANGE_USER:
......
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