← Back to team overview

maria-developers team mailing list archive

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