Re: Potential G2-item cycles under serializable isolation

From: Kyle Kingsbury <aphyr(at)jepsen(dot)io>
To: Peter Geoghegan <pg(at)bowt(dot)ie>
Cc: PostgreSQL mailing lists <pgsql-bugs(at)lists(dot)postgresql(dot)org>
Subject: Re: Potential G2-item cycles under serializable isolation
Date: 2020-06-06 12:49:56
Message-ID: d91de157-b590-dd4b-3585-79f4ece79dfa@jepsen.io
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On 6/5/20 6:44 PM, Peter Geoghegan wrote:

> Hopefully this helps you, Kyle. Would you mind repeating the exercise
> from earlier with this new log file/execution?

Here's a quick runthrough of G2-item #0:

Let:
  T1 = {:type :ok, :f :txn, :value [[:append 1468 3] [:r 1469 nil] [:append
1439 2]], :time 22408795244, :process 49, :index 10392}
  T2 = {:type :ok, :f :txn, :value [[:append 1469 1] [:append 1456 2] [:r 1468
nil]], :time 22565885165, :process 45, :index 10464}

Then:
  - T1 < T2, because T1 observed the initial (nil) state of 1469, which T2
created by appending 1.
  - However, T2 < T1, because T2 observed the initial (nil) state of 1468,
which T1 created by appending 3: a contradiction!

Classic G2: two rw-edges, where each transaction failed to observe the other's
write. I restricted the log to just those processes:

egrep 'process (49|45)' log_rr_recording.log

I jumped to the write of 1468 with /'1468'/, then backtracked to process 45's BEGIN:

[rr 316503 580915] 1591388175.849-316503-5/231-0-SHOW-5edaa7f9.4d457-jepsen
process 45 LOG:  execute <unnamed>: SHOW TRANSACTION ISOLATION LEVEL
[rr 316503 581192] 1591388175.858-316503-5/232-0-SET-5edaa7f9.4d457-jepsen
process 45 LOG:  execute <unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION
ISOLATION LEVEL SERIALIZABLE
[rr 316503 581202] 1591388175.858-316503-5/233-0-BEGIN-5edaa7f9.4d457-jepsen
process 45 LOG:  execute <unnamed>: BEGIN

45 tries to append 1 to 1469, but fails because it found zero rows:

[rr 316503 581206] 1591388175.859-316503-5/233-0-UPDATE-5edaa7f9.4d457-jepsen
process 45 LOG:  execute <unnamed>: update txn2 set val = CONCAT(val, ',', $1)
where id = $2
 1591388175.859-316503-5/233-0-UPDATE-5edaa7f9.4d457-jepsen process 45 DETAIL: 
parameters: $1 = '1', $2 = '1469'

45 backs off to an insert:

[rr 316503 581222] 1591388175.859-316503-5/233-0-SAVEPOINT-5edaa7f9.4d457-jepsen
process 45 LOG:  execute <unnamed>: savepoint upsert

49 jumps in to start a transaction:

[rr 316514 581232] 1591388175.860-316514-13/401-0-SHOW-5edaa7f9.4d462-jepsen
process 49 LOG:  execute <unnamed>: SHOW TRANSACTION ISOLATION LEVEL
[rr 316514 581242] 1591388175.860-316514-13/402-0-SET-5edaa7f9.4d462-jepsen
process 49 LOG:  execute <unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION
ISOLATION LEVEL SERIALIZABLE
[rr 316514 581256] 1591388175.860-316514-13/403-0-BEGIN-5edaa7f9.4d462-jepsen
process 49 LOG:  execute <unnamed>: BEGIN

49 tries to update 1468, which also fails, and backs off to an insert:

[rr 316514 581350] 1591388175.864-316514-13/403-0-UPDATE-5edaa7f9.4d462-jepsen
process 49 LOG:  execute <unnamed>: update txn1 set val = CONCAT(val, ',', $1)
where id = $2
 1591388175.864-316514-13/403-0-UPDATE-5edaa7f9.4d462-jepsen process 49
DETAIL:  parameters: $1 = '3', $2 = '1468'
[rr 316514 581364]
1591388175.864-316514-13/403-0-SAVEPOINT-5edaa7f9.4d462-jepsen process 49 LOG: 
execute <unnamed>: savepoint upsert
[rr 316514 581374] 1591388175.865-316514-13/403-0-INSERT-5edaa7f9.4d462-jepsen
process 49 LOG:  execute <unnamed>: insert into txn1 (id, sk, val) values ($1,
$2, $3)
 1591388175.865-316514-13/403-0-INSERT-5edaa7f9.4d462-jepsen process 49
DETAIL:  parameters: $1 = '1468', $2 = '1468', $3 = '3'

45 performs its insert of 1469:

