Обсуждение: race condition in pgplsql call handler?

Поиск
Список
Период
Сортировка

race condition in pgplsql call handler?

От
Zdenek Kotala
Дата:
I'm looking into PG/PLSql code and following code in 
plpgsql_call_handler looks strange:
        /* Find or compile the function */        func = plpgsql_compile(fcinfo, false);
        /* Mark the function as busy, so it can't be deleted from under 
us */        func->use_count++;


I don't have deep knowledge about this part of code. But what happen if 
in parallel execution "func" will be deleted between these two lines?

    Zdenek


Re: race condition in pgplsql call handler?

От
Tom Lane
Дата:
Zdenek Kotala <Zdenek.Kotala@Sun.COM> writes:
> I'm looking into PG/PLSql code and following code in 
> plpgsql_call_handler looks strange:

>          /* Find or compile the function */
>          func = plpgsql_compile(fcinfo, false);

>          /* Mark the function as busy, so it can't be deleted from under 
> us */
>          func->use_count++;


> I don't have deep knowledge about this part of code. But what happen if 
> in parallel execution "func" will be deleted between these two lines?

This is not a race condition because the backend is single-threaded.

(Hint: what it actually means by "function" is "the plpgsql function
cache entry I just found or built".)
        regards, tom lane


Re: race condition in pgplsql call handler?

От
Zdenek Kotala
Дата:
Tom Lane wrote:
> Zdenek Kotala <Zdenek.Kotala@Sun.COM> writes:
>> I'm looking into PG/PLSql code and following code in 
>> plpgsql_call_handler looks strange:
> 
>>          /* Find or compile the function */
>>          func = plpgsql_compile(fcinfo, false);
> 
>>          /* Mark the function as busy, so it can't be deleted from under 
>> us */
>>          func->use_count++;
> 
> 
>> I don't have deep knowledge about this part of code. But what happen if 
>> in parallel execution "func" will be deleted between these two lines?
> 
> This is not a race condition because the backend is single-threaded.

I see. Each backend has own function cache and use_count is for handle 
recursion usage. Are my assumption correct?
    thanks Zdenek


Re: race condition in pgplsql call handler?

От
Tom Lane
Дата:
Zdenek Kotala <Zdenek.Kotala@Sun.COM> writes:
> Tom Lane wrote:
>> This is not a race condition because the backend is single-threaded.

> I see. Each backend has own function cache and use_count is for handle 
> recursion usage. Are my assumption correct?

Right.  Once a function cache entry is set up, it exists unchanged until
no longer in use, no matter what happens to the underlying pg_proc row.
        regards, tom lane