Skip to content

Random FK Constraint issues on MariaDB  #809

@ohager

Description

@ohager

VERSION: 3.8.0

It may happen randomly that insertion errors appear (reported once a while)

org.jooq.exception.DataAccessException: SQL [insert into `block` (`id`, `version`, `timestamp`, `previous_block_id`, `total_amount`, `total_fee`, `total_fee_cash_back`, `total_fee_burnt`, `payload_length`, `generator_public_key`, `previous_block_hash`, `cumulative_difficulty`, `base_target`, `height`, `generation_signature`, `block_signature`, `payload_hash`, `generator_id`, `nonce`, `ats`) values (3658542890957534042, 4, 306624049, -8593194476844238940, 1525000000, 160200000, 0, 160200000, 72, X'8826b7c9dd68d28b65e8e8f814238909c809adbdc5e5e58b837cb734632d7c5b', X'a4b7d9e926d7be88021471ad7e5454e29c703cce8d59793ec48f894dfa10af20', X'0881ae3da821e30df4', 6070375815265423852, 1271377, X'b252b7e7ed1143cafa021010785863df0bc110a2a33685d03b9f6cbc3ff06ffb', X'24e830a6b9d13747f76c103459fcf464965dd0c5489033f3306dbb50a11d830b60c50ed3689ea40d6e6d85b97f8b857f9f0f28c1dea4412cf88ca529a65fc849', X'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', -6154617539399287288, 22900000018369928, X'137c77dce40a40ba845c50213db058851c52177767c794f3e22dbf5a56bf426447a56576dfb9e28320faff6c20b789e10319e3bdff90b38850cc067a0f1c3e853dac69775d7d9fbe')]; (conn=200844) Cannot add or update a child row: a foreign key constraint fails (`brs_master`.`block`, CONSTRAINT `constraint_3c` FOREIGN KEY (`previous_block_id`) REFERENCES `block` (`id`) ON DELETE CASCADE)
    at org.jooq_3.15.7.MARIADB.debug(Unknown Source)
    at org.jooq.impl.Tools.translate(Tools.java:2997)
    at org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:639)
    at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:354)
    at org.jooq.impl.AbstractDelegatingQuery.execute(AbstractDelegatingQuery.java:111)
    at brs.db.sql.SqlBlockDb.saveBlock(SqlBlockDb.java:130)
    at brs.db.sql.SqlBlockchainStore.lambda$addBlock$15(SqlBlockchainStore.java:295)
    at brs.db.sql.Db.useDSLContext(Db.java:236)
    at brs.db.sql.SqlBlockchainStore.addBlock(SqlBlockchainStore.java:294)
    at brs.BlockchainProcessorImpl.addBlock(BlockchainProcessorImpl.java:845)
    at brs.BlockchainProcessorImpl.pushBlock(BlockchainProcessorImpl.java:1051)
    at brs.BlockchainProcessorImpl.lambda$new$5(BlockchainProcessorImpl.java:641)
    at brs.util.ThreadPool.lambda$start$0(ThreadPool.java:104)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)

Observation:

This looks like a threading issue, where the insertion order is not guaranteed leading to FK constraint issues. Iirc, FK checks are disabled exactly to this reason. Maybe with the MariaDB version update something has change regarding the FK configuration. The FKs are introduced to take advantage of cascaded deletion on popOffs. Cascaded deletion can be emulated with Triggers instead of FK checks, like it is done on SQLite.

Metadata

Metadata

Assignees

No one assigned

    Labels

    🪲 bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions