List:Commits« Previous MessageNext Message »
From:Martin Skold Date:September 8 2009 1:02pm
Subject:bzr commit into mysql-5.1-telco-6.2 branch (Martin.Skold:2985) Bug#36701
View as plain text  
#At file:///home/marty/MySQL/mysql-5.1-telco-6.2/

 2985 Martin Skold	2009-09-08
      Bug#36701 memory leak in mysqld when executing simple join on clustered tables
      modified:
        sql/ha_ndbcluster.cc
        sql/ha_ndbcluster.h
        storage/ndb/include/ndbapi/NdbBlob.hpp
        storage/ndb/src/ndbapi/NdbBlob.cpp

=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc	2009-09-04 10:32:57 +0000
+++ b/sql/ha_ndbcluster.cc	2009-09-08 11:02:48 +0000
@@ -1031,6 +1031,19 @@ bool ha_ndbcluster::uses_blob_value(cons
   return FALSE;
 }
 
+void ha_ndbcluster::release_blobs_buffer()
+{
+  DBUG_ENTER("releaseBlobsBuffer");
+  if (m_blob_total_size > 0)
+  {
+    DBUG_PRINT("info", ("Deleting blobs buffer, size %llu", m_blob_total_size));
+    my_free(m_blobs_buffer, MYF(MY_ALLOW_ZERO_PTR));
+    m_blobs_buffer= 0;
+    m_blob_total_size= 0;
+    m_blobs_buffer_size= 0;
+  }
+  DBUG_VOID_RETURN;
+}
 
 /**
   Get metadata for this table from NDB.
@@ -4596,6 +4609,7 @@ int ha_ndbcluster::init_handler_for_stat
   // Start of transaction
   m_rows_changed= 0;
   m_blobs_pending= FALSE;
+  release_blobs_buffer();
   m_slow_path= thd_ndb->m_slow_path;
 #ifdef HAVE_NDB_BINLOG
   if (unlikely(m_slow_path))
@@ -6624,6 +6638,7 @@ ha_ndbcluster::ha_ndbcluster(handlerton 
   m_update_cannot_batch(FALSE),
   m_skip_auto_increment(TRUE),
   m_blobs_pending(0),
+  m_blob_total_size(0),
   m_blobs_buffer(0),
   m_blobs_buffer_size(0),
   m_dupkey((uint) -1),
@@ -6677,8 +6692,7 @@ ha_ndbcluster::~ha_ndbcluster() 
     free_share(&m_share);
   }
   release_metadata(thd, ndb);
-  my_free(m_blobs_buffer, MYF(MY_ALLOW_ZERO_PTR));
-  m_blobs_buffer= 0;
+  release_blobs_buffer();
 
   // Check for open cursor/transaction
   DBUG_ASSERT(m_active_cursor == NULL);

=== modified file 'sql/ha_ndbcluster.h'
--- a/sql/ha_ndbcluster.h	2009-05-26 18:53:34 +0000
+++ b/sql/ha_ndbcluster.h	2009-09-08 11:02:48 +0000
@@ -592,6 +592,7 @@ private:
   int set_blob_values(const NdbOperation *ndb_op, my_ptrdiff_t row_offset,
                       const MY_BITMAP *bitmap, uint *set_count, bool batch);
   friend int g_get_ndb_blobs_value(NdbBlob *ndb_blob, void *arg);
+  void release_blobs_buffer();
   Uint32 setup_get_hidden_fields(NdbOperation::GetValueSpec gets[2]);
   void get_hidden_fields_keyop(NdbOperation::OperationOptions *options,
                                NdbOperation::GetValueSpec gets[2]);

=== modified file 'storage/ndb/include/ndbapi/NdbBlob.hpp'
--- a/storage/ndb/include/ndbapi/NdbBlob.hpp	2009-06-15 06:15:20 +0000
+++ b/storage/ndb/include/ndbapi/NdbBlob.hpp	2009-09-08 11:02:48 +0000
@@ -369,6 +369,7 @@ private:
     Buf();
     ~Buf();
     void alloc(unsigned n);
+    void release();
     void zerorest();
     void copyfrom(const Buf& src);
   };

=== modified file 'storage/ndb/src/ndbapi/NdbBlob.cpp'
--- a/storage/ndb/src/ndbapi/NdbBlob.cpp	2009-05-26 18:53:34 +0000
+++ b/storage/ndb/src/ndbapi/NdbBlob.cpp	2009-09-08 11:02:48 +0000
@@ -376,6 +376,13 @@ NdbBlob::init()
 void
 NdbBlob::release()
 {
+  theKeyBuf.release();
+  theAccessKeyBuf.release();
+  thePackKeyBuf.release();
+  theHeadInlineBuf.release();
+  theHeadInlineCopyBuf.release();
+  thePartBuf.release();
+  theBlobEventDataBuf.release();
   setState(Idle);
 }
 
@@ -411,6 +418,16 @@ NdbBlob::Buf::alloc(unsigned n)
 }
 
 void
+NdbBlob::Buf::release()
+{
+  if (data)
+    delete [] data;
+  data = NULL;
+  size = 0;
+  maxsize = 0;
+}
+
+void
 NdbBlob::Buf::zerorest()
 {
   assert(size <= maxsize);

Thread
bzr commit into mysql-5.1-telco-6.2 branch (Martin.Skold:2985) Bug#36701Martin Skold8 Sep