List:Commits« Previous MessageNext Message »
From:tomas Date:February 4 2008 3:40pm
Subject:bk commit into 5.1 tree (tomas:1.2674) BUG#34275
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of tomas.  When tomas does a push these changes
will be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2008-02-04 15:40:04+01:00, tomas@stripped +2 -0
  Bug #34275 mysqld leak if doing multiple statements within same transaction (or wo/
trans)
  - in autocommit do not allocate statistics share, but instead use one directly on the
handler

  sql/ha_ndbcluster.cc@stripped, 2008-02-04 15:40:00+01:00, tomas@stripped +44
-39
    Bug #34275 mysqld leak if doing multiple statements within same transaction (or wo/
trans)
    - in autocommit do not allocate statistics share, but instead use one directly on the
handler

  sql/ha_ndbcluster.h@stripped, 2008-02-04 15:40:00+01:00, tomas@stripped +1 -7
    Bug #34275 mysqld leak if doing multiple statements within same transaction (or wo/
trans)
    - in autocommit do not allocate statistics share, but instead use one directly on the
handler

diff -Nrup a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
--- a/sql/ha_ndbcluster.cc	2008-01-25 14:34:13 +01:00
+++ b/sql/ha_ndbcluster.cc	2008-02-04 15:40:00 +01:00
@@ -313,6 +313,10 @@ int execute_no_commit_ie(ha_ndbcluster *
 /*
   Place holder for ha_ndbcluster thread specific data
 */
+typedef struct st_thd_ndb_share {
+  const void *key;
+  struct Ndb_local_table_statistics stat;
+} THD_NDB_SHARE;
 static
 uchar *thd_ndb_share_get_key(THD_NDB_SHARE *thd_ndb_share, size_t *length,
                             my_bool not_used __attribute__((unused)))
@@ -369,41 +373,6 @@ Thd_ndb::init_open_tables()
   my_hash_reset(&open_tables);
 }
 
-THD_NDB_SHARE *
-Thd_ndb::get_open_table(THD *thd, const void *key)
-{
-  DBUG_ENTER("Thd_ndb::get_open_table");
-  HASH_SEARCH_STATE state;
-  THD_NDB_SHARE *thd_ndb_share=
-    (THD_NDB_SHARE*)hash_first(&open_tables, (uchar *)&key, sizeof(key),
&state);
-  while (thd_ndb_share && thd_ndb_share->key != key)
-    thd_ndb_share= (THD_NDB_SHARE*)hash_next(&open_tables, (uchar *)&key,
sizeof(key), &state);
-  if (thd_ndb_share == 0)
-  {
-    thd_ndb_share= (THD_NDB_SHARE *) alloc_root(&thd->transaction.mem_root,
-                                                sizeof(THD_NDB_SHARE));
-    if (!thd_ndb_share)
-    {
-      mem_alloc_error(sizeof(THD_NDB_SHARE));
-      DBUG_RETURN(NULL);
-    }
-    thd_ndb_share->key= key;
-    thd_ndb_share->stat.last_count= count;
-    thd_ndb_share->stat.no_uncommitted_rows_count= 0;
-    thd_ndb_share->stat.records= ~(ha_rows)0;
-    my_hash_insert(&open_tables, (uchar *)thd_ndb_share);
-  }
-  else if (thd_ndb_share->stat.last_count != count)
-  {
-    thd_ndb_share->stat.last_count= count;
-    thd_ndb_share->stat.no_uncommitted_rows_count= 0;
-    thd_ndb_share->stat.records= ~(ha_rows)0;
-  }
-  DBUG_PRINT("exit", ("thd_ndb_share: 0x%lx  key: 0x%lx",
-                      (long) thd_ndb_share, (long) key));
-  DBUG_RETURN(thd_ndb_share);
-}
-
 inline
 Ndb *ha_ndbcluster::get_ndb()
 {
@@ -4554,12 +4523,48 @@ int ha_ndbcluster::init_handler_for_stat
         thd_ndb->trans_options|= TNTO_INJECTED_APPLY_STATUS;
   }
 #endif
