From ca0496555c181db30b5ec1384bb3c8958e370d14 Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger Date: Thu, 12 Jan 2023 10:09:58 +0100 Subject: [PATCH] fixed rollback after crash Signed-off-by: Lorenz Herzberger --- Dockerfile-dev | 3 ++- planetmint/backend/models/output.py | 2 +- planetmint/backend/tarantool/init.lua | 6 ++++++ planetmint/backend/tarantool/query.py | 13 +++++++++---- planetmint/lib.py | 2 ++ setup.py | 2 +- tests/tendermint/test_core.py | 5 +++-- 7 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Dockerfile-dev b/Dockerfile-dev index b9ccdd3..968074d 100644 --- a/Dockerfile-dev +++ b/Dockerfile-dev @@ -33,4 +33,5 @@ RUN mkdir -p /usr/src/app COPY . /usr/src/app/ WORKDIR /usr/src/app RUN pip install -e .[dev] -RUN pip install flask-cors \ No newline at end of file +RUN pip install flask-cors +RUN pip install planetmint-transactions@git+https://git@github.com/planetmint/transactions.git@cybnon/adapt-class-access-to-new-schema \ No newline at end of file diff --git a/planetmint/backend/models/output.py b/planetmint/backend/models/output.py index 88ec417..0c27982 100644 --- a/planetmint/backend/models/output.py +++ b/planetmint/backend/models/output.py @@ -116,7 +116,7 @@ class Output: @staticmethod def from_dict(output_dict: dict, index: int, transaction_id: str) -> Output: return Output( - id="placeholder", + id=output_dict["id"] if "id" in output_dict else "placeholder", amount=int(output_dict["amount"]), public_keys=output_dict["public_keys"], condition=Condition.from_dict(output_dict["condition"]), diff --git a/planetmint/backend/tarantool/init.lua b/planetmint/backend/tarantool/init.lua index 8dc3d9d..fb4fa9b 100644 --- a/planetmint/backend/tarantool/init.lua +++ b/planetmint/backend/tarantool/init.lua @@ -90,6 +90,12 @@ function init() { field = 'assets[*].id', type = 'string', is_nullable = true } } }) + governance:create_index('spending_governance_by_id_and_output_index', { + if_not_exists = true, + parts = { + { field = 'inputs[*].fulfills["transaction_id"]', type = 'string', is_nullable = true }, + { field = 'inputs[*].fulfills["output_index"]', type = 'unsigned', is_nullable = true } + }}) -- Outputs outputs = box.schema.create_space('outputs', { if_not_exists = true }) diff --git a/planetmint/backend/tarantool/query.py b/planetmint/backend/tarantool/query.py index 4be3660..7d8ce37 100644 --- a/planetmint/backend/tarantool/query.py +++ b/planetmint/backend/tarantool/query.py @@ -42,7 +42,9 @@ register_query = module_dispatch_registrar(query) def get_complete_transactions_by_ids(connection, txids: list, table=TARANT_TABLE_TRANSACTION) -> list[DbTransaction]: _transactions = [] for txid in txids: - tx = get_transaction_by_id(connection, txid, table) + tx = get_transaction_by_id(connection, txid, TARANT_TABLE_TRANSACTION) + if tx is None: + tx = get_transaction_by_id(connection, txid, TARANT_TABLE_GOVERNANCE) if tx is None: continue outputs = get_outputs_by_tx_id(connection, txid) @@ -354,6 +356,7 @@ def delete_transactions(connection, txn_ids: list): connection.connect().call("delete_output", (_outputs[x].id)) for _id in txn_ids: connection.run(connection.space(TARANT_TABLE_TRANSACTION).delete(_id), only_data=False) + connection.run(connection.space(TARANT_TABLE_GOVERNANCE).delete(_id), only_data=False) except Exception as e: logger.info(f"Could not insert unspent output: {e}") raise OperationDataInsertionError() @@ -446,9 +449,9 @@ def store_validator_set(conn, validators_update: dict): @register_query(TarantoolDBConnection) def delete_validator_set(connection, height: int): - _validators = connection.run(connection.space("validators").select(height, index="height_search")) + _validators = connection.run(connection.space("validator_sets").select(height, index="height")) for _valid in _validators: - connection.run(connection.space("validators").delete(_valid[0]), only_data=False) + connection.run(connection.space("validator_sets").delete(_valid[0]), only_data=False) @register_query(TarantoolDBConnection) @@ -548,7 +551,9 @@ def store_abci_chain(connection, height: int, chain_id: str, is_synced: bool = T @register_query(TarantoolDBConnection) def delete_abci_chain(connection, height: int): hash_id_primarykey = sha256(json.dumps(obj={"height": height}).encode()).hexdigest() - connection.run(connection.space("abci_chains").delete(hash_id_primarykey), only_data=False) + # connection.run(connection.space("abci_chains").delete(hash_id_primarykey), only_data=False) + chains = connection.run(connection.space("abci_chains").select(height, index="height"), only_data=False) + connection.run(connection.space("abci_chains").delete(chains[0][0], index="id"), only_data=False) @register_query(TarantoolDBConnection) diff --git a/planetmint/lib.py b/planetmint/lib.py index 84f341a..ca8048b 100644 --- a/planetmint/lib.py +++ b/planetmint/lib.py @@ -899,6 +899,8 @@ class Planetmint(object): self.delete_elections(new_height) txns = [self.get_transaction(tx_id) for tx_id in txn_ids] + + txns = [Transaction.from_dict(tx.to_dict()) for tx in txns] elections = self._get_votes(txns) for election_id in elections: diff --git a/setup.py b/setup.py index f41e21a..8a248bb 100644 --- a/setup.py +++ b/setup.py @@ -130,7 +130,7 @@ install_requires = [ "planetmint-ipld>=0.0.3", "pyasn1>=0.4.8", "python-decouple", - "planetmint-transactions>=0.2.2", + # "planetmint-transactions>=0.2.2", ] setup( diff --git a/tests/tendermint/test_core.py b/tests/tendermint/test_core.py index d036a1b..93788d5 100644 --- a/tests/tendermint/test_core.py +++ b/tests/tendermint/test_core.py @@ -22,6 +22,7 @@ from planetmint.lib import Block from planetmint.tendermint_utils import new_validator_set from planetmint.tendermint_utils import public_key_to_base64 from planetmint.version import __tm_supported_versions__ +from planetmint.backend.tarantool.const import TARANT_TABLE_GOVERNANCE from tests.utils import generate_election, generate_validators pytestmark = pytest.mark.bdb @@ -410,7 +411,7 @@ def test_rollback_pre_commit_state_after_crash(b): rollback(b) for tx in txs: - assert b.get_transaction(tx.id) + assert b.get_transaction(tx.id, TARANT_TABLE_GOVERNANCE) assert b.get_latest_abci_chain() assert len(b.get_validator_set()["validators"]) == 1 assert b.get_election(migration_election.id) @@ -421,7 +422,7 @@ def test_rollback_pre_commit_state_after_crash(b): rollback(b) for tx in txs: - assert not b.get_transaction(tx.id) + assert not b.get_transaction(tx.id, TARANT_TABLE_GOVERNANCE) assert not b.get_latest_abci_chain() assert len(b.get_validator_set()["validators"]) == 4 assert len(b.get_validator_set(2)["validators"]) == 4