Re: TR: [BUGS] BUG #8842: lo_open/fastpath transaction inconsistency

From: Ludovic POLLET <ludovic(dot)pollet(at)kurmi-software(dot)com>
To: Kevin Grittner <kgrittn(at)ymail(dot)com>, "pgsql-jdbc(at)postgresql(dot)org" <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: TR: [BUGS] BUG #8842: lo_open/fastpath transaction inconsistency
Date: 2014-05-12 09:44:48
Message-ID: d2bc73e48d434d17b0e284cd2e0f02c9@DB4PR06MB173.eurprd06.prod.outlook.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs pgsql-jdbc

I encountered this problem while using exactly the pattern you describe!

"Always add the large object before setting a reference to it, and always eliminate references to a large object before deleting it."

The problem is that you cannot delete references that have been seen by transaction that started in the past ! So even with this pattern, it is important that older transaction can access LOB that are concurrently deleted/replaced. And this is only possible if they access it in readonly mode. (This is coherent with the fact that they won't be able to perform modification on it at that time)

My patch just make LOB access read only by default until a modification is required.

Ludovic

-----Message d'origine-----
De : Kevin Grittner [mailto:kgrittn(at)ymail(dot)com]
Envoyé : lundi 5 mai 2014 15:55
À : Ludovic POLLET; pgsql-jdbc(at)postgresql(dot)org
Objet : Re: [JDBC] TR: [BUGS] BUG #8842: lo_open/fastpath transaction inconsistency

Ludovic POLLET <ludovic(dot)pollet(at)kurmi-software(dot)com> wrote:

> We are facing a bug where our application cannot read a Lob
> because of concurrent removal. However, we are using the
> serializable isolation level and a correct transaction scope.
> We're using the latest JDBC driver snapshot (and hibernate but
> that does not really matter).
>
> The problematic use case is basically a thread that read the LOB
> while another thread replace it with a new one and release the
> old one. In this case, the reader will get a "large object xxx
> does not exist".
>
> From what I understand, it is due to the opening of the large
> object that is always done in read/write mode and thus behave as
> a read commited one (as written in the doc).
>
> This behaviour is at least very surprising especially when
> working in SERIALIZABLE concurrency level.
>
> The attached patch implements the following changes:
> -  Opening the lob in read mode until a write function is called.
> In such a case, the LOB will be reopened in read/write mode. It
> totally solves my problem since our application does not modify
> Lob, but creates new ones indeed.
> -  Deferring the first lo_open until a Blob function is really
> called (hibernate seems to be creating blob even if it does not
> even read them...)
>
> What do you think about these behaviors ?

As one of the developers of the implementation of serializable
transactions used by PostgreSQL, I remember that we needed to
exclude large objects from the transaction serialization because it
basically did not follow transactional semantics in any other
regard.  The only workaround I can think to suggest is to only
insert and delete large objects -- never update them, and rely on
the serialization of modifications to the OID columns which
*reference* the large objects.  Always add the large object before
setting a reference to it, and always eliminate references to a
large object before deleting it.  A crash at the wrong time could
leave a large object which is unreferenced, so you might want to
look at the vacuumlo executable:

http://www.postgresql.org/docs/current/static/vacuumlo.html

Unfortunately, I don't know how that approach interacts with
Hibernate or its use of the JDBC driver.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message ales.kratochvil 2014-05-12 11:48:38 BUG #10294: DROP DOMAIN IF EXISTS does not work as expected if schema does not exist also
Previous Message Tom Lane 2014-05-12 03:48:53 Re: hstore dump/restore bug in 9.3

Browse pgsql-jdbc by date

  From Date Subject
Next Message Mike Fowler 2014-05-16 09:52:00 Buildfarm test failures on JDK 5
Previous Message David G Johnston 2014-05-07 18:13:56 Re: temp table problem due to thread concurrency ( ERROR: could not open file "base/ ) ?