List:Internals« Previous MessageNext Message »
From:Mats Kindahl Date:May 3 2011 9:31am
Subject:Re: Use of thread specific data with mysqld
View as plain text  
On 04/28/2011 02:41 AM, Hiromichi Watari wrote:
> Hi Marc,
> Thank you very much for your pointer, I believe I'm OK with my data residing in
> struct st_my_thread_var with the common key THR_KEY_mysys for now.  However if the need
> changes in the future I will definitely take a look at what you have done.  I appreciate
> you taking time to answer my question.
> Hiromichi

Hi Hiromichi,

A general note on storing data for a thread using pthread_setspecific
in MySQL: it only works if there is a single THD associated with each
thread. There were, for example, an experimental thread pool
implementation in an 6.0 of the server trees where each POSIX thread
managed several THD "session threads". If this architecture is used,
it means that thread-specific data set using pthread_setspecific can
"leak" to a different session if the same thread switches to use a
different THD structure.

This is not the case unless you use 6.0, but since that never GA:ed,
it should not be a problem in production environments since the 5.1
server has one THD structure for each POSIX thread.

Just my few cents,
Mats Kindahl
>
> --- On Wed, 4/27/11, Marc Alff <marc.alff@stripped> wrote:
>
>> From: Marc Alff <marc.alff@stripped>
>> Subject: Re: Use of thread specific data with mysqld
>> To: internals@stripped, hiromichiwatari@stripped
>> Cc: "Sergei Golubchik" <serg@stripped>
>> Date: Wednesday, April 27, 2011, 1:14 AM
>>
>> Hi Hiromichi
>>
>> The performance schema also uses it's own thread local
>> storage, with a dedicated thread key.
>>
>> Examples of code from storage/perfschema/*.cc:
>>
>> Init:
>>
>>   if (pthread_key_create(&THR_PFS,
>> destroy_pfs_thread))
>>     return NULL;
>>
>>   THR_PFS_initialized= true;
>>
>> Anything between init and destroy:
>>
>> PFS_thread *pfs_thread=
>> my_pthread_getspecific_ptr(PFS_thread*, THR_PFS);
>> my_pthread_setspecific_ptr(THR_PFS, pfs);
>>
>> Destroy:
>>
>>   /*
>>     Be careful to not delete un-initialized
>> keys,
>>     this would affect key 0, which is
>> THR_KEY_mysys,
>>   */
>>   if (THR_PFS_initialized)
>>   {
>>     my_pthread_setspecific_ptr(THR_PFS, NULL);
>>     pthread_key_delete(THR_PFS);
>>     THR_PFS_initialized= false;
>>   }
>>
>> Note the code around THR_PFS_initialized: this was found
>> the hard way, destroying a key that was not properly created
>> caused all sort of chaos, so calls to pthread_key_create()
>> and pthread_key_delete() have to be *really* well balanced.
>>
>> I hope this helps.
>>
>> Regards,
>> -- Marc
>>
>>
>> On 4/26/11 1:19 PM, Hiromichi Watari wrote:
>>> Hi Sergei,
>>> I tried but I just couldn't make my own thread
>> specific data to coexist with structure st_my_thread_var so
>> I ended up moving my data to the structure and used it
>> instead.
>>> I suppose there is really no reason to reinvent the
>> wheel, is there ?
>>> But anyway, thank you for your help and you are the
>> best.
>>> Hiromichi
>>>
>>>
>>> --- On Sun, 4/24/11, Sergei Golubchik<serg@stripped> 
>> wrote:
>>>> From: Sergei Golubchik<serg@stripped>
>>>> Subject: Re: Use of thread specific data with
>> mysqld
>>>> To: "Hiromichi Watari"<hiromichiwatari@stripped>
>>>> Cc: internals@stripped
>>>> Date: Sunday, April 24, 2011, 5:04 PM
>>>> Hi, Hiromichi!
>>>>
>>>> On Apr 24, Hiromichi Watari wrote:
>>>>> Hi,
>>>>> I'm trying to use thread specific data with
>> mysqld but
>>>> ran into a problem with my_errno generating
>> Segmentation
>>>> fault at the following line.
>>>>> I know that my_errno is also thread specific
>> data but
>>>> not familiar with its implementation.
>>>>> I'm using pthread_key_create(),
>> pthread_setspecific()
>>>> and pthread_getspecific() for my own thread
>> specific data,
>>>> is there something I should be aware of ?
>>>>> Thanks,
>>>>> Hiromichi
>>>>>
>>>>> p.s. I ran into this problem only if I try to
>> use my
>>>> own thread specific data, of course.
>>>>
>>>> probably you forgot to call my_thread_init() in
>> the
>>>> beginning of your
>>>> thread function.
>>>>
>>>> Anyway, here's the code:
>>>>
>>>> #define my_errno my_thread_var->thr_errno
>>>>
>>>> #define my_thread_var (_my_thread_var())
>>>>
>>>> struct st_my_thread_var *_my_thread_var(void)
>>>> {
>>>>     return 
>> my_pthread_getspecific(struct
>>>> st_my_thread_var*,THR_KEY_mysys);
>>>> }
>>>>
>>>> my_bool my_thread_init(void)
>>>> {
>>>>     ...
>>>>       if (!(tmp= (struct
>> st_my_thread_var *)
>>>> calloc(1, sizeof(*tmp))))
>>>>       {
>>>>         error= 1;
>>>>         goto end;
>>>>       }
>>>>      
>> pthread_setspecific(THR_KEY_mysys,tmp);
>>>>     ...
>>>> }
>>>>
>>>> Regards,
>>>> Sergei
>>>>
>>

Thread
Use of thread specific data with mysqldHiromichi Watari24 Apr
  • Re: Use of thread specific data with mysqldSergei Golubchik24 Apr
    • Re: Use of thread specific data with mysqldHiromichi Watari26 Apr
      • Re: Use of thread specific data with mysqldMarc Alff27 Apr
        • Re: Use of thread specific data with mysqldHiromichi Watari28 Apr
          • Re: Use of thread specific data with mysqldMats Kindahl3 May
            • Re: Use of thread specific data with mysqldHiromichi Watari4 May
            • Re: Use of thread specific data with mysqldMichael Widenius4 May
              • Regression test returning different result each time it's runHiromichi Watari15 Jun
                • Re: Regression test returning different result each time it's runØystein Grøvlen16 Jun
                  • Re: Regression test returning different result each time it's runHiromichi Watari16 Jun
                    • Re: Regression test returning different result each time it's runØystein Grøvlen16 Jun
                      • Re: Regression test returning different result each time it's runRick James16 Jun
                        • Re: Regression test returning different result each time it's runHiromichi Watari18 Jun
                      • Re: Regression test returning different result each time it's runHiromichi Watari18 Jun
                        • Name of function to execute mysql commandHiromichi Watari21 Jan