Bug #43995 Falcon Valgrind warnings in StorageInterface, StorageHandler & CmdGen

Submitted: 31 Mar 2009 18:12 Modified: 15 May 2009 17:05
Reporter: Kevin Lewis Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Falcon storage engine Severity:S3 (Non-critical)
Version:6.0.10 OS:Any
Assigned to: Kelly Long CPU Architecture:Any
Tags: F_MISCELLANY

[31 Mar 2009 18:12] Kevin Lewis
Description:
Kelly Long wrote:
---------------------------------------------------
==24131== 178,030 bytes in 1,156 blocks are possibly lost in loss record 5 of 5
==24131==    at 0x4A0739E: malloc (vg_replace_malloc.c:207)
==24131==    by 0x942EA0: MemMgr::allocate(unsigned long) (MemMgrV0SysDefault.cpp:320)
==24131==    by 0x9421AE: Log::addListener(int, void (*)(int, char const*, void*), void*) (MemoryManager.h:109)
==24131==    by 0x8CB0A2: StorageInterface::falcon_init(void*) (ha_falcon.cpp:254)
==24131==    by 0x7A8A55: ha_initialize_handlerton(st_plugin_int*) (handler.cc:448)
==24131==    by 0x8317C1: _ZL17plugin_initializeP13st_plugin_int (sql_plugin.cc:1008)
==24131==    by 0x83471B: plugin_init(int*, char**, int) (sql_plugin.cc:1221)
==24131==    by 0x6A5288: _ZL22init_server_componentsv (mysqld.cc:4079)
==24131==    by 0x6A8247: main (mysqld.cc:4593)

---------------------------------------------------
090327 19:45:55 [Note] Event Scheduler: Purging the queue. 0 events
==10163== Invalid read of size 4
==10163==    at 0x8D353C: StorageDatabase::release() (StorageDatabase.cpp:949)
==10163==    by 0x8D9AC1: StorageTableShare::~StorageTableShare() (StorageTableShare.cpp:161)
==10163==    by 0x8D5530: StorageHandler::~StorageHandler() (StorageHandler.cpp:157)
==10163==    by 0x8D3975: freeFalconStorageHandler (StorageHandler.cpp:118)
==10163==    by 0x8CACBA: StorageInterface::panic(handlerton*, ha_panic_function) (ha_falcon.cpp:297)
==10163==    by 0x7A755B: ha_finalize_handlerton(st_plugin_int*) (handler.cc:393)

==10163==  Address 0x4d73e18 is 400 bytes inside a block of size 408 free'd
==10163==    at 0x4A0609F: free (vg_replace_malloc.c:323)
==10163==    by 0x942E44: MemMgrPoolRelease(MemMgr*, void*) (MemMgrV0SysDefault.cpp:342)
==10163==    by 0x8D54F5: StorageHandler::~StorageHandler() (MemoryManager.h:126)
==10163==    by 0x8D3975: freeFalconStorageHandler (StorageHandler.cpp:118)
==10163==    by 0x8CACBA: StorageInterface::panic(handlerton*, ha_panic_function) (ha_falcon.cpp:297)
==10163==    by 0x7A755B: ha_finalize_handlerton(st_plugin_int*) (handler.cc:393)

---------------------------------------------------
==19425== Mismatched free() / delete / delete []
==19425==    at 0x4A05B9D: operator delete(void*) (vg_replace_malloc.c:342)
==19425==    by 0x90623B: CmdGen::~CmdGen() (CmdGen.cpp:150)
==19425==    by 0x8CE102: StorageInterface::createIndex(char const*, char const*, TABLE*, int) (ha_falcon.cpp:972)
==19425==    by 0x8CE31E: StorageInterface::addIndex(THD*, TABLE*, st_ha_create_information*, st_ha_alter_information*, Bitmap<39>*) (ha_falcon.cpp:2616)
==19425==    by 0x8CE3DB: StorageInterface::alter_table_phase2(THD*, TABLE*, st_ha_create_information*, st_ha_alter_information*, Bitmap<39>*) (ha_falcon.cpp:2537)
==19425==    by 0x7C1CFC: mysql_fast_or_online_alter_table(THD*, TABLE_LIST*, TABLE*, st_ha_create_information*, st_ha_alter_information*, Bitmap<39>*, enum_enable_or_disable) (sql_table.cc:6000)
==19425==    by 0x7C5BBF: mysql_alter_table(THD*, char*, char*, st_ha_create_information*, TABLE_LIST*, Alter_info*, unsigned, st_order*, bool) (sql_table.cc:7166)
==19425==    by 0x6B800C: mysql_execute_command(THD*) (sql_parse.cc:2804)

