[elephant-devel] Re: Updated version of last Postmodern patch bundle

Alex Mizrahi killerstorm at newmail.ru
Wed Mar 19 16:17:36 UTC 2008


 ??>> theoretically we could get a deadlock, but it only happens if
 ??>> application updates object in different order, and this can be
 ??>> avoided.

 LPP> Note that concurrent writes to an indexed slot will currently have
 LPP> a pretty high chance of inducing a deadlock. Try the new test suite.
 LPP> In general it seems to be a tough bet relying on this.

aha, so you mean we need retries anyway?
i did not look into tests source code and thought that you're provoking them 
in "traditional" way.

if simple slot writes provoke deadlocks that is not OK IMHO. PostgreSQL 
documentation 
(http://www.postgresql.org/docs/8.1/static/explicit-locking.html#LOCKING-DEADLOCKS)
mentions several resasons why deadlocking can happen, and it doesn't look 
like we are triggering one of them explicitly.
so chances are this can be fixed via some modifications of the code.

as far as i know deadlocks are much worse than conflicts performance-wise --  
because they are detected by the timer, something like once a second, unlike 
conflicts that are detected immidiately -- and we should try making them 
impossible in working course of operations.

if you have an idea how our code can trigger situation as described in pgsql 
manual please drop a note.

 ??>> also, we have a race condition in update-or-insert implementation, but
 ??>> this could be avoided either via savepoints,

 LPP> But SPs are just a way to have more fine-grained retries, so it's
 LPP> not really different from retrying the whole txn...

no, for our purposes savepoints just alter error handling policy of pgsql. 
such retries can be implemented in a stored procedure code, totally 
transparent from lisp side,
or in db-postmodern code, totally transparent from application.

retries due to conflicts are totally different -- whole txn retry must be 
triggered according to txn semantics, it cannot be done transparently, and 
application can be impacted if it's code is not side-effect-less.

 ??>> or via locking.

 LPP> pgsql automatically locks, doesn't it?

implicitly it obtains only "minimal" locks. knowing semantics of operations, 
we can explicitly deman stricter locking, and this way avoid deadlocks or 
race conditions.
e.g. braindead solution -- before writing, lock whole table so nobody can 
write concurrently (but still can read) -- this way we can be sure that 
there will be no race conditions, but this will also have considerable 
performance impact.
probably there is some better way to do this.. maybe SELECT FOR UPDATE will 
do.. but first i need to investigate what really happens there






More information about the elephant-devel mailing list