Re: pg_relation_size / could not open relation with OID #

Поиск
Список
Период
Сортировка
От Tomas Vondra
Тема Re: pg_relation_size / could not open relation with OID #
Дата
Msg-id 4C9917C0.7000301@fuzzy.cz
обсуждение исходный текст
Ответ на Re: pg_relation_size / could not open relation with OID #  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-general
>> OK, I'm a bit confused now. So it's not a race condition (i.e. a bug) in
>> a pg_relation_size but a feature?
>
> Well, "feature" is in the eye of the beholder I guess.  The race
> condition is not really avoidable; certainly pg_relation_size() can't
> do anything to prevent it.  And you do *not* want "guaranteed consistent"
> results; that would mean taking a lock on every table in the system,
> which would likely result in far more failures, not fewer failures,
> because of deadlocks.

Well, I was thinking about locking the pg_class itself (SHARE ROW
EXCLUSIVE or EXCLUSIVE), but I really am not sure it's a good idea. But
I'm not sure locking a table is different from locking a corresponding
row in the pg_class table - maybe it's the same.

All (or most of) the DDL commands have to modify pg_class at some point,
so I thought that if those commands lock the row (representing a
table/index/...), I could lock the whole table (preventing the DDL from
running).

But I admit this may be a hilariously stupid idea ...

>
> We could prevent your query from failing if we did something like having
> pg_relation_size() return NULL, rather than throwing an error, if the
> OID it's given doesn't turn out to correspond to a live table.  I'm not
> sure if that'd be a net improvement or not --- it certainly seems to
> reduce the system's ability to detect simple errors, and depending on
> what your query was doing with the results, a NULL could bollix it up in
> other ways.  But IIRC we've done similar things for other system inquiry
> functions, so maybe it'd be reasonable here too.

Hmm, sounds nice. Actually I could create such 'graceful wrapper' on my
own - just catch the exception and return NULL. Right?

Another possible solution is to remove the pg_relation_size from the
SELECT itself execute it in a loop for each of the rows (I have to do a
row-by-row processing anyway, and in case of pg_relation_size the
slowdown should be negligible - I guess).

regards
Tomas

В списке pgsql-general по дате отправления:

Предыдущее
От: Aleksey Tsalolikhin
Дата:
Сообщение: ERROR: cache lookup failed for type 14237017
Следующее
От: "Joshua D. Drake"
Дата:
Сообщение: Re: versioned pl/pgsql functions