mirror of https://github.com/citusdata/citus.git
Fix cancellation issues in the real-time executor (#1905)
parent
3fd65cb91b
commit
8f69973411
|
@ -182,7 +182,8 @@ NonblockingForgetResults(MultiConnection *connection)
|
|||
}
|
||||
|
||||
result = PQgetResult(pgConn);
|
||||
if (PQresultStatus(result) == PGRES_COPY_IN)
|
||||
if (PQresultStatus(result) == PGRES_COPY_IN ||
|
||||
PQresultStatus(result) == PGRES_COPY_OUT)
|
||||
{
|
||||
/* in copy, can't reliably recover without blocking */
|
||||
return false;
|
||||
|
|
|
@ -924,15 +924,11 @@ MultiClientWait(WaitInfo *waitInfo)
|
|||
{
|
||||
/*
|
||||
* Signals that arrive can interrupt our poll(). In that case just
|
||||
* check for interrupts, and try again. Every other error is
|
||||
* unexpected and treated as such.
|
||||
* return. Every other error is unexpected and treated as such.
|
||||
*/
|
||||
if (errno == EAGAIN || errno == EINTR)
|
||||
{
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
|
||||
/* maximum wait starts at max again, but that's ok, it's just a stopgap */
|
||||
continue;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -291,6 +291,64 @@ SELECT * FROM co_test_table;
|
|||
(1 row)
|
||||
|
||||
ROLLBACK;
|
||||
-- Test cancelling behaviour. See https://github.com/citusdata/citus/pull/1905.
|
||||
-- Repeating it multiple times to increase the chance of failure before PR #1905.
|
||||
SET client_min_messages TO ERROR;
|
||||
alter system set deadlock_timeout TO '1ms';
|
||||
SELECT pg_reload_conf();
|
||||
pg_reload_conf
|
||||
----------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
SET client_min_messages TO DEFAULT;
|
||||
alter system set deadlock_timeout TO DEFAULT;
|
||||
SELECT pg_reload_conf();
|
||||
pg_reload_conf
|
||||
----------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
DROP SCHEMA multi_real_time_transaction CASCADE;
|
||||
NOTICE: drop cascades to 4 other objects
|
||||
DETAIL: drop cascades to table test_table
|
||||
|
|
|
@ -299,6 +299,64 @@ SELECT * FROM co_test_table;
|
|||
(1 row)
|
||||
|
||||
ROLLBACK;
|
||||
-- Test cancelling behaviour. See https://github.com/citusdata/citus/pull/1905.
|
||||
-- Repeating it multiple times to increase the chance of failure before PR #1905.
|
||||
SET client_min_messages TO ERROR;
|
||||
alter system set deadlock_timeout TO '1ms';
|
||||
SELECT pg_reload_conf();
|
||||
pg_reload_conf
|
||||
----------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ERROR: canceling the transaction since it was involved in a distributed deadlock
|
||||
ROLLBACK;
|
||||
SET client_min_messages TO DEFAULT;
|
||||
alter system set deadlock_timeout TO DEFAULT;
|
||||
SELECT pg_reload_conf();
|
||||
pg_reload_conf
|
||||
----------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
DROP SCHEMA multi_real_time_transaction CASCADE;
|
||||
NOTICE: drop cascades to 4 other objects
|
||||
DETAIL: drop cascades to table test_table
|
||||
|
|
|
@ -176,4 +176,46 @@ DELETE FROM test_table where id = 1 or id = 3;
|
|||
SELECT * FROM co_test_table;
|
||||
ROLLBACK;
|
||||
|
||||
-- Test cancelling behaviour. See https://github.com/citusdata/citus/pull/1905.
|
||||
-- Repeating it multiple times to increase the chance of failure before PR #1905.
|
||||
SET client_min_messages TO ERROR;
|
||||
alter system set deadlock_timeout TO '1ms';
|
||||
SELECT pg_reload_conf();
|
||||
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ROLLBACK;
|
||||
BEGIN;
|
||||
SELECT id, pg_advisory_lock(15) FROM test_table;
|
||||
ROLLBACK;
|
||||
|
||||
SET client_min_messages TO DEFAULT;
|
||||
alter system set deadlock_timeout TO DEFAULT;
|
||||
SELECT pg_reload_conf();
|
||||
|
||||
|
||||
DROP SCHEMA multi_real_time_transaction CASCADE;
|
||||
|
|
Loading…
Reference in New Issue