[rr 316503 581548] 1591388175.871-316503-5/233-0-INSERT-5edaa7f9.4d457-jepsen
process 45 LOG:  execute <unnamed>: insert into txn2 (id, sk, val) values ($1,
$2, $3)
 1591388175.871-316503-5/233-0-INSERT-5edaa7f9.4d457-jepsen process 45 DETAIL: 
parameters: $1 = '1469', $2 = '1469', $3 = '1'
[rr 316503 581562]
1591388175.872-316503-5/233-1680808-RELEASE-5edaa7f9.4d457-jepsen process 45
LOG:  execute <unnamed>: release savepoint upsert

And goes on to update 1456, which also fails, so it inserts there too:

[rr 316503 581576]
1591388175.872-316503-5/233-1680808-UPDATE-5edaa7f9.4d457-jepsen process 45
LOG:  execute <unnamed>: update txn0 set val = CONCAT(val, ',', $1) where id = $2
 1591388175.872-316503-5/233-1680808-UPDATE-5edaa7f9.4d457-jepsen process 45
DETAIL:  parameters: $1 = '2', $2 = '1456'
[rr 316503 581980]
1591388175.887-316503-5/233-1680808-SAVEPOINT-5edaa7f9.4d457-jepsen process 45
LOG:  execute <unnamed>: savepoint upsert
[rr 316503 581994]
1591388175.887-316503-5/233-1680808-INSERT-5edaa7f9.4d457-jepsen process 45
LOG:  execute <unnamed>: insert into txn0 (id, sk, val) values ($1, $2, $3)
 1591388175.887-316503-5/233-1680808-INSERT-5edaa7f9.4d457-jepsen process 45
DETAIL:  parameters: $1 = '1456', $2 = '1456', $3 = '2'
[rr 316503 582008]
1591388175.888-316503-5/233-1680808-RELEASE-5edaa7f9.4d457-jepsen process 45
LOG:  execute <unnamed>: release savepoint upsert

45 reads 1468, observing 0 rows:

[rr 316503 582018]
1591388175.888-316503-5/233-1680808-SELECT-5edaa7f9.4d457-jepsen process 45
LOG:  execute <unnamed>: select (val) from txn1 where id = $1
 1591388175.888-316503-5/233-1680808-SELECT-5edaa7f9.4d457-jepsen process 45
DETAIL:  parameters: $1 = '1468'

And 45 commits:

[rr 316503 582028]
1591388175.888-316503-5/233-1680808-COMMIT-5edaa7f9.4d457-jepsen process 45
LOG:  execute <unnamed>: COMMIT

49's insert succeeded, and it goes on to read 1469, finding 0 rows as well. This
should cause the transaction to abort, because 1469 was written by a committed
transaction performed by process 45, *and* 45 didn't observe 49's writes.

[rr 316514 582409]
1591388175.902-316514-13/403-1680806-RELEASE-5edaa7f9.4d462-jepsen process 49
LOG:  execute <unnamed>: release savepoint upsert
[rr 316514 582419]
1591388175.902-316514-13/403-1680806-SELECT-5edaa7f9.4d462-jepsen process 49
LOG:  execute <unnamed>: select (val) from txn2 where sk = $1
 1591388175.902-316514-13/403-1680806-SELECT-5edaa7f9.4d462-jepsen process 49
DETAIL:  parameters: $1 = '1469'

49 goes on to append to 1439, which, again, fails and backs off to insert:

[rr 316514 583918]
1591388175.956-316514-13/403-1680806-UPDATE-5edaa7f9.4d462-jepsen process 49
LOG:  execute <unnamed>: update txn0 set val = CONCAT(val, ',', $1) where id = $2
 1591388175.956-316514-13/403-1680806-UPDATE-5edaa7f9.4d462-jepsen process 49
DETAIL:  parameters: $1 = '2', $2 = '1439'
[rr 316514 584036]
1591388175.960-316514-13/403-1680806-SAVEPOINT-5edaa7f9.4d462-jepsen process 49
LOG:  execute <unnamed>: savepoint upsert
[rr 316514 584283]
1591388175.970-316514-13/403-1680806-INSERT-5edaa7f9.4d462-jepsen process 49
LOG:  execute <unnamed>: insert into txn0 (id, sk, val) values ($1, $2, $3)
 1591388175.970-316514-13/403-1680806-INSERT-5edaa7f9.4d462-jepsen process 49
DETAIL:  parameters: $1 = '1439', $2 = '1439', $3 = '2'[rr 316514 584299]
1591388175.971-316514-13/403-1680806-RELEASE-5edaa7f9.4d462-jepsen process 49
LOG:  execute <unnamed>: release savepoint upsert

And 49 commits, resulting in a G2-item.

[rr 316514 584309]
1591388175.971-316514-13/403-1680806-COMMIT-5edaa7f9.4d462-jepsen process 49
LOG:  execute <unnamed>: COMMIT

--Kyle

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2020-06-06 14:57:13 Re: pgbench bug / limitation
Previous Message Fabien COELHO 2020-06-06 06:59:57 Re: pgbench bug / limitation