maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #04931
my_apc.cc and new innodb
Hi.
There's some issue we need to discuss.
I've discovered it when merging your APC code into 10.0-monty, but the
problem is simple enough and could've been found earlier too. In the
thd_killed() you do:
3809 extern "C" int thd_killed(const MYSQL_THD thd)
3810 {
3811 if (!thd)
3812 thd= current_thd;
3813
3814 Apc_target *apc_target= (Apc_target*)&thd->apc_target;
3815 if (apc_target->have_apc_requests())
3816 apc_target->process_apc_requests();
3817
3818 if (!(thd->killed & KILL_HARD_BIT))
3819 return 0;
3820 return thd->killed;
3821 }
But there's no rule that thd_killed() cannot be called with thd different
from current_thd. That is, with thd of *another thread*. Of course, when
it happens, the caller is responsible for making sure that the owner
thread of that thd isn't going to use it concurrently. And that's
exactly what happens in the new InnoDB.
Now, show explain wasn't designed to work in this situation, it created
items (which are created using sql_alloc, that uses mem_root of the
current thread, and added to the free item list of the current thd).
As a short-term fix, I've added a protection to thd_killed() to not call
apc functions if thd != current_thd. But I don't like it, I think a
better solution would be to switch thds, like thread pool does, and
process apc requests anyway.
What do you think?
Regards,
Sergei