bdr-sequence: mergme: use consistent order of inserts tablewise
authorAndres Freund <andres@anarazel.de>
Tue, 21 May 2013 03:01:20 +0000 (05:01 +0200)
committerAndres Freund <andres@anarazel.de>
Tue, 21 May 2013 03:01:20 +0000 (05:01 +0200)
This removes intermittent (detected/resolved) deadlocks between the sequence
manager and logical replication.

contrib/bdr/bdr_seq.c

index a19f4d03f52b78800202d1a34835f23d5c6d51a5..93e5a9840cc3b35b4e0781d0379ffa7b1e82f604 100644 (file)
@@ -179,21 +179,22 @@ const char *start_elections_sql =
 "        current_max,\n"
 "        generate_series(\n"
 "            current_max,\n"
-"-- 1000 is the chunk size, -1 is to get < instead of <= of generate_series\n"
+"            -- 1000 is the chunk size, -1 is to get < instead <= out of generate_series\n"
 "            current_max + 1000 * (5 - open_seq_chunks) - 1,\n"
 "            1000) chunk_start\n"
 "    FROM to_be_updated_sequences\n"
 "),\n"
 "inserted_chunks AS (\n"
-"    INSERT INTO bdr_sequence_values(\n"
+"    INSERT INTO bdr_sequence_elections(\n"
 "        owning_sysid,\n"
 "        owning_tlid,\n"
 "        owning_dboid,\n"
 "        owning_riname,\n"
+"        owning_election_id,\n"
+"        vote_type,\n"
+"        open,\n"
 "        seqschema,\n"
 "        seqname,\n"
-"        confirmed,\n"
-"        emptied,\n"
 "        seqrange\n"
 "    )\n"
 "    SELECT\n"
@@ -201,60 +202,63 @@ const char *start_elections_sql =
 "        $2,\n"
 "        $3,\n"
 "        $4,\n"
+"        (\n"
+"            SELECT COALESCE(max(owning_election_id), 0)\n"
+"            FROM bdr_sequence_elections biggest\n"
+"            WHERE\n"
+"              biggest.owning_sysid = $1\n"
+"              AND biggest.owning_tlid = $2\n"
+"              AND biggest.owning_dboid = $3\n"
+"              AND biggest.owning_riname = $4\n"
+"         ) + row_number() OVER (),\n"
+"        'sequence',\n"
+"        true AS open,\n"
 "        seqschema,\n"
 "        seqname,\n"
-"        false AS confirmed,\n"
-"        false AS emptied,\n"
-"        int8range(chunk_start, chunk_start + 1000)\n"
+"       int8range(chunk_start, chunk_start + 1000) AS seqrange\n"
 "    FROM to_be_inserted_chunks\n"
 "    RETURNING\n"
-"        owning_sysid,\n"
-"        owning_tlid,\n"
-"        owning_dboid,\n"
-"        owning_riname,\n"
 "        seqschema,\n"
 "        seqname,\n"
-"        confirmed,\n"
-"        emptied,\n"
 "        seqrange\n"
 ")\n"
 "\n"
-"INSERT INTO bdr_sequence_elections(\n"
+"INSERT INTO bdr_sequence_values(\n"
 "    owning_sysid,\n"
 "    owning_tlid,\n"
 "    owning_dboid,\n"
 "    owning_riname,\n"
-"    owning_election_id,\n"
-"    vote_type,\n"
-"    open,\n"
 "    seqschema,\n"
 "    seqname,\n"
+"    confirmed,\n"
+"    emptied,\n"
 "    seqrange\n"
 ")\n"
 "SELECT\n"
+"    $1,\n"
+"    $2,\n"
+"    $3,\n"
+"    $4,\n"
+"    seqschema,\n"
+"    seqname,\n"
+"    false AS confirmed,\n"
+"    false AS emptied,\n"
+"    int8range(chunk_start, chunk_start + 1000)\n"
+"FROM to_be_inserted_chunks\n"
+"-- force evaluation \n"
+"WHERE (SELECT count(*) FROM inserted_chunks) >= 0\n"
+"RETURNING\n"
 "    owning_sysid,\n"
 "    owning_tlid,\n"
 "    owning_dboid,\n"
 "    owning_riname,\n"
-"    (\n"
-"        SELECT COALESCE(max(owning_election_id), 0)\n"
-"        FROM bdr_sequence_elections biggest\n"
-"        WHERE\n"
-"          biggest.owning_sysid = inserted_chunks.owning_sysid\n"
-"          AND biggest.owning_tlid = inserted_chunks.owning_tlid\n"
-"          AND biggest.owning_dboid = inserted_chunks.owning_dboid\n"
-"          AND biggest.owning_riname = inserted_chunks.owning_riname\n"
-"     ) + row_number() OVER (),\n"
-"    'sequence',\n"
-"    true AS open,\n"
-"    seqschema,\n"
-"    seqname,\n"
-"    seqrange\n"
-"FROM inserted_chunks\n"
-"RETURNING\n"
 "    seqschema,\n"
 "    seqname,\n"
+"    confirmed,\n"
+"    emptied,\n"
 "    seqrange\n"
+
+
 ;
 
 const char *tally_elections_sql =