From 313703589945284b32f3856e9fbe6c10615e2871 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 1 Feb 2024 10:59:25 -0600 Subject: [PATCH 1/8] GH-2173 Fix deadlock, remove recursive mutex --- libraries/chain/fork_database.cpp | 36 +++++- .../include/eosio/chain/fork_database.hpp | 108 +++++++++++------- 2 files changed, 97 insertions(+), 47 deletions(-) diff --git a/libraries/chain/fork_database.cpp b/libraries/chain/fork_database.cpp index 4cb1034eef..c1e496486a 100644 --- a/libraries/chain/fork_database.cpp +++ b/libraries/chain/fork_database.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace eosio::chain { using boost::multi_index_container; @@ -56,6 +57,7 @@ namespace eosio::chain { BOOST_MULTI_INDEX_CONST_MEM_FUN(bs, const block_id_type&, id)>, composite_key_compare, std::greater, std::greater, sha256_less>>>>; + std::shared_mutex mtx; fork_multi_index_type index; bsp root; // Only uses the block_header_state_legacy portion bsp head; @@ -88,6 +90,7 @@ namespace eosio::chain { template void fork_database_t::open( const std::filesystem::path& fork_db_file, validator_t& validator ) { + std::lock_guard g( my->mtx ); my->open_impl( fork_db_file, validator ); } @@ -163,6 +166,7 @@ namespace eosio::chain { template void fork_database_t::close(const std::filesystem::path& fork_db_file) { + std::lock_guard g( my->mtx ); my->close_impl(fork_db_file); } @@ -234,6 +238,7 @@ namespace eosio::chain { template void fork_database_t::reset( const bhs& root_bhs ) { + std::lock_guard g( my->mtx ); my->reset_impl(root_bhs); } @@ -248,6 +253,7 @@ namespace eosio::chain { template void fork_database_t::rollback_head_to_root() { + std::lock_guard g( my->mtx ); my->rollback_head_to_root_impl(); } @@ -266,6 +272,7 @@ namespace eosio::chain { template void fork_database_t::advance_root( const block_id_type& id ) { + std::lock_guard g( my->mtx ); my->advance_root_impl( id ); } @@ -306,6 +313,7 @@ namespace eosio::chain { template fork_database_t::bhsp fork_database_t::get_block_header( const block_id_type& id ) const { + std::shared_lock g( my->mtx ); return my->get_block_header_impl( id ); } @@ -362,6 +370,7 @@ namespace eosio::chain { template void fork_database_t::add( const bsp& n, bool ignore_duplicate ) { + std::lock_guard g( my->mtx ); my->add_impl( n, ignore_duplicate, false, []( block_timestamp_type timestamp, const flat_set& cur_features, @@ -372,16 +381,19 @@ namespace eosio::chain { template bsp fork_database_t::root() const { + std::shared_lock g( my->mtx ); return my->root; } template bsp fork_database_t::head() const { + std::shared_lock g( my->mtx ); return my->head; } template bsp fork_database_t::pending_head() const { + std::shared_lock g( my->mtx ); const auto& indx = my->index.template get(); auto itr = indx.lower_bound( false ); @@ -397,6 +409,7 @@ namespace eosio::chain { fork_database_t::branch_type fork_database_t::fetch_branch(const block_id_type& h, uint32_t trim_after_block_num) const { + std::shared_lock g(my->mtx); return my->fetch_branch_impl(h, trim_after_block_num); } @@ -414,6 +427,7 @@ namespace eosio::chain { template bsp fork_database_t::search_on_branch( const block_id_type& h, uint32_t block_num ) const { + std::shared_lock g( my->mtx ); return my->search_on_branch_impl( h, block_num ); } @@ -434,6 +448,7 @@ namespace eosio::chain { template fork_database_t::branch_type_pair fork_database_t::fetch_branch_from(const block_id_type& first, const block_id_type& second) const { + std::shared_lock g(my->mtx); return my->fetch_branch_from_impl(first, second); } @@ -500,6 +515,7 @@ namespace eosio::chain { /// remove all of the invalid forks built off of this id including this id template void fork_database_t::remove( const block_id_type& id ) { + std::lock_guard g( my->mtx ); return my->remove_impl( id ); } @@ -527,6 +543,7 @@ namespace eosio::chain { template void fork_database_t::mark_valid( const bsp& h ) { + std::lock_guard g( my->mtx ); my->mark_valid_impl( h ); } @@ -553,6 +570,7 @@ namespace eosio::chain { template bsp fork_database_t::get_block(const block_id_type& id) const { + std::shared_lock g( my->mtx ); return my->get_block_impl(id); } @@ -567,7 +585,10 @@ namespace eosio::chain { // ------------------ fork_database ------------------------- fork_database::fork_database(const std::filesystem::path& data_dir) - : data_dir(data_dir) { + : data_dir(data_dir) + // currently needed because chain_head is accessed before fork database open + , fork_db_legacy{std::make_unique(fork_database_legacy_t::legacy_magic_number)} + { } fork_database::~fork_database() { @@ -579,7 +600,6 @@ namespace eosio::chain { } void fork_database::open( validator_t& validator ) { - std::lock_guard g(m); if (!std::filesystem::is_directory(data_dir)) std::filesystem::create_directories(data_dir); @@ -603,12 +623,14 @@ namespace eosio::chain { ); if (totem == fork_database_legacy_t::legacy_magic_number) { + // fork_db_legacy created in constructor apply_legacy([&](auto& forkdb) { forkdb.open(fork_db_file, validator); }); } else { // file is instant-finality data, so switch to fork_database_if_t - vforkdb.emplace(fork_database_if_t::magic_number); + fork_db_if = std::make_unique(fork_database_if_t::magic_number); + legacy = false; apply_if([&](auto& forkdb) { forkdb.open(fork_db_file, validator); }); @@ -618,11 +640,13 @@ namespace eosio::chain { } void fork_database::switch_from_legacy() { - std::lock_guard g(m); // no need to close fork_db because we don't want to write anything out, file is removed on open - block_state_legacy_ptr head = std::get(vforkdb).chain_head; // will throw if called after transistion + // threads may be accessing (or locked on mutex about to access legacy forkdb) so don't delete it until program exit + assert(legacy); + block_state_legacy_ptr head = fork_db_legacy->chain_head; // will throw if called after transistion auto new_head = std::make_shared(*head); - vforkdb.emplace(fork_database_if_t::magic_number); + fork_db_if = std::make_unique(fork_database_if_t::magic_number); + legacy = false; apply_if([&](auto& forkdb) { forkdb.chain_head = new_head; forkdb.reset(*new_head); diff --git a/libraries/chain/include/eosio/chain/fork_database.hpp b/libraries/chain/include/eosio/chain/fork_database.hpp index a2f4f7f868..c9ad269914 100644 --- a/libraries/chain/include/eosio/chain/fork_database.hpp +++ b/libraries/chain/include/eosio/chain/fork_database.hpp @@ -19,7 +19,8 @@ namespace eosio::chain { * blocks older than the last irreversible block are freed after emitting the * irreversible signal. * - * Not thread safe, thread safety provided by fork_database below. + * An internal mutex is used to provide thread-safety. + * * fork_database should be used instead of fork_database_t directly as it manages * the different supported types. */ @@ -108,22 +109,25 @@ namespace eosio::chain { using fork_database_if_t = fork_database_t; /** - * Provides thread safety on fork_database_t and provide mechanism for opening the correct type + * Provides mechanism for opening the correct type * as well as switching from legacy (old dpos) to instant-finality. * * All methods assert until open() is closed. */ class fork_database { - mutable std::recursive_mutex m; const std::filesystem::path data_dir; - std::variant, fork_database_t> vforkdb; + std::atomic legacy = true; + std::unique_ptr fork_db_legacy; + std::unique_ptr fork_db_if; public: explicit fork_database(const std::filesystem::path& data_dir); ~fork_database(); // close on destruction + // not thread safe, expected to be called from main thread before allowing concurrent access void open( validator_t& validator ); void close(); + // expected to be called from main thread, accesses chain_head void switch_from_legacy(); // see fork_database_t::fetch_branch(forkdb->head()->id()) @@ -131,63 +135,85 @@ namespace eosio::chain { template R apply(const F& f) { - std::lock_guard g(m); - if constexpr (std::is_same_v) - std::visit([&](auto& forkdb) { f(forkdb); }, vforkdb); - else - return std::visit([&](auto& forkdb) -> R { return f(forkdb); }, vforkdb); + if constexpr (std::is_same_v) { + if (legacy) { + f(*fork_db_legacy); + } else { + f(*fork_db_if); + } + } else { + if (legacy) { + return f(*fork_db_legacy); + } else { + return f(*fork_db_if); + } + } } template R apply(const F& f) const { - std::lock_guard g(m); - if constexpr (std::is_same_v) - std::visit([&](const auto& forkdb) { f(forkdb); }, vforkdb); - else - return std::visit([&](const auto& forkdb) -> R { return f(forkdb); }, vforkdb); + if constexpr (std::is_same_v) { + if (legacy) { + f(*fork_db_legacy); + } else { + f(*fork_db_if); + } + } else { + if (legacy) { + return f(*fork_db_legacy); + } else { + return f(*fork_db_if); + } + } } /// Apply for when only need lambda executed when in instant-finality mode template R apply_if(const F& f) { - std::lock_guard g(m); - if constexpr (std::is_same_v) - std::visit(overloaded{[&](fork_database_legacy_t&) {}, - [&](fork_database_if_t& forkdb) { f(forkdb); }}, - vforkdb); - else - return std::visit(overloaded{[&](fork_database_legacy_t&) -> R { return {}; }, - [&](fork_database_if_t& forkdb) -> R { return f(forkdb); }}, - vforkdb); + if constexpr (std::is_same_v) { + if (!legacy) { + f(*fork_db_if); + } + } else { + if (!legacy) { + return f(*fork_db_if); + } + return {}; + } } /// Apply for when only need lambda executed when in legacy mode template R apply_legacy(const F& f) { - std::lock_guard g(m); - if constexpr (std::is_same_v) - std::visit(overloaded{[&](fork_database_legacy_t& forkdb) { f(forkdb); }, - [&](fork_database_if_t&) {}}, - vforkdb); - else - return std::visit(overloaded{[&](fork_database_legacy_t& forkdb) -> R { return f(forkdb); }, - [&](fork_database_if_t&) -> R { return {}; }}, - vforkdb); + if constexpr (std::is_same_v) { + if (legacy) { + f(*fork_db_legacy); + } + } else { + if (legacy) { + return f(*fork_db_legacy); + } + return {}; + } } /// @param legacy_f the lambda to execute if in legacy mode /// @param if_f the lambda to execute if in instant-finality mode template R apply(const LegacyF& legacy_f, const IfF& if_f) { - std::lock_guard g(m); - if constexpr (std::is_same_v) - std::visit(overloaded{[&](fork_database_legacy_t& forkdb) { legacy_f(forkdb); }, - [&](fork_database_if_t& forkdb) { if_f(forkdb); }}, - vforkdb); - else - return std::visit(overloaded{[&](fork_database_legacy_t& forkdb) -> R { return legacy_f(forkdb); }, - [&](fork_database_if_t& forkdb) -> R { return if_f(forkdb); }}, - vforkdb); + if constexpr (std::is_same_v) { + if (legacy) { + legacy_f(*fork_db_legacy); + } else { + if_f(*fork_db_if); + } + } else { + if (legacy) { + return legacy_f(*fork_db_legacy); + } else { + return if_f(*fork_db_if); + } + } } // if we ever support more than one version then need to save min/max in fork_database_t From 8b9a0f5c3028315500251606393ea4ec165320c8 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 1 Feb 2024 10:59:37 -0600 Subject: [PATCH 2/8] Add back test --- tests/CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4afd9516e4..90e6c6e289 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -359,9 +359,8 @@ set_property(TEST light_validation_sync_if_test PROPERTY LABELS nonparallelizabl add_test(NAME auto_bp_peering_test COMMAND tests/auto_bp_peering_test.py -v ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) set_property(TEST auto_bp_peering_test PROPERTY LABELS long_running_tests) -# requires https://github.com/AntelopeIO/leap/issues/2175 & https://github.com/AntelopeIO/leap/issues/2173 -#add_test(NAME auto_bp_peering_if_test COMMAND tests/auto_bp_peering_test.py -v --activate-if ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) -#set_property(TEST auto_bp_peering_if_test PROPERTY LABELS long_running_tests) +add_test(NAME auto_bp_peering_if_test COMMAND tests/auto_bp_peering_test.py -v --activate-if ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +set_property(TEST auto_bp_peering_if_test PROPERTY LABELS long_running_tests) add_test(NAME gelf_test COMMAND tests/gelf_test.py ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) set_property(TEST gelf_test PROPERTY LABELS nonparallelizable_tests) From 4cc5eed63df3c5fe9e642534d6a18462f9d5c6ff Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 1 Feb 2024 13:38:58 -0600 Subject: [PATCH 3/8] GH-2173 Fix for test --- tests/trx_finality_status_forked_test.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/trx_finality_status_forked_test.py b/tests/trx_finality_status_forked_test.py index 577668f9bb..9c27782e3a 100755 --- a/tests/trx_finality_status_forked_test.py +++ b/tests/trx_finality_status_forked_test.py @@ -130,6 +130,8 @@ assert not nonProdNode.verifyAlive(), "Bridge node should have been killed if test was functioning correctly." + assert prodC.waitForNextBlock(), "Prod node C should continue to advance, even after bridge node is killed" + def getState(status): assert status is not None, "ERROR: getTransactionStatus failed to return any status" assert "state" in status, \ @@ -149,8 +151,8 @@ def getState(status): forkedOutState = "FORKED_OUT" unknownState = "UNKNOWN" - assert state == localState, \ - f"ERROR: getTransactionStatus didn't return \"{localState}\" state.\n\nstatus: {json.dumps(retStatus, indent=1)}" + assert state == localState or state == inBlockState, \ + f"ERROR: getTransactionStatus didn't return \"{localState}\" or \"{inBlockState}\" state.\n\nstatus: {json.dumps(retStatus, indent=1)}" assert prodC.waitForNextBlock(), "Production node C should continue to advance, even after bridge node is killed" From 3a5530223859cabaa49ca97efbb84e9b6568240d Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 1 Feb 2024 14:53:26 -0600 Subject: [PATCH 4/8] GH-2173 Use mutex over shared_mutex, want to optimize write not read --- libraries/chain/fork_database.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/libraries/chain/fork_database.cpp b/libraries/chain/fork_database.cpp index c1e496486a..6d893b5304 100644 --- a/libraries/chain/fork_database.cpp +++ b/libraries/chain/fork_database.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include namespace eosio::chain { using boost::multi_index_container; @@ -57,7 +57,7 @@ namespace eosio::chain { BOOST_MULTI_INDEX_CONST_MEM_FUN(bs, const block_id_type&, id)>, composite_key_compare, std::greater, std::greater, sha256_less>>>>; - std::shared_mutex mtx; + std::mutex mtx; fork_multi_index_type index; bsp root; // Only uses the block_header_state_legacy portion bsp head; @@ -313,7 +313,7 @@ namespace eosio::chain { template fork_database_t::bhsp fork_database_t::get_block_header( const block_id_type& id ) const { - std::shared_lock g( my->mtx ); + std::lock_guard g( my->mtx ); return my->get_block_header_impl( id ); } @@ -381,19 +381,19 @@ namespace eosio::chain { template bsp fork_database_t::root() const { - std::shared_lock g( my->mtx ); + std::lock_guard g( my->mtx ); return my->root; } template bsp fork_database_t::head() const { - std::shared_lock g( my->mtx ); + std::lock_guard g( my->mtx ); return my->head; } template bsp fork_database_t::pending_head() const { - std::shared_lock g( my->mtx ); + std::lock_guard g( my->mtx ); const auto& indx = my->index.template get(); auto itr = indx.lower_bound( false ); @@ -407,9 +407,8 @@ namespace eosio::chain { template fork_database_t::branch_type - fork_database_t::fetch_branch(const block_id_type& h, - uint32_t trim_after_block_num) const { - std::shared_lock g(my->mtx); + fork_database_t::fetch_branch(const block_id_type& h, uint32_t trim_after_block_num) const { + std::lock_guard g(my->mtx); return my->fetch_branch_impl(h, trim_after_block_num); } @@ -427,7 +426,7 @@ namespace eosio::chain { template bsp fork_database_t::search_on_branch( const block_id_type& h, uint32_t block_num ) const { - std::shared_lock g( my->mtx ); + std::lock_guard g( my->mtx ); return my->search_on_branch_impl( h, block_num ); } @@ -448,7 +447,7 @@ namespace eosio::chain { template fork_database_t::branch_type_pair fork_database_t::fetch_branch_from(const block_id_type& first, const block_id_type& second) const { - std::shared_lock g(my->mtx); + std::lock_guard g(my->mtx); return my->fetch_branch_from_impl(first, second); } @@ -570,7 +569,7 @@ namespace eosio::chain { template bsp fork_database_t::get_block(const block_id_type& id) const { - std::shared_lock g( my->mtx ); + std::lock_guard g( my->mtx ); return my->get_block_impl(id); } From 7e585ee80790223f2b48236ccd2a50425ffcd83c Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 1 Feb 2024 14:54:24 -0600 Subject: [PATCH 5/8] GH-2173 Debug log for shutdown --- plugins/chain_plugin/chain_plugin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index 6f66342c5a..67a48c661e 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -1146,6 +1146,7 @@ void chain_plugin_impl::plugin_shutdown() { applied_transaction_connection.reset(); block_start_connection.reset(); chain.reset(); + dlog("exit shutdown"); } void chain_plugin::plugin_shutdown() { From 2c84e8471d9230c8f49a36da372bac2108d7823f Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 1 Feb 2024 14:54:45 -0600 Subject: [PATCH 6/8] GH-2173 Since test failed under IF, run it both ways --- tests/CMakeLists.txt | 2 ++ tests/nodeos_under_min_avail_ram.py | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 90e6c6e289..4b7b247905 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -272,6 +272,8 @@ set_property(TEST nodeos_voting_if_lr_test PROPERTY LABELS long_running_tests) add_test(NAME nodeos_under_min_avail_ram_lr_test COMMAND tests/nodeos_under_min_avail_ram.py -v --wallet-port 9904 ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) set_property(TEST nodeos_under_min_avail_ram_lr_test PROPERTY LABELS long_running_tests) +add_test(NAME nodeos_under_min_avail_ram_if_lr_test COMMAND tests/nodeos_under_min_avail_ram.py -v --active-if ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +set_property(TEST nodeos_under_min_avail_ram_if_lr_test PROPERTY LABELS long_running_tests) add_test(NAME nodeos_irreversible_mode_lr_test COMMAND tests/nodeos_irreversible_mode_test.py -v ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) set_property(TEST nodeos_irreversible_mode_lr_test PROPERTY LABELS long_running_tests) diff --git a/tests/nodeos_under_min_avail_ram.py b/tests/nodeos_under_min_avail_ram.py index de996a73f5..a210d0b263 100755 --- a/tests/nodeos_under_min_avail_ram.py +++ b/tests/nodeos_under_min_avail_ram.py @@ -18,11 +18,12 @@ Print=Utils.Print errorExit=Utils.errorExit -args = TestHelper.parse_args({"--dump-error-details","--keep-logs","-v","--leave-running","--wallet-port","--unshared"}) +args = TestHelper.parse_args({"--activate-if","--dump-error-details","--keep-logs","-v","--leave-running","--wallet-port","--unshared"}) Utils.Debug=args.v pNodes=4 totalNodes=5 cluster=Cluster(unshared=args.unshared, keepRunning=args.leave_running, keepLogs=args.keep_logs) +activateIF=args.activate_if dumpErrorDetails=args.dump_error_details walletPort=args.wallet_port @@ -42,7 +43,7 @@ maxRAMFlag="--chain-state-db-size-mb" maxRAMValue=1010 extraNodeosArgs=" %s %d %s %d --http-max-response-time-ms 990000 " % (minRAMFlag, minRAMValue, maxRAMFlag, maxRAMValue) - if cluster.launch(onlyBios=False, pnodes=pNodes, totalNodes=totalNodes, totalProducers=totalNodes, activateIF=True, extraNodeosArgs=extraNodeosArgs) is False: + if cluster.launch(onlyBios=False, pnodes=pNodes, totalNodes=totalNodes, totalProducers=totalNodes, activateIF=activateIF, extraNodeosArgs=extraNodeosArgs) is False: Utils.cmdError("launcher") errorExit("Failed to stand up eos cluster.") From 3fb0e7ee8ca00485927f7b62d51ebfb1676acc58 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 1 Feb 2024 15:53:25 -0600 Subject: [PATCH 7/8] GH-2173 activate-if --- tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4b7b247905..dcc5abbf96 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -272,7 +272,7 @@ set_property(TEST nodeos_voting_if_lr_test PROPERTY LABELS long_running_tests) add_test(NAME nodeos_under_min_avail_ram_lr_test COMMAND tests/nodeos_under_min_avail_ram.py -v --wallet-port 9904 ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) set_property(TEST nodeos_under_min_avail_ram_lr_test PROPERTY LABELS long_running_tests) -add_test(NAME nodeos_under_min_avail_ram_if_lr_test COMMAND tests/nodeos_under_min_avail_ram.py -v --active-if ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +add_test(NAME nodeos_under_min_avail_ram_if_lr_test COMMAND tests/nodeos_under_min_avail_ram.py -v --activate-if ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) set_property(TEST nodeos_under_min_avail_ram_if_lr_test PROPERTY LABELS long_running_tests) add_test(NAME nodeos_irreversible_mode_lr_test COMMAND tests/nodeos_irreversible_mode_test.py -v ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) From 4913c6bc2922f5352dd70992b298e39c0ab77c32 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Fri, 2 Feb 2024 07:20:33 -0600 Subject: [PATCH 8/8] Disable failing test GH-2189 --- tests/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index dcc5abbf96..23fceeb4fc 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -223,8 +223,9 @@ set_property(TEST trx_finality_status_if_test PROPERTY LABELS nonparallelizable_ add_test(NAME trx_finality_status_forked_test COMMAND tests/trx_finality_status_forked_test.py -v ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) set_property(TEST trx_finality_status_forked_test PROPERTY LABELS nonparallelizable_tests) -add_test(NAME trx_finality_status_forked_if_test COMMAND tests/trx_finality_status_forked_test.py -v --activate-if ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) -set_property(TEST trx_finality_status_forked_if_test PROPERTY LABELS nonparallelizable_tests) +# requires https://github.com/AntelopeIO/leap/issues/2189 +#add_test(NAME trx_finality_status_forked_if_test COMMAND tests/trx_finality_status_forked_test.py -v --activate-if ${UNSHARE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +#set_property(TEST trx_finality_status_forked_if_test PROPERTY LABELS nonparallelizable_tests) add_test(NAME db_modes_test COMMAND tests/db_modes_test.sh -v WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) set_tests_properties(db_modes_test PROPERTIES COST 6000)