race condition in pgplsql call handler?

Started by Zdenek Kotalaover 18 years ago4 messages
#1Zdenek Kotala
Zdenek.Kotala@Sun.COM

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

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Zdenek Kotala (#1)
Re: race condition in pgplsql call handler?

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

#3Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Tom Lane (#2)
Re: race condition in pgplsql call handler?

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

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Zdenek Kotala (#3)
Re: race condition in pgplsql call handler?

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