From c0808ee6ce9d1e3867ba6ca85be80fbaf2a4f978 Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Mon, 4 Nov 2019 15:47:54 +0300 Subject: [PATCH] Update internal transactions constraint fixing script --- CHANGELOG.md | 1 + ...ional_internal_transaction_constraints.sql | 67 ++++++++++--------- 2 files changed, 38 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf01641a5f..e446671578 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ - [#2844](https://github.com/poanetwork/blockscout/pull/2844) - Extend external reward types up to 20 - [#2827](https://github.com/poanetwork/blockscout/pull/2827) - Node js 12.13.0 (latest LTS release) support - [#2818](https://github.com/poanetwork/blockscout/pull/2818) - allow hiding marketcap percentage +- [#2835](https://github.com/poanetwork/blockscout/pull/2835) - Update int txs constraints repairing script - [#2817](https://github.com/poanetwork/blockscout/pull/2817) - move docker integration documentation to blockscout docs - [#2808](https://github.com/poanetwork/blockscout/pull/2808) - Add tooltip for tx input - [#2807](https://github.com/poanetwork/blockscout/pull/2807) - 422 page diff --git a/apps/explorer/priv/repo/migrations/scripts/20181108205650_large_additional_internal_transaction_constraints.sql b/apps/explorer/priv/repo/migrations/scripts/20181108205650_large_additional_internal_transaction_constraints.sql index cb82ce8847..77c576e549 100644 --- a/apps/explorer/priv/repo/migrations/scripts/20181108205650_large_additional_internal_transaction_constraints.sql +++ b/apps/explorer/priv/repo/migrations/scripts/20181108205650_large_additional_internal_transaction_constraints.sql @@ -6,6 +6,7 @@ -- IMPORTANT NOTE: after making all the corrections needed the script will NOT -- run the constraint validations because this may be a very long and taxing -- operation. To validate the constraint one can run, after the script fininshed: +-- UPDATE (2019-11-04): use pending_block_operations table instead of internal_transactions -- ALTER TABLE internal_transactions VALIDATE CONSTRAINT call_has_call_type; -- ALTER TABLE internal_transactions VALIDATE CONSTRAINT call_has_input; @@ -14,56 +15,62 @@ DO $$ DECLARE batch_size integer := 10000; -- HOW MANY ITEMS WILL BE UPDATED AT A TIME - last_transaction_hash bytea; -- WILL CHECK ONLY TRANSACTIONS FOLLOWING THIS HASH (DESC) + last_block_number integer; -- WILL CHECK ONLY TRANSACTIONS FOLLOWING THIS HASH (DESC) last_fetched_batch_size integer; BEGIN RAISE NOTICE 'STARTING SCRIPT'; - CREATE TEMP TABLE transactions_with_deprecated_internal_transactions(hash bytea NOT NULL); + CREATE TEMP TABLE blocks_with_deprecated_internal_transactions(block_number integer NOT NULL); LOOP RAISE NOTICE 'Fetching new batch of % transactions to correct', batch_size; - INSERT INTO transactions_with_deprecated_internal_transactions - SELECT DISTINCT transaction_hash - FROM internal_transactions - WHERE - (last_transaction_hash IS NULL OR transaction_hash < last_transaction_hash) AND - -- call_has_call_type CONSTRAINT - ((type = 'call' AND call_type IS NULL) OR - -- call_has_input CONSTRAINT - (type = 'call' AND input IS NULL) OR - -- create_has_init CONSTRAINT - (type = 'create' AND init is NULL)) - ORDER BY transaction_hash DESC LIMIT batch_size; + INSERT INTO blocks_with_deprecated_internal_transactions + SELECT DISTINCT a.block_number + FROM ( + SELECT DISTINCT i.block_number, i.transaction_index + FROM internal_transactions i + WHERE + i.block_number IS NOT NULL + AND + (last_block_number IS NULL OR i.block_number < last_block_number) AND + -- call_has_call_type CONSTRAINT + ((type = 'call' AND i.call_type IS NULL) OR + -- call_has_input CONSTRAINT + (type = 'call' AND i.input IS NULL) OR + -- create_has_init CONSTRAINT + (type = 'create' AND i.init is NULL)) + ORDER BY i.block_number DESC, i.transaction_index LIMIT batch_size + ) a; - SELECT INTO last_fetched_batch_size count(*) FROM transactions_with_deprecated_internal_transactions; + SELECT INTO last_fetched_batch_size count(block_number) FROM blocks_with_deprecated_internal_transactions; RAISE NOTICE 'Batch of % transactions was fetched, starting their deprecation', last_fetched_batch_size; - -- UPDATE TRANSACTIONS - UPDATE transactions - SET internal_transactions_indexed_at = NULL, - error = NULL - FROM transactions_with_deprecated_internal_transactions - WHERE transactions.hash = transactions_with_deprecated_internal_transactions.hash; + INSERT INTO pending_block_operations (block_hash, inserted_at, updated_at, fetch_internal_transactions) + SELECT b.hash, NOW(), NOW(), true + FROM blocks_with_deprecated_internal_transactions bd, blocks b + WHERE bd.block_number = b.number + AND b.consensus = true + ON CONFLICT (block_hash) + DO NOTHING; -- REMOVE THE DEPRECATED internal_transactions DELETE FROM internal_transactions - USING transactions_with_deprecated_internal_transactions - WHERE internal_transactions.transaction_hash = transactions_with_deprecated_internal_transactions.hash; + USING blocks_with_deprecated_internal_transactions + WHERE internal_transactions.block_number = blocks_with_deprecated_internal_transactions.block_number; -- COMMIT THE BATCH UPDATES CHECKPOINT; - -- UPDATE last_transaction_hash TO KEEP TRACK OF ROWS ALREADY CHECKED - SELECT INTO last_transaction_hash hash - FROM transactions_with_deprecated_internal_transactions - ORDER BY hash ASC LIMIT 1; + -- UPDATE last_block_number TO KEEP TRACK OF ROWS ALREADY CHECKED + SELECT INTO last_block_number block_number + FROM blocks_with_deprecated_internal_transactions + ORDER BY block_number ASC LIMIT 1; - RAISE NOTICE 'Last batch completed, last transaction hash: %', last_transaction_hash; + RAISE NOTICE 'Last batch completed, last block number: %', last_block_number; -- CLEAR THE TEMP TABLE - DELETE FROM transactions_with_deprecated_internal_transactions; + DELETE FROM blocks_with_deprecated_internal_transactions; -- EXIT IF ALL internal_transactions HAVE BEEN CHECKED ALREADY EXIT WHEN last_fetched_batch_size != batch_size; @@ -71,5 +78,5 @@ BEGIN RAISE NOTICE 'SCRIPT FINISHED, all affected transactions have been deprecated'; - DROP TABLE transactions_with_deprecated_internal_transactions; + DROP TABLE blocks_with_deprecated_internal_transactions; END $$;