Commit 05927abf authored by Rich Prohaska's avatar Rich Prohaska

#141 fix table open and close race

parent d9edc3fb
...@@ -216,8 +216,11 @@ static void free_key_and_col_info (KEY_AND_COL_INFO* kc_info) { ...@@ -216,8 +216,11 @@ static void free_key_and_col_info (KEY_AND_COL_INFO* kc_info) {
} }
tokudb_my_free(kc_info->field_lengths); tokudb_my_free(kc_info->field_lengths);
kc_info->field_lengths = NULL;
tokudb_my_free(kc_info->length_bytes); tokudb_my_free(kc_info->length_bytes);
kc_info->length_bytes = NULL;
tokudb_my_free(kc_info->blob_fields); tokudb_my_free(kc_info->blob_fields);
kc_info->blob_fields = NULL;
} }
void TOKUDB_SHARE::init(void) { void TOKUDB_SHARE::init(void) {
...@@ -265,11 +268,6 @@ static TOKUDB_SHARE *get_share(const char *table_name, TABLE_SHARE* table_share) ...@@ -265,11 +268,6 @@ static TOKUDB_SHARE *get_share(const char *table_name, TABLE_SHARE* table_share)
share->table_name = tmp_name; share->table_name = tmp_name;
strmov(share->table_name, table_name); strmov(share->table_name, table_name);
error = allocate_key_and_col_info(table_share, &share->kc_info);
if (error) {
goto exit;
}
error = my_hash_insert(&tokudb_open_tables, (uchar *) share); error = my_hash_insert(&tokudb_open_tables, (uchar *) share);
if (error) { if (error) {
free_key_and_col_info(&share->kc_info); free_key_and_col_info(&share->kc_info);
...@@ -314,19 +312,21 @@ static int free_share(TOKUDB_SHARE * share) { ...@@ -314,19 +312,21 @@ static int free_share(TOKUDB_SHARE * share) {
} }
} }
free_key_and_col_info(&share->kc_info);
error = tokudb::close_status(&share->status_block); error = tokudb::close_status(&share->status_block);
assert(error == 0); assert(error == 0);
free_key_and_col_info(&share->kc_info);
tokudb_pthread_mutex_lock(&tokudb_mutex); tokudb_pthread_mutex_lock(&tokudb_mutex);
tokudb_pthread_mutex_lock(&share->mutex); tokudb_pthread_mutex_lock(&share->mutex);
share->m_state = TOKUDB_SHARE::CLOSED; share->m_state = TOKUDB_SHARE::CLOSED;
if (share->use_count > 0) { if (share->use_count > 0) {
fprintf(stderr, "%ld %s:%u free_share %p %d\n", syscall(186), __FILE__, __LINE__, share, share->use_count);
tokudb_pthread_cond_broadcast(&share->m_openclose_cond); tokudb_pthread_cond_broadcast(&share->m_openclose_cond);
tokudb_pthread_mutex_unlock(&share->mutex); tokudb_pthread_mutex_unlock(&share->mutex);
tokudb_pthread_mutex_unlock(&tokudb_mutex); tokudb_pthread_mutex_unlock(&tokudb_mutex);
} else { } else {
my_hash_delete(&tokudb_open_tables, (uchar *) share); my_hash_delete(&tokudb_open_tables, (uchar *) share);
tokudb_pthread_mutex_unlock(&share->mutex); tokudb_pthread_mutex_unlock(&share->mutex);
...@@ -1818,7 +1818,10 @@ int ha_tokudb::open(const char *name, int mode, uint test_if_locked) { ...@@ -1818,7 +1818,10 @@ int ha_tokudb::open(const char *name, int mode, uint test_if_locked) {
share->m_state = TOKUDB_SHARE::OPENING; share->m_state = TOKUDB_SHARE::OPENING;
tokudb_pthread_mutex_unlock(&share->mutex); tokudb_pthread_mutex_unlock(&share->mutex);
ret_val = initialize_share(name, mode); ret_val = allocate_key_and_col_info(table_share, &share->kc_info);
if (ret_val == 0) {
ret_val = initialize_share(name, mode);
}
tokudb_pthread_mutex_lock(&share->mutex); tokudb_pthread_mutex_lock(&share->mutex);
if (ret_val == 0) { if (ret_val == 0) {
......
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