Обсуждение: race condition in pgplsql call handler?
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
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
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
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