Commit 5ad151aa authored by ingo@mysql.com's avatar ingo@mysql.com

Test Bug: Memory leaks in the archive handler.

Moved initialization code into a new init function.
Added a new cleanup function.
Added a call to close the meta file.
parent 5ea224b8
#
# Simple test for archive example
# Taken fromm the select test
# Taken from the select test
#
-- source include/have_archive.inc
......
......@@ -116,7 +116,6 @@
/* Variables for archive share methods */
pthread_mutex_t archive_mutex;
static HASH archive_open_tables;
static int archive_init= 0;
/* The file extension */
#define ARZ ".ARZ" // The data file
......@@ -142,6 +141,46 @@ static byte* archive_get_key(ARCHIVE_SHARE *share,uint *length,
return (byte*) share->table_name;
}
/*
Initialize the archive handler.
SYNOPSIS
archive_db_init()
void
RETURN
FALSE OK
TRUE Error
*/
bool archive_db_init()
{
VOID(pthread_mutex_init(&archive_mutex, MY_MUTEX_INIT_FAST));
return (hash_init(&archive_open_tables, system_charset_info, 32, 0, 0,
(hash_get_key) archive_get_key, 0, 0));
}
/*
Release the archive handler.
SYNOPSIS
archive_db_end()
void
RETURN
FALSE OK
*/
bool archive_db_end()
{
hash_free(&archive_open_tables);
VOID(pthread_mutex_destroy(&archive_mutex));
return FALSE;
}
/*
This method reads the header of a datafile and returns whether or not it was successful.
*/
......@@ -269,23 +308,6 @@ ARCHIVE_SHARE *ha_archive::get_share(const char *table_name, TABLE *table)
uint length;
char *tmp_name;
if (!archive_init)
{
/* Hijack a mutex for init'ing the storage engine */
pthread_mutex_lock(&LOCK_mysql_create_db);
if (!archive_init)
{
VOID(pthread_mutex_init(&archive_mutex,MY_MUTEX_INIT_FAST));
if (hash_init(&archive_open_tables,system_charset_info,32,0,0,
(hash_get_key) archive_get_key,0,0))
{
pthread_mutex_unlock(&LOCK_mysql_create_db);
return NULL;
}
archive_init++;
}
pthread_mutex_unlock(&LOCK_mysql_create_db);
}
pthread_mutex_lock(&archive_mutex);
length=(uint) strlen(table_name);
......@@ -379,6 +401,7 @@ int ha_archive::free_share(ARCHIVE_SHARE *share)
(void)write_meta_file(share->meta_file, share->rows_recorded, FALSE);
if (gzclose(share->archive_write) == Z_ERRNO)
rc= 1;
my_close(share->meta_file,MYF(0));
my_free((gptr) share, MYF(0));
}
pthread_mutex_unlock(&archive_mutex);
......
......@@ -125,3 +125,7 @@ public:
THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to,
enum thr_lock_type lock_type);
};
bool archive_db_init(void);
bool archive_db_end(void);
......@@ -277,6 +277,16 @@ int ha_init()
else
opt_using_transactions=1;
}
#endif
#ifdef HAVE_ARCHIVE_DB
if (have_archive_db == SHOW_OPTION_YES)
{
if (archive_db_init())
{
have_archive_db= SHOW_OPTION_DISABLED;
error= 1;
}
}
#endif
return error;
}
......@@ -308,6 +318,10 @@ int ha_panic(enum ha_panic_function flag)
#ifdef HAVE_NDBCLUSTER_DB
if (have_ndbcluster == SHOW_OPTION_YES)
error|=ndbcluster_end();
#endif
#ifdef HAVE_ARCHIVE_DB
if (have_archive_db == SHOW_OPTION_YES)
error|= archive_db_end();
#endif
return error;
} /* ha_panic */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment