=== modified file 'storage/tokudb/ha_tokudb.cc' --- storage/tokudb/ha_tokudb.cc 2014-03-24 19:01:55 +0000 +++ storage/tokudb/ha_tokudb.cc 2014-04-24 10:26:13 +0000 @@ -3926,6 +3926,7 @@ int ha_tokudb::write_row(uchar * record) tokudb_trx_data *trx = NULL; uint curr_num_DBs; bool create_sub_trans = false; + bool num_DBs_locked= false; // // some crap that needs to be done because MySQL does not properly abstract @@ -3973,6 +3974,7 @@ int ha_tokudb::write_row(uchar * record) // if (!num_DBs_locked_in_bulk) { rw_rdlock(&share->num_DBs_lock); + num_DBs_locked= true; } else { lock_count++; @@ -4063,7 +4065,7 @@ int ha_tokudb::write_row(uchar * record) track_progress(thd); } cleanup: - if (!num_DBs_locked_in_bulk) { + if (num_DBs_locked) { rw_unlock(&share->num_DBs_lock); } if (error == DB_KEYEXIST) { @@ -4154,7 +4156,8 @@ int ha_tokudb::update_row(const uchar * // // grab reader lock on numDBs_lock // - rw_rdlock(&share->num_DBs_lock); + if (!num_DBs_locked_in_bulk) + rw_rdlock(&share->num_DBs_lock); curr_num_DBs = share->num_DBs; if (using_ignore) { @@ -4248,7 +4251,8 @@ int ha_tokudb::update_row(const uchar * cleanup: - rw_unlock(&share->num_DBs_lock); + if (!num_DBs_locked_in_bulk) + rw_unlock(&share->num_DBs_lock); if (error == DB_KEYEXIST) { error = HA_ERR_FOUND_DUPP_KEY; } @@ -6035,7 +6039,8 @@ int ha_tokudb::reset(void) { // int ha_tokudb::acquire_table_lock (DB_TXN* trans, TABLE_LOCK_TYPE lt) { int error = ENOSYS; - rw_rdlock(&share->num_DBs_lock); + if (!num_DBs_locked_in_bulk) + rw_rdlock(&share->num_DBs_lock); uint curr_num_DBs = share->num_DBs; if (lt == lock_read) { error = 0; @@ -6060,7 +6065,8 @@ int ha_tokudb::acquire_table_lock (DB_TX error = 0; cleanup: - rw_unlock(&share->num_DBs_lock); + if (!num_DBs_locked_in_bulk) + rw_unlock(&share->num_DBs_lock); return error; }