fixed rollback after crash

Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com>
This commit is contained in:
Lorenz Herzberger 2023-01-12 10:09:58 +01:00
parent 3187adb350
commit ca0496555c
No known key found for this signature in database
GPG Key ID: FA5EE906EB55316A
7 changed files with 24 additions and 9 deletions

View File

@ -34,3 +34,4 @@ COPY . /usr/src/app/
WORKDIR /usr/src/app WORKDIR /usr/src/app
RUN pip install -e .[dev] RUN pip install -e .[dev]
RUN pip install flask-cors 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

View File

@ -116,7 +116,7 @@ class Output:
@staticmethod @staticmethod
def from_dict(output_dict: dict, index: int, transaction_id: str) -> Output: def from_dict(output_dict: dict, index: int, transaction_id: str) -> Output:
return Output( return Output(
id="placeholder", id=output_dict["id"] if "id" in output_dict else "placeholder",
amount=int(output_dict["amount"]), amount=int(output_dict["amount"]),
public_keys=output_dict["public_keys"], public_keys=output_dict["public_keys"],
condition=Condition.from_dict(output_dict["condition"]), condition=Condition.from_dict(output_dict["condition"]),

View File

@ -90,6 +90,12 @@ function init()
{ field = 'assets[*].id', type = 'string', is_nullable = true } { 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
outputs = box.schema.create_space('outputs', { if_not_exists = true }) outputs = box.schema.create_space('outputs', { if_not_exists = true })

View File

@ -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]: def get_complete_transactions_by_ids(connection, txids: list, table=TARANT_TABLE_TRANSACTION) -> list[DbTransaction]:
_transactions = [] _transactions = []
for txid in txids: 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: if tx is None:
continue continue
outputs = get_outputs_by_tx_id(connection, txid) 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)) connection.connect().call("delete_output", (_outputs[x].id))
for _id in txn_ids: for _id in txn_ids:
connection.run(connection.space(TARANT_TABLE_TRANSACTION).delete(_id), only_data=False) 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: except Exception as e:
logger.info(f"Could not insert unspent output: {e}") logger.info(f"Could not insert unspent output: {e}")
raise OperationDataInsertionError() raise OperationDataInsertionError()
@ -446,9 +449,9 @@ def store_validator_set(conn, validators_update: dict):
@register_query(TarantoolDBConnection) @register_query(TarantoolDBConnection)
def delete_validator_set(connection, height: int): 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: 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) @register_query(TarantoolDBConnection)
@ -548,7 +551,9 @@ def store_abci_chain(connection, height: int, chain_id: str, is_synced: bool = T
@register_query(TarantoolDBConnection) @register_query(TarantoolDBConnection)
def delete_abci_chain(connection, height: int): def delete_abci_chain(connection, height: int):
hash_id_primarykey = sha256(json.dumps(obj={"height": height}).encode()).hexdigest() 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) @register_query(TarantoolDBConnection)

View File

@ -900,6 +900,8 @@ class Planetmint(object):
txns = [self.get_transaction(tx_id) for tx_id in txn_ids] 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) elections = self._get_votes(txns)
for election_id in elections: for election_id in elections:
election = self.get_transaction(election_id) election = self.get_transaction(election_id)

View File

@ -130,7 +130,7 @@ install_requires = [
"planetmint-ipld>=0.0.3", "planetmint-ipld>=0.0.3",
"pyasn1>=0.4.8", "pyasn1>=0.4.8",
"python-decouple", "python-decouple",
"planetmint-transactions>=0.2.2", # "planetmint-transactions>=0.2.2",
] ]
setup( setup(

View File

@ -22,6 +22,7 @@ from planetmint.lib import Block
from planetmint.tendermint_utils import new_validator_set from planetmint.tendermint_utils import new_validator_set
from planetmint.tendermint_utils import public_key_to_base64 from planetmint.tendermint_utils import public_key_to_base64
from planetmint.version import __tm_supported_versions__ from planetmint.version import __tm_supported_versions__
from planetmint.backend.tarantool.const import TARANT_TABLE_GOVERNANCE
from tests.utils import generate_election, generate_validators from tests.utils import generate_election, generate_validators
pytestmark = pytest.mark.bdb pytestmark = pytest.mark.bdb
@ -410,7 +411,7 @@ def test_rollback_pre_commit_state_after_crash(b):
rollback(b) rollback(b)
for tx in txs: 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 b.get_latest_abci_chain()
assert len(b.get_validator_set()["validators"]) == 1 assert len(b.get_validator_set()["validators"]) == 1
assert b.get_election(migration_election.id) assert b.get_election(migration_election.id)
@ -421,7 +422,7 @@ def test_rollback_pre_commit_state_after_crash(b):
rollback(b) rollback(b)
for tx in txs: 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 not b.get_latest_abci_chain()
assert len(b.get_validator_set()["validators"]) == 4 assert len(b.get_validator_set()["validators"]) == 4
assert len(b.get_validator_set(2)["validators"]) == 4 assert len(b.get_validator_set(2)["validators"]) == 4