==19425==  Address 0x104d94e8 is 0 bytes inside a block of size 1,143 alloc'd
==19425==    at 0x4A0661C: operator new[](unsigned long) (vg_replace_malloc.c:274)
==19425==    by 0x905FD5: CmdGen::getString() (CmdGen.cpp:117)
==19425==    by 0x8CE14E: StorageInterface::createIndex(char const*, char const*, TABLE*, int) (ha_falcon.cpp:960)
==19425==    by 0x8CE31E: StorageInterface::addIndex(THD*, TABLE*, st_ha_create_information*, st_ha_alter_information*, Bitmap<39>*) (ha_falcon.cpp:2616)
==19425==    by 0x8CE3DB: StorageInterface::alter_table_phase2(THD*, TABLE*, st_ha_create_information*, st_ha_alter_information*, Bitmap<39>*) (ha_falcon.cpp:2537)
==19425==    by 0x7C1CFC: mysql_fast_or_online_alter_table(THD*, TABLE_LIST*, TABLE*, st_ha_create_information*, st_ha_alter_information*, Bitmap<39>*, enum_enable_or_disable) (sql_table.cc:6000)
==19425==    by 0x7C5BBF: mysql_alter_table(THD*, char*, char*, st_ha_create_information*, TABLE_LIST*, Alter_info*, unsigned, st_order*, bool) (sql_table.cc:7166)
==19425==    by 0x6B800C: mysql_execute_command(THD*) (sql_parse.cc:2804)

How to repeat:
Run valgrind against DBT2

Suggested fix:
Kelly Long sugggested these fixes
---------------------------------------------------
storage/falcon/ha_falcon.cpp: near line 287
#define KELLY_VALGRIND_FIX_LOGGER
int StorageInterface::falcon_deinit(void *p)
{
    if(storageHandler)
        {
#ifdef KELLY_VALGRIND_FIX_LOGGER
        storageHandler->deleteNfsLogger(StorageInterface::mysqlLogger, NULL); // KELLY - fix memory leak (found via valgrind)
        storageHandler->deleteNfsLogger(StorageInterface::logger, NULL); // KELLY - fix memory leak (found via valgrind)
#endif // KELLY_VALGRIND_FIX
        storageHandler->shutdownHandler();
        freeFalconStorageHandler();
        }
    return 0;
}

---------------------------------------------------
storage/falcon/StorageHandler.cpp near line 146:
#define KELLY_VALGRIND_FIX
StorageHandler::~StorageHandler(void)
{
#ifdef KELLY_VALGRIND_FIX
    // KELLY - delete StorageTableShares FIRST as they rely on StroageDatabase (valgrind found this)
    for (int n = 0; n < tableHashSize; ++n)
        for (StorageTableShare *table; (table = tables[n]);)
            {
            tables[n] = table->collision;
            delete table;
            }
    for (int n = 0; n < databaseHashSize; ++n)
        for (StorageDatabase *storageDatabase; (storageDatabase = storageDatabases[n]);)
             {
            storageDatabases[n] = storageDatabase->collision;
            delete storageDatabase;
            }
#endif // KELLY_VALGRIND_FIX

---------------------------------------------------
storage/falcon/CmdGen.cpp near end of file:
#define KELLY_VALGRIND_FIX_CMDGEN
const char* CmdGen::getString(void)
{
    if (!hunks && remaining)
        {
        *ptr = 0;

        return buffer;
        }
#ifdef KELLY_VALGRIND_FIX_CMDGEN
    delete [] temp; // KELLY - memory leak fix (found via valgrind)
#else // KELLY_VALGRIND_FIX_CMDGEN
    delete temp;
#endif // KELLY_VALGRIND_FIX_CMDGEN
    temp = new char[totalLength + 1];
    memcpy(temp, buffer, sizeof(buffer));
    char *p = temp + sizeof(buffer);
    if (hunks)
        {
        for (CmdHunk *hunk = hunks; hunk->next; hunk = hunk->next)
            {
            memcpy (p, hunk->data, sizeof(hunk->data));
            p += sizeof(hunk->data);
            }

        size_t len = sizeof(currentHunk->data) - remaining;
        memcpy(p, currentHunk->data, len);
        p += len;
        }

    *p = 0;

    return temp;
}

void CmdGen::reset(void)
{
    for (CmdHunk *hunk; (hunk = hunks);)
        {
        hunks = hunk->next;
        delete hunk;
        }

#ifdef KELLY_VALGRIND_FIX
    delete [] temp; // KELLY - memory leak fix (found via valgrind)
#else // KELLY_VALGRIND_FIX
    delete temp;
#endif // KELLY_VALGRIND_FIX
    init();
}
[31 Mar 2009 18:20] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/70947
[31 Mar 2009 18:28] Kevin Lewis
Changes by Kelly Long were pushed by Kevin Lewis
[2 Apr 2009 17:39] Bugs System
Pushed into 6.0.11-alpha (revid:hky@sun.com-20090402144811-yc5kp8g0rjnhz7vy) (version source revid:hky@sun.com-20090331202425-9j6894frsl0m0frp) (merge vers: 6.0.11-alpha) (pib:6)
[15 May 2009 17:05] MC Brown
A note has been added to the 6.0.11 changelog: 

valgrind would report errors for the StorageInterface, StorageHAndler and CmdGen portions of Falcon.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.041 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.