From 9ddf649e2a60690771e13ee14715b42756ecb111 Mon Sep 17 00:00:00 2001 From: Nicholas Dudfield Date: Mon, 1 Dec 2025 15:31:15 +0700 Subject: [PATCH] feat: add ledger range-based TX priority for faster tx detection Simplify TX priority mechanism using RangeSet instead of per-TX hash tracking. When submit_and_wait is called, it registers a ledger range where TX nodes should be fetched before state nodes. Key changes: - Add prioritizeTxForLedgers(start, end) and isTxPrioritized(seq) to InboundLedgers using RangeSet - InboundLedger::trigger() checks range to decide TX-before-state order - Remove complex per-TX hash tracking that couldn't help due to Merkle tree structure (need parent hashes to request children) - Format CMake and source files --- Builds/CMake/RippledCore.cmake | 1799 ++++++++--------- src/ripple/app/ledger/InboundLedger.h | 8 + src/ripple/app/ledger/InboundLedgers.h | 13 + src/ripple/app/ledger/impl/InboundLedger.cpp | 20 +- src/ripple/app/ledger/impl/InboundLedgers.cpp | 46 +- src/ripple/app/misc/NetworkOPs.cpp | 2 +- src/ripple/rpc/handlers/SubmitAndWait.cpp | 91 +- src/test/app/LedgerReplay_test.cpp | 17 + 8 files changed, 1032 insertions(+), 964 deletions(-) diff --git a/Builds/CMake/RippledCore.cmake b/Builds/CMake/RippledCore.cmake index 683032366..4cd35dc87 100644 --- a/Builds/CMake/RippledCore.cmake +++ b/Builds/CMake/RippledCore.cmake @@ -3,15 +3,12 @@ core functionality, useable by some client software perhaps #]===================================================================] -file (GLOB_RECURSE rb_headers - src/ripple/beast/*.h - src/ripple/beast/*.hpp) +file(GLOB_RECURSE rb_headers src/ripple/beast/*.h src/ripple/beast/*.hpp) -add_library (xrpl_core - ${rb_headers}) ## headers added here for benefit of IDEs -if (unity) +add_library(xrpl_core ${rb_headers}) # headers added here for benefit of IDEs +if(unity) set_target_properties(xrpl_core PROPERTIES UNITY_BUILD ON) -endif () +endif() # Try to find the ACL library find_library(ACL_LIBRARY NAMES acl) @@ -27,140 +24,138 @@ add_library(libxrpl INTERFACE) target_link_libraries(libxrpl INTERFACE xrpl_core) add_library(xrpl::libxrpl ALIAS libxrpl) - #[===============================[ beast/legacy FILES: TODO: review these sources for removal or replacement #]===============================] -target_sources (xrpl_core PRIVATE - src/ripple/beast/clock/basic_seconds_clock.cpp - src/ripple/beast/core/CurrentThreadName.cpp - src/ripple/beast/core/SemanticVersion.cpp - src/ripple/beast/hash/impl/xxhash.cpp - src/ripple/beast/insight/impl/Collector.cpp - src/ripple/beast/insight/impl/Groups.cpp - src/ripple/beast/insight/impl/Hook.cpp - src/ripple/beast/insight/impl/Metric.cpp - src/ripple/beast/insight/impl/NullCollector.cpp - src/ripple/beast/insight/impl/StatsDCollector.cpp - src/ripple/beast/net/impl/IPAddressConversion.cpp - src/ripple/beast/net/impl/IPAddressV4.cpp - src/ripple/beast/net/impl/IPAddressV6.cpp - src/ripple/beast/net/impl/IPEndpoint.cpp - src/ripple/beast/utility/src/beast_Journal.cpp - src/ripple/beast/utility/src/beast_PropertyStream.cpp) +target_sources( + xrpl_core + PRIVATE src/ripple/beast/clock/basic_seconds_clock.cpp + src/ripple/beast/core/CurrentThreadName.cpp + src/ripple/beast/core/SemanticVersion.cpp + src/ripple/beast/hash/impl/xxhash.cpp + src/ripple/beast/insight/impl/Collector.cpp + src/ripple/beast/insight/impl/Groups.cpp + src/ripple/beast/insight/impl/Hook.cpp + src/ripple/beast/insight/impl/Metric.cpp + src/ripple/beast/insight/impl/NullCollector.cpp + src/ripple/beast/insight/impl/StatsDCollector.cpp + src/ripple/beast/net/impl/IPAddressConversion.cpp + src/ripple/beast/net/impl/IPAddressV4.cpp + src/ripple/beast/net/impl/IPAddressV6.cpp + src/ripple/beast/net/impl/IPEndpoint.cpp + src/ripple/beast/utility/src/beast_Journal.cpp + src/ripple/beast/utility/src/beast_PropertyStream.cpp) -# Conditionally add enhanced logging source when BEAST_ENHANCED_LOGGING is enabled +# Conditionally add enhanced logging source when BEAST_ENHANCED_LOGGING is +# enabled if(DEFINED BEAST_ENHANCED_LOGGING AND BEAST_ENHANCED_LOGGING) - target_sources(xrpl_core PRIVATE - src/ripple/beast/utility/src/beast_EnhancedLogging.cpp) + target_sources(xrpl_core + PRIVATE src/ripple/beast/utility/src/beast_EnhancedLogging.cpp) endif() #[===============================[ core sources #]===============================] -target_sources (xrpl_core PRIVATE - #[===============================[ +target_sources( + xrpl_core + PRIVATE #[===============================[ main sources: subdir: basics (partial) #]===============================] - src/ripple/basics/impl/base64.cpp - src/ripple/basics/impl/contract.cpp - src/ripple/basics/impl/CountedObject.cpp - src/ripple/basics/impl/FileUtilities.cpp - src/ripple/basics/impl/IOUAmount.cpp - src/ripple/basics/impl/Log.cpp - src/ripple/basics/impl/Number.cpp - src/ripple/basics/impl/StringUtilities.cpp - #[===============================[ + src/ripple/basics/impl/base64.cpp + src/ripple/basics/impl/contract.cpp + src/ripple/basics/impl/CountedObject.cpp + src/ripple/basics/impl/FileUtilities.cpp + src/ripple/basics/impl/IOUAmount.cpp + src/ripple/basics/impl/Log.cpp + src/ripple/basics/impl/Number.cpp + src/ripple/basics/impl/StringUtilities.cpp + #[===============================[ main sources: subdir: json #]===============================] - src/ripple/json/impl/JsonPropertyStream.cpp - src/ripple/json/impl/Object.cpp - src/ripple/json/impl/Output.cpp - src/ripple/json/impl/Writer.cpp - src/ripple/json/impl/json_reader.cpp - src/ripple/json/impl/json_value.cpp - src/ripple/json/impl/json_valueiterator.cpp - src/ripple/json/impl/json_writer.cpp - src/ripple/json/impl/to_string.cpp - #[===============================[ + src/ripple/json/impl/JsonPropertyStream.cpp + src/ripple/json/impl/Object.cpp + src/ripple/json/impl/Output.cpp + src/ripple/json/impl/Writer.cpp + src/ripple/json/impl/json_reader.cpp + src/ripple/json/impl/json_value.cpp + src/ripple/json/impl/json_valueiterator.cpp + src/ripple/json/impl/json_writer.cpp + src/ripple/json/impl/to_string.cpp + #[===============================[ main sources: subdir: protocol #]===============================] - src/ripple/protocol/impl/AccountID.cpp - src/ripple/protocol/impl/Book.cpp - src/ripple/protocol/impl/BuildInfo.cpp - src/ripple/protocol/impl/ErrorCodes.cpp - src/ripple/protocol/impl/Feature.cpp - src/ripple/protocol/impl/Indexes.cpp - src/ripple/protocol/impl/InnerObjectFormats.cpp - src/ripple/protocol/impl/Issue.cpp - src/ripple/protocol/impl/Keylet.cpp - src/ripple/protocol/impl/LedgerFormats.cpp - src/ripple/protocol/impl/PublicKey.cpp - src/ripple/protocol/impl/Quality.cpp - src/ripple/protocol/impl/Rate2.cpp - src/ripple/protocol/impl/Rules.cpp - src/ripple/protocol/impl/SField.cpp - src/ripple/protocol/impl/SOTemplate.cpp - src/ripple/protocol/impl/STAccount.cpp - src/ripple/protocol/impl/STAmount.cpp - src/ripple/protocol/impl/STArray.cpp - src/ripple/protocol/impl/STBase.cpp - src/ripple/protocol/impl/STBlob.cpp - src/ripple/protocol/impl/STInteger.cpp - src/ripple/protocol/impl/STLedgerEntry.cpp - src/ripple/protocol/impl/STObject.cpp - src/ripple/protocol/impl/STParsedJSON.cpp - src/ripple/protocol/impl/STPathSet.cpp - src/ripple/protocol/impl/STTx.cpp - src/ripple/protocol/impl/STValidation.cpp - src/ripple/protocol/impl/STVar.cpp - src/ripple/protocol/impl/STVector256.cpp - src/ripple/protocol/impl/SecretKey.cpp - src/ripple/protocol/impl/Seed.cpp - src/ripple/protocol/impl/Serializer.cpp - src/ripple/protocol/impl/Sign.cpp - src/ripple/protocol/impl/TER.cpp - src/ripple/protocol/impl/TxFormats.cpp - src/ripple/protocol/impl/TxMeta.cpp - src/ripple/protocol/impl/UintTypes.cpp - src/ripple/protocol/impl/digest.cpp - src/ripple/protocol/impl/tokens.cpp - #[===============================[ + src/ripple/protocol/impl/AccountID.cpp + src/ripple/protocol/impl/Book.cpp + src/ripple/protocol/impl/BuildInfo.cpp + src/ripple/protocol/impl/ErrorCodes.cpp + src/ripple/protocol/impl/Feature.cpp + src/ripple/protocol/impl/Indexes.cpp + src/ripple/protocol/impl/InnerObjectFormats.cpp + src/ripple/protocol/impl/Issue.cpp + src/ripple/protocol/impl/Keylet.cpp + src/ripple/protocol/impl/LedgerFormats.cpp + src/ripple/protocol/impl/PublicKey.cpp + src/ripple/protocol/impl/Quality.cpp + src/ripple/protocol/impl/Rate2.cpp + src/ripple/protocol/impl/Rules.cpp + src/ripple/protocol/impl/SField.cpp + src/ripple/protocol/impl/SOTemplate.cpp + src/ripple/protocol/impl/STAccount.cpp + src/ripple/protocol/impl/STAmount.cpp + src/ripple/protocol/impl/STArray.cpp + src/ripple/protocol/impl/STBase.cpp + src/ripple/protocol/impl/STBlob.cpp + src/ripple/protocol/impl/STInteger.cpp + src/ripple/protocol/impl/STLedgerEntry.cpp + src/ripple/protocol/impl/STObject.cpp + src/ripple/protocol/impl/STParsedJSON.cpp + src/ripple/protocol/impl/STPathSet.cpp + src/ripple/protocol/impl/STTx.cpp + src/ripple/protocol/impl/STValidation.cpp + src/ripple/protocol/impl/STVar.cpp + src/ripple/protocol/impl/STVector256.cpp + src/ripple/protocol/impl/SecretKey.cpp + src/ripple/protocol/impl/Seed.cpp + src/ripple/protocol/impl/Serializer.cpp + src/ripple/protocol/impl/Sign.cpp + src/ripple/protocol/impl/TER.cpp + src/ripple/protocol/impl/TxFormats.cpp + src/ripple/protocol/impl/TxMeta.cpp + src/ripple/protocol/impl/UintTypes.cpp + src/ripple/protocol/impl/digest.cpp + src/ripple/protocol/impl/tokens.cpp + #[===============================[ main sources: subdir: crypto #]===============================] - src/ripple/crypto/impl/RFC1751.cpp - src/ripple/crypto/impl/csprng.cpp - src/ripple/crypto/impl/secure_erase.cpp) + src/ripple/crypto/impl/RFC1751.cpp + src/ripple/crypto/impl/csprng.cpp + src/ripple/crypto/impl/secure_erase.cpp) -add_library (Ripple::xrpl_core ALIAS xrpl_core) -target_include_directories (xrpl_core - PUBLIC - $ - $) +add_library(Ripple::xrpl_core ALIAS xrpl_core) +target_include_directories( + xrpl_core PUBLIC $ + $) -target_compile_definitions(xrpl_core - PUBLIC - BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT - BOOST_CONTAINER_FWD_BAD_DEQUE - HAS_UNCAUGHT_EXCEPTIONS=1) -target_compile_options (xrpl_core - PUBLIC - $<$:-Wno-maybe-uninitialized>) -target_link_libraries (xrpl_core - PUBLIC - OpenSSL::Crypto - Ripple::boost - wasmedge::wasmedge - Ripple::syslibs - secp256k1::secp256k1 - ed25519::ed25519 - date::date - Ripple::opts) +target_compile_definitions( + xrpl_core PUBLIC BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT + BOOST_CONTAINER_FWD_BAD_DEQUE HAS_UNCAUGHT_EXCEPTIONS=1) +target_compile_options(xrpl_core + PUBLIC $<$:-Wno-maybe-uninitialized>) +target_link_libraries( + xrpl_core + PUBLIC OpenSSL::Crypto + Ripple::boost + wasmedge::wasmedge + Ripple::syslibs + secp256k1::secp256k1 + ed25519::ed25519 + date::date + Ripple::opts) # Link date-tz library when enhanced logging is enabled if(DEFINED BEAST_ENHANCED_LOGGING AND BEAST_ENHANCED_LOGGING) @@ -171,177 +166,149 @@ endif() #[=================================[ main/core headers installation #]=================================] -install ( - FILES - src/ripple/basics/base64.h - src/ripple/basics/Blob.h - src/ripple/basics/Buffer.h - src/ripple/basics/CountedObject.h - src/ripple/basics/FileUtilities.h - src/ripple/basics/IOUAmount.h - src/ripple/basics/LocalValue.h - src/ripple/basics/Log.h - src/ripple/basics/MathUtilities.h - src/ripple/basics/Number.h - src/ripple/basics/safe_cast.h - src/ripple/basics/Slice.h - src/ripple/basics/spinlock.h - src/ripple/basics/StringUtilities.h - src/ripple/basics/ThreadSafetyAnalysis.h - src/ripple/basics/ToString.h - src/ripple/basics/UnorderedContainers.h - src/ripple/basics/XRPAmount.h - src/ripple/basics/algorithm.h - src/ripple/basics/base_uint.h - src/ripple/basics/chrono.h - src/ripple/basics/contract.h - src/ripple/basics/FeeUnits.h - src/ripple/basics/hardened_hash.h - src/ripple/basics/strHex.h +install( + FILES src/ripple/basics/base64.h + src/ripple/basics/Blob.h + src/ripple/basics/Buffer.h + src/ripple/basics/CountedObject.h + src/ripple/basics/FileUtilities.h + src/ripple/basics/IOUAmount.h + src/ripple/basics/LocalValue.h + src/ripple/basics/Log.h + src/ripple/basics/MathUtilities.h + src/ripple/basics/Number.h + src/ripple/basics/safe_cast.h + src/ripple/basics/Slice.h + src/ripple/basics/spinlock.h + src/ripple/basics/StringUtilities.h + src/ripple/basics/ThreadSafetyAnalysis.h + src/ripple/basics/ToString.h + src/ripple/basics/UnorderedContainers.h + src/ripple/basics/XRPAmount.h + src/ripple/basics/algorithm.h + src/ripple/basics/base_uint.h + src/ripple/basics/chrono.h + src/ripple/basics/contract.h + src/ripple/basics/FeeUnits.h + src/ripple/basics/hardened_hash.h + src/ripple/basics/strHex.h DESTINATION include/ripple/basics) -install ( - FILES - src/ripple/crypto/RFC1751.h - src/ripple/crypto/csprng.h - src/ripple/crypto/secure_erase.h - DESTINATION include/ripple/crypto) -install ( - FILES - src/ripple/json/JsonPropertyStream.h - src/ripple/json/Object.h - src/ripple/json/Output.h - src/ripple/json/Writer.h - src/ripple/json/json_forwards.h - src/ripple/json/json_reader.h - src/ripple/json/json_value.h - src/ripple/json/json_writer.h - src/ripple/json/to_string.h +install(FILES src/ripple/crypto/RFC1751.h src/ripple/crypto/csprng.h + src/ripple/crypto/secure_erase.h + DESTINATION include/ripple/crypto) +install( + FILES src/ripple/json/JsonPropertyStream.h + src/ripple/json/Object.h + src/ripple/json/Output.h + src/ripple/json/Writer.h + src/ripple/json/json_forwards.h + src/ripple/json/json_reader.h + src/ripple/json/json_value.h + src/ripple/json/json_writer.h + src/ripple/json/to_string.h DESTINATION include/ripple/json) -install ( - FILES - src/ripple/json/impl/json_assert.h - DESTINATION include/ripple/json/impl) -install ( - FILES - src/ripple/protocol/AccountID.h - src/ripple/protocol/AmountConversions.h - src/ripple/protocol/Book.h - src/ripple/protocol/BuildInfo.h - src/ripple/protocol/ErrorCodes.h - src/ripple/protocol/Feature.h - src/ripple/protocol/HashPrefix.h - src/ripple/protocol/Indexes.h - src/ripple/protocol/InnerObjectFormats.h - src/ripple/protocol/Issue.h - src/ripple/protocol/KeyType.h - src/ripple/protocol/Keylet.h - src/ripple/protocol/KnownFormats.h - src/ripple/protocol/LedgerFormats.h - src/ripple/protocol/Protocol.h - src/ripple/protocol/PublicKey.h - src/ripple/protocol/Quality.h - src/ripple/protocol/Rate.h - src/ripple/protocol/Rules.h - src/ripple/protocol/SField.h - src/ripple/protocol/SOTemplate.h - src/ripple/protocol/STAccount.h - src/ripple/protocol/STAmount.h - src/ripple/protocol/STArray.h - src/ripple/protocol/STBase.h - src/ripple/protocol/STBitString.h - src/ripple/protocol/STBlob.h - src/ripple/protocol/STExchange.h - src/ripple/protocol/STInteger.h - src/ripple/protocol/STLedgerEntry.h - src/ripple/protocol/STObject.h - src/ripple/protocol/STParsedJSON.h - src/ripple/protocol/STPathSet.h - src/ripple/protocol/STTx.h - src/ripple/protocol/STValidation.h - src/ripple/protocol/STVector256.h - src/ripple/protocol/SecretKey.h - src/ripple/protocol/Seed.h - src/ripple/protocol/SeqProxy.h - src/ripple/protocol/Serializer.h - src/ripple/protocol/Sign.h - src/ripple/protocol/SystemParameters.h - src/ripple/protocol/TER.h - src/ripple/protocol/TxFlags.h - src/ripple/protocol/TxFormats.h - src/ripple/protocol/TxMeta.h - src/ripple/protocol/UintTypes.h - src/ripple/protocol/digest.h - src/ripple/protocol/jss.h - src/ripple/protocol/tokens.h +install(FILES src/ripple/json/impl/json_assert.h + DESTINATION include/ripple/json/impl) +install( + FILES src/ripple/protocol/AccountID.h + src/ripple/protocol/AmountConversions.h + src/ripple/protocol/Book.h + src/ripple/protocol/BuildInfo.h + src/ripple/protocol/ErrorCodes.h + src/ripple/protocol/Feature.h + src/ripple/protocol/HashPrefix.h + src/ripple/protocol/Indexes.h + src/ripple/protocol/InnerObjectFormats.h + src/ripple/protocol/Issue.h + src/ripple/protocol/KeyType.h + src/ripple/protocol/Keylet.h + src/ripple/protocol/KnownFormats.h + src/ripple/protocol/LedgerFormats.h + src/ripple/protocol/Protocol.h + src/ripple/protocol/PublicKey.h + src/ripple/protocol/Quality.h + src/ripple/protocol/Rate.h + src/ripple/protocol/Rules.h + src/ripple/protocol/SField.h + src/ripple/protocol/SOTemplate.h + src/ripple/protocol/STAccount.h + src/ripple/protocol/STAmount.h + src/ripple/protocol/STArray.h + src/ripple/protocol/STBase.h + src/ripple/protocol/STBitString.h + src/ripple/protocol/STBlob.h + src/ripple/protocol/STExchange.h + src/ripple/protocol/STInteger.h + src/ripple/protocol/STLedgerEntry.h + src/ripple/protocol/STObject.h + src/ripple/protocol/STParsedJSON.h + src/ripple/protocol/STPathSet.h + src/ripple/protocol/STTx.h + src/ripple/protocol/STValidation.h + src/ripple/protocol/STVector256.h + src/ripple/protocol/SecretKey.h + src/ripple/protocol/Seed.h + src/ripple/protocol/SeqProxy.h + src/ripple/protocol/Serializer.h + src/ripple/protocol/Sign.h + src/ripple/protocol/SystemParameters.h + src/ripple/protocol/TER.h + src/ripple/protocol/TxFlags.h + src/ripple/protocol/TxFormats.h + src/ripple/protocol/TxMeta.h + src/ripple/protocol/UintTypes.h + src/ripple/protocol/digest.h + src/ripple/protocol/jss.h + src/ripple/protocol/tokens.h DESTINATION include/ripple/protocol) -install ( - FILES - src/ripple/protocol/impl/STVar.h - src/ripple/protocol/impl/secp256k1.h - DESTINATION include/ripple/protocol/impl) +install(FILES src/ripple/protocol/impl/STVar.h + src/ripple/protocol/impl/secp256k1.h + DESTINATION include/ripple/protocol/impl) #[===================================[ beast/legacy headers installation #]===================================] -install ( - FILES - src/ripple/beast/clock/abstract_clock.h - src/ripple/beast/clock/basic_seconds_clock.h - src/ripple/beast/clock/manual_clock.h +install( + FILES src/ripple/beast/clock/abstract_clock.h + src/ripple/beast/clock/basic_seconds_clock.h + src/ripple/beast/clock/manual_clock.h DESTINATION include/ripple/beast/clock) -install ( - FILES - src/ripple/beast/core/LexicalCast.h - src/ripple/beast/core/List.h - src/ripple/beast/core/SemanticVersion.h - DESTINATION include/ripple/beast/core) -install ( - FILES - src/ripple/beast/hash/hash_append.h - src/ripple/beast/hash/uhash.h - src/ripple/beast/hash/xxhasher.h - DESTINATION include/ripple/beast/hash) -install ( - FILES src/ripple/beast/hash/impl/xxhash.h - DESTINATION include/ripple/beast/hash/impl) -install ( - FILES - src/ripple/beast/rfc2616.h - src/ripple/beast/type_name.h - src/ripple/beast/unit_test.h - src/ripple/beast/xor_shift_engine.h - DESTINATION include/ripple/beast) -install ( - FILES - src/ripple/beast/utility/Journal.h - src/ripple/beast/utility/PropertyStream.h - src/ripple/beast/utility/Zero.h - src/ripple/beast/utility/rngfill.h +install(FILES src/ripple/beast/core/LexicalCast.h src/ripple/beast/core/List.h + src/ripple/beast/core/SemanticVersion.h + DESTINATION include/ripple/beast/core) +install(FILES src/ripple/beast/hash/hash_append.h src/ripple/beast/hash/uhash.h + src/ripple/beast/hash/xxhasher.h + DESTINATION include/ripple/beast/hash) +install(FILES src/ripple/beast/hash/impl/xxhash.h + DESTINATION include/ripple/beast/hash/impl) +install(FILES src/ripple/beast/rfc2616.h src/ripple/beast/type_name.h + src/ripple/beast/unit_test.h src/ripple/beast/xor_shift_engine.h + DESTINATION include/ripple/beast) +install( + FILES src/ripple/beast/utility/Journal.h + src/ripple/beast/utility/PropertyStream.h + src/ripple/beast/utility/Zero.h src/ripple/beast/utility/rngfill.h DESTINATION include/ripple/beast/utility) -# WARNING!! -- horrible levelization ahead -# (these files should be isolated or moved...but -# unfortunately unit_test.h above creates this dependency) -if (tests) - install ( - FILES - src/ripple/beast/unit_test/amount.hpp - src/ripple/beast/unit_test/dstream.hpp - src/ripple/beast/unit_test/global_suites.hpp - src/ripple/beast/unit_test/match.hpp - src/ripple/beast/unit_test/recorder.hpp - src/ripple/beast/unit_test/reporter.hpp - src/ripple/beast/unit_test/results.hpp - src/ripple/beast/unit_test/runner.hpp - src/ripple/beast/unit_test/suite.hpp - src/ripple/beast/unit_test/suite_info.hpp - src/ripple/beast/unit_test/suite_list.hpp - src/ripple/beast/unit_test/thread.hpp +# WARNING!! -- horrible levelization ahead (these files should be isolated or +# moved...but unfortunately unit_test.h above creates this dependency) +if(tests) + install( + FILES src/ripple/beast/unit_test/amount.hpp + src/ripple/beast/unit_test/dstream.hpp + src/ripple/beast/unit_test/global_suites.hpp + src/ripple/beast/unit_test/match.hpp + src/ripple/beast/unit_test/recorder.hpp + src/ripple/beast/unit_test/reporter.hpp + src/ripple/beast/unit_test/results.hpp + src/ripple/beast/unit_test/runner.hpp + src/ripple/beast/unit_test/suite.hpp + src/ripple/beast/unit_test/suite_info.hpp + src/ripple/beast/unit_test/suite_list.hpp + src/ripple/beast/unit_test/thread.hpp DESTINATION include/ripple/beast/extras/unit_test) - install ( - FILES - src/ripple/beast/unit_test/detail/const_container.hpp - DESTINATION include/ripple/beast/unit_test/detail) -endif () #tests + install(FILES src/ripple/beast/unit_test/detail/const_container.hpp + DESTINATION include/ripple/beast/unit_test/detail) +endif() # tests #[===================================================================[ rippled executable #]===================================================================] @@ -351,773 +318,773 @@ endif () #tests versions of cmake happy. cmake 3.10+ allows add_executable with no sources #]=========================================================] -add_executable (rippled src/ripple/app/main/Application.h) -if (unity) +add_executable(rippled src/ripple/app/main/Application.h) +if(unity) set_target_properties(rippled PROPERTIES UNITY_BUILD ON) -endif () -if (tests) - target_compile_definitions(rippled PUBLIC ENABLE_TESTS) endif() -target_sources (rippled PRIVATE - #[===============================[ +if(tests) + target_compile_definitions(rippled PUBLIC ENABLE_TESTS) +endif() +target_sources( + rippled + PRIVATE #[===============================[ main sources: subdir: app #]===============================] - src/ripple/app/consensus/RCLConsensus.cpp - src/ripple/app/consensus/RCLCxPeerPos.cpp - src/ripple/app/consensus/RCLValidations.cpp - src/ripple/app/ledger/AcceptedLedger.cpp - src/ripple/app/ledger/AcceptedLedgerTx.cpp - src/ripple/app/ledger/AccountStateSF.cpp - src/ripple/app/ledger/BookListeners.cpp - src/ripple/app/ledger/ConsensusTransSetSF.cpp - src/ripple/app/ledger/Ledger.cpp - src/ripple/app/ledger/LedgerHistory.cpp - src/ripple/app/ledger/OrderBookDB.cpp - src/ripple/app/ledger/TransactionStateSF.cpp - src/ripple/app/ledger/impl/BuildLedger.cpp - src/ripple/app/ledger/impl/InboundLedger.cpp - src/ripple/app/ledger/impl/InboundLedgers.cpp - src/ripple/app/ledger/impl/InboundTransactions.cpp - src/ripple/app/ledger/impl/LedgerCleaner.cpp - src/ripple/app/ledger/impl/LedgerDeltaAcquire.cpp - src/ripple/app/ledger/impl/LedgerMaster.cpp - src/ripple/app/ledger/impl/LedgerReplay.cpp - src/ripple/app/ledger/impl/LedgerReplayer.cpp - src/ripple/app/ledger/impl/LedgerReplayMsgHandler.cpp - src/ripple/app/ledger/impl/LedgerReplayTask.cpp - src/ripple/app/ledger/impl/LedgerToJson.cpp - src/ripple/app/ledger/impl/LocalTxs.cpp - src/ripple/app/ledger/impl/OpenLedger.cpp - src/ripple/app/ledger/impl/SkipListAcquire.cpp - src/ripple/app/ledger/impl/TimeoutCounter.cpp - src/ripple/app/ledger/impl/TransactionAcquire.cpp - src/ripple/app/ledger/impl/TransactionMaster.cpp - src/ripple/app/main/Application.cpp - src/ripple/app/main/BasicApp.cpp - src/ripple/app/main/CollectorManager.cpp - src/ripple/app/main/GRPCServer.cpp - src/ripple/app/main/LoadManager.cpp - src/ripple/app/main/Main.cpp - src/ripple/app/main/NodeIdentity.cpp - src/ripple/app/main/NodeStoreScheduler.cpp - src/ripple/app/reporting/ReportingETL.cpp - src/ripple/app/reporting/ETLSource.cpp - src/ripple/app/reporting/P2pProxy.cpp - src/ripple/app/misc/CanonicalTXSet.cpp - src/ripple/app/misc/FeeVoteImpl.cpp - src/ripple/app/misc/HashRouter.cpp - src/ripple/app/misc/NegativeUNLVote.cpp - src/ripple/app/misc/NetworkOPs.cpp - src/ripple/app/misc/SHAMapStoreImp.cpp - src/ripple/app/misc/StateAccounting.cpp - src/ripple/app/misc/detail/impl/WorkSSL.cpp - src/ripple/app/misc/impl/AccountTxPaging.cpp - src/ripple/app/misc/impl/AmendmentTable.cpp - src/ripple/app/misc/impl/LoadFeeTrack.cpp - src/ripple/app/misc/impl/Manifest.cpp - src/ripple/app/misc/impl/Transaction.cpp - src/ripple/app/misc/impl/TxQ.cpp - src/ripple/app/misc/impl/ValidatorKeys.cpp - src/ripple/app/misc/impl/ValidatorList.cpp - src/ripple/app/misc/impl/ValidatorSite.cpp - src/ripple/app/paths/AccountCurrencies.cpp - src/ripple/app/paths/Credit.cpp - src/ripple/app/paths/Flow.cpp - src/ripple/app/paths/PathRequest.cpp - src/ripple/app/paths/PathRequests.cpp - src/ripple/app/paths/Pathfinder.cpp - src/ripple/app/paths/RippleCalc.cpp - src/ripple/app/paths/RippleLineCache.cpp - src/ripple/app/paths/TrustLine.cpp - src/ripple/app/paths/impl/BookStep.cpp - src/ripple/app/paths/impl/DirectStep.cpp - src/ripple/app/paths/impl/PaySteps.cpp - src/ripple/app/paths/impl/XRPEndpointStep.cpp - src/ripple/app/rdb/backend/detail/impl/Node.cpp - src/ripple/app/rdb/backend/detail/impl/Shard.cpp - src/ripple/app/rdb/backend/impl/PostgresDatabase.cpp - src/ripple/app/rdb/backend/impl/SQLiteDatabase.cpp - src/ripple/app/rdb/impl/Download.cpp - src/ripple/app/rdb/impl/PeerFinder.cpp - src/ripple/app/rdb/impl/RelationalDatabase.cpp - src/ripple/app/rdb/impl/ShardArchive.cpp - src/ripple/app/rdb/impl/State.cpp - src/ripple/app/rdb/impl/UnitaryShard.cpp - src/ripple/app/rdb/impl/Vacuum.cpp - src/ripple/app/rdb/impl/Wallet.cpp - src/ripple/app/tx/impl/ApplyContext.cpp - src/ripple/app/tx/impl/BookTip.cpp - src/ripple/app/tx/impl/CancelCheck.cpp - src/ripple/app/tx/impl/CancelOffer.cpp - src/ripple/app/tx/impl/CashCheck.cpp - src/ripple/app/tx/impl/Change.cpp - src/ripple/app/tx/impl/ClaimReward.cpp - src/ripple/app/tx/impl/Clawback.cpp - src/ripple/app/tx/impl/CreateCheck.cpp - src/ripple/app/tx/impl/CreateOffer.cpp - src/ripple/app/tx/impl/CreateTicket.cpp - src/ripple/app/tx/impl/Cron.cpp - src/ripple/app/tx/impl/CronSet.cpp - src/ripple/app/tx/impl/DeleteAccount.cpp - src/ripple/app/tx/impl/DepositPreauth.cpp - src/ripple/app/tx/impl/Escrow.cpp - src/ripple/app/tx/impl/GenesisMint.cpp - src/ripple/app/tx/impl/Import.cpp - src/ripple/app/tx/impl/InvariantCheck.cpp - src/ripple/app/tx/impl/Invoke.cpp - src/ripple/app/tx/impl/NFTokenAcceptOffer.cpp - src/ripple/app/tx/impl/NFTokenBurn.cpp - src/ripple/app/tx/impl/NFTokenCancelOffer.cpp - src/ripple/app/tx/impl/NFTokenCreateOffer.cpp - src/ripple/app/tx/impl/NFTokenMint.cpp - src/ripple/app/tx/impl/OfferStream.cpp - src/ripple/app/tx/impl/PayChan.cpp - src/ripple/app/tx/impl/Payment.cpp - src/ripple/app/tx/impl/Remit.cpp - src/ripple/app/tx/impl/SetAccount.cpp - src/ripple/app/tx/impl/SetHook.cpp - src/ripple/app/tx/impl/SetRemarks.cpp - src/ripple/app/tx/impl/SetRegularKey.cpp - src/ripple/app/tx/impl/SetSignerList.cpp - src/ripple/app/tx/impl/SetTrust.cpp - src/ripple/app/tx/impl/SignerEntries.cpp - src/ripple/app/tx/impl/Taker.cpp - src/ripple/app/tx/impl/Transactor.cpp - src/ripple/app/tx/impl/URIToken.cpp - src/ripple/app/tx/impl/apply.cpp - src/ripple/app/tx/impl/applySteps.cpp - src/ripple/app/hook/impl/applyHook.cpp - src/ripple/app/tx/impl/details/NFTokenUtils.cpp - #[===============================[ + src/ripple/app/consensus/RCLConsensus.cpp + src/ripple/app/consensus/RCLCxPeerPos.cpp + src/ripple/app/consensus/RCLValidations.cpp + src/ripple/app/ledger/AcceptedLedger.cpp + src/ripple/app/ledger/AcceptedLedgerTx.cpp + src/ripple/app/ledger/AccountStateSF.cpp + src/ripple/app/ledger/BookListeners.cpp + src/ripple/app/ledger/ConsensusTransSetSF.cpp + src/ripple/app/ledger/Ledger.cpp + src/ripple/app/ledger/LedgerHistory.cpp + src/ripple/app/ledger/OrderBookDB.cpp + src/ripple/app/ledger/TransactionStateSF.cpp + src/ripple/app/ledger/impl/BuildLedger.cpp + src/ripple/app/ledger/impl/InboundLedger.cpp + src/ripple/app/ledger/impl/InboundLedgers.cpp + src/ripple/app/ledger/impl/InboundTransactions.cpp + src/ripple/app/ledger/impl/LedgerCleaner.cpp + src/ripple/app/ledger/impl/LedgerDeltaAcquire.cpp + src/ripple/app/ledger/impl/LedgerMaster.cpp + src/ripple/app/ledger/impl/LedgerReplay.cpp + src/ripple/app/ledger/impl/LedgerReplayer.cpp + src/ripple/app/ledger/impl/LedgerReplayMsgHandler.cpp + src/ripple/app/ledger/impl/LedgerReplayTask.cpp + src/ripple/app/ledger/impl/LedgerToJson.cpp + src/ripple/app/ledger/impl/LocalTxs.cpp + src/ripple/app/ledger/impl/OpenLedger.cpp + src/ripple/app/ledger/impl/SkipListAcquire.cpp + src/ripple/app/ledger/impl/TimeoutCounter.cpp + src/ripple/app/ledger/impl/TransactionAcquire.cpp + src/ripple/app/ledger/impl/TransactionMaster.cpp + src/ripple/app/main/Application.cpp + src/ripple/app/main/BasicApp.cpp + src/ripple/app/main/CollectorManager.cpp + src/ripple/app/main/GRPCServer.cpp + src/ripple/app/main/LoadManager.cpp + src/ripple/app/main/Main.cpp + src/ripple/app/main/NodeIdentity.cpp + src/ripple/app/main/NodeStoreScheduler.cpp + src/ripple/app/reporting/ReportingETL.cpp + src/ripple/app/reporting/ETLSource.cpp + src/ripple/app/reporting/P2pProxy.cpp + src/ripple/app/misc/CanonicalTXSet.cpp + src/ripple/app/misc/FeeVoteImpl.cpp + src/ripple/app/misc/HashRouter.cpp + src/ripple/app/misc/NegativeUNLVote.cpp + src/ripple/app/misc/NetworkOPs.cpp + src/ripple/app/misc/SHAMapStoreImp.cpp + src/ripple/app/misc/StateAccounting.cpp + src/ripple/app/misc/detail/impl/WorkSSL.cpp + src/ripple/app/misc/impl/AccountTxPaging.cpp + src/ripple/app/misc/impl/AmendmentTable.cpp + src/ripple/app/misc/impl/LoadFeeTrack.cpp + src/ripple/app/misc/impl/Manifest.cpp + src/ripple/app/misc/impl/Transaction.cpp + src/ripple/app/misc/impl/TxQ.cpp + src/ripple/app/misc/impl/ValidatorKeys.cpp + src/ripple/app/misc/impl/ValidatorList.cpp + src/ripple/app/misc/impl/ValidatorSite.cpp + src/ripple/app/paths/AccountCurrencies.cpp + src/ripple/app/paths/Credit.cpp + src/ripple/app/paths/Flow.cpp + src/ripple/app/paths/PathRequest.cpp + src/ripple/app/paths/PathRequests.cpp + src/ripple/app/paths/Pathfinder.cpp + src/ripple/app/paths/RippleCalc.cpp + src/ripple/app/paths/RippleLineCache.cpp + src/ripple/app/paths/TrustLine.cpp + src/ripple/app/paths/impl/BookStep.cpp + src/ripple/app/paths/impl/DirectStep.cpp + src/ripple/app/paths/impl/PaySteps.cpp + src/ripple/app/paths/impl/XRPEndpointStep.cpp + src/ripple/app/rdb/backend/detail/impl/Node.cpp + src/ripple/app/rdb/backend/detail/impl/Shard.cpp + src/ripple/app/rdb/backend/impl/PostgresDatabase.cpp + src/ripple/app/rdb/backend/impl/SQLiteDatabase.cpp + src/ripple/app/rdb/impl/Download.cpp + src/ripple/app/rdb/impl/PeerFinder.cpp + src/ripple/app/rdb/impl/RelationalDatabase.cpp + src/ripple/app/rdb/impl/ShardArchive.cpp + src/ripple/app/rdb/impl/State.cpp + src/ripple/app/rdb/impl/UnitaryShard.cpp + src/ripple/app/rdb/impl/Vacuum.cpp + src/ripple/app/rdb/impl/Wallet.cpp + src/ripple/app/tx/impl/ApplyContext.cpp + src/ripple/app/tx/impl/BookTip.cpp + src/ripple/app/tx/impl/CancelCheck.cpp + src/ripple/app/tx/impl/CancelOffer.cpp + src/ripple/app/tx/impl/CashCheck.cpp + src/ripple/app/tx/impl/Change.cpp + src/ripple/app/tx/impl/ClaimReward.cpp + src/ripple/app/tx/impl/Clawback.cpp + src/ripple/app/tx/impl/CreateCheck.cpp + src/ripple/app/tx/impl/CreateOffer.cpp + src/ripple/app/tx/impl/CreateTicket.cpp + src/ripple/app/tx/impl/Cron.cpp + src/ripple/app/tx/impl/CronSet.cpp + src/ripple/app/tx/impl/DeleteAccount.cpp + src/ripple/app/tx/impl/DepositPreauth.cpp + src/ripple/app/tx/impl/Escrow.cpp + src/ripple/app/tx/impl/GenesisMint.cpp + src/ripple/app/tx/impl/Import.cpp + src/ripple/app/tx/impl/InvariantCheck.cpp + src/ripple/app/tx/impl/Invoke.cpp + src/ripple/app/tx/impl/NFTokenAcceptOffer.cpp + src/ripple/app/tx/impl/NFTokenBurn.cpp + src/ripple/app/tx/impl/NFTokenCancelOffer.cpp + src/ripple/app/tx/impl/NFTokenCreateOffer.cpp + src/ripple/app/tx/impl/NFTokenMint.cpp + src/ripple/app/tx/impl/OfferStream.cpp + src/ripple/app/tx/impl/PayChan.cpp + src/ripple/app/tx/impl/Payment.cpp + src/ripple/app/tx/impl/Remit.cpp + src/ripple/app/tx/impl/SetAccount.cpp + src/ripple/app/tx/impl/SetHook.cpp + src/ripple/app/tx/impl/SetRemarks.cpp + src/ripple/app/tx/impl/SetRegularKey.cpp + src/ripple/app/tx/impl/SetSignerList.cpp + src/ripple/app/tx/impl/SetTrust.cpp + src/ripple/app/tx/impl/SignerEntries.cpp + src/ripple/app/tx/impl/Taker.cpp + src/ripple/app/tx/impl/Transactor.cpp + src/ripple/app/tx/impl/URIToken.cpp + src/ripple/app/tx/impl/apply.cpp + src/ripple/app/tx/impl/applySteps.cpp + src/ripple/app/hook/impl/applyHook.cpp + src/ripple/app/tx/impl/details/NFTokenUtils.cpp + #[===============================[ main sources: subdir: basics (partial) #]===============================] - src/ripple/basics/impl/Archive.cpp - src/ripple/basics/impl/BasicConfig.cpp - src/ripple/basics/impl/ResolverAsio.cpp - src/ripple/basics/impl/UptimeClock.cpp - src/ripple/basics/impl/make_SSLContext.cpp - src/ripple/basics/impl/mulDiv.cpp - src/ripple/basics/impl/partitioned_unordered_map.cpp - #[===============================[ + src/ripple/basics/impl/Archive.cpp + src/ripple/basics/impl/BasicConfig.cpp + src/ripple/basics/impl/ResolverAsio.cpp + src/ripple/basics/impl/UptimeClock.cpp + src/ripple/basics/impl/make_SSLContext.cpp + src/ripple/basics/impl/mulDiv.cpp + src/ripple/basics/impl/partitioned_unordered_map.cpp + #[===============================[ main sources: subdir: conditions #]===============================] - src/ripple/conditions/impl/Condition.cpp - src/ripple/conditions/impl/Fulfillment.cpp - src/ripple/conditions/impl/error.cpp - #[===============================[ + src/ripple/conditions/impl/Condition.cpp + src/ripple/conditions/impl/Fulfillment.cpp + src/ripple/conditions/impl/error.cpp + #[===============================[ main sources: subdir: core #]===============================] - src/ripple/core/impl/Config.cpp - src/ripple/core/impl/DatabaseCon.cpp - src/ripple/core/impl/Job.cpp - src/ripple/core/impl/JobQueue.cpp - src/ripple/core/impl/LoadEvent.cpp - src/ripple/core/impl/LoadMonitor.cpp - src/ripple/core/impl/SNTPClock.cpp - src/ripple/core/impl/SociDB.cpp - src/ripple/core/impl/TimeKeeper.cpp - src/ripple/core/impl/Workers.cpp - src/ripple/core/Pg.cpp - #[===============================[ + src/ripple/core/impl/Config.cpp + src/ripple/core/impl/DatabaseCon.cpp + src/ripple/core/impl/Job.cpp + src/ripple/core/impl/JobQueue.cpp + src/ripple/core/impl/LoadEvent.cpp + src/ripple/core/impl/LoadMonitor.cpp + src/ripple/core/impl/SNTPClock.cpp + src/ripple/core/impl/SociDB.cpp + src/ripple/core/impl/TimeKeeper.cpp + src/ripple/core/impl/Workers.cpp + src/ripple/core/Pg.cpp + #[===============================[ main sources: subdir: consensus #]===============================] - src/ripple/consensus/Consensus.cpp - #[===============================[ + src/ripple/consensus/Consensus.cpp + #[===============================[ main sources: subdir: ledger #]===============================] - src/ripple/ledger/impl/ApplyStateTable.cpp - src/ripple/ledger/impl/ApplyView.cpp - src/ripple/ledger/impl/ApplyViewBase.cpp - src/ripple/ledger/impl/ApplyViewImpl.cpp - src/ripple/ledger/impl/BookDirs.cpp - src/ripple/ledger/impl/CachedView.cpp - src/ripple/ledger/impl/Directory.cpp - src/ripple/ledger/impl/OpenView.cpp - src/ripple/ledger/impl/PaymentSandbox.cpp - src/ripple/ledger/impl/RawStateTable.cpp - src/ripple/ledger/impl/ReadView.cpp - src/ripple/ledger/impl/View.cpp - #[===============================[ + src/ripple/ledger/impl/ApplyStateTable.cpp + src/ripple/ledger/impl/ApplyView.cpp + src/ripple/ledger/impl/ApplyViewBase.cpp + src/ripple/ledger/impl/ApplyViewImpl.cpp + src/ripple/ledger/impl/BookDirs.cpp + src/ripple/ledger/impl/CachedView.cpp + src/ripple/ledger/impl/Directory.cpp + src/ripple/ledger/impl/OpenView.cpp + src/ripple/ledger/impl/PaymentSandbox.cpp + src/ripple/ledger/impl/RawStateTable.cpp + src/ripple/ledger/impl/ReadView.cpp + src/ripple/ledger/impl/View.cpp + #[===============================[ main sources: subdir: net #]===============================] - src/ripple/net/impl/DatabaseDownloader.cpp - src/ripple/net/impl/HTTPClient.cpp - src/ripple/net/impl/HTTPDownloader.cpp - src/ripple/net/impl/HTTPStream.cpp - src/ripple/net/impl/InfoSub.cpp - src/ripple/net/impl/RPCCall.cpp - src/ripple/net/impl/RPCErr.cpp - src/ripple/net/impl/RPCSub.cpp - src/ripple/net/impl/RegisterSSLCerts.cpp - #[===============================[ + src/ripple/net/impl/DatabaseDownloader.cpp + src/ripple/net/impl/HTTPClient.cpp + src/ripple/net/impl/HTTPDownloader.cpp + src/ripple/net/impl/HTTPStream.cpp + src/ripple/net/impl/InfoSub.cpp + src/ripple/net/impl/RPCCall.cpp + src/ripple/net/impl/RPCErr.cpp + src/ripple/net/impl/RPCSub.cpp + src/ripple/net/impl/RegisterSSLCerts.cpp + #[===============================[ main sources: subdir: nodestore #]===============================] - src/ripple/nodestore/backend/CassandraFactory.cpp - src/ripple/nodestore/backend/RWDBFactory.cpp - src/ripple/nodestore/backend/MemoryFactory.cpp - src/ripple/nodestore/backend/NuDBFactory.cpp - src/ripple/nodestore/backend/NullFactory.cpp - src/ripple/nodestore/backend/RocksDBFactory.cpp - src/ripple/nodestore/impl/BatchWriter.cpp - src/ripple/nodestore/impl/Database.cpp - src/ripple/nodestore/impl/DatabaseNodeImp.cpp - src/ripple/nodestore/impl/DatabaseRotatingImp.cpp - src/ripple/nodestore/impl/DatabaseShardImp.cpp - src/ripple/nodestore/impl/DeterministicShard.cpp - src/ripple/nodestore/impl/DecodedBlob.cpp - src/ripple/nodestore/impl/DummyScheduler.cpp - src/ripple/nodestore/impl/ManagerImp.cpp - src/ripple/nodestore/impl/NodeObject.cpp - src/ripple/nodestore/impl/Shard.cpp - src/ripple/nodestore/impl/ShardInfo.cpp - src/ripple/nodestore/impl/TaskQueue.cpp - #[===============================[ + src/ripple/nodestore/backend/CassandraFactory.cpp + src/ripple/nodestore/backend/RWDBFactory.cpp + src/ripple/nodestore/backend/MemoryFactory.cpp + src/ripple/nodestore/backend/NuDBFactory.cpp + src/ripple/nodestore/backend/NullFactory.cpp + src/ripple/nodestore/backend/RocksDBFactory.cpp + src/ripple/nodestore/impl/BatchWriter.cpp + src/ripple/nodestore/impl/Database.cpp + src/ripple/nodestore/impl/DatabaseNodeImp.cpp + src/ripple/nodestore/impl/DatabaseRotatingImp.cpp + src/ripple/nodestore/impl/DatabaseShardImp.cpp + src/ripple/nodestore/impl/DeterministicShard.cpp + src/ripple/nodestore/impl/DecodedBlob.cpp + src/ripple/nodestore/impl/DummyScheduler.cpp + src/ripple/nodestore/impl/ManagerImp.cpp + src/ripple/nodestore/impl/NodeObject.cpp + src/ripple/nodestore/impl/Shard.cpp + src/ripple/nodestore/impl/ShardInfo.cpp + src/ripple/nodestore/impl/TaskQueue.cpp + #[===============================[ main sources: subdir: overlay #]===============================] - src/ripple/overlay/impl/Cluster.cpp - src/ripple/overlay/impl/ConnectAttempt.cpp - src/ripple/overlay/impl/Handshake.cpp - src/ripple/overlay/impl/Message.cpp - src/ripple/overlay/impl/OverlayImpl.cpp - src/ripple/overlay/impl/PeerImp.cpp - src/ripple/overlay/impl/PeerReservationTable.cpp - src/ripple/overlay/impl/PeerSet.cpp - src/ripple/overlay/impl/ProtocolVersion.cpp - src/ripple/overlay/impl/TrafficCount.cpp - src/ripple/overlay/impl/TxMetrics.cpp - #[===============================[ + src/ripple/overlay/impl/Cluster.cpp + src/ripple/overlay/impl/ConnectAttempt.cpp + src/ripple/overlay/impl/Handshake.cpp + src/ripple/overlay/impl/Message.cpp + src/ripple/overlay/impl/OverlayImpl.cpp + src/ripple/overlay/impl/PeerImp.cpp + src/ripple/overlay/impl/PeerReservationTable.cpp + src/ripple/overlay/impl/PeerSet.cpp + src/ripple/overlay/impl/ProtocolVersion.cpp + src/ripple/overlay/impl/TrafficCount.cpp + src/ripple/overlay/impl/TxMetrics.cpp + #[===============================[ main sources: subdir: peerfinder #]===============================] - src/ripple/peerfinder/impl/Bootcache.cpp - src/ripple/peerfinder/impl/Endpoint.cpp - src/ripple/peerfinder/impl/PeerfinderConfig.cpp - src/ripple/peerfinder/impl/PeerfinderManager.cpp - src/ripple/peerfinder/impl/SlotImp.cpp - src/ripple/peerfinder/impl/SourceStrings.cpp - #[===============================[ + src/ripple/peerfinder/impl/Bootcache.cpp + src/ripple/peerfinder/impl/Endpoint.cpp + src/ripple/peerfinder/impl/PeerfinderConfig.cpp + src/ripple/peerfinder/impl/PeerfinderManager.cpp + src/ripple/peerfinder/impl/SlotImp.cpp + src/ripple/peerfinder/impl/SourceStrings.cpp + #[===============================[ main sources: subdir: resource #]===============================] - src/ripple/resource/impl/Charge.cpp - src/ripple/resource/impl/Consumer.cpp - src/ripple/resource/impl/Fees.cpp - src/ripple/resource/impl/ResourceManager.cpp - #[===============================[ + src/ripple/resource/impl/Charge.cpp + src/ripple/resource/impl/Consumer.cpp + src/ripple/resource/impl/Fees.cpp + src/ripple/resource/impl/ResourceManager.cpp + #[===============================[ main sources: subdir: rpc #]===============================] - src/ripple/rpc/handlers/AccountChannels.cpp - src/ripple/rpc/handlers/AccountCurrenciesHandler.cpp - src/ripple/rpc/handlers/AccountInfo.cpp - src/ripple/rpc/handlers/AccountLines.cpp - src/ripple/rpc/handlers/AccountObjects.cpp - src/ripple/rpc/handlers/AccountOffers.cpp - src/ripple/rpc/handlers/AccountNamespace.cpp - src/ripple/rpc/handlers/AccountTx.cpp - src/ripple/rpc/handlers/BlackList.cpp - src/ripple/rpc/handlers/BookOffers.cpp - src/ripple/rpc/handlers/CanDelete.cpp - src/ripple/rpc/handlers/Catalogue.cpp - src/ripple/rpc/handlers/Connect.cpp - src/ripple/rpc/handlers/ConsensusInfo.cpp - src/ripple/rpc/handlers/CrawlShards.cpp - src/ripple/rpc/handlers/DepositAuthorized.cpp - src/ripple/rpc/handlers/DownloadShard.cpp - src/ripple/rpc/handlers/Feature1.cpp - src/ripple/rpc/handlers/Fee1.cpp - src/ripple/rpc/handlers/FetchInfo.cpp - src/ripple/rpc/handlers/GatewayBalances.cpp - src/ripple/rpc/handlers/GetCounts.cpp - src/ripple/rpc/handlers/LedgerAccept.cpp - src/ripple/rpc/handlers/LedgerCleanerHandler.cpp - src/ripple/rpc/handlers/LedgerClosed.cpp - src/ripple/rpc/handlers/LedgerCurrent.cpp - src/ripple/rpc/handlers/LedgerData.cpp - src/ripple/rpc/handlers/LedgerDiff.cpp - src/ripple/rpc/handlers/LedgerEntry.cpp - src/ripple/rpc/handlers/LedgerHandler.cpp - src/ripple/rpc/handlers/LedgerHeader.cpp - src/ripple/rpc/handlers/LedgerRequest.cpp - src/ripple/rpc/handlers/LogLevel.cpp - src/ripple/rpc/handlers/LogRotate.cpp - src/ripple/rpc/handlers/Manifest.cpp - src/ripple/rpc/handlers/NFTOffers.cpp - src/ripple/rpc/handlers/NodeToShard.cpp - src/ripple/rpc/handlers/NoRippleCheck.cpp - src/ripple/rpc/handlers/OwnerInfo.cpp - src/ripple/rpc/handlers/PathFind.cpp - src/ripple/rpc/handlers/PayChanClaim.cpp - src/ripple/rpc/handlers/Peers.cpp - src/ripple/rpc/handlers/Ping.cpp - src/ripple/rpc/handlers/Print.cpp - src/ripple/rpc/handlers/Random.cpp - src/ripple/rpc/handlers/Reservations.cpp - src/ripple/rpc/handlers/RipplePathFind.cpp - src/ripple/rpc/handlers/ServerDefinitions.cpp - src/ripple/rpc/handlers/ServerInfo.cpp - src/ripple/rpc/handlers/ServerState.cpp - src/ripple/rpc/handlers/SignFor.cpp - src/ripple/rpc/handlers/SignHandler.cpp - src/ripple/rpc/handlers/Stop.cpp - src/ripple/rpc/handlers/Submit.cpp - src/ripple/rpc/handlers/SubmitMultiSigned.cpp - src/ripple/rpc/handlers/Subscribe.cpp - src/ripple/rpc/handlers/TransactionEntry.cpp - src/ripple/rpc/handlers/Tx.cpp - src/ripple/rpc/handlers/TxHistory.cpp - src/ripple/rpc/handlers/TxReduceRelay.cpp - src/ripple/rpc/handlers/UnlList.cpp - src/ripple/rpc/handlers/Unsubscribe.cpp - src/ripple/rpc/handlers/ValidationCreate.cpp - src/ripple/rpc/handlers/ValidatorInfo.cpp - src/ripple/rpc/handlers/ValidatorListSites.cpp - src/ripple/rpc/handlers/Validators.cpp - src/ripple/rpc/handlers/WalletPropose.cpp - src/ripple/rpc/handlers/Catalogue.cpp - src/ripple/rpc/impl/DeliveredAmount.cpp - src/ripple/rpc/impl/Handler.cpp - src/ripple/rpc/impl/LegacyPathFind.cpp - src/ripple/rpc/impl/RPCHandler.cpp - src/ripple/rpc/impl/RPCHelpers.cpp - src/ripple/rpc/impl/Role.cpp - src/ripple/rpc/impl/ServerHandlerImp.cpp - src/ripple/rpc/impl/ShardArchiveHandler.cpp - src/ripple/rpc/impl/ShardVerificationScheduler.cpp - src/ripple/rpc/impl/Status.cpp - src/ripple/rpc/impl/TransactionSign.cpp - src/ripple/rpc/impl/NFTokenID.cpp - src/ripple/rpc/impl/NFTokenOfferID.cpp - src/ripple/rpc/impl/NFTSyntheticSerializer.cpp - #[===============================[ + src/ripple/rpc/handlers/AccountChannels.cpp + src/ripple/rpc/handlers/AccountCurrenciesHandler.cpp + src/ripple/rpc/handlers/AccountInfo.cpp + src/ripple/rpc/handlers/AccountLines.cpp + src/ripple/rpc/handlers/AccountObjects.cpp + src/ripple/rpc/handlers/AccountOffers.cpp + src/ripple/rpc/handlers/AccountNamespace.cpp + src/ripple/rpc/handlers/AccountTx.cpp + src/ripple/rpc/handlers/BlackList.cpp + src/ripple/rpc/handlers/BookOffers.cpp + src/ripple/rpc/handlers/CanDelete.cpp + src/ripple/rpc/handlers/Catalogue.cpp + src/ripple/rpc/handlers/Connect.cpp + src/ripple/rpc/handlers/ConsensusInfo.cpp + src/ripple/rpc/handlers/CrawlShards.cpp + src/ripple/rpc/handlers/DepositAuthorized.cpp + src/ripple/rpc/handlers/DownloadShard.cpp + src/ripple/rpc/handlers/Feature1.cpp + src/ripple/rpc/handlers/Fee1.cpp + src/ripple/rpc/handlers/FetchInfo.cpp + src/ripple/rpc/handlers/GatewayBalances.cpp + src/ripple/rpc/handlers/GetCounts.cpp + src/ripple/rpc/handlers/LedgerAccept.cpp + src/ripple/rpc/handlers/LedgerCleanerHandler.cpp + src/ripple/rpc/handlers/LedgerClosed.cpp + src/ripple/rpc/handlers/LedgerCurrent.cpp + src/ripple/rpc/handlers/LedgerData.cpp + src/ripple/rpc/handlers/LedgerDiff.cpp + src/ripple/rpc/handlers/LedgerEntry.cpp + src/ripple/rpc/handlers/LedgerHandler.cpp + src/ripple/rpc/handlers/LedgerHeader.cpp + src/ripple/rpc/handlers/LedgerRequest.cpp + src/ripple/rpc/handlers/LogLevel.cpp + src/ripple/rpc/handlers/LogRotate.cpp + src/ripple/rpc/handlers/Manifest.cpp + src/ripple/rpc/handlers/NFTOffers.cpp + src/ripple/rpc/handlers/NodeToShard.cpp + src/ripple/rpc/handlers/NoRippleCheck.cpp + src/ripple/rpc/handlers/OwnerInfo.cpp + src/ripple/rpc/handlers/PathFind.cpp + src/ripple/rpc/handlers/PayChanClaim.cpp + src/ripple/rpc/handlers/Peers.cpp + src/ripple/rpc/handlers/Ping.cpp + src/ripple/rpc/handlers/Print.cpp + src/ripple/rpc/handlers/Random.cpp + src/ripple/rpc/handlers/Reservations.cpp + src/ripple/rpc/handlers/RipplePathFind.cpp + src/ripple/rpc/handlers/ServerDefinitions.cpp + src/ripple/rpc/handlers/ServerInfo.cpp + src/ripple/rpc/handlers/ServerState.cpp + src/ripple/rpc/handlers/SignFor.cpp + src/ripple/rpc/handlers/SignHandler.cpp + src/ripple/rpc/handlers/Stop.cpp + src/ripple/rpc/handlers/Submit.cpp + src/ripple/rpc/handlers/SubmitMultiSigned.cpp + src/ripple/rpc/handlers/SubmitAndWait.cpp + src/ripple/rpc/handlers/Subscribe.cpp + src/ripple/rpc/handlers/TransactionEntry.cpp + src/ripple/rpc/handlers/Tx.cpp + src/ripple/rpc/handlers/TxHistory.cpp + src/ripple/rpc/handlers/TxReduceRelay.cpp + src/ripple/rpc/handlers/UnlList.cpp + src/ripple/rpc/handlers/Unsubscribe.cpp + src/ripple/rpc/handlers/ValidationCreate.cpp + src/ripple/rpc/handlers/ValidatorInfo.cpp + src/ripple/rpc/handlers/ValidatorListSites.cpp + src/ripple/rpc/handlers/Validators.cpp + src/ripple/rpc/handlers/WalletPropose.cpp + src/ripple/rpc/handlers/Catalogue.cpp + src/ripple/rpc/impl/DeliveredAmount.cpp + src/ripple/rpc/impl/Handler.cpp + src/ripple/rpc/impl/LegacyPathFind.cpp + src/ripple/rpc/impl/RPCHandler.cpp + src/ripple/rpc/impl/RPCHelpers.cpp + src/ripple/rpc/impl/Role.cpp + src/ripple/rpc/impl/ServerHandlerImp.cpp + src/ripple/rpc/impl/ShardArchiveHandler.cpp + src/ripple/rpc/impl/ShardVerificationScheduler.cpp + src/ripple/rpc/impl/Status.cpp + src/ripple/rpc/impl/TransactionSign.cpp + src/ripple/rpc/impl/NFTokenID.cpp + src/ripple/rpc/impl/NFTokenOfferID.cpp + src/ripple/rpc/impl/NFTSyntheticSerializer.cpp + #[===============================[ main sources: subdir: perflog #]===============================] - src/ripple/perflog/impl/PerfLogImp.cpp - - #[===============================[ + src/ripple/perflog/impl/PerfLogImp.cpp + #[===============================[ main sources: subdir: server #]===============================] - src/ripple/server/impl/JSONRPCUtil.cpp - src/ripple/server/impl/Port.cpp - #[===============================[ + src/ripple/server/impl/JSONRPCUtil.cpp + src/ripple/server/impl/Port.cpp + #[===============================[ main sources: subdir: shamap #]===============================] - src/ripple/shamap/impl/NodeFamily.cpp - src/ripple/shamap/impl/SHAMap.cpp - src/ripple/shamap/impl/SHAMapDelta.cpp - src/ripple/shamap/impl/SHAMapInnerNode.cpp - src/ripple/shamap/impl/SHAMapLeafNode.cpp - src/ripple/shamap/impl/SHAMapNodeID.cpp - src/ripple/shamap/impl/SHAMapSync.cpp - src/ripple/shamap/impl/SHAMapTreeNode.cpp - src/ripple/shamap/impl/ShardFamily.cpp) + src/ripple/shamap/impl/NodeFamily.cpp + src/ripple/shamap/impl/SHAMap.cpp + src/ripple/shamap/impl/SHAMapDelta.cpp + src/ripple/shamap/impl/SHAMapInnerNode.cpp + src/ripple/shamap/impl/SHAMapLeafNode.cpp + src/ripple/shamap/impl/SHAMapNodeID.cpp + src/ripple/shamap/impl/SHAMapSync.cpp + src/ripple/shamap/impl/SHAMapTreeNode.cpp + src/ripple/shamap/impl/ShardFamily.cpp) - #[===============================[ +#[===============================[ test sources: subdir: app #]===============================] -if (tests) - target_sources (rippled PRIVATE - src/test/app/AccountDelete_test.cpp - src/test/app/AccountTxPaging_test.cpp - src/test/app/AmendmentTable_test.cpp - src/test/app/BaseFee_test.cpp - src/test/app/Check_test.cpp - src/test/app/ClaimReward_test.cpp - src/test/app/Cron_test.cpp - src/test/app/Clawback_test.cpp - src/test/app/CrossingLimits_test.cpp - src/test/app/DeliverMin_test.cpp - src/test/app/DepositAuth_test.cpp - src/test/app/Discrepancy_test.cpp - src/test/app/DNS_test.cpp - src/test/app/Escrow_test.cpp - src/test/app/FeeVote_test.cpp - src/test/app/Flow_test.cpp - src/test/app/Freeze_test.cpp - src/test/app/GenesisMint_test.cpp - src/test/app/HashRouter_test.cpp - src/test/app/Import_test.cpp - src/test/app/Invoke_test.cpp - src/test/app/LedgerHistory_test.cpp - src/test/app/LedgerLoad_test.cpp - src/test/app/LedgerMaster_test.cpp - src/test/app/LedgerReplay_test.cpp - src/test/app/LoadFeeTrack_test.cpp - src/test/app/Manifest_test.cpp - src/test/app/MultiSign_test.cpp - src/test/app/NetworkID_test.cpp - src/test/app/NFToken_test.cpp - src/test/app/NFTokenBurn_test.cpp - src/test/app/NFTokenDir_test.cpp - src/test/app/OfferStream_test.cpp - src/test/app/Offer_test.cpp - src/test/app/OversizeMeta_test.cpp - src/test/app/Path_test.cpp - src/test/app/PayChan_test.cpp - src/test/app/PayStrand_test.cpp - src/test/app/PreviousTxn_test.cpp - src/test/app/PseudoTx_test.cpp - src/test/app/RCLCensorshipDetector_test.cpp - src/test/app/RCLValidations_test.cpp - src/test/app/Regression_test.cpp - src/test/app/Remit_test.cpp - src/test/app/SHAMapStore_test.cpp - src/test/app/SetAuth_test.cpp - src/test/app/SetHook_test.cpp - src/test/app/SetHookTSH_test.cpp - src/test/app/SetRegularKey_test.cpp - src/test/app/SetRemarks_test.cpp - src/test/app/SetTrust_test.cpp - src/test/app/Taker_test.cpp - src/test/app/TheoreticalQuality_test.cpp - src/test/app/Ticket_test.cpp - src/test/app/Touch_test.cpp - src/test/app/Transaction_ordering_test.cpp - src/test/app/TrustAndBalance_test.cpp - src/test/app/TxQ_test.cpp - src/test/app/URIToken_test.cpp - src/test/app/ValidatorKeys_test.cpp - src/test/app/ValidatorList_test.cpp - src/test/app/ValidatorSite_test.cpp - src/test/app/Wildcard_test.cpp - src/test/app/XahauGenesis_test.cpp - src/test/app/tx/apply_test.cpp - #[===============================[ +if(tests) + target_sources( + rippled + PRIVATE src/test/app/AccountDelete_test.cpp + src/test/app/AccountTxPaging_test.cpp + src/test/app/AmendmentTable_test.cpp + src/test/app/BaseFee_test.cpp + src/test/app/Check_test.cpp + src/test/app/ClaimReward_test.cpp + src/test/app/Cron_test.cpp + src/test/app/Clawback_test.cpp + src/test/app/CrossingLimits_test.cpp + src/test/app/DeliverMin_test.cpp + src/test/app/DepositAuth_test.cpp + src/test/app/Discrepancy_test.cpp + src/test/app/DNS_test.cpp + src/test/app/Escrow_test.cpp + src/test/app/FeeVote_test.cpp + src/test/app/Flow_test.cpp + src/test/app/Freeze_test.cpp + src/test/app/GenesisMint_test.cpp + src/test/app/HashRouter_test.cpp + src/test/app/Import_test.cpp + src/test/app/Invoke_test.cpp + src/test/app/LedgerHistory_test.cpp + src/test/app/LedgerLoad_test.cpp + src/test/app/LedgerMaster_test.cpp + src/test/app/LedgerReplay_test.cpp + src/test/app/LoadFeeTrack_test.cpp + src/test/app/Manifest_test.cpp + src/test/app/MultiSign_test.cpp + src/test/app/NetworkID_test.cpp + src/test/app/NFToken_test.cpp + src/test/app/NFTokenBurn_test.cpp + src/test/app/NFTokenDir_test.cpp + src/test/app/OfferStream_test.cpp + src/test/app/Offer_test.cpp + src/test/app/OversizeMeta_test.cpp + src/test/app/Path_test.cpp + src/test/app/PayChan_test.cpp + src/test/app/PayStrand_test.cpp + src/test/app/PreviousTxn_test.cpp + src/test/app/PseudoTx_test.cpp + src/test/app/RCLCensorshipDetector_test.cpp + src/test/app/RCLValidations_test.cpp + src/test/app/Regression_test.cpp + src/test/app/Remit_test.cpp + src/test/app/SHAMapStore_test.cpp + src/test/app/SetAuth_test.cpp + src/test/app/SetHook_test.cpp + src/test/app/SetHookTSH_test.cpp + src/test/app/SetRegularKey_test.cpp + src/test/app/SetRemarks_test.cpp + src/test/app/SetTrust_test.cpp + src/test/app/Taker_test.cpp + src/test/app/TheoreticalQuality_test.cpp + src/test/app/Ticket_test.cpp + src/test/app/Touch_test.cpp + src/test/app/Transaction_ordering_test.cpp + src/test/app/TrustAndBalance_test.cpp + src/test/app/TxQ_test.cpp + src/test/app/URIToken_test.cpp + src/test/app/ValidatorKeys_test.cpp + src/test/app/ValidatorList_test.cpp + src/test/app/ValidatorSite_test.cpp + src/test/app/Wildcard_test.cpp + src/test/app/XahauGenesis_test.cpp + src/test/app/tx/apply_test.cpp + #[===============================[ test sources: subdir: basics #]===============================] - src/test/basics/Buffer_test.cpp - src/test/basics/DetectCrash_test.cpp - src/test/basics/Expected_test.cpp - src/test/basics/FileUtilities_test.cpp - src/test/basics/IOUAmount_test.cpp - src/test/basics/KeyCache_test.cpp - src/test/basics/Number_test.cpp - src/test/basics/PerfLog_test.cpp - src/test/basics/RangeSet_test.cpp - src/test/basics/scope_test.cpp - src/test/basics/Slice_test.cpp - src/test/basics/StringUtilities_test.cpp - src/test/basics/TaggedCache_test.cpp - src/test/basics/XRPAmount_test.cpp - src/test/basics/base64_test.cpp - src/test/basics/base_uint_test.cpp - src/test/basics/contract_test.cpp - src/test/basics/FeeUnits_test.cpp - src/test/basics/hardened_hash_test.cpp - src/test/basics/join_test.cpp - src/test/basics/mulDiv_test.cpp - src/test/basics/tagged_integer_test.cpp - #[===============================[ + src/test/basics/Buffer_test.cpp + src/test/basics/DetectCrash_test.cpp + src/test/basics/Expected_test.cpp + src/test/basics/FileUtilities_test.cpp + src/test/basics/IOUAmount_test.cpp + src/test/basics/KeyCache_test.cpp + src/test/basics/Number_test.cpp + src/test/basics/PerfLog_test.cpp + src/test/basics/RangeSet_test.cpp + src/test/basics/scope_test.cpp + src/test/basics/Slice_test.cpp + src/test/basics/StringUtilities_test.cpp + src/test/basics/TaggedCache_test.cpp + src/test/basics/XRPAmount_test.cpp + src/test/basics/base64_test.cpp + src/test/basics/base_uint_test.cpp + src/test/basics/contract_test.cpp + src/test/basics/FeeUnits_test.cpp + src/test/basics/hardened_hash_test.cpp + src/test/basics/join_test.cpp + src/test/basics/mulDiv_test.cpp + src/test/basics/tagged_integer_test.cpp + #[===============================[ test sources: subdir: beast #]===============================] - src/test/beast/IPEndpoint_test.cpp - src/test/beast/LexicalCast_test.cpp - src/test/beast/SemanticVersion_test.cpp - src/test/beast/aged_associative_container_test.cpp - src/test/beast/beast_CurrentThreadName_test.cpp - src/test/beast/beast_Journal_test.cpp - src/test/beast/beast_PropertyStream_test.cpp - src/test/beast/beast_Zero_test.cpp - src/test/beast/beast_abstract_clock_test.cpp - src/test/beast/beast_basic_seconds_clock_test.cpp - src/test/beast/beast_io_latency_probe_test.cpp - src/test/beast/define_print.cpp - #[===============================[ + src/test/beast/IPEndpoint_test.cpp + src/test/beast/LexicalCast_test.cpp + src/test/beast/SemanticVersion_test.cpp + src/test/beast/aged_associative_container_test.cpp + src/test/beast/beast_CurrentThreadName_test.cpp + src/test/beast/beast_Journal_test.cpp + src/test/beast/beast_PropertyStream_test.cpp + src/test/beast/beast_Zero_test.cpp + src/test/beast/beast_abstract_clock_test.cpp + src/test/beast/beast_basic_seconds_clock_test.cpp + src/test/beast/beast_io_latency_probe_test.cpp + src/test/beast/define_print.cpp + #[===============================[ test sources: subdir: conditions #]===============================] - src/test/conditions/PreimageSha256_test.cpp - #[===============================[ + src/test/conditions/PreimageSha256_test.cpp + #[===============================[ test sources: subdir: consensus #]===============================] - src/test/consensus/ByzantineFailureSim_test.cpp - src/test/consensus/Consensus_test.cpp - src/test/consensus/DistributedValidatorsSim_test.cpp - src/test/consensus/LedgerTiming_test.cpp - src/test/consensus/LedgerTrie_test.cpp - src/test/consensus/NegativeUNL_test.cpp - src/test/consensus/ScaleFreeSim_test.cpp - src/test/consensus/UNLReport_test.cpp - src/test/consensus/Validations_test.cpp - #[===============================[ + src/test/consensus/ByzantineFailureSim_test.cpp + src/test/consensus/Consensus_test.cpp + src/test/consensus/DistributedValidatorsSim_test.cpp + src/test/consensus/LedgerTiming_test.cpp + src/test/consensus/LedgerTrie_test.cpp + src/test/consensus/NegativeUNL_test.cpp + src/test/consensus/ScaleFreeSim_test.cpp + src/test/consensus/UNLReport_test.cpp + src/test/consensus/Validations_test.cpp + #[===============================[ test sources: subdir: core #]===============================] - src/test/core/ClosureCounter_test.cpp - src/test/core/Config_test.cpp - src/test/core/Coroutine_test.cpp - src/test/core/CryptoPRNG_test.cpp - src/test/core/JobQueue_test.cpp - src/test/core/SociDB_test.cpp - src/test/core/Workers_test.cpp - #[===============================[ + src/test/core/ClosureCounter_test.cpp + src/test/core/Config_test.cpp + src/test/core/Coroutine_test.cpp + src/test/core/CryptoPRNG_test.cpp + src/test/core/JobQueue_test.cpp + src/test/core/SociDB_test.cpp + src/test/core/Workers_test.cpp + #[===============================[ test sources: subdir: csf #]===============================] - src/test/csf/BasicNetwork_test.cpp - src/test/csf/Digraph_test.cpp - src/test/csf/Histogram_test.cpp - src/test/csf/Scheduler_test.cpp - src/test/csf/impl/Sim.cpp - src/test/csf/impl/ledgers.cpp - #[===============================[ + src/test/csf/BasicNetwork_test.cpp + src/test/csf/Digraph_test.cpp + src/test/csf/Histogram_test.cpp + src/test/csf/Scheduler_test.cpp + src/test/csf/impl/Sim.cpp + src/test/csf/impl/ledgers.cpp + #[===============================[ test sources: subdir: json #]===============================] - src/test/json/Object_test.cpp - src/test/json/Output_test.cpp - src/test/json/Writer_test.cpp - src/test/json/json_value_test.cpp - #[===============================[ + src/test/json/Object_test.cpp + src/test/json/Output_test.cpp + src/test/json/Writer_test.cpp + src/test/json/json_value_test.cpp + #[===============================[ test sources: subdir: jtx #]===============================] - src/test/jtx/Env_test.cpp - src/test/jtx/WSClient_test.cpp - src/test/jtx/impl/Account.cpp - src/test/jtx/impl/Env.cpp - src/test/jtx/impl/JSONRPCClient.cpp - src/test/jtx/impl/ManualTimeKeeper.cpp - src/test/jtx/impl/WSClient.cpp - src/test/jtx/impl/hook.cpp - src/test/jtx/impl/acctdelete.cpp - src/test/jtx/impl/account_txn_id.cpp - src/test/jtx/impl/amount.cpp - src/test/jtx/impl/balance.cpp - src/test/jtx/impl/check.cpp - src/test/jtx/impl/cron.cpp - src/test/jtx/impl/delivermin.cpp - src/test/jtx/impl/deposit.cpp - src/test/jtx/impl/envconfig.cpp - src/test/jtx/impl/escrow.cpp - src/test/jtx/impl/fee.cpp - src/test/jtx/impl/flags.cpp - src/test/jtx/impl/genesis.cpp - src/test/jtx/impl/import.cpp - src/test/jtx/impl/invoice_id.cpp - src/test/jtx/impl/invoke.cpp - src/test/jtx/impl/jtx_json.cpp - src/test/jtx/impl/last_ledger_sequence.cpp - src/test/jtx/impl/memo.cpp - src/test/jtx/impl/multisign.cpp - src/test/jtx/impl/network.cpp - src/test/jtx/impl/offer.cpp - src/test/jtx/impl/owners.cpp - src/test/jtx/impl/paths.cpp - src/test/jtx/impl/pay.cpp - src/test/jtx/impl/paychan.cpp - src/test/jtx/impl/quality2.cpp - src/test/jtx/impl/rate.cpp - src/test/jtx/impl/regkey.cpp - src/test/jtx/impl/reward.cpp - src/test/jtx/impl/remarks.cpp - src/test/jtx/impl/remit.cpp - src/test/jtx/impl/sendmax.cpp - src/test/jtx/impl/seq.cpp - src/test/jtx/impl/sig.cpp - src/test/jtx/impl/tag.cpp - src/test/jtx/impl/TestHelpers.cpp - src/test/jtx/impl/ticket.cpp - src/test/jtx/impl/token.cpp - src/test/jtx/impl/trust.cpp - src/test/jtx/impl/txflags.cpp - src/test/jtx/impl/unl.cpp - src/test/jtx/impl/uritoken.cpp - src/test/jtx/impl/utility.cpp - - #[===============================[ + src/test/jtx/Env_test.cpp + src/test/jtx/WSClient_test.cpp + src/test/jtx/impl/Account.cpp + src/test/jtx/impl/Env.cpp + src/test/jtx/impl/JSONRPCClient.cpp + src/test/jtx/impl/ManualTimeKeeper.cpp + src/test/jtx/impl/WSClient.cpp + src/test/jtx/impl/hook.cpp + src/test/jtx/impl/acctdelete.cpp + src/test/jtx/impl/account_txn_id.cpp + src/test/jtx/impl/amount.cpp + src/test/jtx/impl/balance.cpp + src/test/jtx/impl/check.cpp + src/test/jtx/impl/cron.cpp + src/test/jtx/impl/delivermin.cpp + src/test/jtx/impl/deposit.cpp + src/test/jtx/impl/envconfig.cpp + src/test/jtx/impl/escrow.cpp + src/test/jtx/impl/fee.cpp + src/test/jtx/impl/flags.cpp + src/test/jtx/impl/genesis.cpp + src/test/jtx/impl/import.cpp + src/test/jtx/impl/invoice_id.cpp + src/test/jtx/impl/invoke.cpp + src/test/jtx/impl/jtx_json.cpp + src/test/jtx/impl/last_ledger_sequence.cpp + src/test/jtx/impl/memo.cpp + src/test/jtx/impl/multisign.cpp + src/test/jtx/impl/network.cpp + src/test/jtx/impl/offer.cpp + src/test/jtx/impl/owners.cpp + src/test/jtx/impl/paths.cpp + src/test/jtx/impl/pay.cpp + src/test/jtx/impl/paychan.cpp + src/test/jtx/impl/quality2.cpp + src/test/jtx/impl/rate.cpp + src/test/jtx/impl/regkey.cpp + src/test/jtx/impl/reward.cpp + src/test/jtx/impl/remarks.cpp + src/test/jtx/impl/remit.cpp + src/test/jtx/impl/sendmax.cpp + src/test/jtx/impl/seq.cpp + src/test/jtx/impl/sig.cpp + src/test/jtx/impl/tag.cpp + src/test/jtx/impl/TestHelpers.cpp + src/test/jtx/impl/ticket.cpp + src/test/jtx/impl/token.cpp + src/test/jtx/impl/trust.cpp + src/test/jtx/impl/txflags.cpp + src/test/jtx/impl/unl.cpp + src/test/jtx/impl/uritoken.cpp + src/test/jtx/impl/utility.cpp + #[===============================[ test sources: subdir: ledger #]===============================] - src/test/ledger/BookDirs_test.cpp - src/test/ledger/Directory_test.cpp - src/test/ledger/Invariants_test.cpp - src/test/ledger/PaymentSandbox_test.cpp - src/test/ledger/PendingSaves_test.cpp - src/test/ledger/SkipList_test.cpp - src/test/ledger/View_test.cpp - #[===============================[ + src/test/ledger/BookDirs_test.cpp + src/test/ledger/Directory_test.cpp + src/test/ledger/Invariants_test.cpp + src/test/ledger/PaymentSandbox_test.cpp + src/test/ledger/PendingSaves_test.cpp + src/test/ledger/SkipList_test.cpp + src/test/ledger/View_test.cpp + #[===============================[ test sources: subdir: net #]===============================] - src/test/net/DatabaseDownloader_test.cpp - #[===============================[ + src/test/net/DatabaseDownloader_test.cpp + #[===============================[ test sources: subdir: nodestore #]===============================] - src/test/nodestore/Backend_test.cpp - src/test/nodestore/Basics_test.cpp - src/test/nodestore/DatabaseShard_test.cpp - src/test/nodestore/Database_test.cpp - src/test/nodestore/NuDBFactory_test.cpp - src/test/nodestore/Timing_test.cpp - src/test/nodestore/import_test.cpp - src/test/nodestore/varint_test.cpp - #[===============================[ + src/test/nodestore/Backend_test.cpp + src/test/nodestore/Basics_test.cpp + src/test/nodestore/DatabaseShard_test.cpp + src/test/nodestore/Database_test.cpp + src/test/nodestore/NuDBFactory_test.cpp + src/test/nodestore/Timing_test.cpp + src/test/nodestore/import_test.cpp + src/test/nodestore/varint_test.cpp + #[===============================[ test sources: subdir: overlay #]===============================] - src/test/overlay/ProtocolVersion_test.cpp - src/test/overlay/cluster_test.cpp - src/test/overlay/short_read_test.cpp - src/test/overlay/compression_test.cpp - src/test/overlay/reduce_relay_test.cpp - src/test/overlay/handshake_test.cpp - src/test/overlay/tx_reduce_relay_test.cpp - #[===============================[ + src/test/overlay/ProtocolVersion_test.cpp + src/test/overlay/cluster_test.cpp + src/test/overlay/short_read_test.cpp + src/test/overlay/compression_test.cpp + src/test/overlay/reduce_relay_test.cpp + src/test/overlay/handshake_test.cpp + src/test/overlay/tx_reduce_relay_test.cpp + #[===============================[ test sources: subdir: peerfinder #]===============================] - src/test/peerfinder/Livecache_test.cpp - src/test/peerfinder/PeerFinder_test.cpp - #[===============================[ + src/test/peerfinder/Livecache_test.cpp + src/test/peerfinder/PeerFinder_test.cpp + #[===============================[ test sources: subdir: protocol #]===============================] - src/test/protocol/BuildInfo_test.cpp - src/test/protocol/InnerObjectFormats_test.cpp - src/test/protocol/Issue_test.cpp - src/test/protocol/Hooks_test.cpp - src/test/protocol/Memo_test.cpp - src/test/protocol/PublicKey_test.cpp - src/test/protocol/Quality_test.cpp - src/test/protocol/STAccount_test.cpp - src/test/protocol/STAmount_test.cpp - src/test/protocol/STObject_test.cpp - src/test/protocol/STTx_test.cpp - src/test/protocol/STValidation_test.cpp - src/test/protocol/SecretKey_test.cpp - src/test/protocol/Seed_test.cpp - src/test/protocol/SeqProxy_test.cpp - src/test/protocol/TER_test.cpp - src/test/protocol/types_test.cpp - #[===============================[ + src/test/protocol/BuildInfo_test.cpp + src/test/protocol/InnerObjectFormats_test.cpp + src/test/protocol/Issue_test.cpp + src/test/protocol/Hooks_test.cpp + src/test/protocol/Memo_test.cpp + src/test/protocol/PublicKey_test.cpp + src/test/protocol/Quality_test.cpp + src/test/protocol/STAccount_test.cpp + src/test/protocol/STAmount_test.cpp + src/test/protocol/STObject_test.cpp + src/test/protocol/STTx_test.cpp + src/test/protocol/STValidation_test.cpp + src/test/protocol/SecretKey_test.cpp + src/test/protocol/Seed_test.cpp + src/test/protocol/SeqProxy_test.cpp + src/test/protocol/TER_test.cpp + src/test/protocol/types_test.cpp + #[===============================[ test sources: subdir: resource #]===============================] - src/test/resource/Logic_test.cpp - #[===============================[ + src/test/resource/Logic_test.cpp + #[===============================[ test sources: subdir: rdb #]===============================] - src/test/rdb/RelationalDatabase_test.cpp - #[===============================[ + src/test/rdb/RelationalDatabase_test.cpp + #[===============================[ test sources: subdir: rpc #]===============================] - src/test/rpc/AccountCurrencies_test.cpp - src/test/rpc/AccountInfo_test.cpp - src/test/rpc/AccountLinesRPC_test.cpp - src/test/rpc/AccountObjects_test.cpp - src/test/rpc/AccountOffers_test.cpp - src/test/rpc/AccountNamespace_test.cpp - src/test/rpc/AccountSet_test.cpp - src/test/rpc/AccountTx_test.cpp - src/test/rpc/AmendmentBlocked_test.cpp - src/test/rpc/Book_test.cpp - src/test/rpc/Catalogue_test.cpp - src/test/rpc/DepositAuthorized_test.cpp - src/test/rpc/DeliveredAmount_test.cpp - src/test/rpc/Feature_test.cpp - src/test/rpc/GatewayBalances_test.cpp - src/test/rpc/GetCounts_test.cpp - src/test/rpc/JSONRPC_test.cpp - src/test/rpc/KeyGeneration_test.cpp - src/test/rpc/LedgerClosed_test.cpp - src/test/rpc/LedgerData_test.cpp - src/test/rpc/LedgerRPC_test.cpp - src/test/rpc/LedgerRequestRPC_test.cpp - src/test/rpc/ManifestRPC_test.cpp - src/test/rpc/NodeToShardRPC_test.cpp - src/test/rpc/NoRippleCheck_test.cpp - src/test/rpc/NoRipple_test.cpp - src/test/rpc/OwnerInfo_test.cpp - src/test/rpc/Peers_test.cpp - src/test/rpc/ReportingETL_test.cpp - src/test/rpc/Roles_test.cpp - src/test/rpc/RPCCall_test.cpp - src/test/rpc/RPCOverload_test.cpp - src/test/rpc/RobustTransaction_test.cpp - src/test/rpc/ServerDefinitions_test.cpp - src/test/rpc/ServerInfo_test.cpp - src/test/rpc/ShardArchiveHandler_test.cpp - src/test/rpc/Status_test.cpp - src/test/rpc/Subscribe_test.cpp - src/test/rpc/Transaction_test.cpp - src/test/rpc/TransactionEntry_test.cpp - src/test/rpc/TransactionHistory_test.cpp - src/test/rpc/ValidatorInfo_test.cpp - src/test/rpc/ValidatorRPC_test.cpp - src/test/rpc/Version_test.cpp - #[===============================[ + src/test/rpc/AccountCurrencies_test.cpp + src/test/rpc/AccountInfo_test.cpp + src/test/rpc/AccountLinesRPC_test.cpp + src/test/rpc/AccountObjects_test.cpp + src/test/rpc/AccountOffers_test.cpp + src/test/rpc/AccountNamespace_test.cpp + src/test/rpc/AccountSet_test.cpp + src/test/rpc/AccountTx_test.cpp + src/test/rpc/AmendmentBlocked_test.cpp + src/test/rpc/Book_test.cpp + src/test/rpc/Catalogue_test.cpp + src/test/rpc/DepositAuthorized_test.cpp + src/test/rpc/DeliveredAmount_test.cpp + src/test/rpc/Feature_test.cpp + src/test/rpc/GatewayBalances_test.cpp + src/test/rpc/GetCounts_test.cpp + src/test/rpc/JSONRPC_test.cpp + src/test/rpc/KeyGeneration_test.cpp + src/test/rpc/LedgerClosed_test.cpp + src/test/rpc/LedgerData_test.cpp + src/test/rpc/LedgerRPC_test.cpp + src/test/rpc/LedgerRequestRPC_test.cpp + src/test/rpc/ManifestRPC_test.cpp + src/test/rpc/NodeToShardRPC_test.cpp + src/test/rpc/NoRippleCheck_test.cpp + src/test/rpc/NoRipple_test.cpp + src/test/rpc/OwnerInfo_test.cpp + src/test/rpc/Peers_test.cpp + src/test/rpc/ReportingETL_test.cpp + src/test/rpc/Roles_test.cpp + src/test/rpc/RPCCall_test.cpp + src/test/rpc/RPCOverload_test.cpp + src/test/rpc/RobustTransaction_test.cpp + src/test/rpc/ServerDefinitions_test.cpp + src/test/rpc/ServerInfo_test.cpp + src/test/rpc/ShardArchiveHandler_test.cpp + src/test/rpc/Status_test.cpp + src/test/rpc/Subscribe_test.cpp + src/test/rpc/Transaction_test.cpp + src/test/rpc/TransactionEntry_test.cpp + src/test/rpc/TransactionHistory_test.cpp + src/test/rpc/ValidatorInfo_test.cpp + src/test/rpc/ValidatorRPC_test.cpp + src/test/rpc/Version_test.cpp + #[===============================[ test sources: subdir: server #]===============================] - src/test/server/ServerStatus_test.cpp - src/test/server/Server_test.cpp - #[===============================[ + src/test/server/ServerStatus_test.cpp + src/test/server/Server_test.cpp + #[===============================[ test sources: subdir: shamap #]===============================] - src/test/shamap/FetchPack_test.cpp - src/test/shamap/SHAMapSync_test.cpp - src/test/shamap/SHAMap_test.cpp - #[===============================[ + src/test/shamap/FetchPack_test.cpp + src/test/shamap/SHAMapSync_test.cpp + src/test/shamap/SHAMap_test.cpp + #[===============================[ test sources: subdir: unit_test #]===============================] - src/test/unit_test/multi_runner.cpp) -endif () #tests + src/test/unit_test/multi_runner.cpp) +endif() # tests -target_link_libraries (rippled +target_link_libraries( + rippled Ripple::boost Ripple::opts Ripple::libs Ripple::xrpl_core # Workaround for a Conan 1.x bug that prevents static linking of libstdc++ # when a dependency (snappy) modifies system_libs. See the comment in - # external/snappy/conanfile.py for a full explanation. - # This is likely not strictly necessary, but listed explicitly as a good practice. - m - ) -exclude_if_included (rippled) -# define a macro for tests that might need to -# be exluded or run differently in CI environment -if (is_ci) + # external/snappy/conanfile.py for a full explanation. This is likely not + # strictly necessary, but listed explicitly as a good practice. + m) +exclude_if_included(rippled) +# define a macro for tests that might need to be exluded or run differently in +# CI environment +if(is_ci) target_compile_definitions(rippled PRIVATE RIPPLED_RUNNING_IN_CI) -endif () +endif() if(reporting) -set_target_properties(rippled PROPERTIES OUTPUT_NAME rippled-reporting) -get_target_property(BIN_NAME rippled OUTPUT_NAME) -message(STATUS "Reporting mode build: rippled renamed ${BIN_NAME}") + set_target_properties(rippled PROPERTIES OUTPUT_NAME rippled-reporting) + get_target_property(BIN_NAME rippled OUTPUT_NAME) + message(STATUS "Reporting mode build: rippled renamed ${BIN_NAME}") target_compile_definitions(rippled PRIVATE RIPPLED_REPORTING) endif() # any files that don't play well with unity should be added here -if (tests) +if(tests) set_source_files_properties( # these two seem to produce conflicts in beast teardown template methods - src/test/rpc/ValidatorRPC_test.cpp - src/test/rpc/ShardArchiveHandler_test.cpp + src/test/rpc/ValidatorRPC_test.cpp src/test/rpc/ShardArchiveHandler_test.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) -endif () #tests +endif() # tests if(ACL_LIBRARY) target_link_libraries(rippled ${ACL_LIBRARY}) diff --git a/src/ripple/app/ledger/InboundLedger.h b/src/ripple/app/ledger/InboundLedger.h index 313135f11..2a3b01750 100644 --- a/src/ripple/app/ledger/InboundLedger.h +++ b/src/ripple/app/ledger/InboundLedger.h @@ -126,6 +126,14 @@ public: bool hasTx(uint256 const& txHash) const; + /** Return the count of known transaction hashes (for debugging). */ + std::size_t + knownTxCount() const + { + ScopedLockType sl(mtx_); + return knownTxHashes_.size(); + } + void touch() { diff --git a/src/ripple/app/ledger/InboundLedgers.h b/src/ripple/app/ledger/InboundLedgers.h index cb17c20ba..72f83fc40 100644 --- a/src/ripple/app/ledger/InboundLedgers.h +++ b/src/ripple/app/ledger/InboundLedgers.h @@ -83,6 +83,19 @@ public: virtual void addPriorityNode(std::uint32_t ledgerSeq, uint256 const& nodeHash) = 0; + /** Add a ledger range where TX fetching should be prioritized. + Ledgers in this range will fetch TX nodes BEFORE state nodes. + Used by submit_and_wait to quickly detect transactions. + @param start First ledger sequence (inclusive) + @param end Last ledger sequence (inclusive) + */ + virtual void + prioritizeTxForLedgers(std::uint32_t start, std::uint32_t end) = 0; + + /** Check if TX fetching should be prioritized for a ledger sequence. */ + virtual bool + isTxPrioritized(std::uint32_t seq) const = 0; + // VFALCO TODO Remove the dependency on the Peer object. // virtual bool diff --git a/src/ripple/app/ledger/impl/InboundLedger.cpp b/src/ripple/app/ledger/impl/InboundLedger.cpp index 83ea00648..87ac8c6e8 100644 --- a/src/ripple/app/ledger/impl/InboundLedger.cpp +++ b/src/ripple/app/ledger/impl/InboundLedger.cpp @@ -101,6 +101,8 @@ InboundLedger::InboundLedger( , mPeerSet(std::move(peerSet)) { JLOG(journal_.trace()) << "Acquiring ledger " << hash_; + JLOG(app_.journal("TxTrack").warn()) + << "NEW LEDGER seq=" << seq << " hash=" << hash; touch(); } @@ -736,7 +738,12 @@ InboundLedger::trigger(std::shared_ptr const& peer, TriggerReason reason) // Get the state data first because it's the most likely to be useful // if we wind up abandoning this fetch. - if (mHaveHeader && !mHaveState && !failed_) + // When TX is prioritized for this ledger range, skip state until TX + // complete. + bool const txPrioritized = + mSeq != 0 && app_.getInboundLedgers().isTxPrioritized(mSeq); + if (mHaveHeader && !mHaveState && !failed_ && + !(txPrioritized && !mHaveTransactions)) { assert(mLedger); @@ -955,6 +962,9 @@ InboundLedger::takeHeader(std::string const& data) mLedger->txMap().setLedgerSeq(mSeq); mHaveHeader = true; + JLOG(app_.journal("TxTrack").warn()) + << "GOT HEADER seq=" << mSeq << " txHash=" << mLedger->info().txHash; + Serializer s(data.size() + 4); s.add32(HashPrefix::ledgerMaster); s.addRaw(data.data(), data.size()); @@ -1040,7 +1050,13 @@ InboundLedger::receiveNode(protocol::TMLedgerData& packet, SHAMapAddNode& san) uint256 txHash; std::memcpy( txHash.data(), data.data() + data.size() - 33, 32); - knownTxHashes_.insert(txHash); + auto [it, inserted] = knownTxHashes_.insert(txHash); + if (inserted) + { + JLOG(app_.journal("TxTrack").warn()) + << "GOT TX ledger=" << mSeq << " tx=" << txHash + << " count=" << knownTxHashes_.size(); + } } } } diff --git a/src/ripple/app/ledger/impl/InboundLedgers.cpp b/src/ripple/app/ledger/impl/InboundLedgers.cpp index d2246eb66..196058f43 100644 --- a/src/ripple/app/ledger/impl/InboundLedgers.cpp +++ b/src/ripple/app/ledger/impl/InboundLedgers.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -205,15 +206,27 @@ public: std::optional findTxLedger(uint256 const& txHash) override { + auto const swj = app_.journal("SubmitAndWait"); ScopedLockType sl(mLock); + JLOG(swj.debug()) << "findTxLedger tx=" << txHash << " searching " + << mLedgers.size() << " inbound ledgers"; for (auto const& [hash, inbound] : mLedgers) { - if (inbound->hasHeader() && !inbound->isFailed() && - inbound->hasTx(txHash)) + bool hasHdr = inbound->hasHeader(); + bool failed = inbound->isFailed(); + bool hasTx = hasHdr && !failed && inbound->hasTx(txHash); + JLOG(swj.trace()) + << "findTxLedger checking ledger seq=" << inbound->getSeq() + << " hash=" << hash << " hasHeader=" << hasHdr + << " failed=" << failed << " hasTx=" << hasTx; + if (hasTx) { + JLOG(swj.warn()) << "findTxLedger FOUND tx=" << txHash + << " in ledger seq=" << inbound->getSeq(); return hash; } } + JLOG(swj.debug()) << "findTxLedger tx=" << txHash << " NOT FOUND"; return std::nullopt; } @@ -248,6 +261,22 @@ public: } } + void + prioritizeTxForLedgers(std::uint32_t start, std::uint32_t end) override + { + std::lock_guard lock(txPriorityMutex_); + txPriorityRange_.insert(ClosedInterval(start, end)); + JLOG(j_.debug()) << "TX priority added for ledgers " << start << "-" + << end; + } + + bool + isTxPrioritized(std::uint32_t seq) const override + { + std::lock_guard lock(txPriorityMutex_); + return boost::icl::contains(txPriorityRange_, seq); + } + /* This gets called when "We got some data from an inbound ledger" @@ -466,6 +495,11 @@ public: } else if ((la + std::chrono::minutes(1)) < start) { + JLOG(app_.journal("SubmitAndWait").debug()) + << "sweep removing ledger seq=" << it->second->getSeq() + << " complete=" << it->second->isComplete() + << " failed=" << it->second->isFailed() + << " knownTxCount=" << it->second->knownTxCount(); stuffToSweep.push_back(it->second); // shouldn't cause the actual final delete // since we are holding a reference in the vector. @@ -480,8 +514,8 @@ public: beast::expire(mRecentFailures, kReacquireInterval); } - JLOG(j_.debug()) - << "Swept " << stuffToSweep.size() << " out of " << total + JLOG(app_.journal("SubmitAndWait").debug()) + << "sweep removed " << stuffToSweep.size() << " out of " << total << " inbound ledgers. Duration: " << std::chrono::duration_cast( m_clock.now() - start) @@ -516,6 +550,10 @@ private: std::set pendingAcquires_; std::mutex acquiresMutex_; + + // Ledger ranges where TX fetching should be prioritized + mutable std::mutex txPriorityMutex_; + RangeSet txPriorityRange_; }; //------------------------------------------------------------------------------ diff --git a/src/ripple/app/misc/NetworkOPs.cpp b/src/ripple/app/misc/NetworkOPs.cpp index c7580ee61..40849754d 100644 --- a/src/ripple/app/misc/NetworkOPs.cpp +++ b/src/ripple/app/misc/NetworkOPs.cpp @@ -1222,7 +1222,7 @@ NetworkOPsImp::broadcastRawTransaction(Blob const& txBlob) Serializer s; stx->add(s); msg.set_rawtransaction(s.data(), s.size()); - msg.set_status(protocol::tsCURRENT); + msg.set_status(protocol::tsNEW); // tsNEW = origin node could not validate msg.set_receivetimestamp( app_.timeKeeper().now().time_since_epoch().count()); diff --git a/src/ripple/rpc/handlers/SubmitAndWait.cpp b/src/ripple/rpc/handlers/SubmitAndWait.cpp index 0ced75135..3d6bdf513 100644 --- a/src/ripple/rpc/handlers/SubmitAndWait.cpp +++ b/src/ripple/rpc/handlers/SubmitAndWait.cpp @@ -34,6 +34,11 @@ namespace ripple { +// Custom journal partition for submit_and_wait debugging +// Configure with [rpc_startup] { "command": "log_level", "partition": +// "SubmitAndWait", "severity": "debug" } +#define SWLOG(level) JLOG(context.app.journal("SubmitAndWait").level()) + // { // tx_blob: // timeout: @@ -118,15 +123,32 @@ doSubmitAndWait(RPC::JsonContext& context) setCoroFetchTimeout( std::chrono::duration_cast(timeout / 2)); - // Broadcast the transaction + SWLOG(warn) << "starting for tx=" << txHash + << " lastLedgerSeq=" << (lastLedgerSeq ? *lastLedgerSeq : 0) + << " timeout=" << timeout.count() << "s"; + + // Poll for the transaction result + constexpr auto pollInterval = std::chrono::milliseconds(10); + auto const startTime = std::chrono::steady_clock::now(); + + // Broadcast IMMEDIATELY - don't wait for anything + SWLOG(warn) << "broadcasting tx=" << txHash; auto broadcastResult = context.netOps.broadcastRawTransaction(*txBlob); if (!broadcastResult) { + SWLOG(warn) << "broadcast FAILED for tx=" << txHash; jvResult[jss::error] = "broadcastFailed"; jvResult[jss::error_exception] = "Failed to parse/broadcast transaction"; return jvResult; } + SWLOG(warn) << "broadcast SUCCESS for tx=" << txHash; + + // Prioritize TX fetching for ledgers in our window + // This makes TX nodes fetch before state nodes for faster detection + auto const startSeq = context.ledgerMaster.getValidLedgerIndex(); + auto const endSeq = lastLedgerSeq.value_or(startSeq + 20); + context.app.getInboundLedgers().prioritizeTxForLedgers(startSeq, endSeq); jvResult[jss::tx_hash] = to_string(txHash); jvResult[jss::broadcast] = true; @@ -135,10 +157,6 @@ doSubmitAndWait(RPC::JsonContext& context) std::optional foundLedgerHash; std::optional foundLedgerSeq; - // Poll for the transaction result - constexpr auto pollInterval = std::chrono::milliseconds(500); - auto const startTime = std::chrono::steady_clock::now(); - // Helper to check if a ledger is validated (has quorum) auto isLedgerValidated = [&](uint256 const& ledgerHash) -> bool { auto const quorum = context.app.validators().quorum(); @@ -152,8 +170,8 @@ doSubmitAndWait(RPC::JsonContext& context) }; // Helper to read tx result from a ledger - auto readTxResult = - [&](std::shared_ptr const& ledger) -> bool { + auto readTxResult = [&](std::shared_ptr const& ledger, + std::string const& source) -> bool { if (!ledger) return false; @@ -163,6 +181,7 @@ doSubmitAndWait(RPC::JsonContext& context) jvResult[jss::status] = "success"; jvResult[jss::validated] = true; + jvResult["found_via"] = source; jvResult[jss::tx_json] = sttx->getJson(JsonOptions::none); jvResult[jss::metadata] = stobj->getJson(JsonOptions::none); jvResult[jss::ledger_hash] = to_string(ledger->info().hash); @@ -177,7 +196,7 @@ doSubmitAndWait(RPC::JsonContext& context) std::string human; transResultInfo(result, token, human); jvResult[jss::engine_result] = token; - jvResult[jss::engine_result_code] = static_cast(result); + jvResult[jss::engine_result_code] = TERtoInt(result); jvResult[jss::engine_result_message] = human; } @@ -194,58 +213,36 @@ doSubmitAndWait(RPC::JsonContext& context) "Transaction not validated within timeout period"; if (foundLedgerSeq) { - jvResult[jss::found_in_ledger] = *foundLedgerSeq; + jvResult["found_in_ledger"] = *foundLedgerSeq; auto const valCount = context.app.getValidations().numTrustedForLedger( *foundLedgerHash); auto const quorum = context.app.validators().quorum(); - jvResult[jss::validation_count] = + jvResult["validation_count"] = static_cast(valCount); - jvResult[jss::quorum] = static_cast(quorum); + jvResult["quorum"] = static_cast(quorum); } return jvResult; } - // Check LastLedgerSequence expiry using validated ledger - auto const validatedSeq = context.ledgerMaster.getValidLedgerIndex(); - if (lastLedgerSeq && validatedSeq > *lastLedgerSeq) - { - jvResult[jss::error] = "transactionExpired"; - jvResult[jss::error_message] = - "LastLedgerSequence exceeded before transaction was validated"; - jvResult[jss::last_ledger_sequence] = *lastLedgerSeq; - jvResult[jss::validated_ledger] = validatedSeq; - return jvResult; - } - // If we already found the tx, check if its ledger is now validated if (foundLedgerHash) { if (isLedgerValidated(*foundLedgerHash)) { - // Ledger is validated! Try to read the tx from it - // First try the partial ledger we have + // Ledger is validated! Read the tx result auto ledger = context.app.getInboundLedgers().getPartialLedger( *foundLedgerHash); - if (ledger && readTxResult(ledger)) + if (ledger && readTxResult(ledger, "InboundLedgers")) { return jvResult; } - - // Try getting from LedgerMaster (may have been stored) - ledger = context.ledgerMaster.getLedgerByHash(*foundLedgerHash); - if (ledger && readTxResult(ledger)) - { - return jvResult; - } - - // Ledger validated but we can't read it yet - keep waiting - // The nodes might still be arriving + // Ledger validated but can't read yet - keep waiting } } else { - // Look for the transaction in inbound ledgers + // Search InboundLedgers for the tx auto const ledgerHash = context.app.getInboundLedgers().findTxLedger(txHash); @@ -257,21 +254,33 @@ doSubmitAndWait(RPC::JsonContext& context) if (ledger) { - // Found the tx - record which ledger foundLedgerHash = ledgerHash; foundLedgerSeq = ledger->info().seq; + SWLOG(warn) + << "FOUND tx in ledger seq=" << ledger->info().seq; - // Check if already validated if (isLedgerValidated(*ledgerHash)) { - if (readTxResult(ledger)) + if (readTxResult(ledger, "InboundLedgers")) { return jvResult; } } - // Otherwise continue waiting for validation } } + + // Check LastLedgerSequence expiry + auto const currentValidatedSeq = + context.ledgerMaster.getValidLedgerIndex(); + if (lastLedgerSeq && currentValidatedSeq > *lastLedgerSeq) + { + jvResult[jss::error] = "transactionExpired"; + jvResult[jss::error_message] = + "LastLedgerSequence exceeded and transaction not found"; + jvResult["last_ledger_sequence"] = *lastLedgerSeq; + jvResult["validated_ledger"] = currentValidatedSeq; + return jvResult; + } } // Sleep and continue polling diff --git a/src/test/app/LedgerReplay_test.cpp b/src/test/app/LedgerReplay_test.cpp index 0968f1439..1145b91f4 100644 --- a/src/test/app/LedgerReplay_test.cpp +++ b/src/test/app/LedgerReplay_test.cpp @@ -132,11 +132,28 @@ public: return {}; } + virtual std::optional + findTxLedger(uint256 const& txHash) override + { + return std::nullopt; + } + virtual void addPriorityNode(std::uint32_t ledgerSeq, uint256 const& nodeHash) override { } + virtual void + prioritizeTxForLedgers(std::uint32_t start, std::uint32_t end) override + { + } + + virtual bool + isTxPrioritized(std::uint32_t seq) const override + { + return false; + } + virtual bool gotLedgerData( LedgerHash const& ledgerHash,