Skip to content

Commit 23b3ff1

Browse files
author
V S Murthy Sidagam
committed
Bug#11757169: MyISAM share list scalability problems
Post push patch, which fixes a valgrind error.
1 parent 2f84df5 commit 23b3ff1

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

storage/myisam/ha_myisam.cc

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -750,33 +750,45 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked)
750750
if (!(test_if_locked & HA_OPEN_TMP_TABLE) && opt_myisam_use_mmap)
751751
test_if_locked|= HA_OPEN_MMAP;
752752

753-
lock_shared_ha_data();
754-
my_handler_share= static_cast<Myisam_handler_share*>(get_ha_share_ptr());
755-
if (my_handler_share)
756-
share= my_handler_share->m_share;
757-
758-
if (!(file= mi_open_share(name, share, mode,
759-
test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
760-
{
761-
unlock_shared_ha_data();
762-
return (my_errno ? my_errno : -1);
763-
}
764-
if (!my_handler_share)
753+
/*
754+
We are allocating the handler share only in case of normal MyISAM tables
755+
*/
756+
if (table->s->tmp_table == NO_TMP_TABLE)
765757
{
766-
my_handler_share= new (std::nothrow) Myisam_handler_share;
758+
lock_shared_ha_data();
759+
my_handler_share= static_cast <Myisam_handler_share*>(get_ha_share_ptr());
767760
if (my_handler_share)
761+
share= my_handler_share->m_share;
762+
763+
if (!(file= mi_open_share(name, share, mode,
764+
test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
768765
{
769-
my_handler_share->m_share= file->s;
770-
set_ha_share_ptr(static_cast<Handler_share*>(my_handler_share));
766+
unlock_shared_ha_data();
767+
return (my_errno ? my_errno : -1);
771768
}
772-
else
769+
if (!my_handler_share)
773770
{
774-
mi_close(file);
775-
unlock_shared_ha_data();
776-
return (my_errno ? my_errno : HA_ERR_OUT_OF_MEM);
771+
my_handler_share= new (std::nothrow) Myisam_handler_share;
772+
if (my_handler_share)
773+
{
774+
my_handler_share->m_share= file->s;
775+
set_ha_share_ptr(static_cast <Handler_share*>(my_handler_share));
776+
}
777+
else
778+
{
779+
mi_close(file);
780+
unlock_shared_ha_data();
781+
return (my_errno ? my_errno : HA_ERR_OUT_OF_MEM);
782+
}
777783
}
784+
unlock_shared_ha_data();
778785
}
779-
unlock_shared_ha_data();
786+
else
787+
if (!(file=
788+
mi_open_share(name, share, mode,
789+
test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
790+
return (my_errno ? my_errno : -1);
791+
780792
if (!table->s->tmp_table) /* No need to perform a check for tmp table */
781793
{
782794
if ((my_errno= table2myisam(table, &keyinfo, &recinfo, &recs)))
@@ -837,15 +849,15 @@ int ha_myisam::close(void)
837849
my_bool closed_share= FALSE;
838850
lock_shared_ha_data();
839851
int err= mi_close_share(file, &closed_share);
840-
file=0;
852+
file= 0;
841853
/*
842854
Since tmp tables will also come to the same flow. To distinguesh with them
843855
we need to check table_share->tmp_table.
844856
*/
845857
if (closed_share && table_share->tmp_table == NO_TMP_TABLE)
846858
{
847859
Myisam_handler_share *my_handler_share=
848-
static_cast<Myisam_handler_share*>(get_ha_share_ptr());
860+
static_cast <Myisam_handler_share*>(get_ha_share_ptr());
849861
if (my_handler_share && my_handler_share->m_share)
850862
delete (my_handler_share);
851863
set_ha_share_ptr(NULL);

0 commit comments

Comments
 (0)