List:Commits« Previous MessageNext Message »
From:Martin Skold Date:June 14 2012 11:49am
Subject:bzr push into mysql-5.1-telco-7.1 branch (Martin.Skold:4569 to 4571)
Bug#13824846 Bug#14185126
View as plain text  
 4571 Martin Skold	2012-06-14
      Bug#13824846,Bug#14185126: Cleaning away stray files at server startup or at cluster reconnect (after restart)

    modified:
      mysql-test/suite/ndb/r/ndb_reconnect.result
      mysql-test/suite/ndb/t/ndb_reconnect.test
      sql/ha_ndbcluster.cc
      sql/ha_ndbcluster.h
      sql/ha_ndbcluster_binlog.cc
 4570 Martin Skold	2012-06-14
      WL#1735 Handler: "discover" database: publisized function make_db_list

    modified:
      sql/sql_show.cc
      sql/sql_show.h
 4569 magnus.blaudd@stripped	2012-06-13 [merge]
      Merge 7.0 -> 7.1

    modified:
      sql/ha_ndbcluster.cc
=== modified file 'mysql-test/suite/ndb/r/ndb_reconnect.result'
--- a/mysql-test/suite/ndb/r/ndb_reconnect.result	2009-02-03 13:35:56 +0000
+++ b/mysql-test/suite/ndb/r/ndb_reconnect.result	2012-06-14 11:48:36 +0000
@@ -26,3 +26,33 @@ a	b	c
 1	row 1	2
 insert into t1 values (2, "row 1", 37);
 drop table t1;
+create table t1(a int, b varchar(10), c date) engine=ndb;
+CREATE TRIGGER trg1 BEFORE UPDATE ON t1 FOR EACH ROW BEGIN
+SET new.c = '1901-01-01 01:01:01';
+End //
+insert into t1 values (1, "row 1", NULL),(2, "row 2", NULL);
+select * from t1 order by a;
+a	b	c
+1	row 1	NULL
+2	row 2	NULL
+create table t2(a int, b varchar(10), c date) engine=myisam;
+CREATE TRIGGER trg2 BEFORE UPDATE ON t2 FOR EACH ROW BEGIN
+SET new.c = '1901-01-01 01:01:01';
+End //
+create table t1(a int, b varchar(10), c date) engine=ndb;
+CREATE TRIGGER trg1 BEFORE UPDATE ON t1 FOR EACH ROW BEGIN
+SET new.c = '1902-02-02 02:02:02';
+End //
+insert into t1 values (1, "row 1", NULL),(2, "row 2", NULL);
+select * from t1 order by a;
+a	b	c
+1	row 1	NULL
+2	row 2	NULL
+create table t2(a int, b varchar(10), c date) engine=myisam;
+ERROR 42S01: Table 't2' already exists
+drop table t2;
+create table t2(a int, b varchar(10), c date) engine=myisam;
+CREATE TRIGGER trg2 BEFORE UPDATE ON t2 FOR EACH ROW BEGIN
+SET new.c = '1901-01-01 01:01:01';
+End //
+drop table t1, t2;

=== modified file 'mysql-test/suite/ndb/t/ndb_reconnect.test'
--- a/mysql-test/suite/ndb/t/ndb_reconnect.test	2009-06-06 13:04:45 +0000
+++ b/mysql-test/suite/ndb/t/ndb_reconnect.test	2012-06-14 11:48:36 +0000
@@ -76,3 +76,66 @@ insert into t1 values (2, "row 1", 37);
 
 # cleanup
 drop table t1;
+
+#
+#Bug #13824846 FRM FILES ARE CREATED FOR MYSQLD, BUT TABLE DOES NOT EXIST IN CLUSTER
+#
+
+connection default;
+create table t1(a int, b varchar(10), c date) engine=ndb;
+delimiter //;
+CREATE TRIGGER trg1 BEFORE UPDATE ON t1 FOR EACH ROW BEGIN
+   SET new.c = '1901-01-01 01:01:01';
+End //
+delimiter ;//
+
+insert into t1 values (1, "row 1", NULL),(2, "row 2", NULL);
+select * from t1 order by a;
+
+create table t2(a int, b varchar(10), c date) engine=myisam;
+delimiter //;
+CREATE TRIGGER trg2 BEFORE UPDATE ON t2 FOR EACH ROW BEGIN
+   SET new.c = '1901-01-01 01:01:01';
+End //
+delimiter ;//
+
+# Restart cluster nodes and clear all meta-data
+--exec $NDB_MGM --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" -e "all restart -i" >> $NDB_TOOLS_OUTPUT
+# Wait for all nodes to enter "started"
+--exec $NDB_WAITER --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" >> $NDB_TOOLS_OUTPUT
+
+#
+# Wait until the connection to the
+# cluster has been restored or timeout occurs
+#
+connection default;
+--disable_result_log
+--disable_query_log
+--source include/ndb_not_readonly.inc
+--enable_result_log
+--enable_query_log
+
+# Create the table again to check there are no conflicts
+create table t1(a int, b varchar(10), c date) engine=ndb;
+delimiter //;
+CREATE TRIGGER trg1 BEFORE UPDATE ON t1 FOR EACH ROW BEGIN
+   SET new.c = '1902-02-02 02:02:02';
+End //
+delimiter ;//
+
+insert into t1 values (1, "row 1", NULL),(2, "row 2", NULL);
+select * from t1 order by a;
+
+# Check that only ndb tables have been cleaned away
+--error ER_TABLE_EXISTS_ERROR
+create table t2(a int, b varchar(10), c date) engine=myisam;
+drop table t2;
+create table t2(a int, b varchar(10), c date) engine=myisam;
+delimiter //;
+CREATE TRIGGER trg2 BEFORE UPDATE ON t2 FOR EACH ROW BEGIN
+   SET new.c = '1901-01-01 01:01:01';
+End //
+delimiter ;//
+
+# cleanup
+drop table t1, t2;

