#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#36701 | Martin Skold | 8 Sep |