-  // TODO remove double pointers...
-  if (!(m_thd_ndb_share= thd_ndb->get_open_table(thd, m_table)))
+
+  if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
   {
-    DBUG_RETURN(1);
+    const void *key= m_table;
+    HASH_SEARCH_STATE state;
+    THD_NDB_SHARE *thd_ndb_share=
+      (THD_NDB_SHARE*)hash_first(&thd_ndb->open_tables, (uchar *)&key,
sizeof(key), &state);
+    while (thd_ndb_share && thd_ndb_share->key != key)
+      thd_ndb_share= (THD_NDB_SHARE*)hash_next(&thd_ndb->open_tables, (uchar
*)&key, sizeof(key), &state);
+    if (thd_ndb_share == 0)
+    {
+      thd_ndb_share= (THD_NDB_SHARE *) alloc_root(&thd->transaction.mem_root,
+                                                  sizeof(THD_NDB_SHARE));
+      if (!thd_ndb_share)
+      {
+        mem_alloc_error(sizeof(THD_NDB_SHARE));
+        DBUG_RETURN(1);
+      }
+      thd_ndb_share->key= key;
+      thd_ndb_share->stat.last_count= thd_ndb->count;
+      thd_ndb_share->stat.no_uncommitted_rows_count= 0;
+      thd_ndb_share->stat.records= ~(ha_rows)0;
+      my_hash_insert(&thd_ndb->open_tables, (uchar *)thd_ndb_share);
+    }
+    else if (thd_ndb_share->stat.last_count != thd_ndb->count)
+    {
+      thd_ndb_share->stat.last_count= thd_ndb->count;
+      thd_ndb_share->stat.no_uncommitted_rows_count= 0;
+      thd_ndb_share->stat.records= ~(ha_rows)0;
+    }
+    DBUG_PRINT("exit", ("thd_ndb_share: 0x%lx  key: 0x%lx",
+                        (long) thd_ndb_share, (long) key));
+    m_table_info= &thd_ndb_share->stat;
+  }
+  else
+  {
+    struct Ndb_local_table_statistics &stat= m_table_info_instance;
+    stat.last_count= thd_ndb->count;
+    stat.no_uncommitted_rows_count= 0;
+    stat.records= ~(ha_rows)0;
+    m_table_info= &stat;
   }
-  m_table_info= &m_thd_ndb_share->stat;
   DBUG_RETURN(0);
 }
 
diff -Nrup a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h
--- a/sql/ha_ndbcluster.h	2007-11-05 21:11:14 +01:00
+++ b/sql/ha_ndbcluster.h	2008-02-04 15:40:00 +01:00
@@ -195,11 +195,6 @@ struct Ndb_local_table_statistics {
   ha_rows records;
 };
 
-typedef struct st_thd_ndb_share {
-  const void *key;
-  struct Ndb_local_table_statistics stat;
-} THD_NDB_SHARE;
-
 class Thd_ndb 
 {
  public:
@@ -207,7 +202,6 @@ class Thd_ndb 
   ~Thd_ndb();
 
   void init_open_tables();
-  THD_NDB_SHARE *get_open_table(THD *thd, const void *key);
 
   Ndb *ndb;
   ulong count;
@@ -514,6 +508,7 @@ private:
   NdbScanOperation *m_active_cursor;
   const NdbDictionary::Table *m_table;
   struct Ndb_local_table_statistics *m_table_info;
+  struct Ndb_local_table_statistics m_table_info_instance;
   char m_dbname[FN_HEADLEN];
   //char m_schemaname[FN_HEADLEN];
   char m_tabname[FN_HEADLEN];
@@ -522,7 +517,6 @@ private:
   bool m_lock_tuple;
   NDB_SHARE *m_share;
   NDB_INDEX_DATA  m_index[MAX_KEY];
-  THD_NDB_SHARE *m_thd_ndb_share;
   // NdbRecAttr has no reference to blob
   NdbValue m_value[NDB_MAX_ATTRIBUTES_IN_TABLE];
   uchar m_ref[NDB_HIDDEN_PRIMARY_KEY_LENGTH];
Thread
bk commit into 5.1 tree (tomas:1.2674) BUG#34275tomas4 Feb