=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc	2012-06-13 19:10:06 +0000
+++ b/sql/ha_ndbcluster.cc	2012-06-14 11:48:36 +0000
@@ -11519,8 +11519,19 @@ ndbcluster_find_files(handlerton *hton, 
     {
       DBUG_PRINT("info", ("NDB says %s does not exists", file_name->str));
       it.remove();
-      // Put in list of tables to remove from disk
-      delete_list.push_back(thd->strdup(file_name->str));
+      if (thd == injector_thd &&
+	  thd_ndb->options & TNO_NO_REMOVE_STRAY_FILES)
+      {
+	/*
+	  Don't delete anything when called from
+	  the binlog thread. This is a kludge to avoid
+	  that something is deleted when "Ndb schema dist"
+	  uses find_files() to check for "local tables in db"
+	*/
+      }
+      else
+	// Put in list of tables to remove from disk
+	delete_list.push_back(thd->strdup(file_name->str));
     }
   }
 

=== modified file 'sql/ha_ndbcluster.h'
--- a/sql/ha_ndbcluster.h	2012-06-07 10:58:14 +0000
+++ b/sql/ha_ndbcluster.h	2012-06-14 11:48:36 +0000
@@ -254,14 +254,19 @@ enum THD_NDB_OPTIONS
     In participating mysqld, do not try to acquire global schema
     lock, as one other mysqld already has the lock.
   */
-  TNO_NO_LOCK_SCHEMA_OP= 1 << 1
+  TNO_NO_LOCK_SCHEMA_OP= 1 << 1,
   /*
     Skip drop of ndb table in delete_table.  Used when calling
     mysql_rm_table_part2 in "show tables", as we do not want to
     remove ndb tables "by mistake".  The table should not exist
     in ndb in the first place.
   */
-  ,TNO_NO_NDB_DROP_TABLE=    1 << 2
+  TNO_NO_NDB_DROP_TABLE=    1 << 2,
+  /*
+    In participating mysqld, do not remove stray files
+    when dropping tables
+  */
+  TNO_NO_REMOVE_STRAY_FILES= 1 <<3
 };
 
 enum THD_NDB_TRANS_OPTIONS

=== modified file 'sql/ha_ndbcluster_binlog.cc'
--- a/sql/ha_ndbcluster_binlog.cc	2012-03-28 15:30:10 +0000
+++ b/sql/ha_ndbcluster_binlog.cc	2012-06-14 11:48:36 +0000
@@ -1476,6 +1476,48 @@ static void ndb_notify_tables_writable()
 }
 
 /*
+
+ */
+
+static void clean_away_stray_files(THD *thd)
+{
+  /*
+    Clean-up any stray files for non-existing NDB tables
+  */
+  LOOKUP_FIELD_VALUES lookup_field_values;
+  bool with_i_schema;
+  List<LEX_STRING> db_names;
+  List_iterator_fast<LEX_STRING> it(db_names);
+  LEX_STRING *db_name;
+  List<LEX_STRING> tab_names;
+  char path[FN_REFLEN + 1];
+ 
+  DBUG_ENTER("clean_away_stray_files");
+  bzero((char*) &lookup_field_values, sizeof(LOOKUP_FIELD_VALUES));
+  if (make_db_list(thd, &db_names, &lookup_field_values, &with_i_schema))
+  {
+    thd->clear_error();
+    DBUG_PRINT("info", ("Failed to find databases"));
+    DBUG_VOID_RETURN;
+  }
+  it.rewind();
+  while ((db_name= it++))
+  {
+    DBUG_PRINT("info", ("Found database %s", db_name->str));
+    sql_print_information("NDB: Cleaning stray tables from database '%s'",
+			  db_name->str);
+    build_table_filename(path, sizeof(path) - 1, db_name->str, "", "", 0);
+    if (find_files(thd, &tab_names, db_name->str, path, NullS, 0)
+	!= FIND_FILES_OK)
+    {
+      thd->clear_error();
+      DBUG_PRINT("info", ("Failed to find tables"));
+    }
+  }
+  DBUG_VOID_RETURN;
+}
+
+/*
   Ndb has no representation of the database schema objects.
   The mysql.ndb_schema table contains the latest schema operations
   done via a mysqld, and thus reflects databases created/dropped/altered
@@ -1616,7 +1658,7 @@ static int ndbcluster_find_all_databases
           if (database_exists)
           {
             /* drop missing database */
