Sergei, I have pushed the updates in the separate commit:

> diff --git a/storage/perfschema/pfs_variable.cc
>> b/storage/perfschema/pfs_variable.cc
>> > index 984b68e699b..85656532c72 100644
>> > --- a/storage/perfschema/pfs_variable.cc
>> > +++ b/storage/perfschema/pfs_variable.cc
>> > @@ -100,6 +102,15 @@ bool
>> PFS_system_variable_cache::init_show_var_array(enum_var_type scope, bool st
>> >
>> >    mysql_prlock_unlock(&LOCK_system_variables_hash);
>> >
>> > +  for (uint i= 0; i < m_show_var_array.elements(); i++)
>>
>> why separately, not in the loop above?
>>
> I wanted to do ti outside of LOCK_system_variables_hash, only that's why.
>
>>
>> > +  {
>> > +    sys_var *var= (sys_var *)m_show_var_array.at(i).value;
>> > +    if (!var) continue;
>>
>> can var be NULL?
>>
> I have seen this protection elsewhere in PS code, and blindly relied on
> that it's important:)
>
> See for example the loop
> in PFS_system_variable_cache::do_materialize_global.
> They only continue until the value is NULL. Do you have a clue why?
>
>
>> > +    sys_var *prev= i == 0 ? NULL : (sys_var *)m_show_var_array.at
>> (i-1).value;
>>
>> hmm, normally this is done with
>>
>>   sys_var *prev= NULL;
>>
>> before the loop and
>>
>>    prev= var;
>>
>> in the loop, after plugin_lock_by_var_if_different().
>>
>>
> Right, that'll be better. I'll rewrite.
>
>
Since it is already a separate loop, I have extracted it to
the plugin_lock_by_sys_var_array function altogether. The function's
meaning is now much cleaner itself. And besides there's much less
conditions computed in the loop, so it's faster.


> @@ -316,7 +327,27 @@ class PFS_system_variable_cache_apc: public
>> Apc_target::Apc_call
>> >
>> >    void call_in_target_thread() override
>> >    {
>> > -    (m_pfs->*m_func)(m_param);
>> > +    call(m_pfs, m_func, m_param);
>> > +  }
>> > +public:
>> > +  static void call(PFS_system_variable_cache *pfs, Request func, uint
>> param)
>> > +  {
>> > +    THD *safe_thd= pfs->safe_thd();
>> > +
>> > +    if (pfs->query_scope() == OPT_SESSION)
>>
>> what's the point doing apc call if the query_scope() is not OPT_SESSION?
>> It seems like here you need a DBUG_ASSERT,
>> and the if() should be much earlier up the stack.
>>
>
> I just used the same mechanism for global variables as well. I understand
> now it's an overkill. Will simplify!
>
>
I realized i didn't touch global variables traverse, so moving this check
to an assertion was enough


-- 
Yours truly,
Nikita Malyavin
_______________________________________________
Mailing list: https://launchpad.net/~maria-developers
Post to     : maria-developers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~maria-developers
More help   : https://help.launchpad.net/ListHelp

Reply via email to