An example of bugs for Hot Standby

From: Hiroyuki Yamada <yamada(at)kokolink(dot)net>
To: pgsql-hackers(at)postgresql(dot)org
Subject: An example of bugs for Hot Standby
Date: 2009-12-15 11:25:31
Message-ID: 200912151125.AA00169@silver.kokolink.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hot Standby node can freeze when startup process calls LockBufferForCleanup().
This bug can be reproduced by the following procedure.

0. start Hot Standby, with one active node(node A) and one standby node(node B)
1. create table X and table Y in node A
2. insert several rows in table X in node A
3. delete one row from table X in node A
4. begin xact 1 in node A, execute following commands, and leave xact 1 open
4.1 LOCK table Y IN ACCESS EXCLUSIVE MODE
5. wait until WAL's for above actions are applied in node B
6. begin xact 2 in node B, and execute following commands
6.1 DECLARE CURSOR test_cursor FOR SELECT * FROM table X;
6.2 FETCH test_cursor;
6.3 SELECT * FROM table Y;
7. execute VACUUM FREEZE table A in node A
8. commit xact 1 in node A

...then in node B occurs following "deadlock" situation, which is not detected by deadlock check.
* startup process waits for xact 2 to release buffers in table X (in LockBufferForCleanup())
* xact 2 waits for startup process to release ACCESS EXCLUSIVE lock in table Y

This situation can occur when
a) a transaction in the standby node tries to acquire ACCESS SHARE lock while holding some buffers
b) startup process calls LockBufferForCleanup() for any of the buffers

regards,

--
Hiroyuki YAMADA
Kokolink Corporation
yamada(at)kokolink(dot)net

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Marko Kreen 2009-12-15 12:05:13 Re: Patch: Remove gcc dependency in definition of inline functions
Previous Message Kurt Harriman 2009-12-15 11:15:15 Re: Patch: Remove gcc dependency in definition of inline functions