-            sql_print_information("NDB: Discovered reamining database '%s'", db);
+            sql_print_information("NDB: Discovered remaining database '%s'", db);
           }
         }
       }
@@ -1694,35 +1736,38 @@ ndb_binlog_setup(THD *thd)
     }
   }
 
+  clean_away_stray_files(thd);
+
   if (ndbcluster_find_all_databases(thd))
   {
     return false;
   }
 
-  if (!ndbcluster_find_all_files(thd))
+  if (ndbcluster_find_all_files(thd))
   {
-    mysql_mutex_lock(&LOCK_open);
-    ndb_binlog_tables_inited= TRUE;
-    if (ndb_binlog_tables_inited &&
-        ndb_binlog_running && ndb_binlog_is_ready)
-    {
-      if (opt_ndb_extra_logging)
-        sql_print_information("NDB Binlog: ndb tables writable");
-      close_cached_tables(NULL, NULL, TRUE, FALSE, FALSE);
-      
-      /* 
-         Signal any waiting thread that ndb table setup is
-         now complete
-      */
-      ndb_notify_tables_writable();
-    }
-    mysql_mutex_unlock(&LOCK_open);
-    /* Signal injector thread that all is setup */
-    pthread_cond_signal(&injector_cond);
+    return false;
+  }
 
-    return true; // Setup completed -> OK
+  mysql_mutex_lock(&LOCK_open);
+  ndb_binlog_tables_inited= TRUE;
+  if (ndb_binlog_tables_inited &&
+      ndb_binlog_running && ndb_binlog_is_ready)
+  {
+    if (opt_ndb_extra_logging)
+      sql_print_information("NDB Binlog: ndb tables writable");
+    close_cached_tables(NULL, NULL, TRUE, FALSE, FALSE);
+    
+    /* 
+       Signal any waiting thread that ndb table setup is
+       now complete
+    */
+    ndb_notify_tables_writable();
   }
-  return false;
+  mysql_mutex_unlock(&LOCK_open);
+  /* Signal injector thread that all is setup */
+  pthread_cond_signal(&injector_cond);
+  
+  return true; // Setup completed -> OK
 }
 
 /*
@@ -2943,6 +2988,7 @@ ndb_binlog_thread_handle_schema_event(TH
         case SOT_DROP_DB:
           /* Drop the database locally if it only contains ndb tables */
           thd_ndb_options.set(TNO_NO_LOCK_SCHEMA_OP);
+	  thd_ndb_options.set(TNO_NO_REMOVE_STRAY_FILES);
           if (! ndbcluster_check_if_local_tables_in_db(thd, schema->db))
           {
             const int no_print_error[1]= {0};

=== modified file 'sql/sql_show.cc'
--- a/sql/sql_show.cc	2012-06-07 09:06:47 +0000
+++ b/sql/sql_show.cc	2012-06-14 11:44:50 +0000
@@ -2453,11 +2453,13 @@ void calc_sum_of_all_status(STATUS_VAR *
 /* This is only used internally, but we need it here as a forward reference */
 extern ST_SCHEMA_TABLE schema_tables[];
 
+#ifdef MCP_WL1735
 typedef struct st_lookup_field_values
 {
   LEX_STRING db_value, table_value;
   bool wild_db_value, wild_table_value;
 } LOOKUP_FIELD_VALUES;
+#endif
 
 
 /*

=== modified file 'sql/sql_show.h'
--- a/sql/sql_show.h	2011-06-30 15:55:35 +0000
+++ b/sql/sql_show.h	2012-06-14 11:44:50 +0000
@@ -26,12 +26,26 @@ struct st_ha_create_information;
 typedef st_ha_create_information HA_CREATE_INFO;
 struct TABLE_LIST;
 
+#ifndef MCP_WL1735
+typedef struct st_lookup_field_values
+{
+  LEX_STRING db_value, table_value;
+  bool wild_db_value, wild_table_value;
+} LOOKUP_FIELD_VALUES;
+#endif
+
 enum find_files_result {
   FIND_FILES_OK,
   FIND_FILES_OOM,
   FIND_FILES_DIR
 };
 
+#ifndef MCP_WL1735
+int make_db_list(THD *thd, List<LEX_STRING> *files,
+                 LOOKUP_FIELD_VALUES *lookup_field_vals,
+                 bool *with_i_schema);
+#endif
+
 find_files_result find_files(THD *thd, List<LEX_STRING> *files, const char *db,
                              const char *path, const char *wild, bool dir);
 

No bundle (reason: useless for push emails).
Thread
bzr push into mysql-5.1-telco-7.1 branch (Martin.Skold:4569 to 4571)Bug#13824846 Bug#14185126Martin Skold14 Jun