Skip to content

Commit 0b196f0

Browse files
authored
fix: optimize queries to prune and restore mempool rbf txs (#2327)
1 parent 01998bc commit 0b196f0

File tree

1 file changed

+40
-20
lines changed

1 file changed

+40
-20
lines changed

src/datastore/pg-write-store.ts

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2961,17 +2961,27 @@ export class PgWriteStore extends PgStore {
29612961
t.nonce,
29622962
]);
29632963
const updatedRows = await sql<{ tx_id: string }[]>`
2964-
WITH input_data (tx_id, sender_address, sponsor_address, sponsored, nonce)
2965-
AS (VALUES ${sql(inputData)}),
2966-
affected_mempool_tx_ids AS (
2964+
WITH input_data (tx_id, sender_address, sponsor_address, sponsored, nonce) AS (
2965+
VALUES ${sql(inputData)}
2966+
),
2967+
sponsored_inputs AS (SELECT * FROM input_data WHERE sponsored::boolean),
2968+
non_sponsored_inputs AS (SELECT * FROM input_data WHERE NOT sponsored::boolean),
2969+
affected_sponsored AS (
2970+
SELECT m.tx_id
2971+
FROM mempool_txs m
2972+
INNER JOIN sponsored_inputs i ON m.nonce = i.nonce::int
2973+
AND (m.sponsor_address = i.sponsor_address OR m.sender_address = i.sponsor_address)
2974+
),
2975+
affected_non_sponsored AS (
29672976
SELECT m.tx_id
2968-
FROM mempool_txs AS m
2969-
INNER JOIN input_data AS i
2970-
ON m.nonce = i.nonce::int
2971-
AND (CASE i.sponsored::boolean
2972-
WHEN true THEN (m.sponsor_address = i.sponsor_address OR m.sender_address = i.sponsor_address)
2973-
ELSE (m.sponsor_address = i.sender_address OR m.sender_address = i.sender_address)
2974-
END)
2977+
FROM mempool_txs m
2978+
INNER JOIN non_sponsored_inputs i ON m.nonce = i.nonce::int
2979+
AND (m.sponsor_address = i.sender_address OR m.sender_address = i.sender_address)
2980+
),
2981+
affected_mempool_tx_ids AS (
2982+
SELECT tx_id FROM affected_sponsored
2983+
UNION
2984+
SELECT tx_id FROM affected_non_sponsored
29752985
UNION
29762986
SELECT tx_id::bytea FROM input_data
29772987
),
@@ -3046,17 +3056,27 @@ export class PgWriteStore extends PgStore {
30463056
t.nonce,
30473057
]);
30483058
const updateResults = await sql<{ tx_id: string }[]>`
3049-
WITH input_data (tx_id, sender_address, sponsor_address, sponsored, nonce)
3050-
AS (VALUES ${sql(inputData)}),
3051-
affected_mempool_tx_ids AS (
3059+
WITH input_data (tx_id, sender_address, sponsor_address, sponsored, nonce) AS (
3060+
VALUES ${sql(inputData)}
3061+
),
3062+
sponsored_inputs AS (SELECT * FROM input_data WHERE sponsored::boolean),
3063+
non_sponsored_inputs AS (SELECT * FROM input_data WHERE NOT sponsored::boolean),
3064+
affected_sponsored AS (
3065+
SELECT m.tx_id
3066+
FROM mempool_txs m
3067+
INNER JOIN sponsored_inputs i ON m.nonce = i.nonce::int
3068+
AND (m.sponsor_address = i.sponsor_address OR m.sender_address = i.sponsor_address)
3069+
),
3070+
affected_non_sponsored AS (
30523071
SELECT m.tx_id
3053-
FROM mempool_txs AS m
3054-
INNER JOIN input_data AS i
3055-
ON m.nonce = i.nonce::int
3056-
AND (CASE i.sponsored::boolean
3057-
WHEN true THEN (m.sponsor_address = i.sponsor_address OR m.sender_address = i.sponsor_address)
3058-
ELSE (m.sponsor_address = i.sender_address OR m.sender_address = i.sender_address)
3059-
END)
3072+
FROM mempool_txs m
3073+
INNER JOIN non_sponsored_inputs i ON m.nonce = i.nonce::int
3074+
AND (m.sponsor_address = i.sender_address OR m.sender_address = i.sender_address)
3075+
),
3076+
affected_mempool_tx_ids AS (
3077+
SELECT tx_id FROM affected_sponsored
3078+
UNION
3079+
SELECT tx_id FROM affected_non_sponsored
30603080
UNION
30613081
SELECT tx_id::bytea FROM input_data
30623082
),

0 commit comments

Comments
 (0)