diff options
author | unknown <tomas@poseidon.ndb.mysql.com> | 2006-01-31 01:37:48 +0100 |
---|---|---|
committer | unknown <tomas@poseidon.ndb.mysql.com> | 2006-01-31 01:37:48 +0100 |
commit | 91b0d093fd3650cd2eea25fef454cd8e67bc79ba (patch) | |
tree | f90159e8d613c0359815c8657a27d03466d34aa7 | |
parent | 3a2b70f8414a1ee02f8a210f22a2707f66bf0ce5 (diff) | |
download | mariadb-git-91b0d093fd3650cd2eea25fef454cd8e67bc79ba.tar.gz |
Bug #16851, log floods with ndb discover messages
+ fix crashing bug when discovering ndb tables outside select context
-rw-r--r-- | sql/ha_ndbcluster.cc | 27 | ||||
-rw-r--r-- | sql/ha_ndbcluster_binlog.cc | 2 | ||||
-rw-r--r-- | sql/ha_ndbcluster_binlog.h | 3 |
3 files changed, 26 insertions, 6 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 85f43ba2757..8243bf182f5 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -5388,6 +5388,18 @@ static void ndbcluster_drop_database(char *path) /* find all tables in ndb and discover those needed */ +int ndb_create_table_from_engine(THD *thd, const char *db, + const char *table_name) +{ + LEX *old_lex= thd->lex, newlex; + thd->lex= &newlex; + newlex.current_select= NULL; + lex_start(thd, (const uchar*) "", 0); + int res= ha_create_table_from_engine(thd, db, table_name); + thd->lex= old_lex; + return res; +} + int ndbcluster_find_all_files(THD *thd) { DBUG_ENTER("ndbcluster_find_all_files"); @@ -5440,8 +5452,15 @@ int ndbcluster_find_all_files(THD *thd) if (ndbtab->getFrmLength() == 0) continue; - strxnmov(key, FN_LEN-1, mysql_data_home, "/", - elmt.database, "/", elmt.name, NullS); + /* check if database exists */ + char *end= strxnmov(key, FN_LEN-1, mysql_data_home, "/", + elmt.database, NullS); + if (my_access(key, F_OK)) + { + /* no such database defined, skip table */ + continue; + } + strxnmov(end, FN_LEN-1-(key-end), "/", elmt.name, NullS); const void *data= 0, *pack_data= 0; uint length, pack_length; int discover= 0; @@ -5471,7 +5490,7 @@ int ndbcluster_find_all_files(THD *thd) { /* ToDo 4.1 database needs to be created if missing */ pthread_mutex_lock(&LOCK_open); - if (ha_create_table_from_engine(thd, elmt.database, elmt.name)) + if (ndb_create_table_from_engine(thd, elmt.database, elmt.name)) { /* ToDo 4.1 handle error */ } @@ -5699,7 +5718,7 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path, while ((file_name=it2++)) { DBUG_PRINT("info", ("Table %s need discovery", file_name)); - if (ha_create_table_from_engine(thd, db, file_name) == 0) + if (ndb_create_table_from_engine(thd, db, file_name) == 0) files->push_back(thd->strdup(file_name)); } diff --git a/sql/ha_ndbcluster_binlog.cc b/sql/ha_ndbcluster_binlog.cc index 1b3833fe443..99adc8a5b21 100644 --- a/sql/ha_ndbcluster_binlog.cc +++ b/sql/ha_ndbcluster_binlog.cc @@ -1314,7 +1314,7 @@ ndb_binlog_thread_handle_schema_event(THD *thd, Ndb *ndb, /* fall through */ case SOT_ALTER_TABLE: pthread_mutex_lock(&LOCK_open); - if (ha_create_table_from_engine(thd, schema->db, schema->name)) + if (ndb_create_table_from_engine(thd, schema->db, schema->name)) { sql_print_error("Could not discover table '%s.%s' from " "binlog schema event '%s' from node %d", diff --git a/sql/ha_ndbcluster_binlog.h b/sql/ha_ndbcluster_binlog.h index e8582ab659a..a9ba29447ff 100644 --- a/sql/ha_ndbcluster_binlog.h +++ b/sql/ha_ndbcluster_binlog.h @@ -90,7 +90,8 @@ int ndbcluster_handle_drop_table(Ndb *ndb, const char *event_name, NDB_SHARE *share); void ndb_rep_event_name(String *event_name, const char *db, const char *tbl); - +int ndb_create_table_from_engine(THD *thd, const char *db, + const char *table_name); int ndbcluster_binlog_start(); pthread_handler_t ndb_binlog_thread_func(void *arg); |