From 84ce5482e68f2c710cadce45e6e4c2918120d772 Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Sun, 10 May 2026 18:08:31 +0200 Subject: [PATCH] feat: logging --- bin/add_trace_logging.py | 499 ++++++++++++++++++ include/xrpl/basics/TraceLog.h | 37 ++ include/xrpl/nodestore/Database.h | 12 + .../nodestore/detail/DatabaseRotatingImp.h | 2 + src/libxrpl/basics/Archive.cpp | 2 + src/libxrpl/basics/BasicConfig.cpp | 14 + src/libxrpl/basics/CountedObject.cpp | 3 + src/libxrpl/basics/FileUtilities.cpp | 3 + src/libxrpl/basics/Log.cpp | 28 + src/libxrpl/basics/MallocTrim.cpp | 5 + src/libxrpl/basics/Number.cpp | 35 ++ src/libxrpl/basics/ResolverAsio.cpp | 20 + src/libxrpl/basics/StringUtilities.cpp | 6 + src/libxrpl/basics/TraceLog.cpp | 304 +++++++++++ src/libxrpl/basics/UptimeClock.cpp | 4 + src/libxrpl/basics/base64.cpp | 7 + src/libxrpl/basics/contract.cpp | 3 + src/libxrpl/basics/make_SSLContext.cpp | 6 + src/libxrpl/basics/mulDiv.cpp | 2 + src/libxrpl/conditions/Condition.cpp | 3 + src/libxrpl/conditions/Fulfillment.cpp | 5 + src/libxrpl/conditions/error.cpp | 8 + src/libxrpl/core/HashRouter.cpp | 10 + src/libxrpl/core/detail/Job.cpp | 9 + src/libxrpl/core/detail/JobQueue.cpp | 20 + src/libxrpl/core/detail/LoadEvent.cpp | 8 + src/libxrpl/core/detail/LoadMonitor.cpp | 8 + src/libxrpl/core/detail/Workers.cpp | 13 + src/libxrpl/crypto/RFC1751.cpp | 10 + src/libxrpl/crypto/csprng.cpp | 7 + src/libxrpl/crypto/secure_erase.cpp | 2 + src/libxrpl/json/JsonPropertyStream.cpp | 25 + src/libxrpl/json/Output.cpp | 4 + src/libxrpl/json/Writer.cpp | 31 ++ src/libxrpl/json/json_reader.cpp | 33 ++ src/libxrpl/json/json_value.cpp | 77 +++ src/libxrpl/json/json_valueiterator.cpp | 12 + src/libxrpl/json/json_writer.cpp | 30 ++ src/libxrpl/json/to_string.cpp | 3 + src/libxrpl/ledger/AcceptedLedgerTx.cpp | 3 + src/libxrpl/ledger/ApplyStateTable.cpp | 19 + src/libxrpl/ledger/ApplyView.cpp | 9 + src/libxrpl/ledger/ApplyViewBase.cpp | 24 + src/libxrpl/ledger/ApplyViewImpl.cpp | 4 + src/libxrpl/ledger/BookDirs.cpp | 8 + src/libxrpl/ledger/BookListeners.cpp | 4 + src/libxrpl/ledger/CachedView.cpp | 3 + src/libxrpl/ledger/CanonicalTXSet.cpp | 5 + src/libxrpl/ledger/Dir.cpp | 10 + src/libxrpl/ledger/Ledger.cpp | 49 ++ src/libxrpl/ledger/OpenView.cpp | 27 + src/libxrpl/ledger/PaymentSandbox.cpp | 21 + src/libxrpl/ledger/RawStateTable.cpp | 20 + src/libxrpl/ledger/ReadView.cpp | 9 + src/libxrpl/ledger/View.cpp | 17 + src/libxrpl/ledger/helpers/AMMHelpers.cpp | 30 ++ .../ledger/helpers/AccountRootHelpers.cpp | 11 + .../ledger/helpers/CredentialHelpers.cpp | 12 + .../ledger/helpers/DirectoryHelpers.cpp | 9 + src/libxrpl/ledger/helpers/LendingHelpers.cpp | 34 ++ src/libxrpl/ledger/helpers/MPTokenHelpers.cpp | 26 + src/libxrpl/ledger/helpers/NFTokenHelpers.cpp | 20 + src/libxrpl/ledger/helpers/OfferHelpers.cpp | 2 + .../ledger/helpers/PaymentChannelHelpers.cpp | 2 + .../ledger/helpers/PermissionedDEXHelpers.cpp | 3 + .../ledger/helpers/RippleStateHelpers.cpp | 18 + src/libxrpl/ledger/helpers/TokenHelpers.cpp | 42 ++ src/libxrpl/ledger/helpers/VaultHelpers.cpp | 5 + src/libxrpl/net/HTTPClient.cpp | 19 + src/libxrpl/net/RegisterSSLCerts.cpp | 2 + src/libxrpl/nodestore/BatchWriter.cpp | 8 + src/libxrpl/nodestore/Database.cpp | 39 ++ src/libxrpl/nodestore/DatabaseNodeImp.cpp | 6 + src/libxrpl/nodestore/DatabaseRotatingImp.cpp | 20 +- src/libxrpl/nodestore/DecodedBlob.cpp | 3 + src/libxrpl/nodestore/DummyScheduler.cpp | 2 + src/libxrpl/nodestore/ManagerImp.cpp | 10 + src/libxrpl/nodestore/NodeObject.cpp | 5 + .../nodestore/backend/MemoryFactory.cpp | 19 + src/libxrpl/nodestore/backend/NuDBFactory.cpp | 26 + src/libxrpl/nodestore/backend/NullFactory.cpp | 11 + .../nodestore/backend/RocksDBFactory.cpp | 22 + src/libxrpl/protocol/AMMCore.cpp | 8 + src/libxrpl/protocol/AccountID.cpp | 10 + src/libxrpl/protocol/Asset.cpp | 9 + src/libxrpl/protocol/Book.cpp | 5 + src/libxrpl/protocol/BuildInfo.cpp | 8 + src/libxrpl/protocol/ErrorCodes.cpp | 9 + src/libxrpl/protocol/Feature.cpp | 29 + src/libxrpl/protocol/IOUAmount.cpp | 11 + src/libxrpl/protocol/Indexes.cpp | 56 ++ src/libxrpl/protocol/InnerObjectFormats.cpp | 4 + src/libxrpl/protocol/Issue.cpp | 10 + src/libxrpl/protocol/Keylet.cpp | 2 + src/libxrpl/protocol/LedgerFormats.cpp | 4 + src/libxrpl/protocol/LedgerHeader.cpp | 5 + src/libxrpl/protocol/MPTAmount.cpp | 8 + src/libxrpl/protocol/MPTIssue.cpp | 8 + .../protocol/NFTSyntheticSerializer.cpp | 2 + src/libxrpl/protocol/NFTokenID.cpp | 5 + src/libxrpl/protocol/NFTokenOfferID.cpp | 4 + src/libxrpl/protocol/PathAsset.cpp | 3 + src/libxrpl/protocol/Permissions.cpp | 11 + src/libxrpl/protocol/Protocol.cpp | 3 + src/libxrpl/protocol/PublicKey.cpp | 14 + src/libxrpl/protocol/Quality.cpp | 13 + src/libxrpl/protocol/QualityFunction.cpp | 4 + src/libxrpl/protocol/RPCErr.cpp | 3 + src/libxrpl/protocol/Rate2.cpp | 9 + src/libxrpl/protocol/Rules.cpp | 14 + src/libxrpl/protocol/SField.cpp | 6 + src/libxrpl/protocol/SOTemplate.cpp | 3 + src/libxrpl/protocol/STAccount.cpp | 9 + src/libxrpl/protocol/STAmount.cpp | 57 ++ src/libxrpl/protocol/STArray.cpp | 15 + src/libxrpl/protocol/STBase.cpp | 18 + src/libxrpl/protocol/STBlob.cpp | 8 + src/libxrpl/protocol/STCurrency.cpp | 11 + src/libxrpl/protocol/STInteger.cpp | 16 + src/libxrpl/protocol/STIssue.cpp | 10 + src/libxrpl/protocol/STLedgerEntry.cpp | 13 + src/libxrpl/protocol/STNumber.cpp | 15 + src/libxrpl/protocol/STObject.cpp | 17 + src/libxrpl/protocol/STParsedJSON.cpp | 23 + src/libxrpl/protocol/STPathSet.cpp | 12 + src/libxrpl/protocol/STTakesAsset.cpp | 2 + src/libxrpl/protocol/STTx.cpp | 39 ++ src/libxrpl/protocol/STValidation.cpp | 13 + src/libxrpl/protocol/STVar.cpp | 10 + src/libxrpl/protocol/STVector256.cpp | 9 + src/libxrpl/protocol/STXChainBridge.cpp | 11 + src/libxrpl/protocol/SecretKey.cpp | 19 + src/libxrpl/protocol/Seed.cpp | 9 + src/libxrpl/protocol/Serializer.cpp | 41 ++ src/libxrpl/protocol/Sign.cpp | 5 + src/libxrpl/protocol/TER.cpp | 6 + src/libxrpl/protocol/TxFormats.cpp | 4 + src/libxrpl/protocol/TxMeta.cpp | 10 + src/libxrpl/protocol/UintTypes.cpp | 7 + src/libxrpl/protocol/XChainAttestations.cpp | 31 ++ src/libxrpl/protocol/digest.cpp | 10 + src/libxrpl/protocol/tokens.cpp | 17 + src/libxrpl/rdb/DatabaseCon.cpp | 7 + src/libxrpl/rdb/SociDB.cpp | 21 + src/libxrpl/resource/Charge.cpp | 8 + src/libxrpl/resource/Consumer.cpp | 14 + src/libxrpl/resource/ResourceManager.cpp | 14 + src/libxrpl/server/InfoSub.cpp | 13 + src/libxrpl/server/JSONRPCUtil.cpp | 3 + src/libxrpl/server/LoadFeeTrack.cpp | 4 + src/libxrpl/server/Manifest.cpp | 22 + src/libxrpl/server/Port.cpp | 6 + src/libxrpl/server/State.cpp | 7 + src/libxrpl/server/Vacuum.cpp | 2 + src/libxrpl/server/Wallet.cpp | 15 + src/libxrpl/shamap/SHAMap.cpp | 49 ++ src/libxrpl/shamap/SHAMapDelta.cpp | 5 + src/libxrpl/shamap/SHAMapInnerNode.cpp | 21 + src/libxrpl/shamap/SHAMapLeafNode.cpp | 7 + src/libxrpl/shamap/SHAMapNodeID.cpp | 8 + src/libxrpl/shamap/SHAMapSync.cpp | 16 + src/libxrpl/shamap/SHAMapTreeNode.cpp | 7 + src/libxrpl/tx/ApplyContext.cpp | 9 + src/libxrpl/tx/SignerEntries.cpp | 2 + src/libxrpl/tx/Transactor.cpp | 36 ++ src/libxrpl/tx/apply.cpp | 8 + src/libxrpl/tx/applySteps.cpp | 20 + src/libxrpl/tx/invariants/AMMInvariant.cpp | 12 + src/libxrpl/tx/invariants/FreezeInvariant.cpp | 10 + src/libxrpl/tx/invariants/InvariantCheck.cpp | 30 ++ .../tx/invariants/LoanBrokerInvariant.cpp | 4 + src/libxrpl/tx/invariants/LoanInvariant.cpp | 3 + src/libxrpl/tx/invariants/MPTInvariant.cpp | 5 + src/libxrpl/tx/invariants/NFTInvariant.cpp | 5 + .../invariants/PermissionedDEXInvariant.cpp | 3 + .../PermissionedDomainInvariant.cpp | 3 + src/libxrpl/tx/invariants/VaultInvariant.cpp | 7 + src/libxrpl/tx/paths/AMMLiquidity.cpp | 6 + src/libxrpl/tx/paths/AMMOffer.cpp | 10 + src/libxrpl/tx/paths/BookStep.cpp | 56 ++ src/libxrpl/tx/paths/BookTip.cpp | 2 + src/libxrpl/tx/paths/DirectStep.cpp | 38 ++ src/libxrpl/tx/paths/Flow.cpp | 3 + src/libxrpl/tx/paths/MPTEndpointStep.cpp | 36 ++ src/libxrpl/tx/paths/OfferStream.cpp | 8 + src/libxrpl/tx/paths/PaySteps.cpp | 6 + src/libxrpl/tx/paths/RippleCalc.cpp | 2 + src/libxrpl/tx/paths/XRPEndpointStep.cpp | 24 + .../tx/transactors/account/AccountDelete.cpp | 17 + .../tx/transactors/account/AccountSet.cpp | 8 + .../tx/transactors/account/SetRegularKey.cpp | 5 + .../tx/transactors/account/SignerListSet.cpp | 14 + .../tx/transactors/bridge/XChainBridge.cpp | 53 ++ .../tx/transactors/check/CheckCancel.cpp | 5 + .../tx/transactors/check/CheckCash.cpp | 6 + .../tx/transactors/check/CheckCreate.cpp | 6 + .../credentials/CredentialAccept.cpp | 6 + .../credentials/CredentialCreate.cpp | 6 + .../credentials/CredentialDelete.cpp | 6 + .../tx/transactors/delegate/DelegateSet.cpp | 6 + .../tx/transactors/delegate/DelegateUtils.cpp | 3 + src/libxrpl/tx/transactors/dex/AMMBid.cpp | 7 + .../tx/transactors/dex/AMMClawback.cpp | 9 + src/libxrpl/tx/transactors/dex/AMMCreate.cpp | 8 + src/libxrpl/tx/transactors/dex/AMMDelete.cpp | 6 + src/libxrpl/tx/transactors/dex/AMMDeposit.cpp | 16 + src/libxrpl/tx/transactors/dex/AMMVote.cpp | 7 + .../tx/transactors/dex/AMMWithdraw.cpp | 20 + .../tx/transactors/dex/OfferCancel.cpp | 5 + .../tx/transactors/dex/OfferCreate.cpp | 13 + src/libxrpl/tx/transactors/did/DIDDelete.cpp | 6 + src/libxrpl/tx/transactors/did/DIDSet.cpp | 5 + .../tx/transactors/escrow/EscrowCancel.cpp | 7 + .../tx/transactors/escrow/EscrowCreate.cpp | 12 + .../tx/transactors/escrow/EscrowFinish.cpp | 11 + .../lending/LoanBrokerCoverClawback.cpp | 11 + .../lending/LoanBrokerCoverDeposit.cpp | 6 + .../lending/LoanBrokerCoverWithdraw.cpp | 6 + .../transactors/lending/LoanBrokerDelete.cpp | 6 + .../tx/transactors/lending/LoanBrokerSet.cpp | 7 + .../tx/transactors/lending/LoanDelete.cpp | 6 + .../tx/transactors/lending/LoanManage.cpp | 11 + .../tx/transactors/lending/LoanPay.cpp | 8 + .../tx/transactors/lending/LoanSet.cpp | 11 + .../tx/transactors/nft/NFTokenAcceptOffer.cpp | 8 + .../tx/transactors/nft/NFTokenBurn.cpp | 5 + .../tx/transactors/nft/NFTokenCancelOffer.cpp | 5 + .../tx/transactors/nft/NFTokenCreateOffer.cpp | 6 + .../tx/transactors/nft/NFTokenMint.cpp | 10 + .../tx/transactors/nft/NFTokenModify.cpp | 5 + .../tx/transactors/oracle/OracleDelete.cpp | 6 + .../tx/transactors/oracle/OracleSet.cpp | 8 + .../tx/transactors/payment/DepositPreauth.cpp | 7 + .../tx/transactors/payment/Payment.cpp | 10 + .../payment_channel/PaymentChannelClaim.cpp | 7 + .../payment_channel/PaymentChannelCreate.cpp | 6 + .../payment_channel/PaymentChannelFund.cpp | 5 + .../PermissionedDomainDelete.cpp | 5 + .../PermissionedDomainSet.cpp | 6 + src/libxrpl/tx/transactors/system/Batch.cpp | 8 + src/libxrpl/tx/transactors/system/Change.cpp | 9 + .../tx/transactors/system/LedgerStateFix.cpp | 6 + .../tx/transactors/system/TicketCreate.cpp | 6 + src/libxrpl/tx/transactors/token/Clawback.cpp | 11 + .../tx/transactors/token/MPTokenAuthorize.cpp | 6 + .../token/MPTokenIssuanceCreate.cpp | 7 + .../token/MPTokenIssuanceDestroy.cpp | 5 + .../transactors/token/MPTokenIssuanceSet.cpp | 8 + src/libxrpl/tx/transactors/token/TrustSet.cpp | 8 + .../tx/transactors/vault/VaultClawback.cpp | 7 + .../tx/transactors/vault/VaultCreate.cpp | 7 + .../tx/transactors/vault/VaultDelete.cpp | 5 + .../tx/transactors/vault/VaultDeposit.cpp | 5 + src/libxrpl/tx/transactors/vault/VaultSet.cpp | 6 + .../tx/transactors/vault/VaultWithdraw.cpp | 5 + .../app/consensus/RCLCensorshipDetector.h | 7 + src/xrpld/app/consensus/RCLConsensus.cpp | 35 ++ src/xrpld/app/consensus/RCLConsensus.h | 14 + src/xrpld/app/consensus/RCLCxLedger.h | 9 + src/xrpld/app/consensus/RCLCxPeerPos.cpp | 5 + src/xrpld/app/consensus/RCLCxPeerPos.h | 7 + src/xrpld/app/consensus/RCLCxTx.h | 8 + src/xrpld/app/consensus/RCLValidations.cpp | 10 + src/xrpld/app/consensus/RCLValidations.h | 15 + src/xrpld/app/ledger/AcceptedLedger.cpp | 2 + src/xrpld/app/ledger/AcceptedLedger.h | 5 + src/xrpld/app/ledger/AccountStateSF.cpp | 3 + src/xrpld/app/ledger/ConsensusTransSetSF.cpp | 3 + src/xrpld/app/ledger/InboundLedger.h | 7 + src/xrpld/app/ledger/LedgerHistory.cpp | 13 + src/xrpld/app/ledger/LedgerHistory.h | 3 + src/xrpld/app/ledger/LedgerHolder.h | 4 + src/xrpld/app/ledger/LedgerMaster.h | 4 + src/xrpld/app/ledger/LedgerReplay.h | 4 + src/xrpld/app/ledger/LedgerReplayTask.h | 2 + src/xrpld/app/ledger/LedgerReplayer.h | 4 + src/xrpld/app/ledger/LedgerToJson.h | 2 + src/xrpld/app/ledger/OpenLedger.h | 2 + src/xrpld/app/ledger/OrderBookDBImpl.cpp | 11 + src/xrpld/app/ledger/TransactionStateSF.cpp | 3 + src/xrpld/app/ledger/detail/BuildLedger.cpp | 5 + src/xrpld/app/ledger/detail/InboundLedger.cpp | 29 + .../app/ledger/detail/InboundLedgers.cpp | 17 + .../app/ledger/detail/InboundTransactions.cpp | 11 + src/xrpld/app/ledger/detail/LedgerCleaner.cpp | 12 + .../app/ledger/detail/LedgerDeltaAcquire.cpp | 12 + src/xrpld/app/ledger/detail/LedgerMaster.cpp | 71 +++ .../app/ledger/detail/LedgerPersistence.cpp | 8 + src/xrpld/app/ledger/detail/LedgerReplay.cpp | 2 + .../ledger/detail/LedgerReplayMsgHandler.cpp | 5 + .../app/ledger/detail/LedgerReplayTask.cpp | 15 + .../app/ledger/detail/LedgerReplayer.cpp | 8 + src/xrpld/app/ledger/detail/LedgerToJson.cpp | 14 + src/xrpld/app/ledger/detail/LocalTxs.cpp | 12 + src/xrpld/app/ledger/detail/OpenLedger.cpp | 11 + .../app/ledger/detail/SkipListAcquire.cpp | 13 + .../app/ledger/detail/TimeoutCounter.cpp | 6 + src/xrpld/app/ledger/detail/TimeoutCounter.h | 2 + .../app/ledger/detail/TransactionAcquire.cpp | 10 + .../app/ledger/detail/TransactionMaster.cpp | 9 + src/xrpld/app/main/Application.cpp | 83 +++ src/xrpld/app/main/BasicApp.cpp | 3 + src/xrpld/app/main/BasicApp.h | 3 + src/xrpld/app/main/CollectorManager.cpp | 5 + src/xrpld/app/main/GRPCServer.cpp | 26 + src/xrpld/app/main/LoadManager.cpp | 8 + src/xrpld/app/main/Main.cpp | 22 + src/xrpld/app/main/NodeIdentity.cpp | 2 + src/xrpld/app/main/NodeStoreScheduler.cpp | 4 + src/xrpld/app/misc/FeeVoteImpl.cpp | 9 + src/xrpld/app/misc/NegativeUNLVote.cpp | 8 + src/xrpld/app/misc/NetworkOPs.cpp | 110 ++++ src/xrpld/app/misc/SHAMapStoreImp.cpp | 24 + src/xrpld/app/misc/SHAMapStoreImp.h | 8 + src/xrpld/app/misc/Transaction.h | 27 + src/xrpld/app/misc/TxQ.h | 9 + src/xrpld/app/misc/ValidatorKeys.h | 2 + src/xrpld/app/misc/ValidatorList.h | 9 + src/xrpld/app/misc/detail/AccountTxPaging.cpp | 3 + src/xrpld/app/misc/detail/AmendmentTable.cpp | 33 ++ src/xrpld/app/misc/detail/DeliverMax.cpp | 2 + src/xrpld/app/misc/detail/Transaction.cpp | 9 + src/xrpld/app/misc/detail/TxQ.cpp | 32 ++ src/xrpld/app/misc/detail/ValidatorKeys.cpp | 2 + src/xrpld/app/misc/detail/ValidatorList.cpp | 55 ++ src/xrpld/app/misc/detail/ValidatorSite.cpp | 17 + src/xrpld/app/misc/detail/WorkBase.h | 12 + src/xrpld/app/misc/detail/WorkFile.h | 4 + src/xrpld/app/misc/detail/WorkPlain.h | 3 + src/xrpld/app/misc/detail/WorkSSL.cpp | 4 + src/xrpld/app/misc/detail/WorkSSL.h | 2 + .../app/misc/detail/setup_HashRouter.cpp | 2 + src/xrpld/app/rdb/backend/detail/Node.cpp | 32 ++ .../app/rdb/backend/detail/SQLiteDatabase.cpp | 42 ++ src/xrpld/app/rdb/detail/PeerFinder.cpp | 5 + src/xrpld/consensus/Consensus.cpp | 4 + src/xrpld/consensus/Consensus.h | 28 + src/xrpld/consensus/ConsensusParms.h | 2 + src/xrpld/consensus/ConsensusProposal.h | 16 + src/xrpld/consensus/ConsensusTypes.h | 7 + src/xrpld/consensus/DisputedTx.h | 11 + src/xrpld/consensus/LedgerTrie.h | 28 + src/xrpld/consensus/Validations.h | 35 ++ src/xrpld/core/Config.h | 8 + src/xrpld/core/ConfigSections.h | 3 + src/xrpld/core/TimeKeeper.h | 5 + src/xrpld/core/detail/Config.cpp | 17 + .../core/detail/NetworkIDServiceImpl.cpp | 2 + src/xrpld/overlay/Cluster.h | 4 + src/xrpld/overlay/ClusterNode.h | 5 + src/xrpld/overlay/Compression.h | 3 + src/xrpld/overlay/Message.h | 3 + src/xrpld/overlay/Overlay.h | 2 + src/xrpld/overlay/PeerSet.h | 2 + src/xrpld/overlay/Slot.h | 27 + src/xrpld/overlay/Squelch.h | 4 + src/xrpld/overlay/detail/Cluster.cpp | 6 + src/xrpld/overlay/detail/ConnectAttempt.cpp | 18 + src/xrpld/overlay/detail/ConnectAttempt.h | 3 + src/xrpld/overlay/detail/Handshake.cpp | 12 + src/xrpld/overlay/detail/Handshake.h | 3 + src/xrpld/overlay/detail/Message.cpp | 9 + src/xrpld/overlay/detail/OverlayImpl.cpp | 58 ++ src/xrpld/overlay/detail/OverlayImpl.h | 18 + src/xrpld/overlay/detail/PeerImp.cpp | 83 +++ src/xrpld/overlay/detail/PeerImp.h | 17 + .../overlay/detail/PeerReservationTable.cpp | 6 + src/xrpld/overlay/detail/PeerSet.cpp | 10 + src/xrpld/overlay/detail/ProtocolMessage.h | 11 + src/xrpld/overlay/detail/ProtocolVersion.cpp | 7 + src/xrpld/overlay/detail/ProtocolVersion.h | 1 + src/xrpld/overlay/detail/TrafficCount.cpp | 2 + src/xrpld/overlay/detail/TrafficCount.h | 5 + src/xrpld/overlay/detail/TxMetrics.cpp | 8 + src/xrpld/overlay/detail/ZeroCopyStream.h | 9 + src/xrpld/overlay/predicates.h | 9 + src/xrpld/peerfinder/PeerfinderManager.h | 3 + src/xrpld/peerfinder/detail/Bootcache.cpp | 20 + src/xrpld/peerfinder/detail/Bootcache.h | 5 + src/xrpld/peerfinder/detail/Checker.h | 9 + src/xrpld/peerfinder/detail/Counts.h | 24 + src/xrpld/peerfinder/detail/Fixed.h | 4 + src/xrpld/peerfinder/detail/Handouts.h | 22 + src/xrpld/peerfinder/detail/Livecache.h | 36 ++ src/xrpld/peerfinder/detail/Logic.h | 35 ++ .../peerfinder/detail/PeerfinderConfig.cpp | 6 + .../peerfinder/detail/PeerfinderManager.cpp | 24 + src/xrpld/peerfinder/detail/SlotImp.cpp | 6 + src/xrpld/peerfinder/detail/SlotImp.h | 16 + src/xrpld/peerfinder/detail/SourceStrings.cpp | 4 + src/xrpld/peerfinder/detail/StoreSqdb.h | 6 + src/xrpld/peerfinder/detail/iosformat.h | 13 + src/xrpld/perflog/detail/PerfLogImp.cpp | 20 + src/xrpld/rpc/BookChanges.h | 2 + src/xrpld/rpc/CTID.h | 3 + src/xrpld/rpc/Output.h | 2 + src/xrpld/rpc/ServerHandler.h | 5 + src/xrpld/rpc/Status.h | 8 + src/xrpld/rpc/detail/AccountAssets.cpp | 3 + src/xrpld/rpc/detail/AssetCache.cpp | 5 + src/xrpld/rpc/detail/AssetCache.h | 5 + src/xrpld/rpc/detail/DeliveredAmount.cpp | 8 + src/xrpld/rpc/detail/Handler.cpp | 12 + src/xrpld/rpc/detail/Handler.h | 3 + src/xrpld/rpc/detail/LegacyPathFind.cpp | 3 + src/xrpld/rpc/detail/LegacyPathFind.h | 2 + src/xrpld/rpc/detail/MPT.h | 5 + src/xrpld/rpc/detail/MPTokenIssuanceID.cpp | 4 + src/xrpld/rpc/detail/PathRequest.cpp | 18 + src/xrpld/rpc/detail/PathRequestManager.cpp | 8 + src/xrpld/rpc/detail/PathRequestManager.h | 4 + src/xrpld/rpc/detail/Pathfinder.cpp | 26 + src/xrpld/rpc/detail/PathfinderUtils.h | 4 + src/xrpld/rpc/detail/RPCCall.cpp | 38 ++ src/xrpld/rpc/detail/RPCHandler.cpp | 5 + src/xrpld/rpc/detail/RPCHelpers.cpp | 11 + src/xrpld/rpc/detail/RPCLedgerHelpers.cpp | 13 + src/xrpld/rpc/detail/RPCSub.cpp | 7 + src/xrpld/rpc/detail/Role.cpp | 10 + src/xrpld/rpc/detail/ServerHandler.cpp | 30 ++ src/xrpld/rpc/detail/Status.cpp | 5 + src/xrpld/rpc/detail/TransactionSign.cpp | 27 + src/xrpld/rpc/detail/TransactionSign.h | 2 + src/xrpld/rpc/detail/TrustLine.cpp | 8 + src/xrpld/rpc/detail/TrustLine.h | 19 + src/xrpld/rpc/detail/WSInfoSub.h | 5 + src/xrpld/rpc/handlers/ChannelVerify.cpp | 2 + src/xrpld/rpc/handlers/VaultInfo.cpp | 3 + .../rpc/handlers/account/AccountChannels.cpp | 3 + .../handlers/account/AccountCurrencies.cpp | 2 + .../rpc/handlers/account/AccountInfo.cpp | 3 + .../rpc/handlers/account/AccountLines.cpp | 3 + .../rpc/handlers/account/AccountNFTs.cpp | 2 + .../rpc/handlers/account/AccountObjects.cpp | 3 + .../rpc/handlers/account/AccountOffers.cpp | 3 + src/xrpld/rpc/handlers/account/AccountTx.cpp | 6 + .../rpc/handlers/account/GatewayBalances.cpp | 2 + .../rpc/handlers/account/NoRippleCheck.cpp | 3 + src/xrpld/rpc/handlers/account/OwnerInfo.cpp | 2 + src/xrpld/rpc/handlers/admin/BlackList.cpp | 2 + src/xrpld/rpc/handlers/admin/UnlList.cpp | 2 + .../rpc/handlers/admin/data/LedgerCleaner.cpp | 2 + .../rpc/handlers/admin/data/LedgerRequest.cpp | 2 + .../admin/keygen/ValidationCreate.cpp | 3 + .../handlers/admin/keygen/WalletPropose.cpp | 4 + src/xrpld/rpc/handlers/admin/log/LogLevel.cpp | 2 + .../rpc/handlers/admin/log/LogRotate.cpp | 2 + src/xrpld/rpc/handlers/admin/peer/Connect.cpp | 2 + .../admin/peer/PeerReservationsAdd.cpp | 2 + .../admin/peer/PeerReservationsDel.cpp | 2 + .../admin/peer/PeerReservationsList.cpp | 2 + src/xrpld/rpc/handlers/admin/peer/Peers.cpp | 2 + .../admin/server_control/LedgerAccept.cpp | 2 + .../handlers/admin/server_control/Stop.cpp | 2 + .../admin/signing/ChannelAuthorize.cpp | 2 + src/xrpld/rpc/handlers/admin/signing/Sign.cpp | 2 + .../rpc/handlers/admin/signing/SignFor.cpp | 2 + .../handlers/admin/status/ConsensusInfo.cpp | 2 + .../rpc/handlers/admin/status/FetchInfo.cpp | 2 + .../rpc/handlers/admin/status/GetCounts.cpp | 4 + src/xrpld/rpc/handlers/admin/status/Print.cpp | 2 + .../handlers/admin/status/ValidatorInfo.cpp | 2 + .../admin/status/ValidatorListSites.cpp | 2 + .../rpc/handlers/admin/status/Validators.cpp | 2 + src/xrpld/rpc/handlers/ledger/Ledger.cpp | 4 + .../rpc/handlers/ledger/LedgerClosed.cpp | 2 + .../rpc/handlers/ledger/LedgerCurrent.cpp | 2 + src/xrpld/rpc/handlers/ledger/LedgerData.cpp | 3 + src/xrpld/rpc/handlers/ledger/LedgerDiff.cpp | 2 + src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp | 35 ++ .../rpc/handlers/ledger/LedgerHeader.cpp | 2 + src/xrpld/rpc/handlers/orderbook/AMMInfo.cpp | 4 + .../rpc/handlers/orderbook/BookChanges.cpp | 2 + .../rpc/handlers/orderbook/BookOffers.cpp | 5 + .../handlers/orderbook/GetAggregatePrice.cpp | 3 + .../rpc/handlers/orderbook/NFTBuyOffers.cpp | 2 + .../rpc/handlers/orderbook/NFTSellOffers.cpp | 2 + src/xrpld/rpc/handlers/orderbook/PathFind.cpp | 2 + .../rpc/handlers/orderbook/RipplePathFind.cpp | 2 + .../rpc/handlers/server_info/Feature.cpp | 2 + src/xrpld/rpc/handlers/server_info/Fee.cpp | 2 + .../rpc/handlers/server_info/Manifest.cpp | 2 + .../server_info/ServerDefinitions.cpp | 7 + .../rpc/handlers/server_info/ServerInfo.cpp | 2 + .../rpc/handlers/server_info/ServerState.cpp | 2 + .../rpc/handlers/subscribe/Subscribe.cpp | 2 + .../rpc/handlers/subscribe/Unsubscribe.cpp | 2 + .../rpc/handlers/transaction/Simulate.cpp | 7 + src/xrpld/rpc/handlers/transaction/Submit.cpp | 3 + .../transaction/SubmitMultiSigned.cpp | 2 + .../handlers/transaction/TransactionEntry.cpp | 2 + src/xrpld/rpc/handlers/transaction/Tx.cpp | 5 + .../rpc/handlers/transaction/TxHistory.cpp | 2 + .../handlers/transaction/TxReduceRelay.cpp | 2 + src/xrpld/rpc/handlers/utility/Ping.cpp | 2 + src/xrpld/rpc/handlers/utility/Random.cpp | 2 + src/xrpld/rpc/json_body.h | 5 + src/xrpld/shamap/NodeFamily.cpp | 5 + 498 files changed, 6214 insertions(+), 2 deletions(-) create mode 100644 bin/add_trace_logging.py create mode 100644 include/xrpl/basics/TraceLog.h create mode 100644 src/libxrpl/basics/TraceLog.cpp diff --git a/bin/add_trace_logging.py b/bin/add_trace_logging.py new file mode 100644 index 0000000000..8dbfc3705c --- /dev/null +++ b/bin/add_trace_logging.py @@ -0,0 +1,499 @@ +#!/usr/bin/env python3 +""" +Instrument every function in the rippled codebase with TRACE_FUNC(). + +Adds an RAII trace scope to every function body that logs: + - ENTER on function entry (with file:line) + - EXIT on function exit (with file:line and duration in microseconds) + +Usage: + python3 bin/add_trace_logging.py [--dry-run] [--verbose] [--dir path] +""" + +import argparse +import os +import re +import sys +from pathlib import Path + +TRACE_INCLUDE = '#include ' +TRACE_CALL = ' TRACE_FUNC();' + +# Control-flow keywords that produce a '{' on its own line +# (due to AfterControlStatement: true in .clang-format) +CONTROL_KW_RE = re.compile( + r'^\s*(' + r'if\s*\(|' + r'else\s*if\s*\(|' + r'else\s*$|' + r'for\s*\(|' + r'while\s*\(|' + r'do\s*$|' + r'switch\s*\(|' + r'try\s*$|' + r'catch\s*\(' + r')' +) + +# Structural keywords (class/struct/enum/union) — brace on own line +STRUCT_KW_RE = re.compile( + r'^\s*(class|struct|enum|union)\b' +) + +# Namespace — AfterNamespace: false so '{' is on same line, +# but handle edge cases where someone puts it on next line +NAMESPACE_RE = re.compile(r'^\s*namespace\b') + +# Lambda capture: line contains ] possibly followed by () and qualifiers +LAMBDA_RE = re.compile(r'\]\s*(\([^)]*\))?\s*(mutable\s*)?(noexcept\s*)?' + r'(->[\s\S]*)?\s*$') + +# Function ending: line ends with ) and optional qualifiers +FUNC_END_RE = re.compile( + r'\)\s*' + r'(const\s*)?' + r'(volatile\s*)?' + r'(noexcept(\([^)]*\))?\s*)?' + r'(override\s*)?' + r'(final\s*)?' + r'(requires\s*\([^)]*\)\s*)?' + r'(->[\s\w:<>,*&]+\s*)?' + r'\s*$' +) + +# Constructor initializer list line: starts with : or , for member init +INIT_LIST_RE = re.compile(r'^\s*[,:]\s+\w') + +# Macro-like patterns to skip +MACRO_RE = re.compile(r'^\s*\\?\s*$') + + +def find_source_files(root, dirs, extensions=('.cpp',), exclude_dirs=None): + """Find all source files under given directories.""" + if exclude_dirs is None: + exclude_dirs = {'tests', 'test'} + + files = [] + for d in dirs: + search_dir = root / d + if not search_dir.exists(): + continue + for ext in extensions: + for f in sorted(search_dir.rglob(f'*{ext}')): + # Skip test directories + parts = f.relative_to(root).parts + if any(p in exclude_dirs for p in parts): + continue + files.append(f) + return files + + +def find_template_headers(root): + """Find .h files with template implementations that need instrumentation.""" + headers = [] + # These directories have header-only template implementations + template_dirs = [ + 'src/xrpld/consensus', + 'src/xrpld/overlay', + 'src/xrpld/overlay/detail', + 'src/xrpld/peerfinder', + 'src/xrpld/peerfinder/detail', + 'src/xrpld/app/consensus', + 'src/xrpld/app/ledger', + 'src/xrpld/app/ledger/detail', + 'src/xrpld/app/misc', + 'src/xrpld/app/misc/detail', + 'src/xrpld/app/main', + 'src/xrpld/rpc', + 'src/xrpld/rpc/detail', + 'src/xrpld/core', + 'src/xrpld/core/detail', + ] + for d in template_dirs: + search_dir = root / d + if not search_dir.exists(): + continue + for f in sorted(search_dir.glob('*.h')): + headers.append(f) + + # Also include key libxrpl headers with implementations + libxrpl_dirs = [ + 'include/xrpl/shamap', + 'include/xrpl/basics', + 'include/xrpl/protocol', + ] + for d in libxrpl_dirs: + search_dir = root / d + if not search_dir.exists(): + continue + for f in sorted(search_dir.glob('*.h')): + # Skip TraceLog.h itself + if f.name == 'TraceLog.h': + continue + headers.append(f) + + return headers + + +def add_include(lines): + """Add the TraceLog.h include if not already present. Returns modified lines.""" + # Check if already included + for line in lines: + if 'TraceLog.h' in line: + return lines, False + + # Find insertion point: after last #include or + last_xrpl_idx = -1 + last_xrpld_idx = -1 + last_include_idx = -1 + + for i, line in enumerate(lines): + stripped = line.strip() + if stripped.startswith('#include'): + last_include_idx = i + if '= 0: + insert_at = last_xrpl_idx + 1 + elif last_xrpld_idx >= 0: + # Insert after the xrpld block, with a blank line before xrpl includes + insert_at = last_xrpld_idx + 1 + else: + insert_at = last_include_idx + 1 + + lines.insert(insert_at, TRACE_INCLUDE + '\n') + return lines, True + + +def get_prev_nonblank(lines, idx): + """Get the index of the previous non-blank line before idx.""" + i = idx - 1 + while i >= 0: + if lines[i].strip(): + return i + i -= 1 + return -1 + + +def find_matching_open_paren_line(lines, start_idx): + """ + Starting from start_idx, walk backwards through lines to find the line + containing the '(' that matches the last ')' on start_idx's line. + Returns the line index, or -1 if not found. + Uses character-level paren tracking for accuracy. + """ + depth = 0 + for scan in range(start_idx, max(start_idx - 30, -1), -1): + line = lines[scan].rstrip() + for ch in reversed(line): + if ch == ')': + depth += 1 + elif ch == '(': + depth -= 1 + if depth == 0: + return scan + return -1 + + +def is_lambda(lines, brace_idx): + """Check if the '{' at brace_idx opens a lambda body.""" + # Walk back up to 5 non-blank lines looking for ] (lambda capture close) + prev = brace_idx - 1 + checked = 0 + while prev >= 0 and checked < 6: + line = lines[prev].rstrip() + if not line.strip(): + prev -= 1 + continue + # Lambda pattern: line contains ']' possibly followed by () qualifiers + if ']' in line: + # Skip C++ attributes like [[nodiscard]], [[maybe_unused]], etc. + # Attributes use [[ ]] (double brackets) + stripped = line.strip() + if re.match(r'^\[\[', stripped): + # This is a C++ attribute, not a lambda + checked += 1 + prev -= 1 + continue + # Also skip ]] patterns mid-line (attributes in return types) + if ']]' in line and '[[' in line: + checked += 1 + prev -= 1 + continue + + # Check for actual lambda pattern: ] followed by ( or { or mutable + # Lambda captures end with ] then optional (params) or {body} + if re.search(r'\]\s*(\([^)]*\))?\s*(mutable\s*)?(noexcept\s*)?' + r'(->[\s\S]*)?\s*$', line): + return True + # Stop walking back at scope boundaries + if line.strip().startswith('{') or line.strip().startswith('}'): + break + if line.strip().startswith('#'): + break + checked += 1 + prev -= 1 + return False + + +def is_function_body(lines, brace_idx): + """ + Determine if the '{' at brace_idx opens a function body. + + Returns True if this looks like a function definition, False otherwise. + """ + prev_idx = get_prev_nonblank(lines, brace_idx) + if prev_idx < 0: + return False + + prev_line = lines[prev_idx].rstrip() + + # Skip if preceded by a single-line control keyword + if CONTROL_KW_RE.match(prev_line): + return False + + # Skip namespace + if NAMESPACE_RE.match(prev_line): + return False + + # Skip class/struct/enum/union + if STRUCT_KW_RE.match(prev_line): + return False + + # Skip lambdas + if is_lambda(lines, brace_idx): + return False + + # Case 1: Previous line ends with ) + optional qualifiers + if FUNC_END_RE.search(prev_line): + # Walk back to find the line with the matching '(' + open_paren_line = find_matching_open_paren_line(lines, prev_idx) + if open_paren_line >= 0: + # Check if that line (or preceding lines) is a control keyword + line = lines[open_paren_line].rstrip() + if CONTROL_KW_RE.match(line): + return False + # Also check the line before (for multi-line: "else\n if(...)") + prev_kw = get_prev_nonblank(lines, open_paren_line) + if prev_kw >= 0: + kw_line = lines[prev_kw].rstrip() + if re.match(r'^\s*else\s*$', kw_line): + return False + return True + + # Case 2: Constructor initializer list — line starts with , or : + if INIT_LIST_RE.match(prev_line): + # Walk back through initializer list to find constructor signature + scan = prev_idx - 1 + while scan >= 0: + line = lines[scan].rstrip() + if FUNC_END_RE.search(line): + return True + if not INIT_LIST_RE.match(line) and ')' not in line: + break + scan -= 1 + # Even if we can't find the signature, an init list implies constructor + return True + + # Case 3: Previous line ends with something unusual — check a few + # lines back for a ')' that might be part of a function signature + # (e.g., trailing requires clause or -> return type on separate line) + for lookback in range(1, 4): + check_idx = prev_idx - lookback + if check_idx < 0: + break + check_line = lines[check_idx].rstrip() + if check_line.strip() == '' or check_line.strip().startswith('#'): + break + if FUNC_END_RE.search(check_line): + open_paren_line = find_matching_open_paren_line( + lines, check_idx) + if open_paren_line >= 0: + if CONTROL_KW_RE.match(lines[open_paren_line].rstrip()): + return False + return True + + return False + + +def is_empty_body(lines, brace_idx): + """Check if the function body is empty (next non-blank line is '}').""" + i = brace_idx + 1 + while i < len(lines): + stripped = lines[i].strip() + if stripped: + return stripped == '}' + i += 1 + return True + + +def already_has_trace(lines, brace_idx): + """Check if TRACE_FUNC is already the first statement.""" + i = brace_idx + 1 + while i < len(lines): + stripped = lines[i].strip() + if stripped: + return 'TRACE_FUNC()' in stripped + i += 1 + return False + + +def get_function_context(lines, brace_idx): + """Try to extract a meaningful function name from the context.""" + prev_idx = get_prev_nonblank(lines, brace_idx) + if prev_idx < 0: + return "unknown" + + # Walk back to find the function name line + scan = prev_idx + while scan >= 0: + line = lines[scan].strip() + # Look for ClassName::methodName or just functionName + match = re.search(r'(\w+(?:::\w+)?)\s*\(', line) + if match: + return match.group(1) + if line.startswith('#') or line == '': + break + scan -= 1 + + return lines[prev_idx].strip()[:60] + + +def instrument_file(filepath, dry_run=False, verbose=False): + """ + Add TRACE_FUNC() to every function body in the given file. + Returns (functions_found, include_added) tuple. + """ + with open(filepath, 'r') as f: + lines = f.readlines() + + original_lines = list(lines) + functions_found = 0 + insertions = [] # (line_index, context_string) + + # Pass 1: Find all function body openings + # Track brace depth to skip nested blocks inside functions + brace_depth = 0 + in_function = False + i = 0 + while i < len(lines): + line = lines[i] + stripped = line.strip() + + if in_function: + # Count braces to track nesting within the current function + brace_depth += stripped.count('{') - stripped.count('}') + if brace_depth <= 0: + in_function = False + brace_depth = 0 + elif stripped == '{': + if is_function_body(lines, i): + if not is_empty_body(lines, i) and not already_has_trace(lines, i): + ctx = get_function_context(lines, i) + insertions.append((i, ctx)) + functions_found += 1 + in_function = True + brace_depth = 1 + i += 1 + + if functions_found == 0 and not any('TraceLog.h' in l for l in lines): + return 0, False # Nothing to do + + # Pass 2: Add include + include_added = False + if functions_found > 0: + lines, include_added = add_include(lines) + # Adjust insertion indices if include was added + if include_added: + # Find where the include was inserted + for idx in range(len(lines)): + if TRACE_INCLUDE in lines[idx]: + include_line = idx + break + insertions = [ + (i + 1 if i >= include_line else i, ctx) + for i, ctx in insertions + ] + + # Pass 3: Insert TRACE_FUNC() calls (reverse order to preserve indices) + for insert_idx, ctx in reversed(insertions): + lines.insert(insert_idx + 1, TRACE_CALL + '\n') + + if verbose and functions_found > 0: + rel_path = filepath.name + print(f" {rel_path}: {functions_found} functions") + for _, ctx in insertions: + print(f" -> {ctx}") + + if not dry_run and lines != original_lines: + with open(filepath, 'w') as f: + f.writelines(lines) + + return functions_found, include_added + + +def main(): + parser = argparse.ArgumentParser( + description='Add TRACE_FUNC() to every function in the rippled codebase') + parser.add_argument('--dry-run', action='store_true', + help='Print what would change without modifying files') + parser.add_argument('--verbose', '-v', action='store_true', + help='Show each function found') + parser.add_argument('--dir', type=str, default=None, + help='Only process files under this subdirectory') + parser.add_argument('--headers', action='store_true', + help='Also process .h files with template implementations') + parser.add_argument('--root', type=str, default='.', + help='Project root directory') + args = parser.parse_args() + + root = Path(args.root).resolve() + + # Find source files + if args.dir: + dirs = [args.dir] + else: + dirs = ['src/xrpld', 'src/libxrpl'] + + files = find_source_files(root, dirs) + + if args.headers: + files.extend(find_template_headers(root)) + + if not files: + print(f"No source files found under {root}") + sys.exit(1) + + total_functions = 0 + total_includes = 0 + total_files_modified = 0 + + mode = "DRY RUN" if args.dry_run else "INSTRUMENTING" + print(f"[{mode}] Processing {len(files)} files under {root}") + print() + + for filepath in files: + funcs, inc = instrument_file( + filepath, dry_run=args.dry_run, verbose=args.verbose) + if funcs > 0: + total_functions += funcs + total_files_modified += 1 + if inc: + total_includes += 1 + + print() + print(f"{'Would instrument' if args.dry_run else 'Instrumented'}: " + f"{total_functions} functions across {total_files_modified} files") + print(f"{'Would add' if args.dry_run else 'Added'}: " + f"{total_includes} new #include directives") + + +if __name__ == '__main__': + main() diff --git a/include/xrpl/basics/TraceLog.h b/include/xrpl/basics/TraceLog.h new file mode 100644 index 0000000000..de000bead0 --- /dev/null +++ b/include/xrpl/basics/TraceLog.h @@ -0,0 +1,37 @@ +#pragma once + +#include + +namespace xrpl { + +namespace tracing { +void init( + char const* outputPath, + double samplingRate = 1.0, + std::uint64_t maxFileSizeMB = 500, + int maxFiles = 10); +void shutdown(); +} // namespace tracing + +class TraceScope +{ + std::uint64_t spanId_; + std::uint64_t traceId_; + std::uint64_t parentId_; + char const* func_; + char const* file_; + int line_; + std::int64_t startUs_; + bool active_; + +public: + TraceScope(char const* func, char const* file, int line) noexcept; + ~TraceScope() noexcept; + TraceScope(TraceScope const&) = delete; + TraceScope& operator=(TraceScope const&) = delete; +}; + +} // namespace xrpl + +#define TRACE_FUNC() \ + xrpl::TraceScope xrpl_trace_scope_(__func__, __FILE__, __LINE__) diff --git a/include/xrpl/nodestore/Database.h b/include/xrpl/nodestore/Database.h index ca2dde560c..7848e36419 100644 --- a/include/xrpl/nodestore/Database.h +++ b/include/xrpl/nodestore/Database.h @@ -3,12 +3,14 @@ #include #include #include +#include #include #include #include #include #include +#include namespace xrpl::NodeStore { @@ -222,6 +224,12 @@ protected: void importInternal(Backend& dstBackend, Database& srcDB); + void + negCacheErase(uint256 const& hash); + + void + negCacheClear(); + void updateFetchMetrics(uint64_t fetches, uint64_t hits, uint64_t duration) { @@ -251,6 +259,10 @@ private: std::atomic readThreads_ = 0; std::atomic runningThreads_ = 0; + mutable std::mutex negCacheMutex_; + std::unordered_set> negCache_; + static constexpr std::size_t kNegCacheMax = 100'000; + virtual std::shared_ptr fetchNodeObject( uint256 const& hash, diff --git a/include/xrpl/nodestore/detail/DatabaseRotatingImp.h b/include/xrpl/nodestore/detail/DatabaseRotatingImp.h index 39441ef4d8..c5d5648bb7 100644 --- a/include/xrpl/nodestore/detail/DatabaseRotatingImp.h +++ b/include/xrpl/nodestore/detail/DatabaseRotatingImp.h @@ -2,6 +2,7 @@ #include +#include #include namespace xrpl::NodeStore { @@ -59,6 +60,7 @@ private: std::shared_ptr writableBackend_; std::shared_ptr archiveBackend_; mutable std::mutex mutex_; + std::atomic archiveHasData_{true}; std::shared_ptr fetchNodeObject(uint256 const& hash, std::uint32_t, FetchReport& fetchReport, bool duplicate) diff --git a/src/libxrpl/basics/Archive.cpp b/src/libxrpl/basics/Archive.cpp index bba144ed04..96ca774a48 100644 --- a/src/libxrpl/basics/Archive.cpp +++ b/src/libxrpl/basics/Archive.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -17,6 +18,7 @@ namespace xrpl { void extractTarLz4(boost::filesystem::path const& src, boost::filesystem::path const& dst) { + TRACE_FUNC(); if (!is_regular_file(src)) Throw("Invalid source file"); diff --git a/src/libxrpl/basics/BasicConfig.cpp b/src/libxrpl/basics/BasicConfig.cpp index c1997eb713..7f3378148f 100644 --- a/src/libxrpl/basics/BasicConfig.cpp +++ b/src/libxrpl/basics/BasicConfig.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -21,12 +22,14 @@ Section::Section(std::string name) : name_(std::move(name)) void Section::set(std::string const& key, std::string const& value) { + TRACE_FUNC(); lookup_.insert_or_assign(key, value); } void Section::append(std::vector const& lines) { + TRACE_FUNC(); // '=' static boost::regex const kRE1( "^" // start of line @@ -98,12 +101,14 @@ Section::append(std::vector const& lines) bool Section::exists(std::string const& name) const { + TRACE_FUNC(); return lookup_.contains(name); } std::ostream& operator<<(std::ostream& os, Section const& section) { + TRACE_FUNC(); for (auto const& [k, v] : section.lookup_) os << k << "=" << v << "\n"; return os; @@ -114,18 +119,21 @@ operator<<(std::ostream& os, Section const& section) bool BasicConfig::exists(std::string const& name) const { + TRACE_FUNC(); return map_.contains(name); } Section& BasicConfig::section(std::string const& name) { + TRACE_FUNC(); return map_.emplace(name, name).first->second; } Section const& BasicConfig::section(std::string const& name) const { + TRACE_FUNC(); static Section const kNONE(""); auto const iter = map_.find(name); if (iter == map_.end()) @@ -136,6 +144,7 @@ BasicConfig::section(std::string const& name) const void BasicConfig::overwrite(std::string const& section, std::string const& key, std::string const& value) { + TRACE_FUNC(); auto const result = map_.emplace(std::piecewise_construct, std::make_tuple(section), std::make_tuple(section)); result.first->second.set(key, value); @@ -144,6 +153,7 @@ BasicConfig::overwrite(std::string const& section, std::string const& key, std:: void BasicConfig::deprecatedClearSection(std::string const& section) { + TRACE_FUNC(); auto i = map_.find(section); if (i != map_.end()) i->second = Section(section); @@ -152,18 +162,21 @@ BasicConfig::deprecatedClearSection(std::string const& section) void BasicConfig::legacy(std::string const& section, std::string value) { + TRACE_FUNC(); map_.emplace(section, section).first->second.legacy(std::move(value)); } std::string BasicConfig::legacy(std::string const& sectionName) const { + TRACE_FUNC(); return section(sectionName).legacy(); } void BasicConfig::build(IniFileSections const& ifs) { + TRACE_FUNC(); for (auto const& entry : ifs) { auto const result = map_.emplace( @@ -175,6 +188,7 @@ BasicConfig::build(IniFileSections const& ifs) std::ostream& operator<<(std::ostream& ss, BasicConfig const& c) { + TRACE_FUNC(); for (auto const& [k, v] : c.map_) ss << "[" << k << "]\n" << v; return ss; diff --git a/src/libxrpl/basics/CountedObject.cpp b/src/libxrpl/basics/CountedObject.cpp index 1bf88687f8..5b25448279 100644 --- a/src/libxrpl/basics/CountedObject.cpp +++ b/src/libxrpl/basics/CountedObject.cpp @@ -1,4 +1,5 @@ #include +#include #include @@ -7,6 +8,7 @@ namespace xrpl { CountedObjects& CountedObjects::getInstance() noexcept { + TRACE_FUNC(); static CountedObjects kINSTANCE; return kINSTANCE; @@ -19,6 +21,7 @@ CountedObjects::CountedObjects() noexcept : count_(0), head_(nullptr) CountedObjects::List CountedObjects::getCounts(int minimumThreshold) const { + TRACE_FUNC(); List counts; // When other operations are concurrent, the count diff --git a/src/libxrpl/basics/FileUtilities.cpp b/src/libxrpl/basics/FileUtilities.cpp index 1a6e604724..5b79be5325 100644 --- a/src/libxrpl/basics/FileUtilities.cpp +++ b/src/libxrpl/basics/FileUtilities.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -22,6 +23,7 @@ getFileContents( boost::filesystem::path const& sourcePath, std::optional maxSize) { + TRACE_FUNC(); using namespace boost::filesystem; using namespace boost::system::errc; @@ -62,6 +64,7 @@ writeFileContents( boost::filesystem::path const& destPath, std::string const& contents) { + TRACE_FUNC(); using namespace boost::filesystem; using namespace boost::system::errc; diff --git a/src/libxrpl/basics/Log.cpp b/src/libxrpl/basics/Log.cpp index a629d865b8..004a5e30e8 100644 --- a/src/libxrpl/basics/Log.cpp +++ b/src/libxrpl/basics/Log.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,7 @@ Logs::Sink::Sink(std::string partition, beast::severities::Severity thresh, Logs void Logs::Sink::write(beast::severities::Severity level, std::string const& text) { + TRACE_FUNC(); if (level < threshold()) return; @@ -37,6 +39,7 @@ Logs::Sink::write(beast::severities::Severity level, std::string const& text) void Logs::Sink::writeAlways(beast::severities::Severity level, std::string const& text) { + TRACE_FUNC(); logs_.write(level, partition_, text, console()); } @@ -49,12 +52,14 @@ Logs::File::File() : stream_(nullptr) bool Logs::File::isOpen() const noexcept { + TRACE_FUNC(); return stream_ != nullptr; } bool Logs::File::open(boost::filesystem::path const& path) { + TRACE_FUNC(); close(); bool wasOpened = false; @@ -77,6 +82,7 @@ Logs::File::open(boost::filesystem::path const& path) bool Logs::File::closeAndReopen() { + TRACE_FUNC(); close(); return open(path_); @@ -85,12 +91,14 @@ Logs::File::closeAndReopen() void Logs::File::close() { + TRACE_FUNC(); stream_ = nullptr; } void Logs::File::write(char const* text) { + TRACE_FUNC(); if (stream_ != nullptr) (*stream_) << text; } @@ -98,6 +106,7 @@ Logs::File::write(char const* text) void Logs::File::writeln(char const* text) { + TRACE_FUNC(); if (stream_ != nullptr) { (*stream_) << text; @@ -114,12 +123,14 @@ Logs::Logs(beast::severities::Severity thresh) : thresh_(thresh) // default sev bool Logs::open(boost::filesystem::path const& pathToLogFile) { + TRACE_FUNC(); return file_.open(pathToLogFile); } beast::Journal::Sink& Logs::get(std::string const& name) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); auto const result = sinks_.emplace(name, makeSink(name, thresh_)); return *result.first->second; @@ -134,18 +145,21 @@ Logs::operator[](std::string const& name) beast::Journal Logs::journal(std::string const& name) { + TRACE_FUNC(); return beast::Journal(get(name)); } beast::severities::Severity Logs::threshold() const { + TRACE_FUNC(); return thresh_; } void Logs::threshold(beast::severities::Severity thresh) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); thresh_ = thresh; for (auto& sink : sinks_) @@ -155,6 +169,7 @@ Logs::threshold(beast::severities::Severity thresh) std::vector> Logs::partitionSeverities() const { + TRACE_FUNC(); std::vector> list; std::scoped_lock const lock(mutex_); list.reserve(sinks_.size()); @@ -170,6 +185,7 @@ Logs::write( std::string const& text, bool console) { + TRACE_FUNC(); std::string s; format(s, text, level, partition); std::scoped_lock const lock(mutex_); @@ -184,6 +200,7 @@ Logs::write( std::string Logs::rotate() { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); bool const wasOpened = file_.closeAndReopen(); if (wasOpened) @@ -194,12 +211,14 @@ Logs::rotate() std::unique_ptr Logs::makeSink(std::string const& name, beast::severities::Severity threshold) { + TRACE_FUNC(); return std::make_unique(name, threshold, *this); } LogSeverity Logs::fromSeverity(beast::severities::Severity level) { + TRACE_FUNC(); using namespace beast::severities; switch (level) { @@ -229,6 +248,7 @@ Logs::fromSeverity(beast::severities::Severity level) beast::severities::Severity Logs::toSeverity(LogSeverity level) { + TRACE_FUNC(); using namespace beast::severities; switch (level) { @@ -257,6 +277,7 @@ Logs::toSeverity(LogSeverity level) std::string Logs::toString(LogSeverity s) { + TRACE_FUNC(); switch (s) { case LSTrace: @@ -282,6 +303,7 @@ Logs::toString(LogSeverity s) LogSeverity Logs::fromString(std::string const& s) { + TRACE_FUNC(); if (boost::iequals(s, "trace")) return LSTrace; @@ -310,6 +332,7 @@ Logs::format( beast::severities::Severity severity, std::string const& partition) { + TRACE_FUNC(); output.reserve(message.size() + partition.size() + 100); output = xrpl::to_string(std::chrono::system_clock::now()); @@ -412,6 +435,7 @@ public: std::unique_ptr set(std::unique_ptr sink) { + TRACE_FUNC(); std::scoped_lock const _(mtx_); using std::swap; @@ -432,6 +456,7 @@ public: beast::Journal::Sink& get() { + TRACE_FUNC(); std::scoped_lock const _(mtx_); return sink_.get(); } @@ -440,6 +465,7 @@ public: static DebugSink& debugSink() { + TRACE_FUNC(); static DebugSink kINST; return kINST; } @@ -447,12 +473,14 @@ debugSink() std::unique_ptr setDebugLogSink(std::unique_ptr sink) { + TRACE_FUNC(); return debugSink().set(std::move(sink)); } beast::Journal debugLog() { + TRACE_FUNC(); return beast::Journal(debugSink().get()); } diff --git a/src/libxrpl/basics/MallocTrim.cpp b/src/libxrpl/basics/MallocTrim.cpp index 6fb9ab611b..b8f622b3cf 100644 --- a/src/libxrpl/basics/MallocTrim.cpp +++ b/src/libxrpl/basics/MallocTrim.cpp @@ -2,6 +2,7 @@ #include #include +#include #include @@ -31,6 +32,7 @@ namespace { bool getRusageThread(struct rusage& ru) { + TRACE_FUNC(); return ::getrusage(RUSAGE_THREAD, &ru) == 0; // LCOV_EXCL_LINE } @@ -48,12 +50,14 @@ namespace detail { inline int mallocTrimWithPad(std::size_t padBytes) { + TRACE_FUNC(); return ::malloc_trim(padBytes); } long parseStatmRSSkB(std::string const& statm) { + TRACE_FUNC(); // /proc/self/statm format: size resident shared text lib data dt // We want the second field (resident) which is in pages std::istringstream iss(statm); @@ -76,6 +80,7 @@ parseStatmRSSkB(std::string const& statm) MallocTrimReport mallocTrim(std::string_view tag, beast::Journal journal) { + TRACE_FUNC(); // LCOV_EXCL_START MallocTrimReport report; diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index 08ead182bf..f4526e3ba5 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -33,24 +34,28 @@ thread_local std::reference_wrapper Number::kRANGE = kLARGE Number::RoundingMode Number::getround() { + TRACE_FUNC(); return mode; } Number::RoundingMode Number::setround(RoundingMode inMode) { + TRACE_FUNC(); return std::exchange(Number::mode, inMode); } MantissaRange::MantissaScale Number::getMantissaScale() { + TRACE_FUNC(); return kRANGE.get().scale; } void Number::setMantissaScale(MantissaRange::MantissaScale scale) { + TRACE_FUNC(); if (scale != MantissaRange::MantissaScale::Small && scale != MantissaRange::MantissaScale::Large) logicError("Unknown mantissa scale"); @@ -130,24 +135,28 @@ private: inline void Number::Guard::setPositive() noexcept { + TRACE_FUNC(); sbit_ = 0; } inline void Number::Guard::setNegative() noexcept { + TRACE_FUNC(); sbit_ = 1; } inline bool Number::Guard::isNegative() const noexcept { + TRACE_FUNC(); return sbit_ == 1; } inline void Number::Guard::doPush(unsigned d) noexcept { + TRACE_FUNC(); xbit_ = xbit_ || ((digits_ & 0x0000'0000'0000'000F) != 0); digits_ >>= 4; digits_ |= (d & 0x0000'0000'0000'000FULL) << 60; @@ -157,12 +166,14 @@ template inline void Number::Guard::push(T d) noexcept { + TRACE_FUNC(); doPush(static_cast(d)); } inline unsigned Number::Guard::pop() noexcept { + TRACE_FUNC(); unsigned const d = (digits_ & 0xF000'0000'0000'0000) >> 60; digits_ <<= 4; return d; @@ -175,6 +186,7 @@ Number::Guard::pop() noexcept int Number::Guard::round() const noexcept { + TRACE_FUNC(); auto mode = Number::getround(); if (mode == RoundingMode::TowardsZero) @@ -217,6 +229,7 @@ Number::Guard::bringIntoRange( int& exponent, internalrep const& minMantissa) { + TRACE_FUNC(); // Bring mantissa back into the minMantissa / maxMantissa range AFTER // rounding if (mantissa < minMantissa) @@ -244,6 +257,7 @@ Number::Guard::doRoundUp( internalrep const& maxMantissa, std::string location) { + TRACE_FUNC(); auto r = round(); if (r == 1 || (r == 0 && (mantissa & 1) == 1)) { @@ -269,6 +283,7 @@ Number::Guard::doRoundDown( int& exponent, internalrep const& minMantissa) { + TRACE_FUNC(); auto r = round(); if (r == 1 || (r == 0 && (mantissa & 1) == 1)) { @@ -286,6 +301,7 @@ Number::Guard::doRoundDown( void Number::Guard::doRound(rep& drops, std::string location) const { + TRACE_FUNC(); auto r = round(); if (r == 1 || (r == 0 && (drops & 1) == 1)) { @@ -315,6 +331,7 @@ Number::Guard::doRound(rep& drops, std::string location) const Number::internalrep Number::externalToInternal(rep mantissa) { + TRACE_FUNC(); // If the mantissa is already positive, just return it if (mantissa >= 0) return mantissa; @@ -350,6 +367,7 @@ constexpr Number kONE_LRG = Number::oneLarge(); Number Number::one() { + TRACE_FUNC(); if (&kRANGE.get() == &kSMALL_RANGE) return kONE_SML; XRPL_ASSERT(&kRANGE.get() == &kLARGE_RANGE, "Number::one() : valid range"); @@ -367,6 +385,7 @@ doNormalize( MantissaRange::rep const& minMantissa, MantissaRange::rep const& maxMantissa) { + TRACE_FUNC(); auto constexpr kMIN_EXPONENT = Number::kMIN_EXPONENT; auto constexpr kMAX_EXPONENT = Number::kMAX_EXPONENT; auto constexpr kMAX_REP = Number::kMAX_REP; @@ -450,6 +469,7 @@ Number::normalize( internalrep const& minMantissa, internalrep const& maxMantissa) { + TRACE_FUNC(); doNormalize(negative, mantissa, exponent, minMantissa, maxMantissa); } @@ -462,6 +482,7 @@ Number::normalize( internalrep const& minMantissa, internalrep const& maxMantissa) { + TRACE_FUNC(); doNormalize(negative, mantissa, exponent, minMantissa, maxMantissa); } @@ -474,12 +495,14 @@ Number::normalize( internalrep const& minMantissa, internalrep const& maxMantissa) { + TRACE_FUNC(); doNormalize(negative, mantissa, exponent, minMantissa, maxMantissa); } void Number::normalize() { + TRACE_FUNC(); auto const& range = kRANGE.get(); normalize(negative_, mantissa_, exponent_, range.min, range.max); } @@ -490,6 +513,7 @@ Number::normalize() Number Number::shiftExponent(int exponentDelta) const { + TRACE_FUNC(); XRPL_ASSERT_PARTS(isnormal(), "xrpl::Number::shiftExponent", "normalized"); auto const newExponent = exponent_ + exponentDelta; if (newExponent >= kMAX_EXPONENT) @@ -506,6 +530,7 @@ Number::shiftExponent(int exponentDelta) const Number& Number::operator+=(Number const& y) { + TRACE_FUNC(); constexpr Number kZERO = Number{}; if (y == kZERO) return *this; @@ -611,6 +636,7 @@ Number::operator+=(Number const& y) static inline unsigned divu10(uint128_t& u) { + TRACE_FUNC(); // q = u * 0.75 auto q = (u >> 1) + (u >> 2); // iterate towards q = u * 0.8 @@ -633,6 +659,7 @@ divu10(uint128_t& u) Number& Number::operator*=(Number const& y) { + TRACE_FUNC(); constexpr Number kZERO = Number{}; if (*this == kZERO) return *this; @@ -696,6 +723,7 @@ Number::operator*=(Number const& y) Number& Number::operator/=(Number const& y) { + TRACE_FUNC(); constexpr Number kZERO = Number{}; if (y == kZERO) throw std::overflow_error("Number: divide by 0"); @@ -791,6 +819,7 @@ Number::operator/=(Number const& y) Number:: operator rep() const { + TRACE_FUNC(); rep drops = mantissa(); int offset = exponent(); Guard g; @@ -820,6 +849,7 @@ operator rep() const Number Number::truncate() const noexcept { + TRACE_FUNC(); if (exponent_ >= 0 || mantissa_ == 0) return *this; @@ -838,6 +868,7 @@ Number::truncate() const noexcept std::string to_string(Number const& amount) { + TRACE_FUNC(); // keep full internal accuracy, but make more human friendly if possible constexpr Number kZERO = Number{}; if (amount == kZERO) @@ -936,6 +967,7 @@ to_string(Number const& amount) Number power(Number const& f, unsigned n) { + TRACE_FUNC(); if (n == 0) return Number::one(); if (n == 1) @@ -959,6 +991,7 @@ power(Number const& f, unsigned n) Number root(Number f, unsigned d) { + TRACE_FUNC(); constexpr Number kZERO = Number{}; auto const one = Number::one(); @@ -1031,6 +1064,7 @@ root(Number f, unsigned d) Number root2(Number f) { + TRACE_FUNC(); constexpr Number kZERO = Number{}; auto const one = Number::one(); @@ -1078,6 +1112,7 @@ root2(Number f) Number power(Number const& f, unsigned n, unsigned d) { + TRACE_FUNC(); constexpr Number kZERO = Number{}; auto const one = Number::one(); diff --git a/src/libxrpl/basics/ResolverAsio.cpp b/src/libxrpl/basics/ResolverAsio.cpp index 4e64c280c7..375baa0038 100644 --- a/src/libxrpl/basics/ResolverAsio.cpp +++ b/src/libxrpl/basics/ResolverAsio.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -47,6 +48,7 @@ class AsyncObject public: ~AsyncObject() { + TRACE_FUNC(); // Destroying the object with I/O pending? Not a clean exit! XRPL_ASSERT(pending_.load() == 0, "xrpl::AsyncObject::~AsyncObject : nothing pending"); } @@ -60,16 +62,19 @@ public: public: explicit CompletionCounter(Derived* owner) : owner_(owner) { + TRACE_FUNC(); ++owner_->pending_; } CompletionCounter(CompletionCounter const& other) : owner_(other.owner_) { + TRACE_FUNC(); ++owner_->pending_; } ~CompletionCounter() { + TRACE_FUNC(); if (--owner_->pending_ == 0) owner_->asyncHandlersComplete(); } @@ -84,12 +89,14 @@ public: void addReference() { + TRACE_FUNC(); ++pending_; } void removeReference() { + TRACE_FUNC(); if (--pending_ == 0) (static_cast(this))->asyncHandlersComplete(); } @@ -128,6 +135,7 @@ public: template Work(StringSequence const& inNames, HandlerType handler) : handler(std::move(handler)) { + TRACE_FUNC(); names.reserve(inNames.size()); std::reverse_copy(inNames.begin(), inNames.end(), std::back_inserter(names)); @@ -148,6 +156,7 @@ public: ~ResolverAsioImpl() override { + TRACE_FUNC(); XRPL_ASSERT(work.empty(), "xrpl::ResolverAsioImpl::~ResolverAsioImpl : no pending work"); XRPL_ASSERT(stopped, "xrpl::ResolverAsioImpl::~ResolverAsioImpl : stopped"); } @@ -157,6 +166,7 @@ public: void asyncHandlersComplete() { + TRACE_FUNC(); std::unique_lock const lk{mut}; asyncHandlersCompleted = true; cv.notify_all(); @@ -171,6 +181,7 @@ public: void start() override { + TRACE_FUNC(); XRPL_ASSERT(stopped == true, "xrpl::ResolverAsioImpl::start : stopped"); XRPL_ASSERT(stop_called == false, "xrpl::ResolverAsioImpl::start : not stopping"); @@ -187,6 +198,7 @@ public: void stopAsync() override { + TRACE_FUNC(); if (!stop_called.exchange(true)) { boost::asio::dispatch( @@ -201,6 +213,7 @@ public: void stop() override { + TRACE_FUNC(); stopAsync(); JLOG(journal.debug()) << "Waiting to stop"; @@ -213,6 +226,7 @@ public: void resolve(std::vector const& names, HandlerType const& handler) override { + TRACE_FUNC(); XRPL_ASSERT(stop_called == false, "xrpl::ResolverAsioImpl::resolve : not stopping"); XRPL_ASSERT(!names.empty(), "xrpl::ResolverAsioImpl::resolve : names non-empty"); @@ -231,6 +245,7 @@ public: void doStop(CompletionCounter) { + TRACE_FUNC(); XRPL_ASSERT(stop_called == true, "xrpl::ResolverAsioImpl::do_stop : stopping"); if (!stopped.exchange(true)) @@ -250,6 +265,7 @@ public: boost::asio::ip::tcp::resolver::results_type results, CompletionCounter) { + TRACE_FUNC(); if (ec == boost::asio::error::operation_aborted) return; @@ -278,6 +294,7 @@ public: static HostAndPort parseName(std::string const& str) { + TRACE_FUNC(); // first attempt to parse as an endpoint (IP addr + port). // If that doesn't succeed, fall back to generic name + port parsing @@ -324,6 +341,7 @@ public: void doWork(CompletionCounter) { + TRACE_FUNC(); if (stop_called) return; @@ -369,6 +387,7 @@ public: void doResolve(std::vector const& names, HandlerType const& handler, CompletionCounter) { + TRACE_FUNC(); XRPL_ASSERT(!names.empty(), "xrpl::ResolverAsioImpl::do_resolve : names non-empty"); if (!stop_called) @@ -395,6 +414,7 @@ public: std::unique_ptr ResolverAsio::make(boost::asio::io_context& ioContext, beast::Journal journal) { + TRACE_FUNC(); return std::make_unique(ioContext, journal); } diff --git a/src/libxrpl/basics/StringUtilities.cpp b/src/libxrpl/basics/StringUtilities.cpp index f1f8515ae1..f094ef117e 100644 --- a/src/libxrpl/basics/StringUtilities.cpp +++ b/src/libxrpl/basics/StringUtilities.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -22,6 +23,7 @@ namespace xrpl { std::string sqlBlobLiteral(Blob const& blob) { + TRACE_FUNC(); std::string j; j.reserve((blob.size() * 2) + 3); @@ -36,6 +38,7 @@ sqlBlobLiteral(Blob const& blob) bool parseUrl(ParsedUrl& pUrl, std::string const& strUrl) { + TRACE_FUNC(); // scheme://username:password@hostname:port/rest static boost::regex const kRE_URL( "(?i)\\`\\s*" @@ -96,6 +99,7 @@ parseUrl(ParsedUrl& pUrl, std::string const& strUrl) std::string trimWhitespace(std::string str) { + TRACE_FUNC(); boost::trim(str); return str; } @@ -103,6 +107,7 @@ trimWhitespace(std::string str) std::optional toUint64(std::string const& s) { + TRACE_FUNC(); std::uint64_t result = 0; if (beast::lexicalCastChecked(result, s)) return result; @@ -112,6 +117,7 @@ toUint64(std::string const& s) bool isProperlyFormedTomlDomain(std::string_view domain) { + TRACE_FUNC(); // The domain must be between 4 and 128 characters long if (domain.size() < 4 || domain.size() > 128) return false; diff --git a/src/libxrpl/basics/TraceLog.cpp b/src/libxrpl/basics/TraceLog.cpp new file mode 100644 index 0000000000..1d82cb67ba --- /dev/null +++ b/src/libxrpl/basics/TraceLog.cpp @@ -0,0 +1,304 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace xrpl { + +namespace { + +std::atomic s_enabled{false}; +std::atomic s_samplingRate{1.0}; +std::atomic s_nextSpanId{1}; +std::mutex s_fileMutex; +std::FILE* s_file{nullptr}; +std::string s_basePath; +std::uint64_t s_maxFileSize{500ULL * 1024 * 1024}; +int s_maxFiles{10}; +std::uint64_t s_currentFileSize{0}; + +constexpr int kMaxStackDepth = 512; +constexpr std::size_t kFlushThreshold = 65536; + +struct ThreadContext +{ + std::uint64_t traceId{0}; + std::uint64_t spanStack[kMaxStackDepth]; + int stackDepth{0}; + bool sampled{true}; + std::string buffer; +}; + +thread_local ThreadContext t_ctx; + +std::uint64_t +generateTraceId() +{ + thread_local std::mt19937_64 rng( + std::chrono::steady_clock::now().time_since_epoch().count() ^ + std::hash{}(std::this_thread::get_id())); + return rng(); +} + +void +rotateFiles() +{ + if (s_file) + { + std::fclose(s_file); + s_file = nullptr; + } + + // traces.jsonl.9 -> delete, traces.jsonl.8 -> .9, ... .0 -> .1 + for (int i = s_maxFiles - 1; i >= 0; --i) + { + std::string src = + (i == 0) ? s_basePath : (s_basePath + "." + std::to_string(i)); + std::string dst = s_basePath + "." + std::to_string(i + 1); + + if (i == s_maxFiles - 1) + std::remove(src.c_str()); + else + std::rename(src.c_str(), dst.c_str()); + } + + s_file = std::fopen(s_basePath.c_str(), "w"); + s_currentFileSize = 0; +} + +void +flushBuffer() +{ + if (t_ctx.buffer.empty()) + return; + std::lock_guard lock(s_fileMutex); + if (s_file) + { + auto written = + std::fwrite(t_ctx.buffer.data(), 1, t_ctx.buffer.size(), s_file); + std::fflush(s_file); + s_currentFileSize += written; + + if (s_currentFileSize >= s_maxFileSize) + rotateFiles(); + } + t_ctx.buffer.clear(); +} + +char const* +extractFilename(char const* path) +{ + char const* last = path; + for (char const* p = path; *p; ++p) + { + if (*p == '/' || *p == '\\') + last = p + 1; + } + return last; +} + +void +appendJsonString(std::string& buf, char const* s) +{ + buf += '"'; + for (; *s; ++s) + { + switch (*s) + { + case '"': + buf += "\\\""; + break; + case '\\': + buf += "\\\\"; + break; + case '\n': + buf += "\\n"; + break; + case '\r': + buf += "\\r"; + break; + case '\t': + buf += "\\t"; + break; + default: + buf += *s; + } + } + buf += '"'; +} + +void +appendHex(std::string& buf, std::uint64_t val) +{ + static constexpr char kHEX[] = "0123456789abcdef"; + char hex[17]; + for (int i = 15; i >= 0; --i) + { + hex[i] = kHEX[val & 0xf]; + val >>= 4; + } + hex[16] = '\0'; + buf.append(hex, 16); +} + +void +writeSpan( + std::uint64_t traceId, + std::uint64_t spanId, + std::uint64_t parentId, + char const* name, + char const* file, + int line, + std::int64_t startUs, + std::int64_t durUs) +{ + auto& buf = t_ctx.buffer; + + buf += "{\"name\":"; + appendJsonString(buf, name); + buf += ",\"trace\":\""; + appendHex(buf, traceId); + buf += "\",\"span\":\""; + appendHex(buf, spanId); + buf += "\",\"parent\":\""; + appendHex(buf, parentId); + buf += "\",\"file\":"; + appendJsonString(buf, extractFilename(file)); + buf += ",\"line\":"; + buf += std::to_string(line); + buf += ",\"start_us\":"; + buf += std::to_string(startUs); + buf += ",\"dur_us\":"; + buf += std::to_string(durUs); + buf += "}\n"; + + if (buf.size() > kFlushThreshold || t_ctx.stackDepth == 0) + flushBuffer(); +} + +} // namespace + +namespace tracing { + +void +init(char const* outputPath, double samplingRate, std::uint64_t maxFileSizeMB, int maxFiles) +{ + std::lock_guard lock(s_fileMutex); + if (s_file) + std::fclose(s_file); + s_basePath = outputPath; + s_maxFileSize = maxFileSizeMB * 1024ULL * 1024ULL; + s_maxFiles = maxFiles; + s_file = std::fopen(outputPath, "a"); + if (s_file) + { + std::fseek(s_file, 0, SEEK_END); + s_currentFileSize = static_cast(std::ftell(s_file)); + } + s_samplingRate.store(samplingRate, std::memory_order_relaxed); + s_enabled.store(s_file != nullptr, std::memory_order_release); +} + +void +shutdown() +{ + s_enabled.store(false, std::memory_order_release); + std::lock_guard lock(s_fileMutex); + if (s_file) + { + std::fclose(s_file); + s_file = nullptr; + } +} + +} // namespace tracing + +TraceScope::TraceScope( + char const* func, + char const* file, + int line) noexcept + : spanId_(0) + , traceId_(0) + , parentId_(0) + , func_(func) + , file_(file) + , line_(line) + , startUs_(0) + , active_(false) +{ + if (!s_enabled.load(std::memory_order_relaxed)) + return; + + spanId_ = s_nextSpanId.fetch_add(1, std::memory_order_relaxed); + + if (t_ctx.stackDepth == 0) + { + traceId_ = generateTraceId(); + parentId_ = 0; + + double rate = s_samplingRate.load(std::memory_order_relaxed); + if (rate < 1.0) + { + thread_local std::mt19937 samplerRng(std::random_device{}()); + std::uniform_real_distribution dist(0.0, 1.0); + t_ctx.sampled = dist(samplerRng) < rate; + } + else + { + t_ctx.sampled = true; + } + } + else + { + traceId_ = t_ctx.traceId; + parentId_ = t_ctx.spanStack[t_ctx.stackDepth - 1]; + } + + t_ctx.traceId = traceId_; + if (t_ctx.stackDepth < kMaxStackDepth) + t_ctx.spanStack[t_ctx.stackDepth] = spanId_; + ++t_ctx.stackDepth; + + if (!t_ctx.sampled) + return; + + startUs_ = std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()) + .count(); + active_ = true; +} + +TraceScope::~TraceScope() noexcept +{ + if (spanId_ == 0) + return; + + if (active_) + { + auto const endUs = + std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()) + .count(); + writeSpan( + traceId_, + spanId_, + parentId_, + func_, + file_, + line_, + startUs_, + endUs - startUs_); + } + + --t_ctx.stackDepth; + if (t_ctx.stackDepth == 0) + t_ctx.traceId = 0; +} + +} // namespace xrpl diff --git a/src/libxrpl/basics/UptimeClock.cpp b/src/libxrpl/basics/UptimeClock.cpp index 5b92617098..5ee350b088 100644 --- a/src/libxrpl/basics/UptimeClock.cpp +++ b/src/libxrpl/basics/UptimeClock.cpp @@ -1,5 +1,6 @@ #include +#include #include #include @@ -13,6 +14,7 @@ std::atomic UptimeClock::kSTOP{false}; // stop update thread // On xrpld shutdown, cancel and wait for the update thread UptimeClock::UpdateThread::~UpdateThread() { + TRACE_FUNC(); if (joinable()) { kSTOP = true; @@ -26,6 +28,7 @@ UptimeClock::UpdateThread::~UpdateThread() UptimeClock::UpdateThread UptimeClock::startClock() { + TRACE_FUNC(); return UpdateThread{[] { using namespace std; using namespace std::chrono; @@ -48,6 +51,7 @@ UptimeClock::startClock() UptimeClock::time_point UptimeClock::now() { + TRACE_FUNC(); // start the update thread on first use static auto const kINIT = startClock(); diff --git a/src/libxrpl/basics/base64.cpp b/src/libxrpl/basics/base64.cpp index 7a649a8c3a..a93827db09 100644 --- a/src/libxrpl/basics/base64.cpp +++ b/src/libxrpl/basics/base64.cpp @@ -33,6 +33,7 @@ */ #include +#include #include #include @@ -47,6 +48,7 @@ namespace base64 { inline char const* getAlphabet() { + TRACE_FUNC(); static char constexpr kTAB[] = { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"}; return &kTAB[0]; @@ -55,6 +57,7 @@ getAlphabet() inline signed char const* getInverse() { + TRACE_FUNC(); static signed char constexpr kTAB[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0-15 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16-31 @@ -103,6 +106,7 @@ std::size_t constexpr decodedSize(std::size_t n) std::size_t encode(void* dest, void const* src, std::size_t len) { + TRACE_FUNC(); char* out = static_cast(dest); // NOLINT(misc-const-correctness) char const* in = static_cast(src); auto const tab = base64::getAlphabet(); @@ -154,6 +158,7 @@ encode(void* dest, void const* src, std::size_t len) std::pair decode(void* dest, char const* src, std::size_t len) { + TRACE_FUNC(); char* out = static_cast(dest); // NOLINT(misc-const-correctness) auto in = reinterpret_cast(src); unsigned char c3[3]{}, c4[4]{}; @@ -199,6 +204,7 @@ decode(void* dest, char const* src, std::size_t len) std::string base64Encode(std::uint8_t const* data, std::size_t len) { + TRACE_FUNC(); std::string dest; dest.resize(base64::encodedSize(len)); dest.resize(base64::encode(&dest[0], data, len)); @@ -208,6 +214,7 @@ base64Encode(std::uint8_t const* data, std::size_t len) std::string base64Decode(std::string_view data) { + TRACE_FUNC(); std::string dest; dest.resize(base64::decodedSize(data.size())); auto const result = base64::decode(&dest[0], data.data(), data.size()); diff --git a/src/libxrpl/basics/contract.cpp b/src/libxrpl/basics/contract.cpp index a249b82353..8b965bcddd 100644 --- a/src/libxrpl/basics/contract.cpp +++ b/src/libxrpl/basics/contract.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -12,12 +13,14 @@ namespace xrpl { void logThrow(std::string const& title) { + TRACE_FUNC(); JLOG(debugLog().warn()) << title; } [[noreturn]] void logicError(std::string const& s) noexcept { + TRACE_FUNC(); // LCOV_EXCL_START JLOG(debugLog().fatal()) << s; std::cerr << "Logic error: " << s << std::endl; diff --git a/src/libxrpl/basics/make_SSLContext.cpp b/src/libxrpl/basics/make_SSLContext.cpp index 89da14333a..38443d6412 100644 --- a/src/libxrpl/basics/make_SSLContext.cpp +++ b/src/libxrpl/basics/make_SSLContext.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -89,6 +90,7 @@ std::string const kDEFAULT_CIPHER_LIST = "TLSv1.2:!CBC:!DSS:!PSK:!eNULL:!aNULL"; static void initAnonymous(boost::asio::ssl::context& context) { + TRACE_FUNC(); using namespace openssl; static auto kDEFAULT_RSA = []() { @@ -229,6 +231,7 @@ initAuthenticated( std::string const& certFile, std::string const& chainFile) { + TRACE_FUNC(); auto fmtError = [](boost::system::error_code ec) -> std::string { return " [" + std::to_string(ec.value()) + ": " + ec.message() + "]"; }; @@ -321,6 +324,7 @@ initAuthenticated( std::shared_ptr getContext(std::string cipherList) { + TRACE_FUNC(); auto c = std::make_shared(boost::asio::ssl::context::sslv23); c->set_options( @@ -352,6 +356,7 @@ getContext(std::string cipherList) std::shared_ptr makeSslContext(std::string const& cipherList) { + TRACE_FUNC(); auto context = openssl::detail::getContext(cipherList); openssl::detail::initAnonymous(*context); // VFALCO NOTE, It seems the WebSocket context never has @@ -367,6 +372,7 @@ makeSslContextAuthed( std::string const& chainFile, std::string const& cipherList) { + TRACE_FUNC(); auto context = openssl::detail::getContext(cipherList); openssl::detail::initAuthenticated(*context, keyFile, certFile, chainFile); return context; diff --git a/src/libxrpl/basics/mulDiv.cpp b/src/libxrpl/basics/mulDiv.cpp index 64d37a35c3..ba9f721c45 100644 --- a/src/libxrpl/basics/mulDiv.cpp +++ b/src/libxrpl/basics/mulDiv.cpp @@ -1,4 +1,5 @@ #include +#include #include // IWYU pragma: keep @@ -10,6 +11,7 @@ namespace xrpl { std::optional mulDiv(std::uint64_t value, std::uint64_t mul, std::uint64_t div) { + TRACE_FUNC(); boost::multiprecision::uint128_t result; result = multiply(result, value, mul); diff --git a/src/libxrpl/conditions/Condition.cpp b/src/libxrpl/conditions/Condition.cpp index 004778bc4e..4087e9f51e 100644 --- a/src/libxrpl/conditions/Condition.cpp +++ b/src/libxrpl/conditions/Condition.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -57,6 +58,7 @@ constexpr std::size_t kFINGERPRINT_SIZE = 32; std::unique_ptr loadSimpleSha256(Type type, Slice s, std::error_code& ec) { + TRACE_FUNC(); using namespace der; auto p = parsePreamble(s, ec); @@ -137,6 +139,7 @@ loadSimpleSha256(Type type, Slice s, std::error_code& ec) std::unique_ptr Condition::deserialize(Slice s, std::error_code& ec) { + TRACE_FUNC(); // Per the RFC, in a condition we choose a type based // on the tag of the item we contain: // diff --git a/src/libxrpl/conditions/Fulfillment.cpp b/src/libxrpl/conditions/Fulfillment.cpp index 52f89a6150..81d68ddf47 100644 --- a/src/libxrpl/conditions/Fulfillment.cpp +++ b/src/libxrpl/conditions/Fulfillment.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -15,6 +16,7 @@ namespace xrpl::cryptoconditions { bool match(Fulfillment const& f, Condition const& c) { + TRACE_FUNC(); // Fast check: the fulfillment's type must match the // conditions's type: if (f.type() != c.type) @@ -28,18 +30,21 @@ match(Fulfillment const& f, Condition const& c) bool validate(Fulfillment const& f, Condition const& c, Slice m) { + TRACE_FUNC(); return match(f, c) && f.validate(m); } bool validate(Fulfillment const& f, Condition const& c) { + TRACE_FUNC(); return validate(f, c, {}); } std::unique_ptr Fulfillment::deserialize(Slice s, std::error_code& ec) { + TRACE_FUNC(); // Per the RFC, in a fulfillment we choose a type based // on the tag of the item we contain: // diff --git a/src/libxrpl/conditions/error.cpp b/src/libxrpl/conditions/error.cpp index a26a153975..fc3d83aed5 100644 --- a/src/libxrpl/conditions/error.cpp +++ b/src/libxrpl/conditions/error.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -17,12 +18,14 @@ public: [[nodiscard]] char const* name() const noexcept override { + TRACE_FUNC(); return "cryptoconditions"; } [[nodiscard]] std::string message(int ev) const override { + TRACE_FUNC(); switch (safeCast(ev)) { case Error::UnsupportedType: @@ -82,18 +85,21 @@ public: [[nodiscard]] std::error_condition default_error_condition(int ev) const noexcept override { + TRACE_FUNC(); return std::error_condition{ev, *this}; } [[nodiscard]] bool equivalent(int ev, std::error_condition const& condition) const noexcept override { + TRACE_FUNC(); return &condition.category() == this && condition.value() == ev; } [[nodiscard]] bool equivalent(std::error_code const& error, int ev) const noexcept override { + TRACE_FUNC(); return &error.category() == this && error.value() == ev; } }; @@ -101,6 +107,7 @@ public: inline std::error_category const& getCryptoconditionsErrorCategory() { + TRACE_FUNC(); static CryptoconditionsErrorCategory const kCAT{}; return kCAT; } @@ -110,6 +117,7 @@ getCryptoconditionsErrorCategory() std::error_code make_error_code(Error ev) { + TRACE_FUNC(); return std::error_code{ safeCast>(ev), detail::getCryptoconditionsErrorCategory()}; } diff --git a/src/libxrpl/core/HashRouter.cpp b/src/libxrpl/core/HashRouter.cpp index a3265bfcfd..cba0465557 100644 --- a/src/libxrpl/core/HashRouter.cpp +++ b/src/libxrpl/core/HashRouter.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -17,6 +18,7 @@ namespace xrpl { auto HashRouter::emplace(uint256 const& key) -> std::pair { + TRACE_FUNC(); auto iter = suppressionMap_.find(key); if (iter != suppressionMap_.end()) @@ -34,6 +36,7 @@ HashRouter::emplace(uint256 const& key) -> std::pair void HashRouter::addSuppression(uint256 const& key) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); emplace(key); @@ -42,12 +45,14 @@ HashRouter::addSuppression(uint256 const& key) bool HashRouter::addSuppressionPeer(uint256 const& key, PeerShortID peer) { + TRACE_FUNC(); return addSuppressionPeerWithStatus(key, peer).first; } std::pair> HashRouter::addSuppressionPeerWithStatus(uint256 const& key, PeerShortID peer) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); auto result = emplace(key); @@ -58,6 +63,7 @@ HashRouter::addSuppressionPeerWithStatus(uint256 const& key, PeerShortID peer) bool HashRouter::addSuppressionPeer(uint256 const& key, PeerShortID peer, HashRouterFlags& flags) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); auto [s, created] = emplace(key); @@ -73,6 +79,7 @@ HashRouter::shouldProcess( HashRouterFlags& flags, std::chrono::seconds txInterval) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); auto result = emplace(key); @@ -85,6 +92,7 @@ HashRouter::shouldProcess( HashRouterFlags HashRouter::getFlags(uint256 const& key) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); return emplace(key).first.getFlags(); @@ -93,6 +101,7 @@ HashRouter::getFlags(uint256 const& key) bool HashRouter::setFlags(uint256 const& key, HashRouterFlags flags) { + TRACE_FUNC(); XRPL_ASSERT(static_cast(flags), "xrpl::HashRouter::setFlags : valid input"); std::scoped_lock const lock(mutex_); @@ -109,6 +118,7 @@ HashRouter::setFlags(uint256 const& key, HashRouterFlags flags) auto HashRouter::shouldRelay(uint256 const& key) -> std::optional> { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); auto& s = emplace(key).first; diff --git a/src/libxrpl/core/detail/Job.cpp b/src/libxrpl/core/detail/Job.cpp index a1b88864d7..9065a05d98 100644 --- a/src/libxrpl/core/detail/Job.cpp +++ b/src/libxrpl/core/detail/Job.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -27,24 +28,28 @@ Job::Job( std::function const& job) : type_(type), jobIndex_(index), job_(job), name_(name), queue_time_(clock_type::now()) { + TRACE_FUNC(); loadEvent_ = std::make_shared(std::ref(lm), name, false); } JobType Job::getType() const { + TRACE_FUNC(); return type_; } Job::clock_type::time_point const& Job::queueTime() const { + TRACE_FUNC(); return queue_time_; } void Job::doJob() { + TRACE_FUNC(); beast::setCurrentThreadName("j:" + name_); loadEvent_->start(); loadEvent_->setName(name_); @@ -59,6 +64,7 @@ Job::doJob() bool Job::operator>(Job const& j) const { + TRACE_FUNC(); if (type_ < j.type_) return true; @@ -71,6 +77,7 @@ Job::operator>(Job const& j) const bool Job::operator>=(Job const& j) const { + TRACE_FUNC(); if (type_ < j.type_) return true; @@ -83,6 +90,7 @@ Job::operator>=(Job const& j) const bool Job::operator<(Job const& j) const { + TRACE_FUNC(); if (type_ < j.type_) return false; @@ -95,6 +103,7 @@ Job::operator<(Job const& j) const bool Job::operator<=(Job const& j) const { + TRACE_FUNC(); if (type_ < j.type_) return false; diff --git a/src/libxrpl/core/detail/JobQueue.cpp b/src/libxrpl/core/detail/JobQueue.cpp index 06a2d226e1..9f20c13c4b 100644 --- a/src/libxrpl/core/detail/JobQueue.cpp +++ b/src/libxrpl/core/detail/JobQueue.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -33,6 +34,7 @@ JobQueue::JobQueue( , perfLog_(perfLog) , collector_(collector) { + TRACE_FUNC(); JLOG(journal_.info()) << "Using " << threadCount << " threads"; hook_ = collector_->makeHook(std::bind(&JobQueue::collect, this)); @@ -58,6 +60,7 @@ JobQueue::JobQueue( JobQueue::~JobQueue() { + TRACE_FUNC(); // Must unhook before destroying hook_ = beast::insight::Hook(); } @@ -65,6 +68,7 @@ JobQueue::~JobQueue() void JobQueue::collect() { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); job_count_ = jobSet_.size(); } @@ -72,6 +76,7 @@ JobQueue::collect() bool JobQueue::addRefCountedJob(JobType type, std::string const& name, JobFunction const& func) { + TRACE_FUNC(); XRPL_ASSERT(type != JtInvalid, "xrpl::JobQueue::addRefCountedJob : valid input job type"); auto iter(jobData_.find(type)); @@ -119,6 +124,7 @@ JobQueue::addRefCountedJob(JobType type, std::string const& name, JobFunction co int JobQueue::getJobCount(JobType t) const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); JobDataMap::const_iterator const c = jobData_.find(t); @@ -129,6 +135,7 @@ JobQueue::getJobCount(JobType t) const int JobQueue::getJobCountTotal(JobType t) const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); JobDataMap::const_iterator const c = jobData_.find(t); @@ -139,6 +146,7 @@ JobQueue::getJobCountTotal(JobType t) const int JobQueue::getJobCountGE(JobType t) const { + TRACE_FUNC(); // return the number of jobs at this priority level or greater int ret = 0; @@ -156,6 +164,7 @@ JobQueue::getJobCountGE(JobType t) const std::unique_ptr JobQueue::makeLoadEvent(JobType t, std::string const& name) { + TRACE_FUNC(); JobDataMap::iterator const iter(jobData_.find(t)); XRPL_ASSERT(iter != jobData_.end(), "xrpl::JobQueue::makeLoadEvent : valid job type input"); @@ -168,6 +177,7 @@ JobQueue::makeLoadEvent(JobType t, std::string const& name) void JobQueue::addLoadEvents(JobType t, int count, std::chrono::milliseconds elapsed) { + TRACE_FUNC(); if (isStopped()) logicError("JobQueue::addLoadEvents() called after JobQueue stopped"); @@ -179,12 +189,14 @@ JobQueue::addLoadEvents(JobType t, int count, std::chrono::milliseconds elapsed) bool JobQueue::isOverloaded() { + TRACE_FUNC(); return std::ranges::any_of(jobData_, [](auto& entry) { return entry.second.load().isOver(); }); } json::Value JobQueue::getJson(int c) { + TRACE_FUNC(); using namespace std::chrono_literals; json::Value ret(json::ObjectValue); @@ -242,6 +254,7 @@ JobQueue::getJson(int c) void JobQueue::rendezvous() { + TRACE_FUNC(); std::unique_lock lock(mutex_); cv_.wait(lock, [this] { return processCount_ == 0 && jobSet_.empty(); }); } @@ -249,6 +262,7 @@ JobQueue::rendezvous() JobTypeData& JobQueue::getJobTypeData(JobType type) { + TRACE_FUNC(); JobDataMap::iterator const c(jobData_.find(type)); XRPL_ASSERT(c != jobData_.end(), "xrpl::JobQueue::getJobTypeData : valid job type input"); @@ -263,6 +277,7 @@ JobQueue::getJobTypeData(JobType type) void JobQueue::stop() { + TRACE_FUNC(); stopping_ = true; using namespace std::chrono_literals; jobCounter_.join("JobQueue", 1s, journal_); @@ -284,12 +299,14 @@ JobQueue::stop() bool JobQueue::isStopped() const { + TRACE_FUNC(); return stopped_; } void JobQueue::getNextJob(Job& job) { + TRACE_FUNC(); XRPL_ASSERT(!jobSet_.empty(), "xrpl::JobQueue::getNextJob : non-empty jobs"); std::set::const_iterator iter; @@ -320,6 +337,7 @@ JobQueue::getNextJob(Job& job) void JobQueue::finishJob(JobType type) { + TRACE_FUNC(); XRPL_ASSERT(type != JtInvalid, "xrpl::JobQueue::finishJob : valid input job type"); JobTypeData& data = getJobTypeData(type); @@ -341,6 +359,7 @@ JobQueue::finishJob(JobType type) void JobQueue::processTask(int instance) { + TRACE_FUNC(); JobType type = JtInvalid; { @@ -392,6 +411,7 @@ JobQueue::processTask(int instance) int JobQueue::getJobLimit(JobType type) { + TRACE_FUNC(); JobTypeInfo const& j(JobTypes::instance().get(type)); XRPL_ASSERT(j.type() != JtInvalid, "xrpl::JobQueue::getJobLimit : valid job type"); diff --git a/src/libxrpl/core/detail/LoadEvent.cpp b/src/libxrpl/core/detail/LoadEvent.cpp index a2f8ee7620..878b445cbb 100644 --- a/src/libxrpl/core/detail/LoadEvent.cpp +++ b/src/libxrpl/core/detail/LoadEvent.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -21,6 +22,7 @@ LoadEvent::LoadEvent(LoadMonitor& monitor, std::string name, bool shouldStart) LoadEvent::~LoadEvent() { + TRACE_FUNC(); if (running_) stop(); } @@ -28,30 +30,35 @@ LoadEvent::~LoadEvent() std::string const& LoadEvent::name() const { + TRACE_FUNC(); return name_; } std::chrono::steady_clock::duration LoadEvent::waitTime() const { + TRACE_FUNC(); return timeWaiting_; } std::chrono::steady_clock::duration LoadEvent::runTime() const { + TRACE_FUNC(); return timeRunning_; } void LoadEvent::setName(std::string const& name) { + TRACE_FUNC(); name_ = name; } void LoadEvent::start() { + TRACE_FUNC(); auto const now = std::chrono::steady_clock::now(); // If we had already called start, this call will @@ -65,6 +72,7 @@ LoadEvent::start() void LoadEvent::stop() { + TRACE_FUNC(); XRPL_ASSERT(running_, "xrpl::LoadEvent::stop : is running"); auto const now = std::chrono::steady_clock::now(); diff --git a/src/libxrpl/core/detail/LoadMonitor.cpp b/src/libxrpl/core/detail/LoadMonitor.cpp index 95e0e7d3b9..0327c3cfb1 100644 --- a/src/libxrpl/core/detail/LoadMonitor.cpp +++ b/src/libxrpl/core/detail/LoadMonitor.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -46,6 +47,7 @@ LoadMonitor::LoadMonitor(beast::Journal j) void LoadMonitor::update() { + TRACE_FUNC(); using namespace std::chrono_literals; auto now = UptimeClock::now(); if (now == lastUpdate_) // current @@ -84,6 +86,7 @@ LoadMonitor::update() void LoadMonitor::addLoadSample(LoadEvent const& s) { + TRACE_FUNC(); using namespace std::chrono; auto const total = s.runTime() + s.waitTime(); @@ -108,6 +111,7 @@ LoadMonitor::addLoadSample(LoadEvent const& s) void LoadMonitor::addSamples(int count, std::chrono::milliseconds latency) { + TRACE_FUNC(); std::scoped_lock const sl(mutex_); update(); @@ -125,6 +129,7 @@ LoadMonitor::addSamples(int count, std::chrono::milliseconds latency) void LoadMonitor::setTargetLatency(std::chrono::milliseconds avg, std::chrono::milliseconds pk) { + TRACE_FUNC(); targetLatencyAvg_ = avg; targetLatencyPk_ = pk; } @@ -132,6 +137,7 @@ LoadMonitor::setTargetLatency(std::chrono::milliseconds avg, std::chrono::millis bool LoadMonitor::isOverTarget(std::chrono::milliseconds avg, std::chrono::milliseconds peak) { + TRACE_FUNC(); using namespace std::chrono_literals; return (targetLatencyPk_ > 0ms && (peak > targetLatencyPk_)) || (targetLatencyAvg_ > 0ms && (avg > targetLatencyAvg_)); @@ -140,6 +146,7 @@ LoadMonitor::isOverTarget(std::chrono::milliseconds avg, std::chrono::millisecon bool LoadMonitor::isOver() { + TRACE_FUNC(); std::scoped_lock const sl(mutex_); update(); @@ -154,6 +161,7 @@ LoadMonitor::isOver() LoadMonitor::Stats LoadMonitor::getStats() { + TRACE_FUNC(); using namespace std::chrono_literals; Stats stats; diff --git a/src/libxrpl/core/detail/Workers.cpp b/src/libxrpl/core/detail/Workers.cpp index 991c51b77a..a467bb3df5 100644 --- a/src/libxrpl/core/detail/Workers.cpp +++ b/src/libxrpl/core/detail/Workers.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -23,11 +24,13 @@ Workers::Workers( , pauseCount_(0) , runningTaskCount_(0) { + TRACE_FUNC(); setNumberOfThreads(numberOfThreads); } Workers::~Workers() { + TRACE_FUNC(); stop(); deleteWorkers(everyone_); @@ -36,6 +39,7 @@ Workers::~Workers() int Workers::getNumberOfThreads() const noexcept { + TRACE_FUNC(); return numberOfThreads_; } @@ -46,6 +50,7 @@ Workers::getNumberOfThreads() const noexcept void Workers::setNumberOfThreads(int numberOfThreads) { + TRACE_FUNC(); static int kINSTANCE{0}; if (numberOfThreads_ == numberOfThreads) return; @@ -97,6 +102,7 @@ Workers::setNumberOfThreads(int numberOfThreads) void Workers::stop() { + TRACE_FUNC(); setNumberOfThreads(0); // Wait until all workers have paused AND no tasks are actively running. @@ -111,18 +117,21 @@ Workers::stop() void Workers::addTask() { + TRACE_FUNC(); semaphore_.notify(); } int Workers::numberOfCurrentlyRunningTasks() const noexcept { + TRACE_FUNC(); return runningTaskCount_.load(); } void Workers::deleteWorkers(beast::LockFreeStack& stack) { + TRACE_FUNC(); for (;;) { Worker const* const worker = stack.popFront(); @@ -145,11 +154,13 @@ Workers::Worker::Worker(Workers& workers, std::string threadName, int const inst : workers_{workers}, threadName_{std::move(threadName)}, instance_{instance} { + TRACE_FUNC(); thread_ = std::thread{&Workers::Worker::run, this}; } Workers::Worker::~Worker() { + TRACE_FUNC(); { std::scoped_lock const lock{mutex_}; ++wakeCount_; @@ -163,6 +174,7 @@ Workers::Worker::~Worker() void Workers::Worker::notify() { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; ++wakeCount_; wakeup_.notify_one(); @@ -171,6 +183,7 @@ Workers::Worker::notify() void Workers::Worker::run() { + TRACE_FUNC(); bool shouldExit = true; do { diff --git a/src/libxrpl/crypto/RFC1751.cpp b/src/libxrpl/crypto/RFC1751.cpp index 30f2c3a5b8..db109c7f19 100644 --- a/src/libxrpl/crypto/RFC1751.cpp +++ b/src/libxrpl/crypto/RFC1751.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -199,6 +200,7 @@ char const* RFC1751::dictionary[2048] = { unsigned long RFC1751::extract(char const* s, int start, int length) { + TRACE_FUNC(); unsigned char cl = 0; unsigned char cc = 0; unsigned char cr = 0; @@ -226,6 +228,7 @@ RFC1751::extract(char const* s, int start, int length) void RFC1751::btoe(std::string& strHuman, std::string const& strData) { + TRACE_FUNC(); char caBuffer[9]; /* add in room for the parity 2 bits*/ int p = 0, i = 0; @@ -246,6 +249,7 @@ RFC1751::btoe(std::string& strHuman, std::string const& strData) void RFC1751::insert(char* s, int x, int start, int length) { + TRACE_FUNC(); unsigned char cl = 0; unsigned char cc = 0; unsigned char cr = 0; @@ -283,6 +287,7 @@ RFC1751::insert(char* s, int x, int start, int length) void RFC1751::standard(std::string& strWord) { + TRACE_FUNC(); for (auto& letter : strWord) { if (islower(static_cast(letter)) != 0) @@ -308,6 +313,7 @@ RFC1751::standard(std::string& strWord) int RFC1751::wsrch(std::string const& strWord, int iMin, int iMax) { + TRACE_FUNC(); int iResult = -1; while (iResult < 0 && iMin != iMax) @@ -342,6 +348,7 @@ RFC1751::wsrch(std::string const& strWord, int iMin, int iMax) int RFC1751::etob(std::string& strData, std::vector vsHuman) { + TRACE_FUNC(); if (6 != vsHuman.size()) return -1; @@ -389,6 +396,7 @@ RFC1751::etob(std::string& strData, std::vector vsHuman) int RFC1751::getKeyFromEnglish(std::string& strKey, std::string const& strHuman) { + TRACE_FUNC(); std::vector vWords; std::string strFirst, strSecond; int rc = 0; @@ -419,6 +427,7 @@ RFC1751::getKeyFromEnglish(std::string& strKey, std::string const& strHuman) void RFC1751::getEnglishFromKey(std::string& strHuman, std::string const& strKey) { + TRACE_FUNC(); std::string strFirst, strSecond; btoe(strFirst, strKey.substr(0, 8)); @@ -430,6 +439,7 @@ RFC1751::getEnglishFromKey(std::string& strHuman, std::string const& strKey) std::string RFC1751::getWordFromBlob(void const* blob, size_t bytes) { + TRACE_FUNC(); // This is a simple implementation of the Jenkins one-at-a-time hash // algorithm: // http://en.wikipedia.org/wiki/Jenkins_hash_function#one-at-a-time diff --git a/src/libxrpl/crypto/csprng.cpp b/src/libxrpl/crypto/csprng.cpp index 897432fcf1..b5c950655c 100644 --- a/src/libxrpl/crypto/csprng.cpp +++ b/src/libxrpl/crypto/csprng.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -15,6 +16,7 @@ namespace xrpl { CsprngEngine::CsprngEngine() { + TRACE_FUNC(); // This is not strictly necessary if (RAND_poll() != 1) Throw("CSPRNG: Initial polling failed"); @@ -22,6 +24,7 @@ CsprngEngine::CsprngEngine() CsprngEngine::~CsprngEngine() { + TRACE_FUNC(); // This cleanup function is not needed in newer versions of OpenSSL #if (OPENSSL_VERSION_NUMBER < 0x10100000L) RAND_cleanup(); @@ -31,6 +34,7 @@ CsprngEngine::~CsprngEngine() void CsprngEngine::mixEntropy(void* buffer, std::size_t count) { + TRACE_FUNC(); std::array entropy{}; { @@ -56,6 +60,7 @@ CsprngEngine::mixEntropy(void* buffer, std::size_t count) void CsprngEngine::operator()(void* ptr, std::size_t count) { + TRACE_FUNC(); // RAND_bytes is thread-safe on OpenSSL 1.1.0 and later when compiled // with thread support, so we don't need to grab a mutex. // https://mta.openssl.org/pipermail/openssl-users/2020-November/013146.html @@ -72,6 +77,7 @@ CsprngEngine::operator()(void* ptr, std::size_t count) CsprngEngine::result_type CsprngEngine::operator()() { + TRACE_FUNC(); result_type ret = 0; (*this)(&ret, sizeof(result_type)); return ret; @@ -80,6 +86,7 @@ CsprngEngine::operator()() CsprngEngine& cryptoPrng() { + TRACE_FUNC(); static CsprngEngine kENGINE; return kENGINE; } diff --git a/src/libxrpl/crypto/secure_erase.cpp b/src/libxrpl/crypto/secure_erase.cpp index 2b24da7548..e4a8483eb5 100644 --- a/src/libxrpl/crypto/secure_erase.cpp +++ b/src/libxrpl/crypto/secure_erase.cpp @@ -1,4 +1,5 @@ #include +#include #include @@ -9,6 +10,7 @@ namespace xrpl { void secureErase(void* dest, std::size_t bytes) { + TRACE_FUNC(); OPENSSL_cleanse(dest, bytes); } diff --git a/src/libxrpl/json/JsonPropertyStream.cpp b/src/libxrpl/json/JsonPropertyStream.cpp index b6a151d702..3b8aa1a0f2 100644 --- a/src/libxrpl/json/JsonPropertyStream.cpp +++ b/src/libxrpl/json/JsonPropertyStream.cpp @@ -1,6 +1,7 @@ #include #include +#include #include @@ -8,6 +9,7 @@ namespace xrpl { JsonPropertyStream::JsonPropertyStream() : topValue(json::ObjectValue) { + TRACE_FUNC(); stack.reserve(64); stack.push_back(&topValue); } @@ -15,12 +17,14 @@ JsonPropertyStream::JsonPropertyStream() : topValue(json::ObjectValue) json::Value const& JsonPropertyStream::top() const { + TRACE_FUNC(); return topValue; } void JsonPropertyStream::mapBegin() { + TRACE_FUNC(); // top is array json::Value& top(*stack.back()); json::Value& map(top.append(json::ObjectValue)); @@ -30,6 +34,7 @@ JsonPropertyStream::mapBegin() void JsonPropertyStream::mapBegin(std::string const& key) { + TRACE_FUNC(); // top is a map json::Value& top(*stack.back()); json::Value& map(top[key] = json::ObjectValue); @@ -39,60 +44,70 @@ JsonPropertyStream::mapBegin(std::string const& key) void JsonPropertyStream::mapEnd() { + TRACE_FUNC(); stack.pop_back(); } void JsonPropertyStream::add(std::string const& key, short v) { + TRACE_FUNC(); (*stack.back())[key] = v; } void JsonPropertyStream::add(std::string const& key, unsigned short v) { + TRACE_FUNC(); (*stack.back())[key] = v; } void JsonPropertyStream::add(std::string const& key, int v) { + TRACE_FUNC(); (*stack.back())[key] = v; } void JsonPropertyStream::add(std::string const& key, unsigned int v) { + TRACE_FUNC(); (*stack.back())[key] = v; } void JsonPropertyStream::add(std::string const& key, long v) { + TRACE_FUNC(); (*stack.back())[key] = int(v); } void JsonPropertyStream::add(std::string const& key, float v) { + TRACE_FUNC(); (*stack.back())[key] = v; } void JsonPropertyStream::add(std::string const& key, double v) { + TRACE_FUNC(); (*stack.back())[key] = v; } void JsonPropertyStream::add(std::string const& key, std::string const& v) { + TRACE_FUNC(); (*stack.back())[key] = v; } void JsonPropertyStream::arrayBegin() { + TRACE_FUNC(); // top is array json::Value& top(*stack.back()); json::Value& vec(top.append(json::ArrayValue)); @@ -102,6 +117,7 @@ JsonPropertyStream::arrayBegin() void JsonPropertyStream::arrayBegin(std::string const& key) { + TRACE_FUNC(); // top is a map json::Value& top(*stack.back()); json::Value& vec(top[key] = json::ArrayValue); @@ -111,54 +127,63 @@ JsonPropertyStream::arrayBegin(std::string const& key) void JsonPropertyStream::arrayEnd() { + TRACE_FUNC(); stack.pop_back(); } void JsonPropertyStream::add(short v) { + TRACE_FUNC(); stack.back()->append(v); } void JsonPropertyStream::add(unsigned short v) { + TRACE_FUNC(); stack.back()->append(v); } void JsonPropertyStream::add(int v) { + TRACE_FUNC(); stack.back()->append(v); } void JsonPropertyStream::add(unsigned int v) { + TRACE_FUNC(); stack.back()->append(v); } void JsonPropertyStream::add(long v) { + TRACE_FUNC(); stack.back()->append(int(v)); } void JsonPropertyStream::add(float v) { + TRACE_FUNC(); stack.back()->append(v); } void JsonPropertyStream::add(double v) { + TRACE_FUNC(); stack.back()->append(v); } void JsonPropertyStream::add(std::string const& v) { + TRACE_FUNC(); stack.back()->append(v); } diff --git a/src/libxrpl/json/Output.cpp b/src/libxrpl/json/Output.cpp index 14b6617b2f..83d23c3e32 100644 --- a/src/libxrpl/json/Output.cpp +++ b/src/libxrpl/json/Output.cpp @@ -2,6 +2,7 @@ #include #include +#include #include @@ -12,6 +13,7 @@ namespace { void outputJson(json::Value const& value, Writer& writer) { + TRACE_FUNC(); switch (value.type()) { case json::NullValue: { @@ -74,6 +76,7 @@ outputJson(json::Value const& value, Writer& writer) void outputJson(json::Value const& value, Output const& out) { + TRACE_FUNC(); Writer writer(out); outputJson(value, writer); } @@ -81,6 +84,7 @@ outputJson(json::Value const& value, Output const& out) std::string jsonAsString(json::Value const& value) { + TRACE_FUNC(); std::string s; Writer writer(stringOutput(s)); outputJson(value, writer); diff --git a/src/libxrpl/json/Writer.cpp b/src/libxrpl/json/Writer.cpp index 518573ded4..c7c1a139b7 100644 --- a/src/libxrpl/json/Writer.cpp +++ b/src/libxrpl/json/Writer.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -42,6 +43,7 @@ auto const kINTEGRAL_FLOATS_BECOME_INTS = false; size_t lengthWithoutTrailingZeros(std::string const& s) { + TRACE_FUNC(); auto dotPos = s.find('.'); if (dotPos == std::string::npos) return s.size(); @@ -75,12 +77,14 @@ public: [[nodiscard]] bool empty() const { + TRACE_FUNC(); return stack_.empty(); } void start(CollectionType ct) { + TRACE_FUNC(); char const ch = (ct == CollectionType::Array) ? kOPEN_BRACKET : kOPEN_BRACE; output({&ch, 1}); stack_.emplace(Collection{.type = ct}); @@ -89,6 +93,7 @@ public: void output(boost::beast::string_view const& bytes) { + TRACE_FUNC(); markStarted(); output_(bytes); } @@ -96,6 +101,7 @@ public: void stringOutput(boost::beast::string_view const& bytes) { + TRACE_FUNC(); markStarted(); std::size_t position = 0, writtenUntil = 0; @@ -122,6 +128,7 @@ public: void markStarted() { + TRACE_FUNC(); check(!isFinished(), "isFinished() in output."); isStarted_ = true; } @@ -129,6 +136,7 @@ public: void nextCollectionEntry(CollectionType type, std::string const& message) { + TRACE_FUNC(); check(!empty(), "empty () in " + message); auto t = stack_.top().type; @@ -151,6 +159,7 @@ public: void writeObjectTag(std::string const& tag) { + TRACE_FUNC(); #ifndef NDEBUG // Make sure we haven't already seen this tag. auto& tags = stack_.top().tags; @@ -165,12 +174,14 @@ public: [[nodiscard]] bool isFinished() const { + TRACE_FUNC(); return isStarted_ && empty(); } void finish() { + TRACE_FUNC(); check(!empty(), "Empty stack in finish()"); auto isArray = stack_.top().type == CollectionType::Array; @@ -182,6 +193,7 @@ public: void finishAll() { + TRACE_FUNC(); if (isStarted_) { while (!isFinished()) @@ -192,6 +204,7 @@ public: [[nodiscard]] Output const& getOutput() const { + TRACE_FUNC(); return output_; } @@ -226,18 +239,21 @@ Writer::Writer(Output const& output) : impl_(std::make_unique(output)) Writer::~Writer() { + TRACE_FUNC(); if (impl_) impl_->finishAll(); } Writer::Writer(Writer&& w) noexcept { + TRACE_FUNC(); impl_ = std::move(w.impl_); } Writer& Writer::operator=(Writer&& w) noexcept { + TRACE_FUNC(); impl_ = std::move(w.impl_); return *this; } @@ -245,18 +261,21 @@ Writer::operator=(Writer&& w) noexcept void Writer::output(char const* s) { + TRACE_FUNC(); impl_->stringOutput(s); } void Writer::output(std::string const& s) { + TRACE_FUNC(); impl_->stringOutput(s); } void Writer::output(json::Value const& value) { + TRACE_FUNC(); impl_->markStarted(); outputJson(value, impl_->getOutput()); } @@ -264,6 +283,7 @@ Writer::output(json::Value const& value) void Writer::output(float f) { + TRACE_FUNC(); auto s = xrpl::to_string(f); impl_->output({s.data(), lengthWithoutTrailingZeros(s)}); } @@ -271,6 +291,7 @@ Writer::output(float f) void Writer::output(double f) { + TRACE_FUNC(); auto s = xrpl::to_string(f); impl_->output({s.data(), lengthWithoutTrailingZeros(s)}); } @@ -278,24 +299,28 @@ Writer::output(double f) void Writer::output(std::nullptr_t) { + TRACE_FUNC(); impl_->output("null"); } void Writer::output(bool b) { + TRACE_FUNC(); impl_->output(b ? "true" : "false"); } void Writer::implOutput(std::string const& s) { + TRACE_FUNC(); impl_->output(s); } void Writer::finishAll() { + TRACE_FUNC(); if (impl_) impl_->finishAll(); } @@ -303,12 +328,14 @@ Writer::finishAll() void Writer::rawAppend() { + TRACE_FUNC(); impl_->nextCollectionEntry(CollectionType::Array, "append"); } void Writer::rawSet(std::string const& tag) { + TRACE_FUNC(); check(!tag.empty(), "Tag can't be empty"); impl_->nextCollectionEntry(CollectionType::Object, "set"); @@ -318,12 +345,14 @@ Writer::rawSet(std::string const& tag) void Writer::startRoot(CollectionType type) { + TRACE_FUNC(); impl_->start(type); } void Writer::startAppend(CollectionType type) { + TRACE_FUNC(); impl_->nextCollectionEntry(CollectionType::Array, "startAppend"); impl_->start(type); } @@ -331,6 +360,7 @@ Writer::startAppend(CollectionType type) void Writer::startSet(CollectionType type, std::string const& key) { + TRACE_FUNC(); impl_->nextCollectionEntry(CollectionType::Object, "startSet"); impl_->writeObjectTag(key); impl_->start(type); @@ -339,6 +369,7 @@ Writer::startSet(CollectionType type, std::string const& key) void Writer::finish() { + TRACE_FUNC(); if (impl_) impl_->finish(); } diff --git a/src/libxrpl/json/json_reader.cpp b/src/libxrpl/json/json_reader.cpp index 6574789e7b..e4d9480182 100644 --- a/src/libxrpl/json/json_reader.cpp +++ b/src/libxrpl/json/json_reader.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -19,6 +20,7 @@ namespace json { static std::string codePointToUTF8(unsigned int cp) { + TRACE_FUNC(); std::string result; // based on description from http://en.wikipedia.org/wiki/UTF-8 @@ -59,6 +61,7 @@ codePointToUTF8(unsigned int cp) bool Reader::parse(std::string const& document, Value& root) { + TRACE_FUNC(); document_ = document; char const* begin = document_.c_str(); char const* end = begin + document_.length(); @@ -68,6 +71,7 @@ Reader::parse(std::string const& document, Value& root) bool Reader::parse(std::istream& sin, Value& root) { + TRACE_FUNC(); // std::istream_iterator begin(sin); // std::istream_iterator end; // Those would allow streamed input from a file, if parse() were a @@ -83,6 +87,7 @@ Reader::parse(std::istream& sin, Value& root) bool Reader::parse(char const* beginDoc, char const* endDoc, Value& root) { + TRACE_FUNC(); begin_ = beginDoc; end_ = endDoc; current_ = begin_; @@ -115,6 +120,7 @@ Reader::parse(char const* beginDoc, char const* endDoc, Value& root) bool Reader::readValue(unsigned depth) { + TRACE_FUNC(); Token token{}; skipCommentTokens(token); if (depth > kNEST_LIMIT) @@ -165,6 +171,7 @@ Reader::readValue(unsigned depth) void Reader::skipCommentTokens(Token& token) { + TRACE_FUNC(); do { readToken(token); @@ -174,6 +181,7 @@ Reader::skipCommentTokens(Token& token) bool Reader::expectToken(TokenType type, Token& token, char const* message) { + TRACE_FUNC(); readToken(token); if (token.type != type) @@ -185,6 +193,7 @@ Reader::expectToken(TokenType type, Token& token, char const* message) bool Reader::readToken(Token& token) { + TRACE_FUNC(); skipSpaces(); token.start = current_; Char const c = getNextChar(); @@ -274,6 +283,7 @@ Reader::readToken(Token& token) void Reader::skipSpaces() { + TRACE_FUNC(); while (current_ != end_) { Char const c = *current_; @@ -292,6 +302,7 @@ Reader::skipSpaces() bool Reader::match(Location pattern, int patternLength) { + TRACE_FUNC(); if (end_ - current_ < patternLength) return false; @@ -310,6 +321,7 @@ Reader::match(Location pattern, int patternLength) bool Reader::readComment() { + TRACE_FUNC(); Char const c = getNextChar(); if (c == '*') @@ -324,6 +336,7 @@ Reader::readComment() bool Reader::readCStyleComment() { + TRACE_FUNC(); while (current_ != end_) { Char const c = getNextChar(); @@ -338,6 +351,7 @@ Reader::readCStyleComment() bool Reader::readCppStyleComment() { + TRACE_FUNC(); while (current_ != end_) { Char const c = getNextChar(); @@ -352,6 +366,7 @@ Reader::readCppStyleComment() Reader::TokenType Reader::readNumber() { + TRACE_FUNC(); static char const kEXTENDED_TOKENS[] = {'.', 'e', 'E', '+', '-'}; TokenType type = TokenInteger; @@ -383,6 +398,7 @@ Reader::readNumber() bool Reader::readString() { + TRACE_FUNC(); Char c = 0; while (current_ != end_) @@ -405,6 +421,7 @@ Reader::readString() bool Reader::readObject(Token& tokenStart, unsigned depth) { + TRACE_FUNC(); Token tokenName{}; std::string name; currentValue() = Value(ObjectValue); @@ -475,6 +492,7 @@ Reader::readObject(Token& tokenStart, unsigned depth) bool Reader::readArray(Token& tokenStart, unsigned depth) { + TRACE_FUNC(); currentValue() = Value(ArrayValue); skipSpaces(); @@ -525,6 +543,7 @@ Reader::readArray(Token& tokenStart, unsigned depth) bool Reader::decodeNumber(Token& token) { + TRACE_FUNC(); Location current = token.start; bool const isNegative = *current == '-'; @@ -604,6 +623,7 @@ Reader::decodeNumber(Token& token) bool Reader::decodeDouble(Token& token) { + TRACE_FUNC(); double value = 0; int const bufferSize = 32; int count = 0; @@ -640,6 +660,7 @@ Reader::decodeDouble(Token& token) bool Reader::decodeString(Token& token) { + TRACE_FUNC(); std::string decoded; if (!decodeString(token, decoded)) @@ -652,6 +673,7 @@ Reader::decodeString(Token& token) bool Reader::decodeString(Token& token, std::string& decoded) { + TRACE_FUNC(); decoded.reserve(token.end - token.start - 2); Location current = token.start + 1; // skip '"' Location end = token.end - 1; // do not include '"' @@ -731,6 +753,7 @@ Reader::decodeString(Token& token, std::string& decoded) bool Reader::decodeUnicodeCodePoint(Token& token, Location& current, Location end, unsigned int& unicode) { + TRACE_FUNC(); if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) return false; @@ -774,6 +797,7 @@ Reader::decodeUnicodeEscapeSequence( Location end, unsigned int& unicode) { + TRACE_FUNC(); if (end - current < 4) { return addError( @@ -815,6 +839,7 @@ Reader::decodeUnicodeEscapeSequence( bool Reader::addError(std::string const& message, Token& token, Location extra) { + TRACE_FUNC(); ErrorInfo info; info.token = token; info.message = message; @@ -826,6 +851,7 @@ Reader::addError(std::string const& message, Token& token, Location extra) bool Reader::recoverFromError(TokenType skipUntilToken) { + TRACE_FUNC(); int const errorCount = int(errors_.size()); Token skip{}; @@ -845,6 +871,7 @@ Reader::recoverFromError(TokenType skipUntilToken) bool Reader::addErrorAndRecover(std::string const& message, Token& token, TokenType skipUntilToken) { + TRACE_FUNC(); addError(message, token); return recoverFromError(skipUntilToken); } @@ -852,12 +879,14 @@ Reader::addErrorAndRecover(std::string const& message, Token& token, TokenType s Value& Reader::currentValue() { + TRACE_FUNC(); return *(nodes_.top()); } Reader::Char Reader::getNextChar() { + TRACE_FUNC(); if (current_ == end_) return 0; @@ -867,6 +896,7 @@ Reader::getNextChar() void Reader::getLocationLineAndColumn(Location location, int& line, int& column) const { + TRACE_FUNC(); Location current = begin_; Location lastLineStart = current; line = 0; @@ -898,6 +928,7 @@ Reader::getLocationLineAndColumn(Location location, int& line, int& column) cons std::string Reader::getLocationLineAndColumn(Location location) const { + TRACE_FUNC(); int line = 0, column = 0; getLocationLineAndColumn(location, line, column); return "Line " + std::to_string(line) + ", Column " + std::to_string(column); @@ -906,6 +937,7 @@ Reader::getLocationLineAndColumn(Location location) const std::string Reader::getFormattedErrorMessages() const { + TRACE_FUNC(); std::string formattedMessage; for (Errors::const_iterator itError = errors_.begin(); itError != errors_.end(); ++itError) @@ -924,6 +956,7 @@ Reader::getFormattedErrorMessages() const std::istream& operator>>(std::istream& sin, Value& root) { + TRACE_FUNC(); json::Reader reader; bool const ok = reader.parse(sin, root); diff --git a/src/libxrpl/json/json_value.cpp b/src/libxrpl/json/json_value.cpp index e7dc4b067b..fac5b65ba6 100644 --- a/src/libxrpl/json/json_value.cpp +++ b/src/libxrpl/json/json_value.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -27,18 +28,21 @@ public: char* makeMemberName(char const* memberName) override { + TRACE_FUNC(); return duplicateStringValue(memberName); } void releaseMemberName(char* memberName) override { + TRACE_FUNC(); releaseStringValue(memberName); } char* duplicateStringValue(char const* value, unsigned int length = Unknown) override { + TRACE_FUNC(); //@todo investigate this old optimization // if ( !value || value[0] == 0 ) // return 0; @@ -56,6 +60,7 @@ public: void releaseStringValue(char* value) override { + TRACE_FUNC(); if (value != nullptr) free(value); } @@ -64,6 +69,7 @@ public: static ValueAllocator*& valueAllocator() { + TRACE_FUNC(); static ValueAllocator* kVALUE_ALLOCATOR = new DefaultValueAllocator; // NOLINT TODO return kVALUE_ALLOCATOR; } @@ -72,6 +78,7 @@ static struct DummyValueAllocatorInitializer { DummyValueAllocatorInitializer() { + TRACE_FUNC(); valueAllocator(); // ensure valueAllocator() statics are initialized // before main(). } @@ -112,6 +119,7 @@ Value::CZString::CZString(CZString const& other) Value::CZString::~CZString() { + TRACE_FUNC(); if ((cstr_ != nullptr) && index_ == Duplicate) valueAllocator()->releaseMemberName(const_cast(cstr_)); } @@ -119,6 +127,7 @@ Value::CZString::~CZString() bool Value::CZString::operator<(CZString const& other) const { + TRACE_FUNC(); if ((cstr_ != nullptr) && (other.cstr_ != nullptr)) return strcmp(cstr_, other.cstr_) < 0; @@ -128,6 +137,7 @@ Value::CZString::operator<(CZString const& other) const bool Value::CZString::operator==(CZString const& other) const { + TRACE_FUNC(); if ((cstr_ != nullptr) && (other.cstr_ != nullptr)) return strcmp(cstr_, other.cstr_) == 0; @@ -137,18 +147,21 @@ Value::CZString::operator==(CZString const& other) const int Value::CZString::index() const { + TRACE_FUNC(); return index_; } char const* Value::CZString::cStr() const { + TRACE_FUNC(); return cstr_; } bool Value::CZString::isStaticString() const { + TRACE_FUNC(); return index_ == NoDuplication; } @@ -166,6 +179,7 @@ Value::CZString::isStaticString() const */ Value::Value(ValueType type) : type_(type) { + TRACE_FUNC(); switch (type) { case NullValue: @@ -202,48 +216,57 @@ Value::Value(ValueType type) : type_(type) Value::Value(Int value) : type_(IntValue) { + TRACE_FUNC(); value_.intVal = value; } Value::Value(UInt value) : type_(UintValue) { + TRACE_FUNC(); value_.uintVal = value; } Value::Value(double value) : type_(RealValue) { + TRACE_FUNC(); value_.realVal = value; } Value::Value(char const* value) : type_(StringValue), allocated_(true) { + TRACE_FUNC(); value_.stringVal = valueAllocator()->duplicateStringValue(value); } Value::Value(xrpl::Number const& value) : type_(StringValue), allocated_(true) { + TRACE_FUNC(); auto const tmp = to_string(value); value_.stringVal = valueAllocator()->duplicateStringValue(tmp.c_str(), tmp.length()); } Value::Value(std::string const& value) : type_(StringValue), allocated_(true) { + TRACE_FUNC(); value_.stringVal = valueAllocator()->duplicateStringValue(value.c_str(), (unsigned int)value.length()); } Value::Value(StaticString const& value) : type_(StringValue) { + TRACE_FUNC(); value_.stringVal = const_cast(value.cStr()); } Value::Value(bool value) : type_(BooleanValue) { + TRACE_FUNC(); value_.boolVal = value; } Value::Value(Value const& other) : type_(other.type_) { + TRACE_FUNC(); switch (type_) { case NullValue: @@ -281,6 +304,7 @@ Value::Value(Value const& other) : type_(other.type_) Value::~Value() { + TRACE_FUNC(); switch (type_) { case NullValue: @@ -312,6 +336,7 @@ Value::~Value() Value& Value::operator=(Value const& other) { + TRACE_FUNC(); Value tmp(other); swap(tmp); return *this; @@ -320,6 +345,7 @@ Value::operator=(Value const& other) Value::Value(Value&& other) noexcept : value_(other.value_), type_(other.type_), allocated_(other.allocated_) { + TRACE_FUNC(); other.type_ = NullValue; other.allocated_ = 0; } @@ -327,6 +353,7 @@ Value::Value(Value&& other) noexcept Value& Value::operator=(Value&& other) { + TRACE_FUNC(); Value tmp(std::move(other)); swap(tmp); return *this; @@ -335,6 +362,7 @@ Value::operator=(Value&& other) void Value::swap(Value& other) noexcept { + TRACE_FUNC(); std::swap(value_, other.value_); ValueType const temp = type_; @@ -349,12 +377,14 @@ Value::swap(Value& other) noexcept ValueType Value::type() const { + TRACE_FUNC(); return type_; } static int integerCmp(Int i, UInt ui) { + TRACE_FUNC(); // All negative numbers are less than all unsigned numbers. if (i < 0) return -1; @@ -368,6 +398,7 @@ integerCmp(Int i, UInt ui) bool operator<(Value const& x, Value const& y) { + TRACE_FUNC(); if (auto signum = x.type_ - y.type_) { if (x.type_ == IntValue && y.type_ == UintValue) @@ -423,6 +454,7 @@ operator<(Value const& x, Value const& y) bool operator==(Value const& x, Value const& y) { + TRACE_FUNC(); if (x.type_ != y.type_) { if (x.type_ == IntValue && y.type_ == UintValue) @@ -471,6 +503,7 @@ operator==(Value const& x, Value const& y) char const* Value::asCString() const { + TRACE_FUNC(); XRPL_ASSERT(type_ == StringValue, "json::Value::asCString : valid type"); return value_.stringVal; } @@ -478,6 +511,7 @@ Value::asCString() const std::string Value::asString() const { + TRACE_FUNC(); switch (type_) { case NullValue: @@ -514,6 +548,7 @@ Value::asString() const Value::Int Value::asInt() const { + TRACE_FUNC(); switch (type_) { case NullValue: @@ -557,6 +592,7 @@ Value::asInt() const UInt Value::asAbsUInt() const { + TRACE_FUNC(); switch (type_) { case NullValue: @@ -616,6 +652,7 @@ Value::asAbsUInt() const Value::UInt Value::asUInt() const { + TRACE_FUNC(); switch (type_) { case NullValue: @@ -659,6 +696,7 @@ Value::asUInt() const double Value::asDouble() const { + TRACE_FUNC(); switch (type_) { case NullValue: @@ -693,6 +731,7 @@ Value::asDouble() const bool Value::asBool() const { + TRACE_FUNC(); switch (type_) { case NullValue: @@ -727,6 +766,7 @@ Value::asBool() const bool Value::isConvertibleTo(ValueType other) const { + TRACE_FUNC(); switch (type_) { case NullValue: @@ -778,6 +818,7 @@ Value::isConvertibleTo(ValueType other) const Value::UInt Value::size() const { + TRACE_FUNC(); switch (type_) { case NullValue: @@ -813,6 +854,7 @@ Value::size() const Value:: operator bool() const { + TRACE_FUNC(); if (isNull()) return false; @@ -828,6 +870,7 @@ operator bool() const void Value::clear() { + TRACE_FUNC(); XRPL_ASSERT( type_ == NullValue || type_ == ArrayValue || type_ == ObjectValue, "json::Value::clear : valid type"); @@ -867,6 +910,7 @@ Value::operator[](UInt index) Value const& Value::operator[](UInt index) const { + TRACE_FUNC(); XRPL_ASSERT( type_ == NullValue || type_ == ArrayValue, "json::Value::operator[](UInt) const : valid type"); @@ -892,6 +936,7 @@ Value::operator[](char const* key) Value& Value::resolveReference(char const* key, bool isStatic) { + TRACE_FUNC(); XRPL_ASSERT( type_ == NullValue || type_ == ObjectValue, "json::Value::resolveReference : valid type"); @@ -913,6 +958,7 @@ Value::resolveReference(char const* key, bool isStatic) Value Value::get(UInt index, Value const& defaultValue) const { + TRACE_FUNC(); Value const* value = &((*this)[index]); return value == &kNULL ? defaultValue : *value; } @@ -920,12 +966,14 @@ Value::get(UInt index, Value const& defaultValue) const bool Value::isValidIndex(UInt index) const { + TRACE_FUNC(); return index < size(); } Value const& Value::operator[](char const* key) const { + TRACE_FUNC(); XRPL_ASSERT( type_ == NullValue || type_ == ObjectValue, "json::Value::operator[](const char*) const : valid type"); @@ -951,6 +999,7 @@ Value::operator[](std::string const& key) Value const& Value::operator[](std::string const& key) const { + TRACE_FUNC(); return (*this)[key.c_str()]; } @@ -963,24 +1012,28 @@ Value::operator[](StaticString const& key) Value const& Value::operator[](StaticString const& key) const { + TRACE_FUNC(); return (*this)[key.cStr()]; } Value& Value::append(Value const& value) { + TRACE_FUNC(); return (*this)[size()] = value; } Value& Value::append(Value&& value) { + TRACE_FUNC(); return (*this)[size()] = std::move(value); } Value Value::get(char const* key, Value const& defaultValue) const { + TRACE_FUNC(); Value const* value = &((*this)[key]); return value == &kNULL ? defaultValue : *value; } @@ -988,12 +1041,14 @@ Value::get(char const* key, Value const& defaultValue) const Value Value::get(std::string const& key, Value const& defaultValue) const { + TRACE_FUNC(); return get(key.c_str(), defaultValue); } Value Value::removeMember(char const* key) { + TRACE_FUNC(); XRPL_ASSERT( type_ == NullValue || type_ == ObjectValue, "json::Value::removeMember : valid type"); @@ -1014,12 +1069,14 @@ Value::removeMember(char const* key) Value Value::removeMember(std::string const& key) { + TRACE_FUNC(); return removeMember(key.c_str()); } bool Value::isMember(char const* key) const { + TRACE_FUNC(); if (type_ != ObjectValue) return false; @@ -1030,18 +1087,21 @@ Value::isMember(char const* key) const bool Value::isMember(std::string const& key) const { + TRACE_FUNC(); return isMember(key.c_str()); } bool Value::isMember(StaticString const& key) const { + TRACE_FUNC(); return isMember(key.cStr()); } Value::Members Value::getMemberNames() const { + TRACE_FUNC(); XRPL_ASSERT( type_ == NullValue || type_ == ObjectValue, "json::Value::getMemberNames : valid type"); @@ -1062,78 +1122,91 @@ Value::getMemberNames() const bool Value::isNull() const { + TRACE_FUNC(); return type_ == NullValue; } bool Value::isBool() const { + TRACE_FUNC(); return type_ == BooleanValue; } bool Value::isInt() const { + TRACE_FUNC(); return type_ == IntValue; } bool Value::isUInt() const { + TRACE_FUNC(); return type_ == UintValue; } bool Value::isIntegral() const { + TRACE_FUNC(); return type_ == IntValue || type_ == UintValue || type_ == BooleanValue; } bool Value::isDouble() const { + TRACE_FUNC(); return type_ == RealValue; } bool Value::isNumeric() const { + TRACE_FUNC(); return isIntegral() || isDouble(); } bool Value::isString() const { + TRACE_FUNC(); return type_ == StringValue; } bool Value::isArray() const { + TRACE_FUNC(); return type_ == ArrayValue; } bool Value::isArrayOrNull() const { + TRACE_FUNC(); return type_ == NullValue || type_ == ArrayValue; } bool Value::isObject() const { + TRACE_FUNC(); return type_ == ObjectValue; } bool Value::isObjectOrNull() const { + TRACE_FUNC(); return type_ == NullValue || type_ == ObjectValue; } std::string Value::toStyledString() const { + TRACE_FUNC(); StyledWriter writer; return writer.write(*this); } @@ -1141,6 +1214,7 @@ Value::toStyledString() const Value::const_iterator Value::begin() const { + TRACE_FUNC(); switch (type_) { case ArrayValue: @@ -1159,6 +1233,7 @@ Value::begin() const Value::const_iterator Value::end() const { + TRACE_FUNC(); switch (type_) { case ArrayValue: @@ -1177,6 +1252,7 @@ Value::end() const Value::iterator Value::begin() { + TRACE_FUNC(); switch (type_) { case ArrayValue: @@ -1194,6 +1270,7 @@ Value::begin() Value::iterator Value::end() { + TRACE_FUNC(); switch (type_) { case ArrayValue: diff --git a/src/libxrpl/json/json_valueiterator.cpp b/src/libxrpl/json/json_valueiterator.cpp index 5a3a5ffcdb..40c87e0a1a 100644 --- a/src/libxrpl/json/json_valueiterator.cpp +++ b/src/libxrpl/json/json_valueiterator.cpp @@ -2,6 +2,7 @@ #include #include +#include namespace json { @@ -25,24 +26,28 @@ ValueIteratorBase::ValueIteratorBase(Value::ObjectValues::iterator const& curren Value& ValueIteratorBase::deref() const { + TRACE_FUNC(); return current_->second; } void ValueIteratorBase::increment() { + TRACE_FUNC(); ++current_; } void ValueIteratorBase::decrement() { + TRACE_FUNC(); --current_; } ValueIteratorBase::difference_type ValueIteratorBase::computeDistance(SelfType const& other) const { + TRACE_FUNC(); // Iterator for null value are initialized using the default // constructor, which initialize current_ to the default // std::map::iterator. As begin() and end() are two instance @@ -70,6 +75,7 @@ ValueIteratorBase::computeDistance(SelfType const& other) const bool ValueIteratorBase::isEqual(SelfType const& other) const { + TRACE_FUNC(); if (isNull_) { return other.isNull_; @@ -81,12 +87,14 @@ ValueIteratorBase::isEqual(SelfType const& other) const void ValueIteratorBase::copy(SelfType const& other) { + TRACE_FUNC(); current_ = other.current_; } Value ValueIteratorBase::key() const { + TRACE_FUNC(); Value::CZString const czString = (*current_).first; if (czString.cStr() != nullptr) @@ -103,6 +111,7 @@ ValueIteratorBase::key() const UInt ValueIteratorBase::index() const { + TRACE_FUNC(); Value::CZString const czString = (*current_).first; if (czString.cStr() == nullptr) @@ -114,6 +123,7 @@ ValueIteratorBase::index() const char const* ValueIteratorBase::memberName() const { + TRACE_FUNC(); char const* name = (*current_).first.cStr(); return (name != nullptr) ? name : ""; } @@ -134,6 +144,7 @@ ValueConstIterator::ValueConstIterator(Value::ObjectValues::iterator const& curr ValueConstIterator& ValueConstIterator::operator=(ValueIteratorBase const& other) { + TRACE_FUNC(); copy(other); return *this; } @@ -160,6 +171,7 @@ ValueIterator::ValueIterator(ValueIterator const& other) = default; ValueIterator& ValueIterator::operator=(SelfType const& other) { + TRACE_FUNC(); copy(other); return *this; } diff --git a/src/libxrpl/json/json_writer.cpp b/src/libxrpl/json/json_writer.cpp index 6c138e1fb1..998b4dc4a1 100644 --- a/src/libxrpl/json/json_writer.cpp +++ b/src/libxrpl/json/json_writer.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -18,12 +19,14 @@ namespace json { static bool isControlCharacter(char ch) { + TRACE_FUNC(); return ch > 0 && ch <= 0x1F; } static bool containsControlCharacter(char const* str) { + TRACE_FUNC(); while (*str != 0) { if (isControlCharacter(*(str++))) @@ -35,6 +38,7 @@ containsControlCharacter(char const* str) static void uintToString(unsigned int value, char*& current) { + TRACE_FUNC(); *--current = 0; do @@ -47,6 +51,7 @@ uintToString(unsigned int value, char*& current) std::string valueToString(Int value) { + TRACE_FUNC(); char buffer[32]; char* current = buffer + sizeof(buffer); // NOLINT(misc-const-correctness) bool const isNegative = value < 0; @@ -66,6 +71,7 @@ valueToString(Int value) std::string valueToString(UInt value) { + TRACE_FUNC(); char buffer[32]; char* current = buffer + sizeof(buffer); // NOLINT(misc-const-correctness) uintToString(value, current); @@ -76,6 +82,7 @@ valueToString(UInt value) std::string valueToString(double value) { + TRACE_FUNC(); // Allocate a buffer that is more than large enough to store the 16 digits // of precision requested below. char buffer[32]; @@ -94,12 +101,14 @@ valueToString(double value) std::string valueToString(bool value) { + TRACE_FUNC(); return value ? "true" : "false"; } std::string valueToQuotedString(char const* value) { + TRACE_FUNC(); // Not sure how to handle unicode... if (strpbrk(value, "\"\\\b\f\n\r\t") == nullptr && !containsControlCharacter(value)) return std::string("\"") + value + "\""; @@ -178,6 +187,7 @@ valueToQuotedString(char const* value) std::string FastWriter::write(Value const& root) { + TRACE_FUNC(); document_ = ""; writeValue(root); return std::move(document_); @@ -186,6 +196,7 @@ FastWriter::write(Value const& root) void FastWriter::writeValue(Value const& value) { + TRACE_FUNC(); switch (value.type()) { case NullValue: @@ -258,6 +269,7 @@ StyledWriter::StyledWriter() = default; std::string StyledWriter::write(Value const& root) { + TRACE_FUNC(); document_ = ""; addChildValues_ = false; indentString_ = ""; @@ -269,6 +281,7 @@ StyledWriter::write(Value const& root) void StyledWriter::writeValue(Value const& value) { + TRACE_FUNC(); switch (value.type()) { case NullValue: @@ -337,6 +350,7 @@ StyledWriter::writeValue(Value const& value) void StyledWriter::writeArrayValue(Value const& value) { + TRACE_FUNC(); unsigned const size = value.size(); if (size == 0) @@ -400,6 +414,7 @@ StyledWriter::writeArrayValue(Value const& value) bool StyledWriter::isMultilineArray(Value const& value) { + TRACE_FUNC(); int const size = value.size(); bool isMultiLine = size * 3 >= rightMargin_; childValues_.clear(); @@ -433,6 +448,7 @@ StyledWriter::isMultilineArray(Value const& value) void StyledWriter::pushValue(std::string const& value) { + TRACE_FUNC(); if (addChildValues_) { childValues_.push_back(value); @@ -446,6 +462,7 @@ StyledWriter::pushValue(std::string const& value) void StyledWriter::writeIndent() { + TRACE_FUNC(); if (!document_.empty()) { char const last = document_[document_.length() - 1]; @@ -463,6 +480,7 @@ StyledWriter::writeIndent() void StyledWriter::writeWithIndent(std::string const& value) { + TRACE_FUNC(); writeIndent(); document_ += value; } @@ -470,12 +488,14 @@ StyledWriter::writeWithIndent(std::string const& value) void StyledWriter::indent() { + TRACE_FUNC(); indentString_ += std::string(indentSize_, ' '); } void StyledWriter::unindent() { + TRACE_FUNC(); XRPL_ASSERT( int(indentString_.size()) >= indentSize_, "json::StyledWriter::unindent : maximum indent size"); @@ -493,6 +513,7 @@ StyledStreamWriter::StyledStreamWriter(std::string indentation) void StyledStreamWriter::write(std::ostream& out, Value const& root) { + TRACE_FUNC(); document_ = &out; addChildValues_ = false; indentString_ = ""; @@ -504,6 +525,7 @@ StyledStreamWriter::write(std::ostream& out, Value const& root) void StyledStreamWriter::writeValue(Value const& value) { + TRACE_FUNC(); switch (value.type()) { case NullValue: @@ -572,6 +594,7 @@ StyledStreamWriter::writeValue(Value const& value) void StyledStreamWriter::writeArrayValue(Value const& value) { + TRACE_FUNC(); unsigned const size = value.size(); if (size == 0) @@ -635,6 +658,7 @@ StyledStreamWriter::writeArrayValue(Value const& value) bool StyledStreamWriter::isMultilineArray(Value const& value) { + TRACE_FUNC(); int const size = value.size(); bool isMultiLine = size * 3 >= rightMargin_; childValues_.clear(); @@ -668,6 +692,7 @@ StyledStreamWriter::isMultilineArray(Value const& value) void StyledStreamWriter::pushValue(std::string const& value) { + TRACE_FUNC(); if (addChildValues_) { childValues_.push_back(value); @@ -681,6 +706,7 @@ StyledStreamWriter::pushValue(std::string const& value) void StyledStreamWriter::writeIndent() { + TRACE_FUNC(); /* Some comments in this method would have been nice. ;-) @@ -699,6 +725,7 @@ StyledStreamWriter::writeIndent() void StyledStreamWriter::writeWithIndent(std::string const& value) { + TRACE_FUNC(); writeIndent(); *document_ << value; } @@ -706,12 +733,14 @@ StyledStreamWriter::writeWithIndent(std::string const& value) void StyledStreamWriter::indent() { + TRACE_FUNC(); indentString_ += indentation_; } void StyledStreamWriter::unindent() { + TRACE_FUNC(); XRPL_ASSERT( indentString_.size() >= indentation_.size(), "json::StyledStreamWriter::unindent : maximum indent size"); @@ -721,6 +750,7 @@ StyledStreamWriter::unindent() std::ostream& operator<<(std::ostream& sout, Value const& root) { + TRACE_FUNC(); json::StyledStreamWriter writer; writer.write(sout, root); return sout; diff --git a/src/libxrpl/json/to_string.cpp b/src/libxrpl/json/to_string.cpp index b51c8f1eb6..7d608aed5c 100644 --- a/src/libxrpl/json/to_string.cpp +++ b/src/libxrpl/json/to_string.cpp @@ -1,6 +1,7 @@ #include #include +#include #include @@ -9,12 +10,14 @@ namespace json { std::string to_string(Value const& value) { + TRACE_FUNC(); return FastWriter().write(value); } std::string pretty(Value const& value) { + TRACE_FUNC(); return StyledWriter().write(value); } diff --git a/src/libxrpl/ledger/AcceptedLedgerTx.cpp b/src/libxrpl/ledger/AcceptedLedgerTx.cpp index 304c99ffcb..1f536ca146 100644 --- a/src/libxrpl/ledger/AcceptedLedgerTx.cpp +++ b/src/libxrpl/ledger/AcceptedLedgerTx.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ AcceptedLedgerTx::AcceptedLedgerTx( , meta_(txn->getTransactionID(), ledger->seq(), *met) , affected_(meta_.getAffectedAccounts()) { + TRACE_FUNC(); XRPL_ASSERT(!ledger->open(), "xrpl::AcceptedLedgerTx::AcceptedLedgerTx : valid ledger state"); Serializer s; @@ -73,6 +75,7 @@ AcceptedLedgerTx::AcceptedLedgerTx( std::string AcceptedLedgerTx::getEscMeta() const { + TRACE_FUNC(); XRPL_ASSERT(!rawMeta_.empty(), "xrpl::AcceptedLedgerTx::getEscMeta : metadata is set"); return sqlBlobLiteral(rawMeta_); } diff --git a/src/libxrpl/ledger/ApplyStateTable.cpp b/src/libxrpl/ledger/ApplyStateTable.cpp index f49b1d0122..67e28f3a05 100644 --- a/src/libxrpl/ledger/ApplyStateTable.cpp +++ b/src/libxrpl/ledger/ApplyStateTable.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,7 @@ namespace xrpl::detail { void ApplyStateTable::apply(RawView& to) const { + TRACE_FUNC(); to.rawDestroyXRP(dropsDestroyed_); for (auto const& item : items_) { @@ -61,6 +63,7 @@ ApplyStateTable::apply(RawView& to) const std::size_t ApplyStateTable::size() const { + TRACE_FUNC(); std::size_t ret = 0; for (auto& item : items_) { @@ -86,6 +89,7 @@ ApplyStateTable::visit( std::shared_ptr const& before, std::shared_ptr const& after)> const& func) const { + TRACE_FUNC(); for (auto& item : items_) { switch (item.second.first) @@ -118,6 +122,7 @@ ApplyStateTable::apply( bool isDryRun, beast::Journal j) { + TRACE_FUNC(); // Build metadata and insert auto const sTx = std::make_shared(); tx.add(*sTx); @@ -287,6 +292,7 @@ ApplyStateTable::apply( bool ApplyStateTable::exists(ReadView const& base, Keylet const& k) const { + TRACE_FUNC(); auto const iter = items_.find(k.key); if (iter == items_.end()) return base.exists(k); @@ -310,6 +316,7 @@ ApplyStateTable::succ( key_type const& key, std::optional const& last) const -> std::optional { + TRACE_FUNC(); std::optional next = key; items_t::const_iterator iter; // Find base successor that is @@ -342,6 +349,7 @@ ApplyStateTable::succ( std::shared_ptr ApplyStateTable::read(ReadView const& base, Keylet const& k) const { + TRACE_FUNC(); auto const iter = items_.find(k.key); if (iter == items_.end()) return base.read(k); @@ -364,6 +372,7 @@ ApplyStateTable::read(ReadView const& base, Keylet const& k) const std::shared_ptr ApplyStateTable::peek(ReadView const& base, Keylet const& k) { + TRACE_FUNC(); auto iter = items_.lower_bound(k.key); if (iter == items_.end() || iter->first != k.key) { @@ -398,6 +407,7 @@ ApplyStateTable::peek(ReadView const& base, Keylet const& k) void ApplyStateTable::erase(ReadView const& base, std::shared_ptr const& sle) { + TRACE_FUNC(); auto const iter = items_.find(sle->key()); if (iter == items_.end()) Throw("ApplyStateTable::erase: missing key"); @@ -422,6 +432,7 @@ ApplyStateTable::erase(ReadView const& base, std::shared_ptr const& sle) void ApplyStateTable::rawErase(ReadView const& base, std::shared_ptr const& sle) { + TRACE_FUNC(); using namespace std; auto const result = items_.emplace( piecewise_construct, forward_as_tuple(sle->key()), forward_as_tuple(Action::Erase, sle)); @@ -447,6 +458,7 @@ ApplyStateTable::rawErase(ReadView const& base, std::shared_ptr const& sle) void ApplyStateTable::insert(ReadView const& base, std::shared_ptr const& sle) { + TRACE_FUNC(); auto const iter = items_.lower_bound(sle->key()); if (iter == items_.end() || iter->first != sle->key()) { @@ -477,6 +489,7 @@ ApplyStateTable::insert(ReadView const& base, std::shared_ptr const& sle) void ApplyStateTable::replace(ReadView const& base, std::shared_ptr const& sle) { + TRACE_FUNC(); auto const iter = items_.lower_bound(sle->key()); if (iter == items_.end() || iter->first != sle->key()) { @@ -506,6 +519,7 @@ ApplyStateTable::replace(ReadView const& base, std::shared_ptr const& sle) void ApplyStateTable::update(ReadView const& base, std::shared_ptr const& sle) { + TRACE_FUNC(); auto const iter = items_.find(sle->key()); if (iter == items_.end()) Throw("ApplyStateTable::update: missing key"); @@ -529,6 +543,7 @@ ApplyStateTable::update(ReadView const& base, std::shared_ptr const& sle) void ApplyStateTable::destroyXRP(XRPAmount const& fee) { + TRACE_FUNC(); dropsDestroyed_ += fee; } @@ -538,6 +553,7 @@ ApplyStateTable::destroyXRP(XRPAmount const& fee) void ApplyStateTable::threadItem(TxMeta& meta, std::shared_ptr const& sle) { + TRACE_FUNC(); key_type prevTxID; LedgerIndex prevLgrID = 0; @@ -571,6 +587,7 @@ ApplyStateTable::threadItem(TxMeta& meta, std::shared_ptr const& sle) std::shared_ptr ApplyStateTable::getForMod(ReadView const& base, key_type const& key, Mods& mods, beast::Journal j) { + TRACE_FUNC(); { auto miter = mods.find(key); if (miter != mods.end()) @@ -621,6 +638,7 @@ ApplyStateTable::threadTx( Mods& mods, beast::Journal j) { + TRACE_FUNC(); auto const sle = getForMod(base, keylet::account(to).key, mods, j); if (!sle) { @@ -644,6 +662,7 @@ ApplyStateTable::threadOwners( Mods& mods, beast::Journal j) { + TRACE_FUNC(); LedgerEntryType const ledgerType{sle->getType()}; switch (ledgerType) { diff --git a/src/libxrpl/ledger/ApplyView.cpp b/src/libxrpl/ledger/ApplyView.cpp index 3343748a75..734338a988 100644 --- a/src/libxrpl/ledger/ApplyView.cpp +++ b/src/libxrpl/ledger/ApplyView.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -33,6 +34,7 @@ createRoot( uint256 const& key, std::function const&)> const& describe) { + TRACE_FUNC(); auto newRoot = std::make_shared(directory); newRoot->setFieldH256(sfRootIndex, directory.key); describe(newRoot); @@ -48,6 +50,7 @@ createRoot( auto findPreviousPage(ApplyView& view, Keylet const& directory, SLE::ref start) { + TRACE_FUNC(); std::uint64_t const page = start->getFieldU64(sfIndexPrevious); auto node = start; @@ -75,6 +78,7 @@ insertKey( STVector256& indexes, uint256 const& key) { + TRACE_FUNC(); if (preserveOrder) { if (std::ranges::find(indexes, key) != indexes.end()) @@ -112,6 +116,7 @@ insertPage( Keylet const& directory, std::function const&)> const& describe) { + TRACE_FUNC(); // We rely on modulo arithmetic of unsigned integers (guaranteed in // [basic.fundamental] paragraph 2) to detect page representation overflow. // For signed integers this would be UB, hence static_assert here. @@ -168,6 +173,7 @@ ApplyView::dirAdd( uint256 const& key, std::function const&)> const& describe) { + TRACE_FUNC(); auto root = peek(directory); if (!root) @@ -190,6 +196,7 @@ ApplyView::dirAdd( bool ApplyView::emptyDirDelete(Keylet const& directory) { + TRACE_FUNC(); auto node = peek(directory); if (!node) @@ -255,6 +262,7 @@ ApplyView::emptyDirDelete(Keylet const& directory) bool ApplyView::dirRemove(Keylet const& directory, std::uint64_t page, uint256 const& key, bool keepRoot) { + TRACE_FUNC(); auto node = peek(keylet::page(directory, page)); if (!node) @@ -395,6 +403,7 @@ ApplyView::dirRemove(Keylet const& directory, std::uint64_t page, uint256 const& bool ApplyView::dirDelete(Keylet const& directory, std::function const& callback) { + TRACE_FUNC(); std::optional pi; do diff --git a/src/libxrpl/ledger/ApplyViewBase.cpp b/src/libxrpl/ledger/ApplyViewBase.cpp index e5a8e11b4c..95e588556f 100644 --- a/src/libxrpl/ledger/ApplyViewBase.cpp +++ b/src/libxrpl/ledger/ApplyViewBase.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -24,30 +25,35 @@ ApplyViewBase::ApplyViewBase(ReadView const* base, ApplyFlags flags) : flags_(fl bool ApplyViewBase::open() const { + TRACE_FUNC(); return base_->open(); } LedgerHeader const& ApplyViewBase::header() const { + TRACE_FUNC(); return base_->header(); } Fees const& ApplyViewBase::fees() const { + TRACE_FUNC(); return base_->fees(); } Rules const& ApplyViewBase::rules() const { + TRACE_FUNC(); return base_->rules(); } bool ApplyViewBase::exists(Keylet const& k) const { + TRACE_FUNC(); return items_.exists(*base_, k); } @@ -55,54 +61,63 @@ auto ApplyViewBase::succ(key_type const& key, std::optional const& last) const -> std::optional { + TRACE_FUNC(); return items_.succ(*base_, key, last); } std::shared_ptr ApplyViewBase::read(Keylet const& k) const { + TRACE_FUNC(); return items_.read(*base_, k); } auto ApplyViewBase::slesBegin() const -> std::unique_ptr { + TRACE_FUNC(); return base_->slesBegin(); } auto ApplyViewBase::slesEnd() const -> std::unique_ptr { + TRACE_FUNC(); return base_->slesEnd(); } auto ApplyViewBase::slesUpperBound(uint256 const& key) const -> std::unique_ptr { + TRACE_FUNC(); return base_->slesUpperBound(key); } auto ApplyViewBase::txsBegin() const -> std::unique_ptr { + TRACE_FUNC(); return base_->txsBegin(); } auto ApplyViewBase::txsEnd() const -> std::unique_ptr { + TRACE_FUNC(); return base_->txsEnd(); } bool ApplyViewBase::txExists(key_type const& key) const { + TRACE_FUNC(); return base_->txExists(key); } auto ApplyViewBase::txRead(key_type const& key) const -> tx_type { + TRACE_FUNC(); return base_->txRead(key); } @@ -111,30 +126,35 @@ ApplyViewBase::txRead(key_type const& key) const -> tx_type ApplyFlags ApplyViewBase::flags() const { + TRACE_FUNC(); return flags_; } std::shared_ptr ApplyViewBase::peek(Keylet const& k) { + TRACE_FUNC(); return items_.peek(*base_, k); } void ApplyViewBase::erase(std::shared_ptr const& sle) { + TRACE_FUNC(); items_.erase(*base_, sle); } void ApplyViewBase::insert(std::shared_ptr const& sle) { + TRACE_FUNC(); items_.insert(*base_, sle); } void ApplyViewBase::update(std::shared_ptr const& sle) { + TRACE_FUNC(); items_.update(*base_, sle); } @@ -143,24 +163,28 @@ ApplyViewBase::update(std::shared_ptr const& sle) void ApplyViewBase::rawErase(std::shared_ptr const& sle) { + TRACE_FUNC(); items_.rawErase(*base_, sle); } void ApplyViewBase::rawInsert(std::shared_ptr const& sle) { + TRACE_FUNC(); items_.insert(*base_, sle); } void ApplyViewBase::rawReplace(std::shared_ptr const& sle) { + TRACE_FUNC(); items_.replace(*base_, sle); } void ApplyViewBase::rawDestroyXRP(XRPAmount const& fee) { + TRACE_FUNC(); items_.destroyXRP(fee); } diff --git a/src/libxrpl/ledger/ApplyViewImpl.cpp b/src/libxrpl/ledger/ApplyViewImpl.cpp index 9650190a3e..2878fbbb36 100644 --- a/src/libxrpl/ledger/ApplyViewImpl.cpp +++ b/src/libxrpl/ledger/ApplyViewImpl.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -31,12 +32,14 @@ ApplyViewImpl::apply( bool isDryRun, beast::Journal j) { + TRACE_FUNC(); return items_.apply(to, tx, ter, deliver_, parentBatchId, isDryRun, j); } std::size_t ApplyViewImpl::size() { + TRACE_FUNC(); return items_.size(); } @@ -49,6 +52,7 @@ ApplyViewImpl::visit( std::shared_ptr const& before, std::shared_ptr const& after)> const& func) { + TRACE_FUNC(); items_.visit(to, func); } diff --git a/src/libxrpl/ledger/BookDirs.cpp b/src/libxrpl/ledger/BookDirs.cpp index fbe876669e..ff5a37c842 100644 --- a/src/libxrpl/ledger/BookDirs.cpp +++ b/src/libxrpl/ledger/BookDirs.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -17,6 +18,7 @@ BookDirs::BookDirs(ReadView const& view, Book const& book) , next_quality_(getQualityNext(root_)) , key_(view_->succ(root_, next_quality_).value_or(beast::kZERO)) { + TRACE_FUNC(); XRPL_ASSERT(root_ != beast::kZERO, "xrpl::BookDirs::BookDirs : nonzero root"); if (key_ != beast::kZERO) { @@ -32,6 +34,7 @@ BookDirs::BookDirs(ReadView const& view, Book const& book) auto BookDirs::begin() const -> BookDirs::const_iterator { + TRACE_FUNC(); auto it = BookDirs::const_iterator(*view_, root_, key_); if (key_ != beast::kZERO) { @@ -46,12 +49,14 @@ BookDirs::begin() const -> BookDirs::const_iterator auto BookDirs::end() const -> BookDirs::const_iterator { + TRACE_FUNC(); return BookDirs::const_iterator(*view_, root_, key_); } bool BookDirs::const_iterator::operator==(BookDirs::const_iterator const& other) const { + TRACE_FUNC(); if (view_ == nullptr || other.view_ == nullptr) return false; @@ -65,6 +70,7 @@ BookDirs::const_iterator::operator==(BookDirs::const_iterator const& other) cons BookDirs::const_iterator::reference BookDirs::const_iterator::operator*() const { + TRACE_FUNC(); XRPL_ASSERT( index_ != beast::kZERO, "xrpl::BookDirs::const_iterator::operator* : nonzero index"); if (!cache_) @@ -75,6 +81,7 @@ BookDirs::const_iterator::operator*() const BookDirs::const_iterator& BookDirs::const_iterator::operator++() { + TRACE_FUNC(); using beast::kZERO; XRPL_ASSERT(index_ != kZERO, "xrpl::BookDirs::const_iterator::operator++ : nonzero index"); @@ -104,6 +111,7 @@ BookDirs::const_iterator::operator++() BookDirs::const_iterator BookDirs::const_iterator::operator++(int) { + TRACE_FUNC(); XRPL_ASSERT( index_ != beast::kZERO, "xrpl::BookDirs::const_iterator::operator++(int) : nonzero index"); const_iterator tmp(*this); diff --git a/src/libxrpl/ledger/BookListeners.cpp b/src/libxrpl/ledger/BookListeners.cpp index d78da4c73e..9f5ad132dc 100644 --- a/src/libxrpl/ledger/BookListeners.cpp +++ b/src/libxrpl/ledger/BookListeners.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -13,6 +14,7 @@ namespace xrpl { void BookListeners::addSubscriber(InfoSub::ref sub) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); listeners_[sub->getSeq()] = sub; } @@ -20,6 +22,7 @@ BookListeners::addSubscriber(InfoSub::ref sub) void BookListeners::removeSubscriber(std::uint64_t seq) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); listeners_.erase(seq); } @@ -27,6 +30,7 @@ BookListeners::removeSubscriber(std::uint64_t seq) void BookListeners::publish(MultiApiJson const& jvObj, hash_set& havePublished) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); auto it = listeners_.cbegin(); diff --git a/src/libxrpl/ledger/CachedView.cpp b/src/libxrpl/ledger/CachedView.cpp index 2dc28d67e0..9c63b62f30 100644 --- a/src/libxrpl/ledger/CachedView.cpp +++ b/src/libxrpl/ledger/CachedView.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -16,12 +17,14 @@ namespace xrpl::detail { bool CachedViewImpl::exists(Keylet const& k) const { + TRACE_FUNC(); return read(k) != nullptr; } std::shared_ptr CachedViewImpl::read(Keylet const& k) const { + TRACE_FUNC(); static CountedObjects::Counter kHITS{"CachedView::hit"}; static CountedObjects::Counter kHITSEXPIRED{"CachedView::hitExpired"}; static CountedObjects::Counter kMISSES{"CachedView::miss"}; diff --git a/src/libxrpl/ledger/CanonicalTXSet.cpp b/src/libxrpl/ledger/CanonicalTXSet.cpp index bfa3d811e6..325f1ceb93 100644 --- a/src/libxrpl/ledger/CanonicalTXSet.cpp +++ b/src/libxrpl/ledger/CanonicalTXSet.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -15,6 +16,7 @@ namespace xrpl { bool operator<(CanonicalTXSet::Key const& lhs, CanonicalTXSet::Key const& rhs) { + TRACE_FUNC(); if (lhs.account_ < rhs.account_) return true; @@ -33,6 +35,7 @@ operator<(CanonicalTXSet::Key const& lhs, CanonicalTXSet::Key const& rhs) uint256 CanonicalTXSet::accountKey(AccountID const& account) { + TRACE_FUNC(); uint256 ret = beast::kZERO; memcpy(ret.begin(), account.begin(), account.size()); ret ^= salt_; @@ -42,6 +45,7 @@ CanonicalTXSet::accountKey(AccountID const& account) void CanonicalTXSet::insert(std::shared_ptr const& txn) { + TRACE_FUNC(); map_.insert( std::make_pair( Key(accountKey(txn->getAccountID(sfAccount)), @@ -53,6 +57,7 @@ CanonicalTXSet::insert(std::shared_ptr const& txn) std::shared_ptr CanonicalTXSet::popAcctTransaction(std::shared_ptr const& tx) { + TRACE_FUNC(); // Determining the next viable transaction for an account with Tickets: // // 1. Prioritize transactions with Sequences over transactions with diff --git a/src/libxrpl/ledger/Dir.cpp b/src/libxrpl/ledger/Dir.cpp index a633257b27..28a9906255 100644 --- a/src/libxrpl/ledger/Dir.cpp +++ b/src/libxrpl/ledger/Dir.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -18,6 +19,7 @@ using const_iterator = Dir::ConstIterator; Dir::Dir(ReadView const& view, Keylet const& key) : view_(&view), root_(key), sle_(view_->read(root_)) { + TRACE_FUNC(); if (sle_ != nullptr) indexes_ = &sle_->getFieldV256(sfIndexes); } @@ -25,6 +27,7 @@ Dir::Dir(ReadView const& view, Keylet const& key) auto Dir::begin() const -> ConstIterator { + TRACE_FUNC(); auto it = ConstIterator(*view_, root_, root_); if (sle_ != nullptr) { @@ -43,12 +46,14 @@ Dir::begin() const -> ConstIterator auto Dir::end() const -> ConstIterator { + TRACE_FUNC(); return ConstIterator(*view_, root_, root_); } bool const_iterator::operator==(ConstIterator const& other) const { + TRACE_FUNC(); if (view_ == nullptr || other.view_ == nullptr) return false; @@ -61,6 +66,7 @@ const_iterator::operator==(ConstIterator const& other) const const_iterator::reference const_iterator::operator*() const { + TRACE_FUNC(); XRPL_ASSERT(index_ != beast::kZERO, "xrpl::const_iterator::operator* : nonzero index"); if (!cache_) cache_ = view_->read(keylet::child(index_)); @@ -70,6 +76,7 @@ const_iterator::operator*() const const_iterator& const_iterator::operator++() { + TRACE_FUNC(); XRPL_ASSERT(index_ != beast::kZERO, "xrpl::const_iterator::operator++ : nonzero index"); if (++it_ != std::end(*indexes_)) { @@ -84,6 +91,7 @@ const_iterator::operator++() const_iterator const_iterator::operator++(int) { + TRACE_FUNC(); XRPL_ASSERT(index_ != beast::kZERO, "xrpl::const_iterator::operator++(int) : nonzero index"); ConstIterator tmp(*this); ++(*this); @@ -93,6 +101,7 @@ const_iterator::operator++(int) const_iterator& const_iterator::nextPage() { + TRACE_FUNC(); auto const next = sle_->getFieldU64(sfIndexNext); if (next == 0) { @@ -122,6 +131,7 @@ const_iterator::nextPage() std::size_t const_iterator::pageSize() { + TRACE_FUNC(); return indexes_->size(); } diff --git a/src/libxrpl/ledger/Ledger.cpp b/src/libxrpl/ledger/Ledger.cpp index 9857b49b65..19de9090dd 100644 --- a/src/libxrpl/ledger/Ledger.cpp +++ b/src/libxrpl/ledger/Ledger.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -69,12 +70,14 @@ public: [[nodiscard]] std::unique_ptr copy() const override { + TRACE_FUNC(); return std::make_unique(*this); } [[nodiscard]] bool equal(base_type const& impl) const override { + TRACE_FUNC(); if (auto const p = dynamic_cast(&impl)) return iter_ == p->iter_; return false; @@ -83,12 +86,14 @@ public: void increment() override { + TRACE_FUNC(); ++iter_; } [[nodiscard]] SlesType::value_type dereference() const override { + TRACE_FUNC(); SerialIter sit(iter_->slice()); return std::make_shared(sit, iter_->key()); } @@ -116,12 +121,14 @@ public: [[nodiscard]] std::unique_ptr copy() const override { + TRACE_FUNC(); return std::make_unique(*this); } [[nodiscard]] bool equal(base_type const& impl) const override { + TRACE_FUNC(); if (auto const p = dynamic_cast(&impl)) return iter_ == p->iter_; return false; @@ -130,12 +137,14 @@ public: void increment() override { + TRACE_FUNC(); ++iter_; } [[nodiscard]] TxsType::value_type dereference() const override { + TRACE_FUNC(); auto const& item = *iter_; if (metadata_) return Ledger::deserializeTxPlusMeta(item); @@ -158,6 +167,7 @@ Ledger::Ledger( , rules_(std::move(rules)) , j_(beast::Journal(beast::Journal::getNullSink())) { + TRACE_FUNC(); header_.seq = 1; header_.drops = kINITIAL_XRP; header_.closeTimeResolution = kLEDGER_GENESIS_TIME_RESOLUTION; @@ -221,6 +231,7 @@ Ledger::Ledger( , header_(info) , j_(j) { + TRACE_FUNC(); loaded = true; if (header_.txHash.isNonZero() && !txMap_.fetchRoot(SHAMapHash{header_.txHash}, nullptr)) @@ -259,6 +270,7 @@ Ledger::Ledger(Ledger const& prevLedger, NetClock::time_point closeTime) , rules_(prevLedger.rules_) , j_(beast::Journal(beast::Journal::getNullSink())) { + TRACE_FUNC(); header_.seq = prevLedger.header_.seq + 1; header_.parentCloseTime = prevLedger.header_.closeTime; header_.hash = prevLedger.header().hash + uint256(1); @@ -286,6 +298,7 @@ Ledger::Ledger(LedgerHeader const& info, Rules rules, Family& family) , header_(info) , j_(beast::Journal(beast::Journal::getNullSink())) { + TRACE_FUNC(); header_.hash = calculateLedgerHash(header_); } @@ -302,6 +315,7 @@ Ledger::Ledger( , rules_(std::move(rules)) , j_(beast::Journal(beast::Journal::getNullSink())) { + TRACE_FUNC(); header_.seq = ledgerSeq; header_.closeTime = closeTime; header_.closeTimeResolution = kLEDGER_DEFAULT_TIME_RESOLUTION; @@ -311,6 +325,7 @@ Ledger::Ledger( void Ledger::setImmutable(bool rehash) { + TRACE_FUNC(); // Force update, since this is the only // place the hash transitions to valid if (!immutable_ && rehash) @@ -334,6 +349,7 @@ Ledger::setAccepted( NetClock::duration closeResolution, bool correctCloseTime) { + TRACE_FUNC(); // Used when we witnessed the consensus. XRPL_ASSERT(!open(), "xrpl::Ledger::setAccepted : valid ledger state"); @@ -346,6 +362,7 @@ Ledger::setAccepted( bool Ledger::addSLE(SLE const& sle) { + TRACE_FUNC(); auto const s = sle.getSerializer(); return stateMap_.addItem(SHAMapNodeType::TnAccountState, makeShamapitem(sle.key(), s.slice())); } @@ -355,6 +372,7 @@ Ledger::addSLE(SLE const& sle) std::shared_ptr Ledger::deserializeTx(SHAMapItem const& item) { + TRACE_FUNC(); SerialIter sit(item.slice()); return std::make_shared(sit); } @@ -362,6 +380,7 @@ Ledger::deserializeTx(SHAMapItem const& item) std::pair, std::shared_ptr> Ledger::deserializeTxPlusMeta(SHAMapItem const& item) { + TRACE_FUNC(); std::pair, std::shared_ptr> result; SerialIter sit(item.slice()); { @@ -380,6 +399,7 @@ Ledger::deserializeTxPlusMeta(SHAMapItem const& item) bool Ledger::exists(Keylet const& k) const { + TRACE_FUNC(); // VFALCO NOTE Perhaps check the type for debug builds? return stateMap_.hasItem(k.key); } @@ -387,12 +407,14 @@ Ledger::exists(Keylet const& k) const bool Ledger::exists(uint256 const& key) const { + TRACE_FUNC(); return stateMap_.hasItem(key); } std::optional Ledger::succ(uint256 const& key, std::optional const& last) const { + TRACE_FUNC(); auto item = stateMap_.upperBound(key); if (item == stateMap_.end()) return std::nullopt; @@ -404,6 +426,7 @@ Ledger::succ(uint256 const& key, std::optional const& last) const std::shared_ptr Ledger::read(Keylet const& k) const { + TRACE_FUNC(); if (k.key == beast::kZERO) { // LCOV_EXCL_START @@ -425,42 +448,49 @@ Ledger::read(Keylet const& k) const auto Ledger::slesBegin() const -> std::unique_ptr { + TRACE_FUNC(); return std::make_unique(stateMap_.begin()); } auto Ledger::slesEnd() const -> std::unique_ptr { + TRACE_FUNC(); return std::make_unique(stateMap_.end()); } auto Ledger::slesUpperBound(uint256 const& key) const -> std::unique_ptr { + TRACE_FUNC(); return std::make_unique(stateMap_.upperBound(key)); } auto Ledger::txsBegin() const -> std::unique_ptr { + TRACE_FUNC(); return std::make_unique(!open(), txMap_.begin()); } auto Ledger::txsEnd() const -> std::unique_ptr { + TRACE_FUNC(); return std::make_unique(!open(), txMap_.end()); } bool Ledger::txExists(uint256 const& key) const { + TRACE_FUNC(); return txMap_.hasItem(key); } auto Ledger::txRead(key_type const& key) const -> tx_type { + TRACE_FUNC(); auto const& item = txMap_.peekItem(key); if (!item) return {}; @@ -475,6 +505,7 @@ Ledger::txRead(key_type const& key) const -> tx_type auto Ledger::digest(key_type const& key) const -> std::optional { + TRACE_FUNC(); SHAMapHash digest; // VFALCO Unfortunately this loads the item // from the NodeStore needlessly. @@ -488,6 +519,7 @@ Ledger::digest(key_type const& key) const -> std::optional void Ledger::rawErase(std::shared_ptr const& sle) { + TRACE_FUNC(); if (!stateMap_.delItem(sle->key())) logicError("Ledger::rawErase: key not found"); } @@ -495,6 +527,7 @@ Ledger::rawErase(std::shared_ptr const& sle) void Ledger::rawErase(uint256 const& key) { + TRACE_FUNC(); if (!stateMap_.delItem(key)) logicError("Ledger::rawErase: key not found"); } @@ -502,6 +535,7 @@ Ledger::rawErase(uint256 const& key) void Ledger::rawInsert(std::shared_ptr const& sle) { + TRACE_FUNC(); Serializer ss; sle->add(ss); if (!stateMap_.addGiveItem( @@ -514,6 +548,7 @@ Ledger::rawInsert(std::shared_ptr const& sle) void Ledger::rawReplace(std::shared_ptr const& sle) { + TRACE_FUNC(); Serializer ss; sle->add(ss); if (!stateMap_.updateGiveItem( @@ -529,6 +564,7 @@ Ledger::rawTxInsert( std::shared_ptr const& txn, std::shared_ptr const& metaData) { + TRACE_FUNC(); XRPL_ASSERT(metaData, "xrpl::Ledger::rawTxInsert : non-null metadata input"); // low-level - just add to table @@ -542,6 +578,7 @@ Ledger::rawTxInsert( bool Ledger::setup() { + TRACE_FUNC(); bool ret = true; try @@ -626,6 +663,7 @@ Ledger::setup() std::shared_ptr Ledger::peek(Keylet const& k) const { + TRACE_FUNC(); auto const& value = stateMap_.peekItem(k.key); if (!value) return nullptr; @@ -638,6 +676,7 @@ Ledger::peek(Keylet const& k) const hash_set Ledger::negativeUNL() const { + TRACE_FUNC(); hash_set negUnl; if (auto sle = read(keylet::negativeUNL()); sle && sle->isFieldPresent(sfDisabledValidators)) { @@ -663,6 +702,7 @@ Ledger::negativeUNL() const std::optional Ledger::validatorToDisable() const { + TRACE_FUNC(); if (auto sle = read(keylet::negativeUNL()); sle && sle->isFieldPresent(sfValidatorToDisable)) { auto d = sle->getFieldVL(sfValidatorToDisable); @@ -677,6 +717,7 @@ Ledger::validatorToDisable() const std::optional Ledger::validatorToReEnable() const { + TRACE_FUNC(); if (auto sle = read(keylet::negativeUNL()); sle && sle->isFieldPresent(sfValidatorToReEnable)) { auto d = sle->getFieldVL(sfValidatorToReEnable); @@ -691,6 +732,7 @@ Ledger::validatorToReEnable() const void Ledger::updateNegativeUNL() { + TRACE_FUNC(); auto sle = peek(keylet::negativeUNL()); if (!sle) return; @@ -740,6 +782,7 @@ Ledger::updateNegativeUNL() bool Ledger::walkLedger(beast::Journal j, bool parallel) const { + TRACE_FUNC(); std::vector missingNodes1; std::vector missingNodes2; @@ -791,6 +834,7 @@ Ledger::walkLedger(beast::Journal j, bool parallel) const bool Ledger::isSensible() const { + TRACE_FUNC(); if (header_.hash.isZero()) return false; if (header_.accountHash.isZero()) @@ -807,6 +851,7 @@ Ledger::isSensible() const void Ledger::updateSkipList() { + TRACE_FUNC(); if (header_.seq == 0) // genesis ledger has no previous ledger return; @@ -880,17 +925,20 @@ Ledger::updateSkipList() bool Ledger::isFlagLedger() const { + TRACE_FUNC(); return ::xrpl::isFlagLedger(header_.seq); } bool Ledger::isVotingLedger() const { + TRACE_FUNC(); return ::xrpl::isVotingLedger(header_.seq + 1); } void Ledger::unshare() const { + TRACE_FUNC(); stateMap_.unshare(); txMap_.unshare(); } @@ -898,6 +946,7 @@ Ledger::unshare() const void Ledger::invariants() const { + TRACE_FUNC(); stateMap_.invariants(); txMap_.invariants(); } diff --git a/src/libxrpl/ledger/OpenView.cpp b/src/libxrpl/ledger/OpenView.cpp index afe826d78d..ac5a18f0f1 100644 --- a/src/libxrpl/ledger/OpenView.cpp +++ b/src/libxrpl/ledger/OpenView.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include @@ -39,12 +40,14 @@ public: [[nodiscard]] std::unique_ptr copy() const override { + TRACE_FUNC(); return std::make_unique(metadata_, iter_); } [[nodiscard]] bool equal(base_type const& impl) const override { + TRACE_FUNC(); if (auto const p = dynamic_cast(&impl)) return iter_ == p->iter_; return false; @@ -53,14 +56,17 @@ public: void increment() override { + TRACE_FUNC(); ++iter_; } [[nodiscard]] value_type dereference() const override { + TRACE_FUNC(); value_type result; { + TRACE_FUNC(); SerialIter sit(iter_->second.txn->slice()); result.first = std::make_shared(sit); } @@ -97,6 +103,7 @@ OpenView::OpenView(OpenLedgerT, ReadView const* base, Rules rules, std::shared_p , base_(base) , hold_(std::move(hold)) { + TRACE_FUNC(); header_.validated = false; header_.accepted = false; header_.seq = base_->header().seq + 1; @@ -119,12 +126,14 @@ OpenView::OpenView(ReadView const* base, std::shared_ptr hold) std::size_t OpenView::txCount() const { + TRACE_FUNC(); return baseTxCount_ + txs_.size(); } void OpenView::apply(TxsRawView& to) const { + TRACE_FUNC(); items_.apply(to); for (auto const& item : txs_) to.rawTxInsert(item.first, item.second.txn, item.second.meta); @@ -135,24 +144,28 @@ OpenView::apply(TxsRawView& to) const LedgerHeader const& OpenView::header() const { + TRACE_FUNC(); return header_; } Fees const& OpenView::fees() const { + TRACE_FUNC(); return base_->fees(); } Rules const& OpenView::rules() const { + TRACE_FUNC(); return rules_; } bool OpenView::exists(Keylet const& k) const { + TRACE_FUNC(); return items_.exists(*base_, k); } @@ -160,54 +173,63 @@ auto OpenView::succ(key_type const& key, std::optional const& last) const -> std::optional { + TRACE_FUNC(); return items_.succ(*base_, key, last); } std::shared_ptr OpenView::read(Keylet const& k) const { + TRACE_FUNC(); return items_.read(*base_, k); } auto OpenView::slesBegin() const -> std::unique_ptr { + TRACE_FUNC(); return items_.slesBegin(*base_); } auto OpenView::slesEnd() const -> std::unique_ptr { + TRACE_FUNC(); return items_.slesEnd(*base_); } auto OpenView::slesUpperBound(uint256 const& key) const -> std::unique_ptr { + TRACE_FUNC(); return items_.slesUpperBound(*base_, key); } auto OpenView::txsBegin() const -> std::unique_ptr { + TRACE_FUNC(); return std::make_unique(!open(), txs_.cbegin()); } auto OpenView::txsEnd() const -> std::unique_ptr { + TRACE_FUNC(); return std::make_unique(!open(), txs_.cend()); } bool OpenView::txExists(key_type const& key) const { + TRACE_FUNC(); return txs_.contains(key); } auto OpenView::txRead(key_type const& key) const -> tx_type { + TRACE_FUNC(); auto const iter = txs_.find(key); if (iter == txs_.end()) return base_->txRead(key); @@ -230,24 +252,28 @@ OpenView::txRead(key_type const& key) const -> tx_type void OpenView::rawErase(std::shared_ptr const& sle) { + TRACE_FUNC(); items_.erase(sle); } void OpenView::rawInsert(std::shared_ptr const& sle) { + TRACE_FUNC(); items_.insert(sle); } void OpenView::rawReplace(std::shared_ptr const& sle) { + TRACE_FUNC(); items_.replace(sle); } void OpenView::rawDestroyXRP(XRPAmount const& fee) { + TRACE_FUNC(); items_.destroyXRP(fee); // VFALCO Deduct from header_.totalDrops ? // What about child views? @@ -261,6 +287,7 @@ OpenView::rawTxInsert( std::shared_ptr const& txn, std::shared_ptr const& metaData) { + TRACE_FUNC(); auto const result = txs_.emplace( std::piecewise_construct, std::forward_as_tuple(key), std::forward_as_tuple(txn, metaData)); if (!result.second) diff --git a/src/libxrpl/ledger/PaymentSandbox.cpp b/src/libxrpl/ledger/PaymentSandbox.cpp index a730b247ba..48f11c1b70 100644 --- a/src/libxrpl/ledger/PaymentSandbox.cpp +++ b/src/libxrpl/ledger/PaymentSandbox.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,7 @@ namespace detail { auto DeferredCredits::makeKeyIOU(AccountID const& a1, AccountID const& a2, Currency const& c) -> KeyIOU { + TRACE_FUNC(); if (a1 < a2) { return std::make_tuple(a1, a2, c); @@ -40,6 +42,7 @@ DeferredCredits::creditIOU( STAmount const& amount, STAmount const& preCreditSenderBalance) { + TRACE_FUNC(); XRPL_ASSERT( sender != receiver, "xrpl::detail::DeferredCredits::creditIOU : sender is not receiver"); XRPL_ASSERT(!amount.negative(), "xrpl::detail::DeferredCredits::creditIOU : positive amount"); @@ -90,6 +93,7 @@ DeferredCredits::creditMPT( std::uint64_t preCreditBalanceHolder, std::int64_t preCreditBalanceIssuer) { + TRACE_FUNC(); XRPL_ASSERT( amount.holds(), "xrpl::detail::DeferredCredits::creditMPT : amount is for MPTIssue"); @@ -153,6 +157,7 @@ DeferredCredits::issuerSelfDebitMPT( std::uint64_t amount, std::int64_t origBalance) { + TRACE_FUNC(); auto const& mptID = issue.getMptID(); auto i = creditsMPT_.find(mptID); @@ -172,6 +177,7 @@ DeferredCredits::issuerSelfDebitMPT( void DeferredCredits::ownerCount(AccountID const& id, std::uint32_t cur, std::uint32_t next) { + TRACE_FUNC(); auto const v = std::max(cur, next); auto r = ownerCounts_.emplace(id, v); if (!r.second) @@ -184,6 +190,7 @@ DeferredCredits::ownerCount(AccountID const& id, std::uint32_t cur, std::uint32_ std::optional DeferredCredits::ownerCount(AccountID const& id) const { + TRACE_FUNC(); auto i = ownerCounts_.find(id); if (i != ownerCounts_.end()) return i->second; @@ -197,6 +204,7 @@ DeferredCredits::adjustmentsIOU( AccountID const& other, Currency const& currency) const -> std::optional { + TRACE_FUNC(); std::optional result; KeyIOU const k = makeKeyIOU(main, other, currency); @@ -219,6 +227,7 @@ DeferredCredits::adjustmentsIOU( auto DeferredCredits::adjustmentsMPT(xrpl::MPTID const& mptID) const -> std::optional { + TRACE_FUNC(); auto i = creditsMPT_.find(mptID); if (i == creditsMPT_.end()) return std::nullopt; @@ -228,6 +237,7 @@ DeferredCredits::adjustmentsMPT(xrpl::MPTID const& mptID) const -> std::optional void DeferredCredits::apply(DeferredCredits& to) { + TRACE_FUNC(); for (auto const& i : creditsIOU_) { auto r = to.creditsIOU_.emplace(i); @@ -285,6 +295,7 @@ PaymentSandbox::balanceHookIOU( AccountID const& issuer, STAmount const& amount) const { + TRACE_FUNC(); XRPL_ASSERT(amount.holds(), "balanceHookIOU: amount is for Issue"); /* @@ -337,6 +348,7 @@ STAmount PaymentSandbox::balanceHookMPT(AccountID const& account, MPTIssue const& issue, std::int64_t amount) const { + TRACE_FUNC(); auto const& issuer = issue.getIssuer(); bool const accountIsHolder = account != issuer; @@ -374,6 +386,7 @@ PaymentSandbox::balanceHookMPT(AccountID const& account, MPTIssue const& issue, STAmount PaymentSandbox::balanceHookSelfIssueMPT(xrpl::MPTIssue const& issue, std::int64_t amount) const { + TRACE_FUNC(); std::int64_t selfDebited = 0; std::int64_t lastBal = amount; for (auto curSB = this; curSB != nullptr; curSB = curSB->ps_) @@ -394,6 +407,7 @@ PaymentSandbox::balanceHookSelfIssueMPT(xrpl::MPTIssue const& issue, std::int64_ std::uint32_t PaymentSandbox::ownerCountHook(AccountID const& account, std::uint32_t count) const { + TRACE_FUNC(); std::uint32_t result = count; for (auto curSB = this; curSB != nullptr; curSB = curSB->ps_) { @@ -410,6 +424,7 @@ PaymentSandbox::creditHookIOU( STAmount const& amount, STAmount const& preCreditBalance) { + TRACE_FUNC(); XRPL_ASSERT(amount.holds(), "creditHookIOU: amount is for Issue"); tab_.creditIOU(from, to, amount, preCreditBalance); @@ -423,6 +438,7 @@ PaymentSandbox::creditHookMPT( std::uint64_t preCreditBalanceHolder, std::int64_t preCreditBalanceIssuer) { + TRACE_FUNC(); XRPL_ASSERT(amount.holds(), "creditHookMPT: amount is for MPTIssue"); tab_.creditMPT(from, to, amount, preCreditBalanceHolder, preCreditBalanceIssuer); @@ -434,6 +450,7 @@ PaymentSandbox::issuerSelfDebitHookMPT( std::uint64_t amount, std::int64_t origBalance) { + TRACE_FUNC(); XRPL_ASSERT(amount > 0, "PaymentSandbox::issuerSelfDebitHookMPT: amount must be > 0"); tab_.issuerSelfDebitMPT(issue, amount, origBalance); @@ -445,12 +462,14 @@ PaymentSandbox::adjustOwnerCountHook( std::uint32_t cur, std::uint32_t next) { + TRACE_FUNC(); tab_.ownerCount(account, cur, next); } void PaymentSandbox::apply(RawView& to) { + TRACE_FUNC(); XRPL_ASSERT(!ps_, "xrpl::PaymentSandbox::apply : non-null sandbox"); items_.apply(to); } @@ -458,6 +477,7 @@ PaymentSandbox::apply(RawView& to) void PaymentSandbox::apply(PaymentSandbox& to) { + TRACE_FUNC(); XRPL_ASSERT(ps_ == &to, "xrpl::PaymentSandbox::apply : matching sandbox"); items_.apply(to); tab_.apply(to.tab_); @@ -466,6 +486,7 @@ PaymentSandbox::apply(PaymentSandbox& to) XRPAmount PaymentSandbox::xrpDestroyed() const { + TRACE_FUNC(); return items_.dropsDestroyed(); } diff --git a/src/libxrpl/ledger/RawStateTable.cpp b/src/libxrpl/ledger/RawStateTable.cpp index 69e2f5c0fe..6a91a59663 100644 --- a/src/libxrpl/ledger/RawStateTable.cpp +++ b/src/libxrpl/ledger/RawStateTable.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,7 @@ public: ReadView::SlesType::Iterator end0) : iter0_(std::move(iter0)), end0_(std::move(end0)), iter1_(iter1), end1_(end1) { + TRACE_FUNC(); if (iter0_ != end0_) sle0_ = *iter0_; if (iter1_ != end1) @@ -49,12 +51,14 @@ public: std::unique_ptr copy() const override { + TRACE_FUNC(); return std::make_unique(*this); } bool equal(base_type const& impl) const override { + TRACE_FUNC(); if (auto const p = dynamic_cast(&impl)) { XRPL_ASSERT( @@ -70,6 +74,7 @@ public: void increment() override { + TRACE_FUNC(); XRPL_ASSERT( sle1_ || sle0_, "xrpl::detail::RawStateTable::increment : either SLE is " @@ -106,6 +111,7 @@ public: value_type dereference() const override { + TRACE_FUNC(); if (!sle1_) { return sle0_; @@ -123,6 +129,7 @@ private: void inc0() { + TRACE_FUNC(); ++iter0_; if (iter0_ == end0_) { @@ -137,6 +144,7 @@ private: void inc1() { + TRACE_FUNC(); ++iter1_; if (iter1_ == end1_) { @@ -151,6 +159,7 @@ private: void skip() { + TRACE_FUNC(); while (iter1_ != end1_ && iter1_->second.action == Action::Erase && sle0_->key() == sle1_->key()) { @@ -169,6 +178,7 @@ private: void RawStateTable::apply(RawView& to) const { + TRACE_FUNC(); to.rawDestroyXRP(dropsDestroyed_); for (auto const& elem : items_) { @@ -191,6 +201,7 @@ RawStateTable::apply(RawView& to) const bool RawStateTable::exists(ReadView const& base, Keylet const& k) const { + TRACE_FUNC(); XRPL_ASSERT(k.key.isNonZero(), "xrpl::detail::RawStateTable::exists : nonzero key"); auto const iter = items_.find(k.key); if (iter == items_.end()) @@ -211,6 +222,7 @@ auto RawStateTable::succ(ReadView const& base, key_type const& key, std::optional const& last) const -> std::optional { + TRACE_FUNC(); std::optional next = key; items_t::const_iterator iter; // Find base successor that is @@ -243,6 +255,7 @@ RawStateTable::succ(ReadView const& base, key_type const& key, std::optional const& sle) { + TRACE_FUNC(); // The base invariant is checked during apply auto const result = items_.emplace( std::piecewise_construct, @@ -269,6 +282,7 @@ RawStateTable::erase(std::shared_ptr const& sle) void RawStateTable::insert(std::shared_ptr const& sle) { + TRACE_FUNC(); auto const result = items_.emplace( std::piecewise_construct, std::forward_as_tuple(sle->key()), @@ -294,6 +308,7 @@ RawStateTable::insert(std::shared_ptr const& sle) void RawStateTable::replace(std::shared_ptr const& sle) { + TRACE_FUNC(); auto const result = items_.emplace( std::piecewise_construct, std::forward_as_tuple(sle->key()), @@ -316,6 +331,7 @@ RawStateTable::replace(std::shared_ptr const& sle) std::shared_ptr RawStateTable::read(ReadView const& base, Keylet const& k) const { + TRACE_FUNC(); auto const iter = items_.find(k.key); if (iter == items_.end()) return base.read(k); @@ -332,12 +348,14 @@ RawStateTable::read(ReadView const& base, Keylet const& k) const void RawStateTable::destroyXRP(XRPAmount const& fee) { + TRACE_FUNC(); dropsDestroyed_ += fee; } std::unique_ptr RawStateTable::slesBegin(ReadView const& base) const { + TRACE_FUNC(); return std::make_unique( items_.begin(), items_.end(), base.sles.begin(), base.sles.end()); } @@ -345,6 +363,7 @@ RawStateTable::slesBegin(ReadView const& base) const std::unique_ptr RawStateTable::slesEnd(ReadView const& base) const { + TRACE_FUNC(); return std::make_unique( items_.end(), items_.end(), base.sles.end(), base.sles.end()); } @@ -352,6 +371,7 @@ RawStateTable::slesEnd(ReadView const& base) const std::unique_ptr RawStateTable::slesUpperBound(ReadView const& base, uint256 const& key) const { + TRACE_FUNC(); return std::make_unique( items_.upper_bound(key), items_.end(), base.sles.upperBound(key), base.sles.end()); } diff --git a/src/libxrpl/ledger/ReadView.cpp b/src/libxrpl/ledger/ReadView.cpp index 1877edb383..e957447c31 100644 --- a/src/libxrpl/ledger/ReadView.cpp +++ b/src/libxrpl/ledger/ReadView.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -20,18 +21,21 @@ ReadView::SlesType::SlesType(ReadView const& view) : ReadViewFwdRange(view) auto ReadView::SlesType::begin() const -> Iterator { + TRACE_FUNC(); return Iterator(view_, view_->slesBegin()); } auto ReadView::SlesType::end() const -> Iterator { + TRACE_FUNC(); return Iterator(view_, view_->slesEnd()); } auto ReadView::SlesType::upperBound(key_type const& key) const -> Iterator { + TRACE_FUNC(); return Iterator(view_, view_->slesUpperBound(key)); } @@ -42,24 +46,28 @@ ReadView::TxsType::TxsType(ReadView const& view) : ReadViewFwdRange(view) bool ReadView::TxsType::empty() const { + TRACE_FUNC(); return begin() == end(); } auto ReadView::TxsType::begin() const -> Iterator { + TRACE_FUNC(); return Iterator(view_, view_->txsBegin()); } auto ReadView::TxsType::end() const -> Iterator { + TRACE_FUNC(); return Iterator(view_, view_->txsEnd()); } Rules makeRulesGivenLedger(DigestAwareReadView const& ledger, Rules const& current) { + TRACE_FUNC(); return makeRulesGivenLedger(ledger, current.presets()); } @@ -68,6 +76,7 @@ makeRulesGivenLedger( DigestAwareReadView const& ledger, std::unordered_set> const& presets) { + TRACE_FUNC(); Keylet const k = keylet::amendments(); std::optional const digest = ledger.digest(k.key); if (digest) diff --git a/src/libxrpl/ledger/View.cpp b/src/libxrpl/ledger/View.cpp index 9fb03a230c..ab4743b9e8 100644 --- a/src/libxrpl/ledger/View.cpp +++ b/src/libxrpl/ledger/View.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -46,6 +47,7 @@ namespace xrpl { bool hasExpired(ReadView const& view, std::optional const& exp) { + TRACE_FUNC(); using d = NetClock::duration; using tp = NetClock::time_point; @@ -59,6 +61,7 @@ isVaultPseudoAccountFrozen( MPTIssue const& mptShare, int depth) { + TRACE_FUNC(); if (!view.rules().enabled(featureSingleAssetVault)) return false; @@ -100,6 +103,7 @@ isLPTokenFrozen( Asset const& asset, Asset const& asset2) { + TRACE_FUNC(); return isFrozen(view, account, asset) || isFrozen(view, account, asset2); } @@ -110,6 +114,7 @@ areCompatible( beast::Journal::Stream& s, char const* reason) { + TRACE_FUNC(); bool ret = true; if (validLedger.header().seq < testLedger.header().seq) @@ -169,6 +174,7 @@ areCompatible( beast::Journal::Stream& s, char const* reason) { + TRACE_FUNC(); bool ret = true; if (testLedger.header().seq > validIndex) @@ -204,6 +210,7 @@ areCompatible( std::set getEnabledAmendments(ReadView const& view) { + TRACE_FUNC(); std::set amendments; if (auto const sle = view.read(keylet::amendments())) @@ -221,6 +228,7 @@ getEnabledAmendments(ReadView const& view) majorityAmendments_t getMajorityAmendments(ReadView const& view) { + TRACE_FUNC(); majorityAmendments_t ret; if (auto const sle = view.read(keylet::amendments())) @@ -243,6 +251,7 @@ getMajorityAmendments(ReadView const& view) std::optional hashOfSeq(ReadView const& ledger, LedgerIndex seq, beast::Journal journal) { + TRACE_FUNC(); // Easy cases... if (seq > ledger.seq()) { @@ -311,6 +320,7 @@ dirLink( std::shared_ptr& object, SF_UINT64 const& node) { + TRACE_FUNC(); auto const page = view.dirInsert(keylet::ownerDir(owner), object->key(), describeOwnerDir(owner)); if (!page) @@ -342,6 +352,7 @@ withdrawToDestExceedsLimit( AccountID const& to, STAmount const& amount) { + TRACE_FUNC(); auto const& issuer = amount.getIssuer(); if (from == to || to == issuer || isXRP(issuer)) return tesSUCCESS; @@ -370,6 +381,7 @@ canWithdraw( STAmount const& amount, bool hasDestinationTag) { + TRACE_FUNC(); if (auto const ret = checkDestinationAndTag(toSle, hasDestinationTag)) return ret; @@ -393,6 +405,7 @@ canWithdraw( STAmount const& amount, bool hasDestinationTag) { + TRACE_FUNC(); auto const toSle = view.read(keylet::account(to)); return canWithdraw(view, from, to, toSle, amount, hasDestinationTag); @@ -401,6 +414,7 @@ canWithdraw( [[nodiscard]] TER canWithdraw(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); auto const from = tx[sfAccount]; auto const to = tx[~sfDestination].value_or(from); @@ -418,6 +432,7 @@ doWithdraw( STAmount const& amount, beast::Journal j) { + TRACE_FUNC(); // Create trust line or MPToken for the receiving account if (dstAcct == senderAcct) { @@ -460,6 +475,7 @@ cleanupOnAccountDelete( beast::Journal j, std::optional maxNodesToDelete) { + TRACE_FUNC(); // Delete all the entries in the account directory. std::shared_ptr sleDirNode{}; unsigned int uDirEntry{0}; @@ -531,6 +547,7 @@ cleanupOnAccountDelete( bool after(NetClock::time_point now, std::uint32_t mark) { + TRACE_FUNC(); return now.time_since_epoch().count() > mark; } diff --git a/src/libxrpl/ledger/helpers/AMMHelpers.cpp b/src/libxrpl/ledger/helpers/AMMHelpers.cpp index 4cef02e056..90e703be80 100644 --- a/src/libxrpl/ledger/helpers/AMMHelpers.cpp +++ b/src/libxrpl/ledger/helpers/AMMHelpers.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,7 @@ namespace xrpl { STAmount ammLPTokens(STAmount const& asset1, STAmount const& asset2, Asset const& lptIssue) { + TRACE_FUNC(); // AMM invariant: sqrt(asset1 * asset2) >= LPTokensBalance auto const rounding = isFeatureEnabled(fixAMMv1_3) ? Number::RoundingMode::Downward : Number::getround(); @@ -66,6 +68,7 @@ lpTokensOut( STAmount const& lptAMMBalance, std::uint16_t tfee) { + TRACE_FUNC(); auto const f1 = feeMult(tfee); auto const f2 = feeMultHalf(tfee) / f1; Number const r = asset1Deposit / asset1Balance; @@ -99,6 +102,7 @@ ammAssetIn( STAmount const& lpTokens, std::uint16_t tfee) { + TRACE_FUNC(); auto const f1 = feeMult(tfee); auto const f2 = feeMultHalf(tfee) / f1; auto const t1 = lpTokens / lptAMMBalance; @@ -128,6 +132,7 @@ lpTokensIn( STAmount const& lptAMMBalance, std::uint16_t tfee) { + TRACE_FUNC(); Number const fr = asset1Withdraw / asset1Balance; auto const f1 = getFee(tfee); auto const c = fr * f1 + 2 - f1; @@ -159,6 +164,7 @@ ammAssetOut( STAmount const& lpTokens, std::uint16_t tfee) { + TRACE_FUNC(); auto const f = getFee(tfee); Number const t1 = lpTokens / lptAMMBalance; if (!isFeatureEnabled(fixAMMv1_3)) @@ -175,12 +181,14 @@ ammAssetOut( Number square(Number const& n) { + TRACE_FUNC(); return n * n; } STAmount adjustLPTokens(STAmount const& lptAMMBalance, STAmount const& lpTokens, IsDeposit isDeposit) { + TRACE_FUNC(); // Force rounding downward to ensure adjusted tokens are less or equal // to requested tokens. SaveNumberRoundMode const rm(Number::setround(Number::RoundingMode::Downward)); @@ -199,6 +207,7 @@ adjustAmountsByLPTokens( std::uint16_t tfee, IsDeposit isDeposit) { + TRACE_FUNC(); // AMMv1_3 amendment adjusts tokens and amounts in deposit/withdraw if (isFeatureEnabled(fixAMMv1_3)) return std::make_tuple(amount, amount2, lpTokens); @@ -269,6 +278,7 @@ adjustAmountsByLPTokens( Number solveQuadraticEq(Number const& a, Number const& b, Number const& c) { + TRACE_FUNC(); return (-b + root2(b * b - 4 * a * c)) / (2 * a); } @@ -276,6 +286,7 @@ solveQuadraticEq(Number const& a, Number const& b, Number const& c) std::optional solveQuadraticEqSmallest(Number const& a, Number const& b, Number const& c) { + TRACE_FUNC(); auto const d = b * b - 4 * a * c; if (d < 0) return std::nullopt; @@ -292,6 +303,7 @@ solveQuadraticEqSmallest(Number const& a, Number const& b, Number const& c) STAmount multiply(STAmount const& amount, Number const& frac, Number::RoundingMode rm) { + TRACE_FUNC(); NumberRoundModeGuard const g(rm); auto const t = amount * frac; return toSTAmount(amount.asset(), t, rm); @@ -305,6 +317,7 @@ getRoundedAsset( std::function const& productCb, IsDeposit isDeposit) { + TRACE_FUNC(); if (!rules.enabled(fixAMMv1_3)) return toSTAmount(balance.asset(), noRoundCb()); @@ -322,6 +335,7 @@ getRoundedLPTokens( Number const& frac, IsDeposit isDeposit) { + TRACE_FUNC(); if (!rules.enabled(fixAMMv1_3)) return toSTAmount(balance.asset(), balance * frac); @@ -338,6 +352,7 @@ getRoundedLPTokens( std::function const& productCb, IsDeposit isDeposit) { + TRACE_FUNC(); if (!rules.enabled(fixAMMv1_3)) return toSTAmount(lptAMMBalance.asset(), noRoundCb()); @@ -362,6 +377,7 @@ adjustAssetInByTokens( STAmount const& tokens, std::uint16_t tfee) { + TRACE_FUNC(); if (!rules.enabled(fixAMMv1_3)) return {tokens, amount}; auto assetAdj = ammAssetIn(balance, lptAMMBalance, tokens, tfee); @@ -388,6 +404,7 @@ adjustAssetOutByTokens( STAmount const& tokens, std::uint16_t tfee) { + TRACE_FUNC(); if (!rules.enabled(fixAMMv1_3)) return {tokens, amount}; auto assetAdj = ammAssetOut(balance, lptAMMBalance, tokens, tfee); @@ -412,6 +429,7 @@ adjustFracByTokens( STAmount const& tokens, Number const& frac) { + TRACE_FUNC(); if (!rules.enabled(fixAMMv1_3)) return frac; return tokens / lptAMMBalance; @@ -427,6 +445,7 @@ ammPoolHolds( AuthHandling authHandling, beast::Journal const j) { + TRACE_FUNC(); auto const assetInBalance = accountHolds(view, ammAccountID, asset1, freezeHandling, authHandling, j); auto const assetOutBalance = @@ -444,6 +463,7 @@ ammHolds( AuthHandling authHandling, beast::Journal const j) { + TRACE_FUNC(); auto const assets = [&]() -> std::optional> { auto const asset1 = ammSle[sfAsset]; auto const asset2 = ammSle[sfAsset2]; @@ -511,6 +531,7 @@ ammLPHolds( AccountID const& lpAccount, beast::Journal const j) { + TRACE_FUNC(); // This function looks similar to `accountHolds`. However, it only checks if // a LPToken holder has enough balance. On the other hand, `accountHolds` // checks if the underlying assets of LPToken are frozen with the @@ -559,12 +580,14 @@ ammLPHolds( AccountID const& lpAccount, beast::Journal const j) { + TRACE_FUNC(); return ammLPHolds(view, ammSle[sfAsset], ammSle[sfAsset2], ammSle[sfAccount], lpAccount, j); } std::uint16_t getTradingFee(ReadView const& view, SLE const& ammSle, AccountID const& account) { + TRACE_FUNC(); using namespace std::chrono; XRPL_ASSERT( !view.rules().enabled(fixInnerObjTemplate) || ammSle.isFieldPresent(sfAuctionSlot), @@ -595,6 +618,7 @@ getTradingFee(ReadView const& view, SLE const& ammSle, AccountID const& account) STAmount ammAccountHolds(ReadView const& view, AccountID const& ammAccountID, Asset const& asset) { + TRACE_FUNC(); // Get the actual AMM balance without factoring in the balance hook return asset.visit( [&](MPTIssue const& issue) { @@ -631,6 +655,7 @@ deleteAMMTrustLines( std::uint16_t maxTrustlinesToDelete, beast::Journal j) { + TRACE_FUNC(); return cleanupOnAccountDelete( sb, keylet::ownerDir(ammAccountID), @@ -667,6 +692,7 @@ deleteAMMTrustLines( static TER deleteAMMMPTokens(Sandbox& sb, AccountID const& ammAccountID, beast::Journal j) { + TRACE_FUNC(); return cleanupOnAccountDelete( sb, keylet::ownerDir(ammAccountID), @@ -712,6 +738,7 @@ deleteAMMMPTokens(Sandbox& sb, AccountID const& ammAccountID, beast::Journal j) TER deleteAMMAccount(Sandbox& sb, Asset const& asset, Asset const& asset2, beast::Journal j) { + TRACE_FUNC(); auto ammSle = sb.peek(keylet::amm(asset, asset2)); if (!ammSle) { @@ -773,6 +800,7 @@ initializeFeeAuctionVote( Asset const& lptAsset, std::uint16_t tfee) { + TRACE_FUNC(); auto const& rules = view.rules(); // AMM creator gets the voting slot. STArray voteSlots; @@ -822,6 +850,7 @@ initializeFeeAuctionVote( Expected isOnlyLiquidityProvider(ReadView const& view, Issue const& ammIssue, AccountID const& lpAccount) { + TRACE_FUNC(); // Liquidity Provider (LP) must have one LPToken trustline std::uint8_t nLPTokenTrustLines = 0; // AMM account has at most two IOU (pool tokens, not LPToken) trustlines. @@ -926,6 +955,7 @@ verifyAndAdjustLPTokenBalance( std::shared_ptr& ammSle, AccountID const& account) { + TRACE_FUNC(); auto const res = isOnlyLiquidityProvider(sb, lpTokens.get(), account); if (!res.has_value()) { diff --git a/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp b/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp index 052c93739c..168e691fc0 100644 --- a/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp +++ b/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -34,6 +35,7 @@ namespace xrpl { bool isGlobalFrozen(ReadView const& view, AccountID const& issuer) { + TRACE_FUNC(); if (isXRP(issuer)) return false; if (auto const sle = view.read(keylet::account(issuer))) @@ -54,6 +56,7 @@ confineOwnerCount( std::optional const& id = std::nullopt, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}) { + TRACE_FUNC(); std::uint32_t adjusted{current + adjustment}; if (adjustment > 0) { @@ -86,6 +89,7 @@ confineOwnerCount( XRPAmount xrpLiquid(ReadView const& view, AccountID const& id, std::int32_t ownerCountAdj, beast::Journal j) { + TRACE_FUNC(); auto const sle = view.read(keylet::account(id)); if (sle == nullptr) return beast::kZERO; @@ -116,6 +120,7 @@ xrpLiquid(ReadView const& view, AccountID const& id, std::int32_t ownerCountAdj, Rate transferRate(ReadView const& view, AccountID const& issuer) { + TRACE_FUNC(); auto const sle = view.read(keylet::account(issuer)); if (sle && sle->isFieldPresent(sfTransferRate)) @@ -131,6 +136,7 @@ adjustOwnerCount( std::int32_t amount, beast::Journal j) { + TRACE_FUNC(); if (!sle) return; XRPL_ASSERT(amount, "xrpl::adjustOwnerCount : nonzero amount input"); @@ -145,6 +151,7 @@ adjustOwnerCount( AccountID pseudoAccountAddress(ReadView const& view, uint256 const& pseudoOwnerKey) { + TRACE_FUNC(); // This number must not be changed without an amendment constexpr std::uint16_t kMAX_ACCOUNT_ATTEMPTS = 256; for (std::uint16_t i = 0; i < kMAX_ACCOUNT_ATTEMPTS; ++i) @@ -168,6 +175,7 @@ pseudoAccountAddress(ReadView const& view, uint256 const& pseudoOwnerKey) [[nodiscard]] std::vector const& getPseudoAccountFields() { + TRACE_FUNC(); static std::vector const kPSEUDO_FIELDS = []() { auto const ar = LedgerFormats::getInstance().findByType(ltACCOUNT_ROOT); if (!ar) @@ -196,6 +204,7 @@ isPseudoAccount( std::shared_ptr sleAcct, std::set const& pseudoFieldFilter) { + TRACE_FUNC(); auto const& fields = getPseudoAccountFields(); // Intentionally use defensive coding here because it's cheap and makes the @@ -211,6 +220,7 @@ isPseudoAccount( Expected, TER> createPseudoAccount(ApplyView& view, uint256 const& pseudoOwnerKey, SField const& ownerField) { + TRACE_FUNC(); [[maybe_unused]] auto const& fields = getPseudoAccountFields(); XRPL_ASSERT( @@ -253,6 +263,7 @@ createPseudoAccount(ApplyView& view, uint256 const& pseudoOwnerKey, SField const [[nodiscard]] TER checkDestinationAndTag(SLE::const_ref toSle, bool hasDestinationTag) { + TRACE_FUNC(); if (toSle == nullptr) return tecNO_DST; diff --git a/src/libxrpl/ledger/helpers/CredentialHelpers.cpp b/src/libxrpl/ledger/helpers/CredentialHelpers.cpp index 22122216bc..33e5a56963 100644 --- a/src/libxrpl/ledger/helpers/CredentialHelpers.cpp +++ b/src/libxrpl/ledger/helpers/CredentialHelpers.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -35,6 +36,7 @@ namespace credentials { bool checkExpired(std::shared_ptr const& sleCredential, NetClock::time_point const& closed) { + TRACE_FUNC(); std::uint32_t const exp = (*sleCredential)[~sfExpiration].value_or(std::numeric_limits::max()); std::uint32_t const now = closed.time_since_epoch().count(); @@ -44,6 +46,7 @@ checkExpired(std::shared_ptr const& sleCredential, NetClock::time_poi bool removeExpired(ApplyView& view, STVector256 const& arr, beast::Journal const j) { + TRACE_FUNC(); auto const closeTime = view.header().parentCloseTime; bool foundExpired = false; @@ -68,6 +71,7 @@ removeExpired(ApplyView& view, STVector256 const& arr, beast::Journal const j) TER deleteSLE(ApplyView& view, std::shared_ptr const& sleCredential, beast::Journal j) { + TRACE_FUNC(); if (!sleCredential) return tecNO_ENTRY; @@ -122,6 +126,7 @@ deleteSLE(ApplyView& view, std::shared_ptr const& sleCredential, beast::Jou NotTEC checkFields(STTx const& tx, beast::Journal j) { + TRACE_FUNC(); if (!tx.isFieldPresent(sfCredentialIDs)) return tesSUCCESS; @@ -150,6 +155,7 @@ checkFields(STTx const& tx, beast::Journal j) TER valid(STTx const& tx, ReadView const& view, AccountID const& src, beast::Journal j) { + TRACE_FUNC(); if (!tx.isFieldPresent(sfCredentialIDs)) return tesSUCCESS; @@ -184,6 +190,7 @@ valid(STTx const& tx, ReadView const& view, AccountID const& src, beast::Journal TER validDomain(ReadView const& view, uint256 domainID, AccountID const& subject) { + TRACE_FUNC(); // Note, permissioned domain objects can be deleted at any time auto const slePD = view.read(keylet::permissionedDomain(domainID)); if (!slePD) @@ -225,6 +232,7 @@ validDomain(ReadView const& view, uint256 domainID, AccountID const& subject) TER authorizedDepositPreauth(ReadView const& view, STVector256 const& credIDs, AccountID const& dst) { + TRACE_FUNC(); std::set> sorted; std::vector> lifeExtender; lifeExtender.reserve(credIDs.size()); @@ -249,6 +257,7 @@ authorizedDepositPreauth(ReadView const& view, STVector256 const& credIDs, Accou std::set> makeSorted(STArray const& credentials) { + TRACE_FUNC(); std::set> out; for (auto const& cred : credentials) { @@ -262,6 +271,7 @@ makeSorted(STArray const& credentials) NotTEC checkArray(STArray const& credentials, unsigned maxSize, beast::Journal j) { + TRACE_FUNC(); if (credentials.empty() || (credentials.size() > maxSize)) { JLOG(j.trace()) << "Malformed transaction: " @@ -308,6 +318,7 @@ checkArray(STArray const& credentials, unsigned maxSize, beast::Journal j) TER verifyValidDomain(ApplyView& view, AccountID const& account, uint256 domainID, beast::Journal j) { + TRACE_FUNC(); auto const slePD = view.read(keylet::permissionedDomain(domainID)); if (!slePD) return tecOBJECT_NOT_FOUND; @@ -347,6 +358,7 @@ verifyDepositPreauth( std::shared_ptr const& sleDst, beast::Journal j) { + TRACE_FUNC(); // If depositPreauth is enabled, then an account that requires // authorization has at least two ways to get a payment in: // 1. If src == dst, or diff --git a/src/libxrpl/ledger/helpers/DirectoryHelpers.cpp b/src/libxrpl/ledger/helpers/DirectoryHelpers.cpp index 8b4eeae7b7..32223e84af 100644 --- a/src/libxrpl/ledger/helpers/DirectoryHelpers.cpp +++ b/src/libxrpl/ledger/helpers/DirectoryHelpers.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,7 @@ dirFirst( unsigned int& index, uint256& entry) { + TRACE_FUNC(); return detail::internalDirFirst(view, root, page, index, entry); } @@ -36,6 +38,7 @@ dirNext( unsigned int& index, uint256& entry) { + TRACE_FUNC(); return detail::internalDirNext(view, root, page, index, entry); } @@ -47,6 +50,7 @@ cdirFirst( unsigned int& index, uint256& entry) { + TRACE_FUNC(); return detail::internalDirFirst(view, root, page, index, entry); } @@ -58,6 +62,7 @@ cdirNext( unsigned int& index, uint256& entry) { + TRACE_FUNC(); return detail::internalDirNext(view, root, page, index, entry); } @@ -67,6 +72,7 @@ forEachItem( Keylet const& root, std::function const&)> const& f) { + TRACE_FUNC(); XRPL_ASSERT(root.type == ltDIR_NODE, "xrpl::forEachItem : valid root type"); if (root.type != ltDIR_NODE) @@ -97,6 +103,7 @@ forEachItemAfter( unsigned int limit, std::function const&)> const& f) { + TRACE_FUNC(); XRPL_ASSERT(root.type == ltDIR_NODE, "xrpl::forEachItemAfter : valid root type"); if (root.type != ltDIR_NODE) @@ -170,6 +177,7 @@ forEachItemAfter( bool dirIsEmpty(ReadView const& view, Keylet const& k) { + TRACE_FUNC(); auto const sleNode = view.read(k); if (!sleNode) return true; @@ -184,6 +192,7 @@ dirIsEmpty(ReadView const& view, Keylet const& k) std::function describeOwnerDir(AccountID const& account) { + TRACE_FUNC(); return [account](std::shared_ptr const& sle) { (*sle)[sfOwner] = account; }; } diff --git a/src/libxrpl/ledger/helpers/LendingHelpers.cpp b/src/libxrpl/ledger/helpers/LendingHelpers.cpp index 28b0c8976d..f26009d03b 100644 --- a/src/libxrpl/ledger/helpers/LendingHelpers.cpp +++ b/src/libxrpl/ledger/helpers/LendingHelpers.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ namespace xrpl { bool checkLendingProtocolDependencies(Rules const& rules, STTx const& tx) { + TRACE_FUNC(); if (!rules.enabled(featureSingleAssetVault)) return false; @@ -46,6 +48,7 @@ checkLendingProtocolDependencies(Rules const& rules, STTx const& tx) LoanPaymentParts& LoanPaymentParts::operator+=(LoanPaymentParts const& other) { + TRACE_FUNC(); XRPL_ASSERT( other.principalPaid >= beast::kZERO, @@ -70,6 +73,7 @@ LoanPaymentParts::operator+=(LoanPaymentParts const& other) bool LoanPaymentParts::operator==(LoanPaymentParts const& other) const { + TRACE_FUNC(); return principalPaid == other.principalPaid && interestPaid == other.interestPaid && valueChange == other.valueChange && feePaid == other.feePaid; } @@ -82,6 +86,7 @@ LoanPaymentParts::operator==(LoanPaymentParts const& other) const Number loanPeriodicRate(TenthBips32 interestRate, std::uint32_t paymentInterval) { + TRACE_FUNC(); // Need floating point math, since we're dividing by a large number return tenthBipsOfValue(Number(paymentInterval), interestRate) / kSECONDS_IN_YEAR; } @@ -93,6 +98,7 @@ loanPeriodicRate(TenthBips32 interestRate, std::uint32_t paymentInterval) bool isRounded(Asset const& asset, Number const& value, std::int32_t scale) { + TRACE_FUNC(); return roundToAsset(asset, value, scale, Number::RoundingMode::Downward) == roundToAsset(asset, value, scale, Number::RoundingMode::Upward); } @@ -102,6 +108,7 @@ namespace detail { void LoanStateDeltas::nonNegative() { + TRACE_FUNC(); if (principal < beast::kZERO) principal = kNUM_ZERO; if (interest < beast::kZERO) @@ -117,6 +124,7 @@ LoanStateDeltas::nonNegative() Number computeRaisedRate(Number const& periodicRate, std::uint32_t paymentsRemaining) { + TRACE_FUNC(); return power(1 + periodicRate, paymentsRemaining); } @@ -128,6 +136,7 @@ computeRaisedRate(Number const& periodicRate, std::uint32_t paymentsRemaining) Number computePaymentFactor(Number const& periodicRate, std::uint32_t paymentsRemaining) { + TRACE_FUNC(); if (paymentsRemaining == 0) return kNUM_ZERO; @@ -151,6 +160,7 @@ loanPeriodicPayment( Number const& periodicRate, std::uint32_t paymentsRemaining) { + TRACE_FUNC(); if (principalOutstanding == 0 || paymentsRemaining == 0) return 0; @@ -172,6 +182,7 @@ loanPrincipalFromPeriodicPayment( Number const& periodicRate, std::uint32_t paymentsRemaining) { + TRACE_FUNC(); if (paymentsRemaining == 0) return kNUM_ZERO; @@ -193,6 +204,7 @@ computeInterestAndFeeParts( TenthBips16 managementFeeRate, std::int32_t loanScale) { + TRACE_FUNC(); auto const fee = computeManagementFee(asset, interest, managementFeeRate, loanScale); return std::make_pair(interest - fee, fee); @@ -210,6 +222,7 @@ loanLatePaymentInterest( NetClock::time_point parentCloseTime, std::uint32_t nextPaymentDueDate) { + TRACE_FUNC(); if (principalOutstanding == beast::kZERO) return kNUM_ZERO; @@ -245,6 +258,7 @@ loanAccruedInterest( std::uint32_t prevPaymentDate, std::uint32_t paymentInterval) { + TRACE_FUNC(); if (periodicRate == beast::kZERO) return kNUM_ZERO; @@ -289,6 +303,7 @@ doPayment( UInt32OptionalProxy& nextDueDateProxy, std::uint32_t paymentInterval) { + TRACE_FUNC(); XRPL_ASSERT_PARTS(nextDueDateProxy, "xrpl::detail::doPayment", "Next due date proxy set"); if (payment.specialCase == PaymentSpecialCase::Final) @@ -412,6 +427,7 @@ tryOverpayment( TenthBips16 const managementFeeRate, beast::Journal j) { + TRACE_FUNC(); // Calculate what the loan state SHOULD be theoretically (at full precision) auto const theoreticalState = computeTheoreticalLoanState( periodicPayment, periodicRate, paymentRemaining, managementFeeRate); @@ -594,6 +610,7 @@ doOverpayment( TenthBips16 const managementFeeRate, beast::Journal j) { + TRACE_FUNC(); auto const loanState = constructLoanState( totalValueOutstandingProxy, principalOutstandingProxy, managementFeeOutstandingProxy); auto const periodicPayment = periodicPaymentProxy; @@ -712,6 +729,7 @@ computeLatePayment( TenthBips16 managementFeeRate, beast::Journal j) { + TRACE_FUNC(); // Check if the due date has passed. If not, reject the payment as // being too soon if (!hasExpired(view, nextDueDate)) @@ -812,6 +830,7 @@ computeFullPayment( TenthBips16 managementFeeRate, beast::Journal j) { + TRACE_FUNC(); // Full payment must be made before the final scheduled payment. if (paymentRemaining <= 1) { @@ -906,6 +925,7 @@ computeFullPayment( Number PaymentComponents::trackedInterestPart() const { + TRACE_FUNC(); return trackedValueDelta - (trackedPrincipalDelta + trackedManagementFeeDelta); } @@ -939,6 +959,7 @@ computePaymentComponents( std::uint32_t paymentRemaining, TenthBips16 managementFeeRate) { + TRACE_FUNC(); XRPL_ASSERT_PARTS( isRounded(asset, totalValueOutstanding, scale) && isRounded(asset, principalOutstanding, scale) && @@ -1149,6 +1170,7 @@ computeOverpaymentComponents( TenthBips32 const overpaymentFeeRate, TenthBips16 const managementFeeRate) { + TRACE_FUNC(); XRPL_ASSERT( overpayment > 0 && isRounded(asset, overpayment, loanScale), "xrpl::detail::computeOverpaymentComponents : valid overpayment " @@ -1200,6 +1222,7 @@ computeOverpaymentComponents( detail::LoanStateDeltas operator-(LoanState const& lhs, LoanState const& rhs) { + TRACE_FUNC(); detail::LoanStateDeltas result{ .principal = lhs.principalOutstanding - rhs.principalOutstanding, .interest = lhs.interestDue - rhs.interestDue, @@ -1212,6 +1235,7 @@ operator-(LoanState const& lhs, LoanState const& rhs) LoanState operator-(LoanState const& lhs, detail::LoanStateDeltas const& rhs) { + TRACE_FUNC(); LoanState result{ .valueOutstanding = lhs.valueOutstanding - rhs.total(), .principalOutstanding = lhs.principalOutstanding - rhs.principal, @@ -1225,6 +1249,7 @@ operator-(LoanState const& lhs, detail::LoanStateDeltas const& rhs) LoanState operator+(LoanState const& lhs, detail::LoanStateDeltas const& rhs) { + TRACE_FUNC(); LoanState result{ .valueOutstanding = lhs.valueOutstanding + rhs.total(), .principalOutstanding = lhs.principalOutstanding + rhs.principal, @@ -1244,6 +1269,7 @@ checkLoanGuards( LoanProperties const& properties, beast::Journal j) { + TRACE_FUNC(); auto const totalInterestOutstanding = properties.loanState.valueOutstanding - principalRequested; // Guard 1: if there is no computed total interest over the life of the @@ -1329,6 +1355,7 @@ computeFullPaymentInterest( std::uint32_t startDate, TenthBips32 closeInterestRate) { + TRACE_FUNC(); auto const accruedInterest = detail::loanAccruedInterest( theoreticalPrincipalOutstanding, periodicRate, @@ -1384,6 +1411,7 @@ computeTheoreticalLoanState( std::uint32_t const paymentRemaining, TenthBips32 const managementFeeRate) { + TRACE_FUNC(); if (paymentRemaining == 0) { return LoanState{ @@ -1443,6 +1471,7 @@ constructLoanState( Number const& principalOutstanding, Number const& managementFeeOutstanding) { + TRACE_FUNC(); // This implementation is pretty trivial, but ensures the calculations // are consistent everywhere, and reduces copy/paste errors. return LoanState{ @@ -1455,6 +1484,7 @@ constructLoanState( LoanState constructRoundedLoanState(SLE::const_ref loan) { + TRACE_FUNC(); return constructLoanState( loan->at(sfTotalValueOutstanding), loan->at(sfPrincipalOutstanding), @@ -1474,6 +1504,7 @@ computeManagementFee( TenthBips32 managementFeeRate, std::int32_t scale) { + TRACE_FUNC(); return roundToAsset( asset, tenthBipsOfValue(value, managementFeeRate), scale, Number::RoundingMode::Downward); } @@ -1496,6 +1527,7 @@ computeLoanProperties( TenthBips32 managementFeeRate, std::int32_t minimumScale) { + TRACE_FUNC(); auto const periodicRate = loanPeriodicRate(interestRate, paymentInterval); XRPL_ASSERT(interestRate == 0 || periodicRate > 0, "xrpl::computeLoanProperties : valid rate"); return computeLoanProperties( @@ -1524,6 +1556,7 @@ computeLoanProperties( TenthBips32 managementFeeRate, std::int32_t minimumScale) { + TRACE_FUNC(); auto const periodicPayment = detail::loanPeriodicPayment(principalOutstanding, periodicRate, paymentsRemaining); @@ -1608,6 +1641,7 @@ loanMakePayment( LoanPaymentType const paymentType, beast::Journal j) { + TRACE_FUNC(); using namespace Lending; auto principalOutstandingProxy = loan->at(sfPrincipalOutstanding); diff --git a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp index 75fe61b34b..0e957c0e45 100644 --- a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -41,6 +42,7 @@ namespace xrpl { bool isGlobalFrozen(ReadView const& view, MPTIssue const& mptIssue) { + TRACE_FUNC(); if (auto const sle = view.read(keylet::mptIssuance(mptIssue.getMptID()))) return sle->isFlag(lsfMPTLocked); return false; @@ -49,6 +51,7 @@ isGlobalFrozen(ReadView const& view, MPTIssue const& mptIssue) bool isIndividualFrozen(ReadView const& view, AccountID const& account, MPTIssue const& mptIssue) { + TRACE_FUNC(); if (auto const sle = view.read(keylet::mptoken(mptIssue.getMptID(), account))) return sle->isFlag(lsfMPTLocked); return false; @@ -57,6 +60,7 @@ isIndividualFrozen(ReadView const& view, AccountID const& account, MPTIssue cons bool isFrozen(ReadView const& view, AccountID const& account, MPTIssue const& mptIssue, int depth) { + TRACE_FUNC(); return isGlobalFrozen(view, mptIssue) || isIndividualFrozen(view, account, mptIssue) || isVaultPseudoAccountFrozen(view, account, mptIssue, depth); } @@ -68,6 +72,7 @@ isAnyFrozen( MPTIssue const& mptIssue, int depth) { + TRACE_FUNC(); if (isGlobalFrozen(view, mptIssue)) return true; @@ -89,6 +94,7 @@ isAnyFrozen( Rate transferRate(ReadView const& view, MPTID const& issuanceID) { + TRACE_FUNC(); // fee is 0-50,000 (0-50%), rate is 1,000,000,000-2,000,000,000 // For example, if transfer fee is 50% then 10,000 * 50,000 = 500,000 // which represents 50% of 1,000,000,000 @@ -106,6 +112,7 @@ transferRate(ReadView const& view, MPTID const& issuanceID) [[nodiscard]] TER canAddHolding(ReadView const& view, MPTIssue const& mptIssue) { + TRACE_FUNC(); auto mptID = mptIssue.getMptID(); auto issuance = view.read(keylet::mptIssuance(mptID)); if (!issuance) @@ -128,6 +135,7 @@ addEmptyHolding( MPTIssue const& mptIssue, beast::Journal journal) { + TRACE_FUNC(); auto const& mptID = mptIssue.getMptID(); auto const mpt = view.peek(keylet::mptIssuance(mptID)); if (!mpt) @@ -152,6 +160,7 @@ authorizeMPToken( std::uint32_t flags, std::optional holderID) { + TRACE_FUNC(); auto const sleAcct = view.peek(keylet::account(account)); if (!sleAcct) return tecINTERNAL; // LCOV_EXCL_LINE @@ -271,6 +280,7 @@ removeEmptyHolding( MPTIssue const& mptIssue, beast::Journal journal) { + TRACE_FUNC(); // If the account is the issuer, then no token should exist. MPTs do not // have the legacy ability to create such a situation, but check anyway. If // a token does exist, it will get deleted. If not, return success. @@ -305,6 +315,7 @@ requireAuth( AuthType authType, int depth) { + TRACE_FUNC(); auto const mptID = keylet::mptIssuance(mptIssue.getMptID()); auto const sleIssuance = view.read(mptID); if (!sleIssuance) @@ -397,6 +408,7 @@ enforceMPTokenAuthorization( XRPAmount const& priorBalance, // for MPToken authorization beast::Journal j) { + TRACE_FUNC(); auto const sleIssuance = view.read(keylet::mptIssuance(mptIssuanceID)); if (!sleIssuance) return tefINTERNAL; // LCOV_EXCL_LINE @@ -496,6 +508,7 @@ canTransfer( AccountID const& from, AccountID const& to) { + TRACE_FUNC(); auto const mptID = keylet::mptIssuance(mptIssue.getMptID()); auto const sleIssuance = view.read(mptID); if (!sleIssuance) @@ -512,6 +525,7 @@ canTransfer( TER canTrade(ReadView const& view, Asset const& asset) { + TRACE_FUNC(); return asset.visit( [&](Issue const&) -> TER { return tesSUCCESS; }, [&](MPTIssue const& mptIssue) -> TER { @@ -527,6 +541,7 @@ canTrade(ReadView const& view, Asset const& asset) TER lockEscrowMPT(ApplyView& view, AccountID const& sender, STAmount const& amount, beast::Journal j) { + TRACE_FUNC(); auto const mptIssue = amount.get(); auto const mptID = keylet::mptIssuance(mptIssue.getMptID()); auto sleIssuance = view.peek(mptID); @@ -626,6 +641,7 @@ unlockEscrowMPT( STAmount const& grossAmount, beast::Journal j) { + TRACE_FUNC(); if (!view.rules().enabled(fixTokenEscrowV1)) { XRPL_ASSERT(netAmount == grossAmount, "xrpl::unlockEscrowMPT : netAmount == grossAmount"); @@ -788,6 +804,7 @@ createMPToken( AccountID const& account, std::uint32_t const flags) { + TRACE_FUNC(); auto const mptokenKey = keylet::mptoken(mptIssuanceID, account); auto const ownerNode = @@ -814,6 +831,7 @@ checkCreateMPT( xrpl::AccountID const& holder, beast::Journal j) { + TRACE_FUNC(); if (mptIssue.getIssuer() == holder) return tesSUCCESS; @@ -839,12 +857,14 @@ checkCreateMPT( std::int64_t maxMPTAmount(SLE const& sleIssuance) { + TRACE_FUNC(); return sleIssuance[~sfMaximumAmount].value_or(kMAX_MP_TOKEN_AMOUNT); } std::int64_t availableMPTAmount(SLE const& sleIssuance) { + TRACE_FUNC(); auto const max = maxMPTAmount(sleIssuance); auto const outstanding = sleIssuance[sfOutstandingAmount]; return max - outstanding; @@ -853,6 +873,7 @@ availableMPTAmount(SLE const& sleIssuance) std::int64_t availableMPTAmount(ReadView const& view, MPTID const& mptID) { + TRACE_FUNC(); auto const sle = view.read(keylet::mptIssuance(mptID)); if (!sle) Throw(transHuman(tecINTERNAL)); @@ -866,6 +887,7 @@ isMPTOverflow( std::int64_t maximumAmount, AllowMPTOverflow allowOverflow) { + TRACE_FUNC(); std::uint64_t const limit = (allowOverflow == AllowMPTOverflow::Yes) ? std::numeric_limits::max() : maximumAmount; @@ -875,6 +897,7 @@ isMPTOverflow( STAmount issuerFundsToSelfIssue(ReadView const& view, MPTIssue const& issue) { + TRACE_FUNC(); STAmount amount{issue}; auto const sle = view.read(keylet::mptIssuance(issue)); @@ -887,6 +910,7 @@ issuerFundsToSelfIssue(ReadView const& view, MPTIssue const& issue) void issuerSelfDebitHookMPT(ApplyView& view, MPTIssue const& issue, std::uint64_t amount) { + TRACE_FUNC(); auto const available = availableMPTAmount(view, issue); view.issuerSelfDebitHookMPT(issue, amount, available); } @@ -894,6 +918,7 @@ issuerSelfDebitHookMPT(ApplyView& view, MPTIssue const& issue, std::uint64_t amo static TER checkMPTAllowed(ReadView const& view, TxType txType, Asset const& asset, AccountID const& accountID) { + TRACE_FUNC(); if (!asset.holds()) return tesSUCCESS; @@ -947,6 +972,7 @@ checkMPTTxAllowed( Asset const& asset, AccountID const& accountID) { + TRACE_FUNC(); // use isDEXAllowed for payment/offer crossing XRPL_ASSERT(txType != ttPAYMENT, "xrpl::checkMPTTxAllowed : not payment"); return checkMPTAllowed(view, txType, asset, accountID); diff --git a/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp b/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp index eb69ec93d0..3f26893058 100644 --- a/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -44,6 +45,7 @@ namespace xrpl::nft { static std::shared_ptr locatePage(ReadView const& view, AccountID const& owner, uint256 const& id) { + TRACE_FUNC(); auto const first = keylet::nftpage(keylet::nftpageMin(owner), id); auto const last = keylet::nftpageMax(owner); @@ -57,6 +59,7 @@ locatePage(ReadView const& view, AccountID const& owner, uint256 const& id) static std::shared_ptr locatePage(ApplyView& view, AccountID const& owner, uint256 const& id) { + TRACE_FUNC(); auto const first = keylet::nftpage(keylet::nftpageMin(owner), id); auto const last = keylet::nftpageMax(owner); @@ -74,6 +77,7 @@ getPageForToken( uint256 const& id, std::function const& createCallback) { + TRACE_FUNC(); auto const base = keylet::nftpageMin(owner); auto const first = keylet::nftpage(base, id); auto const last = keylet::nftpageMax(owner); @@ -212,6 +216,7 @@ getPageForToken( bool compareTokens(uint256 const& a, uint256 const& b) { + TRACE_FUNC(); // The sort of NFTokens needs to be fully deterministic, but the sort // is weird because we sort on the low 96-bits first. But if the low // 96-bits are identical we still need a fully deterministic sort. @@ -230,6 +235,7 @@ changeTokenURI( uint256 const& nftokenID, std::optional const& uri) { + TRACE_FUNC(); std::shared_ptr const page = locatePage(view, owner, nftokenID); // If the page couldn't be found, the given NFT isn't owned by this account @@ -262,6 +268,7 @@ changeTokenURI( TER insertToken(ApplyView& view, AccountID owner, STObject&& nft) { + TRACE_FUNC(); XRPL_ASSERT(nft.isFieldPresent(sfNFTokenID), "xrpl::nft::insertToken : has NFT token"); // First, we need to locate the page the NFT belongs to, creating it @@ -298,6 +305,7 @@ insertToken(ApplyView& view, AccountID owner, STObject&& nft) static bool mergePages(ApplyView& view, std::shared_ptr const& p1, std::shared_ptr const& p2) { + TRACE_FUNC(); if (p1->key() >= p2->key()) Throw("mergePages: pages passed in out of order!"); @@ -355,6 +363,7 @@ mergePages(ApplyView& view, std::shared_ptr const& p1, std::shared_ptr TER removeToken(ApplyView& view, AccountID const& owner, uint256 const& nftokenID) { + TRACE_FUNC(); std::shared_ptr const page = locatePage(view, owner, nftokenID); // If the page couldn't be found, the given NFT isn't owned by this account @@ -372,6 +381,7 @@ removeToken( uint256 const& nftokenID, std::shared_ptr const& curr) { + TRACE_FUNC(); // We found a page, but the given NFT may not be in it. auto arr = curr->getFieldArray(sfNFTokens); @@ -535,6 +545,7 @@ removeToken( std::optional findToken(ReadView const& view, AccountID const& owner, uint256 const& nftokenID) { + TRACE_FUNC(); std::shared_ptr const page = locatePage(view, owner, nftokenID); // If the page couldn't be found, the given NFT isn't owned by this account @@ -554,6 +565,7 @@ findToken(ReadView const& view, AccountID const& owner, uint256 const& nftokenID std::optional findTokenAndPage(ApplyView& view, AccountID const& owner, uint256 const& nftokenID) { + TRACE_FUNC(); std::shared_ptr page = locatePage(view, owner, nftokenID); // If the page couldn't be found, the given NFT isn't owned by this account @@ -575,6 +587,7 @@ findTokenAndPage(ApplyView& view, AccountID const& owner, uint256 const& nftoken std::size_t removeTokenOffersWithLimit(ApplyView& view, Keylet const& directory, std::size_t maxDeletableOffers) { + TRACE_FUNC(); if (maxDeletableOffers == 0) return 0; @@ -625,6 +638,7 @@ removeTokenOffersWithLimit(ApplyView& view, Keylet const& directory, std::size_t bool deleteTokenOffer(ApplyView& view, std::shared_ptr const& offer) { + TRACE_FUNC(); if (offer->getType() != ltNFTOKEN_OFFER) return false; @@ -653,6 +667,7 @@ deleteTokenOffer(ApplyView& view, std::shared_ptr const& offer) bool repairNFTokenDirectoryLinks(ApplyView& view, AccountID const& owner) { + TRACE_FUNC(); bool didRepair = false; auto const last = keylet::nftpageMax(owner); @@ -780,6 +795,7 @@ tokenOfferCreatePreflight( std::optional const& owner, std::uint32_t txFlags) { + TRACE_FUNC(); if (amount.negative()) { // An offer for a negative amount makes no sense. @@ -833,6 +849,7 @@ tokenOfferCreatePreclaim( std::optional const& owner, std::uint32_t txFlags) { + TRACE_FUNC(); if (((nftFlags & nft::kFLAG_CREATE_TRUST_LINES) == 0) && !amount.native() && (xferFee != 0u)) { if (!view.exists(keylet::account(nftIssuer))) @@ -933,6 +950,7 @@ tokenOfferCreateApply( beast::Journal j, std::uint32_t txFlags) { + TRACE_FUNC(); Keylet const acctKeylet = keylet::account(acctID); if (auto const acct = view.read(acctKeylet); priorBalance < view.fees().accountReserve((*acct)[sfOwnerCount] + 1)) @@ -999,6 +1017,7 @@ checkTrustlineAuthorized( beast::Journal const j, Issue const& issue) { + TRACE_FUNC(); // Only valid for custom currencies XRPL_ASSERT(!isXRP(issue.currency), "xrpl::nft::checkTrustlineAuthorized : valid to check."); @@ -1051,6 +1070,7 @@ checkTrustlineDeepFrozen( beast::Journal const j, Issue const& issue) { + TRACE_FUNC(); // Only valid for custom currencies XRPL_ASSERT(!isXRP(issue.currency), "xrpl::nft::checkTrustlineDeepFrozen : valid to check."); diff --git a/src/libxrpl/ledger/helpers/OfferHelpers.cpp b/src/libxrpl/ledger/helpers/OfferHelpers.cpp index 03a1170aad..72e9e9601d 100644 --- a/src/libxrpl/ledger/helpers/OfferHelpers.cpp +++ b/src/libxrpl/ledger/helpers/OfferHelpers.cpp @@ -11,6 +11,7 @@ #include // IWYU pragma: keep #include #include +#include #include @@ -19,6 +20,7 @@ namespace xrpl { TER offerDelete(ApplyView& view, std::shared_ptr const& sle, beast::Journal j) { + TRACE_FUNC(); if (!sle) return tesSUCCESS; auto offerIndex = sle->key(); diff --git a/src/libxrpl/ledger/helpers/PaymentChannelHelpers.cpp b/src/libxrpl/ledger/helpers/PaymentChannelHelpers.cpp index 31c206d85b..3886e5fa33 100644 --- a/src/libxrpl/ledger/helpers/PaymentChannelHelpers.cpp +++ b/src/libxrpl/ledger/helpers/PaymentChannelHelpers.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -23,6 +24,7 @@ closeChannel( uint256 const& key, beast::Journal j) { + TRACE_FUNC(); AccountID const src = (*slep)[sfAccount]; // Remove PayChan from owner directory { diff --git a/src/libxrpl/ledger/helpers/PermissionedDEXHelpers.cpp b/src/libxrpl/ledger/helpers/PermissionedDEXHelpers.cpp index 456c4e95d6..b0539ca499 100644 --- a/src/libxrpl/ledger/helpers/PermissionedDEXHelpers.cpp +++ b/src/libxrpl/ledger/helpers/PermissionedDEXHelpers.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -19,6 +20,7 @@ namespace xrpl::permissioned_dex { bool accountInDomain(ReadView const& view, AccountID const& account, Domain const& domainID) { + TRACE_FUNC(); auto const sleDomain = view.read(keylet::permissionedDomain(domainID)); if (!sleDomain) return false; @@ -48,6 +50,7 @@ offerInDomain( Domain const& domainID, beast::Journal j) { + TRACE_FUNC(); auto const sleOffer = view.read(keylet::offer(offerID)); // The following are defensive checks that should never happen, since this diff --git a/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp b/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp index 58f44534cf..f76d8cd92d 100644 --- a/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp +++ b/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,7 @@ creditLimit( AccountID const& issuer, Currency const& currency) { + TRACE_FUNC(); STAmount result(Issue{currency, account}); auto sleRippleState = view.read(keylet::line(account, issuer, currency)); @@ -66,6 +68,7 @@ creditLimit( IOUAmount creditLimit2(ReadView const& v, AccountID const& acc, AccountID const& iss, Currency const& cur) { + TRACE_FUNC(); return toAmount(creditLimit(v, acc, iss, cur)); } @@ -76,6 +79,7 @@ creditBalance( AccountID const& issuer, Currency const& currency) { + TRACE_FUNC(); STAmount result(Issue{currency, account}); auto sleRippleState = view.read(keylet::line(account, issuer, currency)); @@ -109,6 +113,7 @@ isIndividualFrozen( Currency const& currency, AccountID const& issuer) { + TRACE_FUNC(); if (isXRP(currency)) return false; if (issuer != account) @@ -130,6 +135,7 @@ isFrozen( Currency const& currency, AccountID const& issuer) { + TRACE_FUNC(); if (isXRP(currency)) return false; auto sle = view.read(keylet::account(issuer)); @@ -152,6 +158,7 @@ isDeepFrozen( Currency const& currency, AccountID const& issuer) { + TRACE_FUNC(); if (isXRP(currency)) { return false; @@ -197,6 +204,7 @@ trustCreate( std::uint32_t uQualityOut, beast::Journal j) { + TRACE_FUNC(); JLOG(j.trace()) << "trustCreate: " << to_string(uSrcAccountID) << ", " << to_string(uDstAccountID) << ", " << saBalance.getFullText(); @@ -299,6 +307,7 @@ trustDelete( AccountID const& uHighAccountID, beast::Journal j) { + TRACE_FUNC(); // Detect legacy dirs. std::uint64_t const uLowNode = sleRippleState->getFieldU64(sfLowNode); std::uint64_t const uHighNode = sleRippleState->getFieldU64(sfHighNode); @@ -339,6 +348,7 @@ updateTrustLine( STAmount const& after, beast::Journal j) { + TRACE_FUNC(); if (!state) return false; std::uint32_t const flags(state->getFieldU32(sfFlags)); @@ -387,6 +397,7 @@ issueIOU( Issue const& issue, beast::Journal j) { + TRACE_FUNC(); XRPL_ASSERT( !isXRP(account) && !isXRP(issue.account), "xrpl::issueIOU : neither account nor issuer is XRP"); @@ -481,6 +492,7 @@ redeemIOU( Issue const& issue, beast::Journal j) { + TRACE_FUNC(); XRPL_ASSERT( !isXRP(account) && !isXRP(issue.account), "xrpl::redeemIOU : neither account nor issuer is XRP"); @@ -553,6 +565,7 @@ redeemIOU( TER requireAuth(ReadView const& view, Issue const& issue, AccountID const& account, AuthType authType) { + TRACE_FUNC(); if (isXRP(issue) || issue.account == account) return tesSUCCESS; @@ -582,6 +595,7 @@ requireAuth(ReadView const& view, Issue const& issue, AccountID const& account, TER canTransfer(ReadView const& view, Issue const& issue, AccountID const& from, AccountID const& to) { + TRACE_FUNC(); if (issue.native()) return tesSUCCESS; @@ -625,6 +639,7 @@ addEmptyHolding( Issue const& issue, beast::Journal journal) { + TRACE_FUNC(); // Every account can hold XRP. An issuer can issue directly. if (issue.native() || accountID == issue.getIssuer()) return tesSUCCESS; @@ -678,6 +693,7 @@ removeEmptyHolding( Issue const& issue, beast::Journal journal) { + TRACE_FUNC(); if (issue.native()) { auto const sle = view.read(keylet::account(accountID)); @@ -741,6 +757,7 @@ deleteAMMTrustLine( std::optional const& ammAccountID, beast::Journal j) { + TRACE_FUNC(); if (!sleState || sleState->getType() != ltRIPPLE_STATE) return tecINTERNAL; // LCOV_EXCL_LINE @@ -789,6 +806,7 @@ deleteAMMMPToken( AccountID const& ammAccountID, beast::Journal j) { + TRACE_FUNC(); if (!view.dirRemove( keylet::ownerDir(ammAccountID), (*sleMpt)[sfOwnerNode], sleMpt->key(), false)) return tefBAD_LEDGER; // LCOV_EXCL_LINE diff --git a/src/libxrpl/ledger/helpers/TokenHelpers.cpp b/src/libxrpl/ledger/helpers/TokenHelpers.cpp index 000f459ef6..0296f521e5 100644 --- a/src/libxrpl/ledger/helpers/TokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/TokenHelpers.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -50,6 +51,7 @@ isLPTokenFrozen( bool isGlobalFrozen(ReadView const& view, Asset const& asset) { + TRACE_FUNC(); return asset.visit( [&](Issue const& issue) { return isGlobalFrozen(view, issue.getIssuer()); }, [&](MPTIssue const& issue) { return isGlobalFrozen(view, issue); }); @@ -58,6 +60,7 @@ isGlobalFrozen(ReadView const& view, Asset const& asset) bool isIndividualFrozen(ReadView const& view, AccountID const& account, Asset const& asset) { + TRACE_FUNC(); return std::visit( [&](auto const& issue) { return isIndividualFrozen(view, account, issue); }, asset.value()); } @@ -65,6 +68,7 @@ isIndividualFrozen(ReadView const& view, AccountID const& account, Asset const& bool isFrozen(ReadView const& view, AccountID const& account, Asset const& asset, int depth) { + TRACE_FUNC(); return std::visit( [&](auto const& issue) { return isFrozen(view, account, issue, depth); }, asset.value()); } @@ -72,18 +76,21 @@ isFrozen(ReadView const& view, AccountID const& account, Asset const& asset, int TER checkFrozen(ReadView const& view, AccountID const& account, Issue const& issue) { + TRACE_FUNC(); return isFrozen(view, account, issue) ? (TER)tecFROZEN : (TER)tesSUCCESS; } TER checkFrozen(ReadView const& view, AccountID const& account, MPTIssue const& mptIssue) { + TRACE_FUNC(); return isFrozen(view, account, mptIssue) ? (TER)tecLOCKED : (TER)tesSUCCESS; } TER checkFrozen(ReadView const& view, AccountID const& account, Asset const& asset) { + TRACE_FUNC(); return std::visit( [&](auto const& issue) { return checkFrozen(view, account, issue); }, asset.value()); } @@ -94,6 +101,7 @@ isAnyFrozen( std::initializer_list const& accounts, Issue const& issue) { + TRACE_FUNC(); for (auto const& account : accounts) { if (isFrozen(view, account, issue.currency, issue.account)) @@ -109,6 +117,7 @@ isAnyFrozen( Asset const& asset, int depth) { + TRACE_FUNC(); return asset.visit( [&](Issue const& issue) { return isAnyFrozen(view, accounts, issue); }, [&](MPTIssue const& issue) { return isAnyFrozen(view, accounts, issue, depth); }); @@ -117,6 +126,7 @@ isAnyFrozen( bool isDeepFrozen(ReadView const& view, AccountID const& account, MPTIssue const& mptIssue, int depth) { + TRACE_FUNC(); // Unlike IOUs, frozen / locked MPTs are not allowed to send or receive // funds, so checking "deep frozen" is the same as checking "frozen". return isFrozen(view, account, mptIssue, depth); @@ -125,6 +135,7 @@ isDeepFrozen(ReadView const& view, AccountID const& account, MPTIssue const& mpt bool isDeepFrozen(ReadView const& view, AccountID const& account, Asset const& asset, int depth) { + TRACE_FUNC(); return std::visit( [&](auto const& issue) { return isDeepFrozen(view, account, issue, depth); }, asset.value()); @@ -133,12 +144,14 @@ isDeepFrozen(ReadView const& view, AccountID const& account, Asset const& asset, TER checkDeepFrozen(ReadView const& view, AccountID const& account, MPTIssue const& mptIssue) { + TRACE_FUNC(); return isDeepFrozen(view, account, mptIssue) ? (TER)tecLOCKED : (TER)tesSUCCESS; } TER checkDeepFrozen(ReadView const& view, AccountID const& account, Asset const& asset) { + TRACE_FUNC(); return std::visit( [&](auto const& issue) { return checkDeepFrozen(view, account, issue); }, asset.value()); } @@ -158,6 +171,7 @@ getLineIfUsable( FreezeHandling zeroIfFrozen, beast::Journal j) { + TRACE_FUNC(); auto sle = view.read(keylet::line(account, issuer, currency)); if (!sle) @@ -208,6 +222,7 @@ getTrustLineBalance( bool includeOppositeLimit, beast::Journal j) { + TRACE_FUNC(); STAmount amount; if (sle) { @@ -246,6 +261,7 @@ accountHolds( beast::Journal j, SpendableHandling includeFullBalance) { + TRACE_FUNC(); STAmount const amount; if (isXRP(currency)) { @@ -276,6 +292,7 @@ accountHolds( beast::Journal j, SpendableHandling includeFullBalance) { + TRACE_FUNC(); return accountHolds( view, account, issue.currency, issue.account, zeroIfFrozen, j, includeFullBalance); } @@ -290,6 +307,7 @@ accountHolds( beast::Journal j, SpendableHandling includeFullBalance) { + TRACE_FUNC(); bool const returnSpendable = (includeFullBalance == SpendableHandling::FullBalance); STAmount amount{mptIssue}; auto const& issuer = mptIssue.getIssuer(); @@ -361,6 +379,7 @@ accountHolds( beast::Journal j, SpendableHandling includeFullBalance) { + TRACE_FUNC(); return asset.visit( [&](Issue const& issue) { return accountHolds(view, account, issue, zeroIfFrozen, j, includeFullBalance); @@ -379,6 +398,7 @@ accountFunds( FreezeHandling freezeHandling, beast::Journal j) { + TRACE_FUNC(); XRPL_ASSERT(saDefault.holds(), "xrpl::accountFunds: saDefault holds Issue"); if (!saDefault.native() && saDefault.getIssuer() == id) @@ -397,6 +417,7 @@ accountFunds( AuthHandling authHandling, beast::Journal j) { + TRACE_FUNC(); return saDefault.asset().visit( [&](Issue const&) { return accountFunds(view, id, saDefault, freezeHandling, j); }, [&](MPTIssue const&) { @@ -414,6 +435,7 @@ accountFunds( Rate transferRate(ReadView const& view, STAmount const& amount) { + TRACE_FUNC(); return amount.asset().visit( [&](Issue const& issue) { return transferRate(view, issue.getIssuer()); }, [&](MPTIssue const& issue) { return transferRate(view, issue.getMptID()); }); @@ -428,6 +450,7 @@ transferRate(ReadView const& view, STAmount const& amount) [[nodiscard]] TER canAddHolding(ReadView const& view, Issue const& issue) { + TRACE_FUNC(); if (issue.native()) { return tesSUCCESS; // No special checks for XRP @@ -449,6 +472,7 @@ canAddHolding(ReadView const& view, Issue const& issue) [[nodiscard]] TER canAddHolding(ReadView const& view, Asset const& asset) { + TRACE_FUNC(); return std::visit( [&](TIss const& issue) -> TER { return canAddHolding(view, issue); }, asset.value()); @@ -462,6 +486,7 @@ addEmptyHolding( Asset const& asset, beast::Journal journal) { + TRACE_FUNC(); return std::visit( [&](TIss const& issue) -> TER { return addEmptyHolding(view, accountID, priorBalance, issue, journal); @@ -476,6 +501,7 @@ removeEmptyHolding( Asset const& asset, beast::Journal journal) { + TRACE_FUNC(); return std::visit( [&](TIss const& issue) -> TER { return removeEmptyHolding(view, accountID, issue, journal); @@ -492,6 +518,7 @@ removeEmptyHolding( TER requireAuth(ReadView const& view, Asset const& asset, AccountID const& account, AuthType authType) { + TRACE_FUNC(); return std::visit( [&](TIss const& issue) { return requireAuth(view, issue, account, authType); @@ -502,6 +529,7 @@ requireAuth(ReadView const& view, Asset const& asset, AccountID const& account, TER canTransfer(ReadView const& view, Asset const& asset, AccountID const& from, AccountID const& to) { + TRACE_FUNC(); return std::visit( [&](TIss const& issue) -> TER { return canTransfer(view, issue, from, to); @@ -528,6 +556,7 @@ directSendNoFeeIOU( bool bCheckIssuer, beast::Journal j) { + TRACE_FUNC(); AccountID const& issuer = saAmount.getIssuer(); Currency const& currency = saAmount.get().currency; @@ -673,6 +702,7 @@ directSendNoLimitIOU( beast::Journal j, WaiveTransferFee waiveFee) { + TRACE_FUNC(); auto const& issuer = saAmount.getIssuer(); XRPL_ASSERT( @@ -722,6 +752,7 @@ directSendNoLimitMultiIOU( beast::Journal j, WaiveTransferFee waiveFee) { + TRACE_FUNC(); auto const& issuer = issue.getIssuer(); XRPL_ASSERT(!isXRP(senderID), "xrpl::directSendNoLimitMultiIOU : sender is not XRP"); @@ -793,6 +824,7 @@ accountSendIOU( beast::Journal j, WaiveTransferFee waiveFee) { + TRACE_FUNC(); if (view.rules().enabled(fixAMMv1_1)) { if (saAmount < beast::kZERO || saAmount.holds()) @@ -910,6 +942,7 @@ accountSendMultiIOU( beast::Journal j, WaiveTransferFee waiveFee) { + TRACE_FUNC(); XRPL_ASSERT_PARTS( receivers.size() > 1, "xrpl::accountSendMultiIOU", "multiple recipients provided"); @@ -1036,6 +1069,7 @@ directSendNoFeeMPT( STAmount const& saAmount, beast::Journal j) { + TRACE_FUNC(); // Do not check MPT authorization here - it must have been checked earlier auto const mptID = keylet::mptIssuance(saAmount.get().getMptID()); auto const& issuer = saAmount.getIssuer(); @@ -1117,6 +1151,7 @@ directSendNoLimitMPT( WaiveTransferFee waiveFee, AllowMPTOverflow allowOverflow) { + TRACE_FUNC(); XRPL_ASSERT(uSenderID != uReceiverID, "xrpl::directSendNoLimitMPT : sender is not receiver"); // Safe to get MPT since directSendNoLimitMPT is only called by accountSendMPT @@ -1177,6 +1212,7 @@ directSendNoLimitMultiMPT( beast::Journal j, WaiveTransferFee waiveFee) { + TRACE_FUNC(); auto const& issuer = mptIssue.getIssuer(); auto const sle = view.read(keylet::mptIssuance(mptIssue.getMptID())); @@ -1297,6 +1333,7 @@ accountSendMPT( WaiveTransferFee waiveFee, AllowMPTOverflow allowOverflow) { + TRACE_FUNC(); XRPL_ASSERT( saAmount >= beast::kZERO && saAmount.holds(), "xrpl::accountSendMPT : minimum amount and MPT"); @@ -1322,6 +1359,7 @@ accountSendMultiMPT( beast::Journal j, WaiveTransferFee waiveFee) { + TRACE_FUNC(); STAmount actual; return directSendNoLimitMultiMPT(view, senderID, mptIssue, receivers, actual, j, waiveFee); @@ -1342,6 +1380,7 @@ directSendNoFee( bool bCheckIssuer, beast::Journal j) { + TRACE_FUNC(); return saAmount.asset().visit( [&](Issue const&) { return directSendNoFeeIOU(view, uSenderID, uReceiverID, saAmount, bCheckIssuer, j); @@ -1362,6 +1401,7 @@ accountSend( WaiveTransferFee waiveFee, AllowMPTOverflow allowOverflow) { + TRACE_FUNC(); return saAmount.asset().visit( [&](Issue const&) { return accountSendIOU(view, uSenderID, uReceiverID, saAmount, j, waiveFee); @@ -1381,6 +1421,7 @@ accountSendMulti( beast::Journal j, WaiveTransferFee waiveFee) { + TRACE_FUNC(); XRPL_ASSERT_PARTS( receivers.size() > 1, "xrpl::accountSendMulti", "multiple recipients provided"); return asset.visit( @@ -1400,6 +1441,7 @@ transferXRP( STAmount const& amount, beast::Journal j) { + TRACE_FUNC(); XRPL_ASSERT(from != beast::kZERO, "xrpl::transferXRP : nonzero from account"); XRPL_ASSERT(to != beast::kZERO, "xrpl::transferXRP : nonzero to account"); XRPL_ASSERT(from != to, "xrpl::transferXRP : sender is not receiver"); diff --git a/src/libxrpl/ledger/helpers/VaultHelpers.cpp b/src/libxrpl/ledger/helpers/VaultHelpers.cpp index 8832e0078f..e1c94fbb21 100644 --- a/src/libxrpl/ledger/helpers/VaultHelpers.cpp +++ b/src/libxrpl/ledger/helpers/VaultHelpers.cpp @@ -6,6 +6,7 @@ #include #include #include // IWYU pragma: keep +#include #include #include @@ -18,6 +19,7 @@ assetsToSharesDeposit( std::shared_ptr const& issuance, STAmount const& assets) { + TRACE_FUNC(); XRPL_ASSERT(!assets.negative(), "xrpl::assetsToSharesDeposit : non-negative assets"); XRPL_ASSERT( assets.asset() == vault->at(sfAsset), @@ -45,6 +47,7 @@ sharesToAssetsDeposit( std::shared_ptr const& issuance, STAmount const& shares) { + TRACE_FUNC(); XRPL_ASSERT(!shares.negative(), "xrpl::sharesToAssetsDeposit : non-negative shares"); XRPL_ASSERT( shares.asset() == vault->at(sfShareMPTID), @@ -72,6 +75,7 @@ assetsToSharesWithdraw( STAmount const& assets, TruncateShares truncate) { + TRACE_FUNC(); XRPL_ASSERT(!assets.negative(), "xrpl::assetsToSharesWithdraw : non-negative assets"); XRPL_ASSERT( assets.asset() == vault->at(sfAsset), @@ -98,6 +102,7 @@ sharesToAssetsWithdraw( std::shared_ptr const& issuance, STAmount const& shares) { + TRACE_FUNC(); XRPL_ASSERT(!shares.negative(), "xrpl::sharesToAssetsWithdraw : non-negative shares"); XRPL_ASSERT( shares.asset() == vault->at(sfShareMPTID), diff --git a/src/libxrpl/net/HTTPClient.cpp b/src/libxrpl/net/HTTPClient.cpp index afdb264916..965add92fd 100644 --- a/src/libxrpl/net/HTTPClient.cpp +++ b/src/libxrpl/net/HTTPClient.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -42,12 +43,14 @@ HTTPClient::initializeSSLContext( bool sslVerify, beast::Journal j) { + TRACE_FUNC(); gHttpClientSslContext.emplace(sslVerifyDir, sslVerifyFile, sslVerify, j); } void HTTPClient::cleanupSSLContext() { + TRACE_FUNC(); gHttpClientSslContext.reset(); } @@ -83,6 +86,7 @@ public: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) makeGet(std::string const& strPath, boost::asio::streambuf& sb, std::string const& strHost) { + TRACE_FUNC(); std::ostream osRequest(&sb); osRequest << "GET " << strPath @@ -107,6 +111,7 @@ public: int iStatus, std::string const& strData)> complete) { + TRACE_FUNC(); ssl_ = bSSL; deqSites_ = deqSites; build_ = build; @@ -128,6 +133,7 @@ public: int iStatus, std::string const& strData)> complete) { + TRACE_FUNC(); complete_ = complete; timeout_ = timeout; @@ -149,6 +155,7 @@ public: void httpsNext() { + TRACE_FUNC(); JLOG(j_.trace()) << "Fetch: " << deqSites_[0]; auto query = std::make_shared( @@ -193,6 +200,7 @@ public: void handleDeadline(boost::system::error_code const& ecResult) { + TRACE_FUNC(); if (ecResult == boost::asio::error::operation_aborted) { // Timer canceled because deadline no longer needed. @@ -229,6 +237,7 @@ public: void handleShutdown(boost::system::error_code const& ecResult) { + TRACE_FUNC(); if (ecResult) { JLOG(j_.trace()) << "Shutdown error: " << deqSites_[0] << ": " << ecResult.message(); @@ -240,6 +249,7 @@ public: boost::system::error_code const& ecResult, boost::asio::ip::tcp::resolver::results_type result) { + TRACE_FUNC(); if (!shutdown_) { shutdown_ = ecResult @@ -270,6 +280,7 @@ public: void handleConnect(boost::system::error_code const& ecResult) { + TRACE_FUNC(); if (!shutdown_) shutdown_ = ecResult; @@ -313,6 +324,7 @@ public: void handleRequest(boost::system::error_code const& ecResult) { + TRACE_FUNC(); if (!shutdown_) shutdown_ = ecResult; @@ -341,6 +353,7 @@ public: void handleWrite(boost::system::error_code const& ecResult, std::size_t bytesTransferred) { + TRACE_FUNC(); if (!shutdown_) shutdown_ = ecResult; @@ -368,6 +381,7 @@ public: void handleHeader(boost::system::error_code const& ecResult, std::size_t bytesTransferred) { + TRACE_FUNC(); std::string strHeader{ {std::istreambuf_iterator(&header_)}, std::istreambuf_iterator()}; JLOG(j_.trace()) << "Header: \"" << strHeader << "\""; @@ -435,6 +449,7 @@ public: void handleData(boost::system::error_code const& ecResult, std::size_t bytesTransferred) { + TRACE_FUNC(); if (!shutdown_) shutdown_ = ecResult; @@ -467,6 +482,7 @@ public: int iStatus = 0, std::string const& strData = "") { + TRACE_FUNC(); boost::system::error_code ecCancel; try { @@ -554,6 +570,7 @@ HTTPClient::get( complete, beast::Journal& j) { + TRACE_FUNC(); auto client = std::make_shared(ioContext, port, responseMax, j); client->get(bSSL, deqSites, strPath, timeout, complete); } @@ -572,6 +589,7 @@ HTTPClient::get( complete, beast::Journal& j) { + TRACE_FUNC(); std::deque const deqSites(1, strSite); auto client = std::make_shared(ioContext, port, responseMax, j); @@ -592,6 +610,7 @@ HTTPClient::request( complete, beast::Journal& j) { + TRACE_FUNC(); std::deque const deqSites(1, strSite); auto client = std::make_shared(ioContext, port, responseMax, j); diff --git a/src/libxrpl/net/RegisterSSLCerts.cpp b/src/libxrpl/net/RegisterSSLCerts.cpp index ff59b5971e..e755eb39f3 100644 --- a/src/libxrpl/net/RegisterSSLCerts.cpp +++ b/src/libxrpl/net/RegisterSSLCerts.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -23,6 +24,7 @@ namespace xrpl { void registerSSLCerts(boost::asio::ssl::context& ctx, boost::system::error_code& ec, beast::Journal j) { + TRACE_FUNC(); #if BOOST_OS_WINDOWS auto certStoreDelete = [](void* h) { if (h != nullptr) diff --git a/src/libxrpl/nodestore/BatchWriter.cpp b/src/libxrpl/nodestore/BatchWriter.cpp index 28184bf174..80ae81462d 100644 --- a/src/libxrpl/nodestore/BatchWriter.cpp +++ b/src/libxrpl/nodestore/BatchWriter.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -16,17 +17,20 @@ namespace xrpl::NodeStore { BatchWriter::BatchWriter(Callback& callback, Scheduler& scheduler) : callback_(callback), scheduler_(scheduler) { + TRACE_FUNC(); writeSet_.reserve(BatchWritePreallocationSize); } BatchWriter::~BatchWriter() { + TRACE_FUNC(); waitForWriting(); } void BatchWriter::store(std::shared_ptr const& object) { + TRACE_FUNC(); std::unique_lock sl(writeMutex_); // If the batch has reached its limit, we wait @@ -47,6 +51,7 @@ BatchWriter::store(std::shared_ptr const& object) int BatchWriter::getWriteLoad() { + TRACE_FUNC(); std::scoped_lock const sl(writeMutex_); return std::max(writeLoad_, static_cast(writeSet_.size())); @@ -55,12 +60,14 @@ BatchWriter::getWriteLoad() void BatchWriter::performScheduledTask() { + TRACE_FUNC(); writeBatch(); } void BatchWriter::writeBatch() { + TRACE_FUNC(); for (;;) { std::vector> set; @@ -101,6 +108,7 @@ BatchWriter::writeBatch() void BatchWriter::waitForWriting() { + TRACE_FUNC(); std::unique_lock sl(writeMutex_); while (writePending_) diff --git a/src/libxrpl/nodestore/Database.cpp b/src/libxrpl/nodestore/Database.cpp index 84941d98aa..a95a9e5f05 100644 --- a/src/libxrpl/nodestore/Database.cpp +++ b/src/libxrpl/nodestore/Database.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -42,6 +43,7 @@ Database::Database( , requestBundle_(get(config, "rq_bundle", 4)) , readThreads_(std::max(1, readThreads)) { + TRACE_FUNC(); XRPL_ASSERT(readThreads, "xrpl::NodeStore::Database::Database : nonzero threads input"); if (earliestLedgerSeq_ < 1) @@ -124,6 +126,7 @@ Database::Database( Database::~Database() { + TRACE_FUNC(); // NOTE! // Any derived class should call the stop() method in its // destructor. Otherwise, occasionally, the derived class may @@ -136,12 +139,14 @@ Database::~Database() bool Database::isStopping() const { + TRACE_FUNC(); return readStopping_.load(std::memory_order_relaxed); } void Database::stop() { + TRACE_FUNC(); { std::scoped_lock const lock(readLock_); @@ -179,6 +184,7 @@ Database::asyncFetch( std::uint32_t ledgerSeq, std::function const&)>&& cb) { + TRACE_FUNC(); std::scoped_lock const lock(readLock_); if (!isStopping()) @@ -191,6 +197,7 @@ Database::asyncFetch( void Database::importInternal(Backend& dstBackend, Database& srcDB) { + TRACE_FUNC(); Batch batch; batch.reserve(BatchWritePreallocationSize); auto storeBatch = [&, fname = __func__]() { @@ -233,6 +240,17 @@ Database::fetchNodeObject( FetchType fetchType, bool duplicate) { + TRACE_FUNC(); + + { + std::scoped_lock const lock(negCacheMutex_); + if (negCache_.count(hash)) + { + ++fetchTotalCount_; + return nullptr; + } + } + FetchReport fetchReport(fetchType); using namespace std::chrono; @@ -246,6 +264,12 @@ Database::fetchNodeObject( ++fetchHitCount_; fetchSz_ += nodeObject->getData().size(); } + else + { + std::scoped_lock const lock(negCacheMutex_); + if (negCache_.size() < kNegCacheMax) + negCache_.insert(hash); + } ++fetchTotalCount_; fetchReport.elapsed = duration_cast(dur); @@ -253,9 +277,24 @@ Database::fetchNodeObject( return nodeObject; } +void +Database::negCacheErase(uint256 const& hash) +{ + std::scoped_lock const lock(negCacheMutex_); + negCache_.erase(hash); +} + +void +Database::negCacheClear() +{ + std::scoped_lock const lock(negCacheMutex_); + negCache_.clear(); +} + void Database::getCountsJson(json::Value& obj) { + TRACE_FUNC(); XRPL_ASSERT(obj.isObject(), "xrpl::NodeStore::Database::getCountsJson : valid input type"); { diff --git a/src/libxrpl/nodestore/DatabaseNodeImp.cpp b/src/libxrpl/nodestore/DatabaseNodeImp.cpp index ef84862de6..c87dfe9c55 100644 --- a/src/libxrpl/nodestore/DatabaseNodeImp.cpp +++ b/src/libxrpl/nodestore/DatabaseNodeImp.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -25,10 +26,12 @@ namespace xrpl::NodeStore { void DatabaseNodeImp::store(NodeObjectType type, Blob&& data, uint256 const& hash, std::uint32_t) { + TRACE_FUNC(); storeStats(1, data.size()); auto obj = NodeObject::createObject(type, std::move(data), hash); backend_->store(obj); + negCacheErase(hash); } void @@ -37,6 +40,7 @@ DatabaseNodeImp::asyncFetch( std::uint32_t ledgerSeq, std::function const&)>&& callback) { + TRACE_FUNC(); Database::asyncFetch(hash, ledgerSeq, std::move(callback)); } @@ -47,6 +51,7 @@ DatabaseNodeImp::fetchNodeObject( FetchReport& fetchReport, bool duplicate) { + TRACE_FUNC(); std::shared_ptr nodeObject = nullptr; Status status = Status::Ok; @@ -84,6 +89,7 @@ DatabaseNodeImp::fetchNodeObject( std::vector> DatabaseNodeImp::fetchBatch(std::vector const& hashes) { + TRACE_FUNC(); using namespace std::chrono; auto const before = steady_clock::now(); diff --git a/src/libxrpl/nodestore/DatabaseRotatingImp.cpp b/src/libxrpl/nodestore/DatabaseRotatingImp.cpp index 24b0e2de2e..671169766d 100644 --- a/src/libxrpl/nodestore/DatabaseRotatingImp.cpp +++ b/src/libxrpl/nodestore/DatabaseRotatingImp.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -33,7 +34,9 @@ DatabaseRotatingImp::DatabaseRotatingImp( : DatabaseRotating(scheduler, readThreads, config, j) , writableBackend_(std::move(writableBackend)) , archiveBackend_(std::move(archiveBackend)) + , archiveHasData_(!get(config, "fresh_sync", false)) { + TRACE_FUNC(); if (writableBackend_) fdRequired_ += writableBackend_->fdRequired(); if (archiveBackend_) @@ -45,6 +48,7 @@ DatabaseRotatingImp::rotate( std::unique_ptr&& newBackend, std::function const& f) { + TRACE_FUNC(); // Pass these two names to the callback function std::string const newWritableBackendName = newBackend->getName(); std::string newArchiveBackendName; @@ -64,12 +68,15 @@ DatabaseRotatingImp::rotate( writableBackend_ = std::move(newBackend); } + archiveHasData_.store(true, std::memory_order_relaxed); + negCacheClear(); f(newWritableBackendName, newArchiveBackendName); } std::string DatabaseRotatingImp::getName() const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); return writableBackend_->getName(); } @@ -77,6 +84,7 @@ DatabaseRotatingImp::getName() const std::int32_t DatabaseRotatingImp::getWriteLoad() const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); return writableBackend_->getWriteLoad(); } @@ -84,6 +92,7 @@ DatabaseRotatingImp::getWriteLoad() const void DatabaseRotatingImp::importDatabase(Database& source) { + TRACE_FUNC(); auto const backend = [&] { std::scoped_lock const lock(mutex_); return writableBackend_; @@ -95,6 +104,7 @@ DatabaseRotatingImp::importDatabase(Database& source) void DatabaseRotatingImp::sync() { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); writableBackend_->sync(); } @@ -102,6 +112,7 @@ DatabaseRotatingImp::sync() void DatabaseRotatingImp::store(NodeObjectType type, Blob&& data, uint256 const& hash, std::uint32_t) { + TRACE_FUNC(); auto nObj = NodeObject::createObject(type, std::move(data), hash); auto const backend = [&] { @@ -111,6 +122,7 @@ DatabaseRotatingImp::store(NodeObjectType type, Blob&& data, uint256 const& hash backend->store(nObj); storeStats(1, nObj->getData().size()); + negCacheErase(hash); } std::shared_ptr @@ -120,6 +132,7 @@ DatabaseRotatingImp::fetchNodeObject( FetchReport& fetchReport, bool duplicate) { + TRACE_FUNC(); auto fetch = [&](std::shared_ptr const& backend) { Status status = Status::Ok; std::shared_ptr nodeObject; @@ -159,12 +172,14 @@ DatabaseRotatingImp::fetchNodeObject( // Try to fetch from the writable backend nodeObject = fetch(writable); - if (!nodeObject) + if (!nodeObject && archiveHasData_.load(std::memory_order_relaxed)) { - // Otherwise try to fetch from the archive backend + // Only try archive if it's known to have data nodeObject = fetch(archive); if (nodeObject) { + archiveHasData_.store(true, std::memory_order_relaxed); + { // Refresh the writable backend pointer std::scoped_lock const lock(mutex_); @@ -186,6 +201,7 @@ DatabaseRotatingImp::fetchNodeObject( void DatabaseRotatingImp::forEach(std::function)> f) { + TRACE_FUNC(); auto [writable, archive] = [&] { std::scoped_lock const lock(mutex_); return std::make_pair(writableBackend_, archiveBackend_); diff --git a/src/libxrpl/nodestore/DecodedBlob.cpp b/src/libxrpl/nodestore/DecodedBlob.cpp index fb7569bd8c..56c392f3ed 100644 --- a/src/libxrpl/nodestore/DecodedBlob.cpp +++ b/src/libxrpl/nodestore/DecodedBlob.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -14,6 +15,7 @@ namespace xrpl::NodeStore { DecodedBlob::DecodedBlob(void const* key, void const* value, int valueBytes) { + TRACE_FUNC(); /* Data format: Bytes @@ -59,6 +61,7 @@ DecodedBlob::DecodedBlob(void const* key, void const* value, int valueBytes) std::shared_ptr DecodedBlob::createObject() { + TRACE_FUNC(); XRPL_ASSERT(success_, "xrpl::NodeStore::DecodedBlob::createObject : valid object type"); std::shared_ptr object; diff --git a/src/libxrpl/nodestore/DummyScheduler.cpp b/src/libxrpl/nodestore/DummyScheduler.cpp index 1f93ed3d0f..e33dfb426e 100644 --- a/src/libxrpl/nodestore/DummyScheduler.cpp +++ b/src/libxrpl/nodestore/DummyScheduler.cpp @@ -2,12 +2,14 @@ #include #include +#include namespace xrpl::NodeStore { void DummyScheduler::scheduleTask(Task& task) { + TRACE_FUNC(); // Invoke the task synchronously. task.performScheduledTask(); } diff --git a/src/libxrpl/nodestore/ManagerImp.cpp b/src/libxrpl/nodestore/ManagerImp.cpp index 0cfda7d86a..d3f573590c 100644 --- a/src/libxrpl/nodestore/ManagerImp.cpp +++ b/src/libxrpl/nodestore/ManagerImp.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -26,6 +27,7 @@ namespace xrpl::NodeStore { ManagerImp& ManagerImp::instance() { + TRACE_FUNC(); static ManagerImp k_; return k_; } @@ -33,6 +35,7 @@ ManagerImp::instance() void ManagerImp::missingBackend() { + TRACE_FUNC(); Throw( "Your xrpld.cfg is missing a [node_db] entry, " "please see the xrpld-example.cfg file!"); @@ -53,6 +56,7 @@ registerMemoryFactory(Manager& manager); ManagerImp::ManagerImp() { + TRACE_FUNC(); registerNuDBFactory(*this); registerRocksDBFactory(*this); registerNullFactory(*this); @@ -66,6 +70,7 @@ ManagerImp::makeBackend( Scheduler& scheduler, beast::Journal journal) { + TRACE_FUNC(); std::string const type{get(parameters, "type")}; if (type.empty()) missingBackend(); @@ -88,6 +93,7 @@ ManagerImp::makeDatabase( Section const& config, beast::Journal journal) { + TRACE_FUNC(); auto backend{makeBackend(config, burstSize, scheduler, journal)}; backend->open(); return std::make_unique( @@ -97,6 +103,7 @@ ManagerImp::makeDatabase( void ManagerImp::insert(Factory& factory) { + TRACE_FUNC(); std::scoped_lock const _(mutex_); list_.push_back(&factory); } @@ -104,6 +111,7 @@ ManagerImp::insert(Factory& factory) void ManagerImp::erase(Factory& factory) { + TRACE_FUNC(); std::scoped_lock const _(mutex_); auto const iter = std::ranges::find_if(list_, [&factory](Factory* other) { return other == &factory; }); @@ -114,6 +122,7 @@ ManagerImp::erase(Factory& factory) Factory* ManagerImp::find(std::string const& name) { + TRACE_FUNC(); std::scoped_lock const _(mutex_); auto const iter = std::ranges::find_if( list_, [&name](Factory* other) { return boost::iequals(name, other->getName()); }); @@ -127,6 +136,7 @@ ManagerImp::find(std::string const& name) Manager& Manager::instance() { + TRACE_FUNC(); return ManagerImp::instance(); } diff --git a/src/libxrpl/nodestore/NodeObject.cpp b/src/libxrpl/nodestore/NodeObject.cpp index 99432eb495..287364ee4f 100644 --- a/src/libxrpl/nodestore/NodeObject.cpp +++ b/src/libxrpl/nodestore/NodeObject.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -18,24 +19,28 @@ NodeObject::NodeObject(NodeObjectType type, Blob&& data, uint256 const& hash, Pr std::shared_ptr NodeObject::createObject(NodeObjectType type, Blob&& data, uint256 const& hash) { + TRACE_FUNC(); return std::make_shared(type, std::move(data), hash, PrivateAccess()); } NodeObjectType NodeObject::getType() const { + TRACE_FUNC(); return type_; } uint256 const& NodeObject::getHash() const { + TRACE_FUNC(); return hash_; } Blob const& NodeObject::getData() const { + TRACE_FUNC(); return data_; } diff --git a/src/libxrpl/nodestore/backend/MemoryFactory.cpp b/src/libxrpl/nodestore/backend/MemoryFactory.cpp index 13c82696cb..ee6c93345d 100644 --- a/src/libxrpl/nodestore/backend/MemoryFactory.cpp +++ b/src/libxrpl/nodestore/backend/MemoryFactory.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,7 @@ public: MemoryDB& open(std::string const& path) { + TRACE_FUNC(); std::scoped_lock const _(mutex_); auto const result = map_.emplace(std::piecewise_construct, std::make_tuple(path), std::make_tuple()); @@ -74,6 +76,7 @@ MemoryFactory* gMemoryFactory = nullptr; void registerMemoryFactory(Manager& manager) { + TRACE_FUNC(); static MemoryFactory kINSTANCE{manager}; gMemoryFactory = &kINSTANCE; } @@ -93,6 +96,7 @@ public: MemoryBackend(size_t keyBytes, Section const& keyValues, beast::Journal journal) : name_(get(keyValues, "path")), journal_(journal) { + TRACE_FUNC(); boost::ignore_unused(journal_); // Keep unused journal_ just in case. if (name_.empty()) Throw("Missing path in Memory backend"); @@ -100,30 +104,35 @@ public: ~MemoryBackend() override { + TRACE_FUNC(); close(); } std::string getName() override { + TRACE_FUNC(); return name_; } void open(bool) override { + TRACE_FUNC(); db_ = &gMemoryFactory->open(name_); } bool isOpen() override { + TRACE_FUNC(); return static_cast(db_); } void close() override { + TRACE_FUNC(); db_ = nullptr; } @@ -132,6 +141,7 @@ public: Status fetch(uint256 const& hash, std::shared_ptr* pObject) override { + TRACE_FUNC(); XRPL_ASSERT(db_, "xrpl::NodeStore::MemoryBackend::fetch : non-null database"); std::scoped_lock const _(db_->mutex); @@ -149,6 +159,7 @@ public: std::pair>, Status> fetchBatch(std::vector const& hashes) override { + TRACE_FUNC(); std::vector> results; results.reserve(hashes.size()); for (auto const& h : hashes) @@ -171,6 +182,7 @@ public: void store(std::shared_ptr const& object) override { + TRACE_FUNC(); XRPL_ASSERT(db_, "xrpl::NodeStore::MemoryBackend::store : non-null database"); std::scoped_lock const _(db_->mutex); db_->table.emplace(object->getHash(), object); @@ -179,6 +191,7 @@ public: void storeBatch(Batch const& batch) override { + TRACE_FUNC(); for (auto const& e : batch) store(e); } @@ -191,6 +204,7 @@ public: void forEach(std::function)> f) override { + TRACE_FUNC(); XRPL_ASSERT(db_, "xrpl::NodeStore::MemoryBackend::forEach : non-null database"); for (auto const& e : db_->table) f(e.second); @@ -199,6 +213,7 @@ public: int getWriteLoad() override { + TRACE_FUNC(); return 0; } @@ -210,6 +225,7 @@ public: [[nodiscard]] int fdRequired() const override { + TRACE_FUNC(); return 0; } }; @@ -218,12 +234,14 @@ public: MemoryFactory::MemoryFactory(Manager& manager) : manager_(manager) { + TRACE_FUNC(); manager_.insert(*this); } std::string MemoryFactory::getName() const { + TRACE_FUNC(); return "Memory"; } @@ -235,6 +253,7 @@ MemoryFactory::createInstance( Scheduler& scheduler, beast::Journal journal) { + TRACE_FUNC(); return std::make_unique(keyBytes, keyValues, journal); } diff --git a/src/libxrpl/nodestore/backend/NuDBFactory.cpp b/src/libxrpl/nodestore/backend/NuDBFactory.cpp index db9dbcbec1..306d1973c3 100644 --- a/src/libxrpl/nodestore/backend/NuDBFactory.cpp +++ b/src/libxrpl/nodestore/backend/NuDBFactory.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -78,6 +79,7 @@ public: , deletePath(false) , scheduler(scheduler) { + TRACE_FUNC(); if (name.empty()) Throw("nodestore: Missing path in NuDB backend"); } @@ -98,12 +100,14 @@ public: , deletePath(false) , scheduler(scheduler) { + TRACE_FUNC(); if (name.empty()) Throw("nodestore: Missing path in NuDB backend"); } ~NuDBBackend() override { + TRACE_FUNC(); try { // close can throw and we don't want the destructor to throw. @@ -119,18 +123,21 @@ public: std::string getName() override { + TRACE_FUNC(); return name; } [[nodiscard]] std::optional getBlockSize() const override { + TRACE_FUNC(); return blockSize; } void open(bool createIfMissing, uint64_t appType, uint64_t uid, uint64_t salt) override { + TRACE_FUNC(); using namespace boost::filesystem; if (db.is_open()) { @@ -169,18 +176,21 @@ public: bool isOpen() override { + TRACE_FUNC(); return db.is_open(); } void open(bool createIfMissing) override { + TRACE_FUNC(); open(createIfMissing, kAPPNUM, nudb::make_uid(), nudb::make_salt()); } void close() override { + TRACE_FUNC(); if (db.is_open()) { nudb::error_code ec; @@ -207,6 +217,7 @@ public: Status fetch(uint256 const& hash, std::shared_ptr* pno) override { + TRACE_FUNC(); Status status = Status::Ok; pno->reset(); nudb::error_code ec; @@ -235,6 +246,7 @@ public: std::pair>, Status> fetchBatch(std::vector const& hashes) override { + TRACE_FUNC(); std::vector> results; results.reserve(hashes.size()); for (auto const& h : hashes) @@ -257,6 +269,7 @@ public: void doInsert(std::shared_ptr const& no) { + TRACE_FUNC(); EncodedBlob const e(no); nudb::error_code ec; nudb::detail::buffer bf; @@ -269,6 +282,7 @@ public: void store(std::shared_ptr const& no) override { + TRACE_FUNC(); BatchWriteReport report{}; report.writeCount = 1; auto const start = std::chrono::steady_clock::now(); @@ -281,6 +295,7 @@ public: void storeBatch(Batch const& batch) override { + TRACE_FUNC(); BatchWriteReport report{}; report.writeCount = batch.size(); auto const start = std::chrono::steady_clock::now(); @@ -299,6 +314,7 @@ public: void forEach(std::function)> f) override { + TRACE_FUNC(); auto const dp = db.dat_path(); auto const kp = db.key_path(); auto const lp = db.log_path(); @@ -336,18 +352,21 @@ public: int getWriteLoad() override { + TRACE_FUNC(); return 0; } void setDeletePath() override { + TRACE_FUNC(); deletePath = true; } void verify() override { + TRACE_FUNC(); auto const dp = db.dat_path(); auto const kp = db.key_path(); auto const lp = db.log_path(); @@ -367,6 +386,7 @@ public: [[nodiscard]] int fdRequired() const override { + TRACE_FUNC(); return 3; } @@ -374,6 +394,7 @@ private: static std::size_t parseBlockSize(std::string const& name, Section const& keyValues, beast::Journal journal) { + TRACE_FUNC(); using namespace boost::filesystem; auto const folder = path(name); auto const kp = (folder / "nudb.key").string(); @@ -423,12 +444,14 @@ private: public: explicit NuDBFactory(Manager& manager) : manager_(manager) { + TRACE_FUNC(); manager_.insert(*this); } [[nodiscard]] std::string getName() const override { + TRACE_FUNC(); return "NuDB"; } @@ -440,6 +463,7 @@ public: Scheduler& scheduler, beast::Journal journal) override { + TRACE_FUNC(); return std::make_unique(keyBytes, keyValues, burstSize, scheduler, journal); } @@ -452,6 +476,7 @@ public: nudb::context& context, beast::Journal journal) override { + TRACE_FUNC(); return std::make_unique( keyBytes, keyValues, burstSize, scheduler, context, journal); } @@ -460,6 +485,7 @@ public: void registerNuDBFactory(Manager& manager) { + TRACE_FUNC(); static NuDBFactory const kINSTANCE{manager}; } diff --git a/src/libxrpl/nodestore/backend/NullFactory.cpp b/src/libxrpl/nodestore/backend/NullFactory.cpp index 38f35e91ff..2a9302834e 100644 --- a/src/libxrpl/nodestore/backend/NullFactory.cpp +++ b/src/libxrpl/nodestore/backend/NullFactory.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -27,6 +28,7 @@ public: std::string getName() override { + TRACE_FUNC(); return std::string(); } @@ -38,6 +40,7 @@ public: bool isOpen() override { + TRACE_FUNC(); return false; } @@ -49,12 +52,14 @@ public: Status fetch(uint256 const&, std::shared_ptr*) override { + TRACE_FUNC(); return Status::NotFound; } std::pair>, Status> fetchBatch(std::vector const& hashes) override { + TRACE_FUNC(); return {}; } @@ -81,6 +86,7 @@ public: int getWriteLoad() override { + TRACE_FUNC(); return 0; } @@ -93,6 +99,7 @@ public: [[nodiscard]] int fdRequired() const override { + TRACE_FUNC(); return 0; } @@ -109,18 +116,21 @@ private: public: explicit NullFactory(Manager& manager) : manager_(manager) { + TRACE_FUNC(); manager_.insert(*this); } [[nodiscard]] std::string getName() const override { + TRACE_FUNC(); return "none"; } std::unique_ptr createInstance(size_t, Section const&, std::size_t, Scheduler&, beast::Journal) override { + TRACE_FUNC(); return std::make_unique(); } }; @@ -128,6 +138,7 @@ public: void registerNullFactory(Manager& manager) { + TRACE_FUNC(); static NullFactory const kINSTANCE{manager}; } diff --git a/src/libxrpl/nodestore/backend/RocksDBFactory.cpp b/src/libxrpl/nodestore/backend/RocksDBFactory.cpp index 7f5ac6b14e..3c1264e6f7 100644 --- a/src/libxrpl/nodestore/backend/RocksDBFactory.cpp +++ b/src/libxrpl/nodestore/backend/RocksDBFactory.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -68,6 +69,7 @@ public: static void threadEntry(void* ptr) { + TRACE_FUNC(); ThreadParams const* const p(reinterpret_cast(ptr)); auto const f = p->f; @@ -84,6 +86,7 @@ public: void StartThread(void (*f)(void*), void* a) override { + TRACE_FUNC(); ThreadParams* const p(new ThreadParams(f, a)); EnvWrapper::StartThread(&RocksDBEnv::threadEntry, p); } @@ -113,6 +116,7 @@ public: RocksDBEnv* env) : deletePath_(false), journal(journal), keyBytes(keyBytes), batch(*this, scheduler) { + TRACE_FUNC(); if (!getIfExists(keyValues, "path", name)) Throw("Missing path in RocksDBFactory backend"); @@ -223,12 +227,14 @@ public: ~RocksDBBackend() override { + TRACE_FUNC(); close(); } void open(bool createIfMissing) override { + TRACE_FUNC(); if (db) { // LCOV_EXCL_START @@ -253,12 +259,14 @@ public: bool isOpen() override { + TRACE_FUNC(); return static_cast(db); } void close() override { + TRACE_FUNC(); if (db) { db.reset(); @@ -273,6 +281,7 @@ public: std::string getName() override { + TRACE_FUNC(); return name; } @@ -281,6 +290,7 @@ public: Status fetch(uint256 const& hash, std::shared_ptr* pObject) override { + TRACE_FUNC(); XRPL_ASSERT(db, "xrpl::NodeStore::RocksDBBackend::fetch : non-null database"); pObject->reset(); @@ -333,6 +343,7 @@ public: std::pair>, Status> fetchBatch(std::vector const& hashes) override { + TRACE_FUNC(); std::vector> results; results.reserve(hashes.size()); for (auto const& h : hashes) @@ -355,12 +366,14 @@ public: void store(std::shared_ptr const& object) override { + TRACE_FUNC(); batch.store(object); } void storeBatch(Batch const& batch) override { + TRACE_FUNC(); XRPL_ASSERT( db, "xrpl::NodeStore::RocksDBBackend::storeBatch : non-null " @@ -392,6 +405,7 @@ public: void forEach(std::function)> f) override { + TRACE_FUNC(); XRPL_ASSERT(db, "xrpl::NodeStore::RocksDBBackend::forEach : non-null database"); rocksdb::ReadOptions const options; @@ -425,12 +439,14 @@ public: int getWriteLoad() override { + TRACE_FUNC(); return batch.getWriteLoad(); } void setDeletePath() override { + TRACE_FUNC(); deletePath_ = true; } @@ -439,6 +455,7 @@ public: void writeBatch(Batch const& batch) override { + TRACE_FUNC(); storeBatch(batch); } @@ -446,6 +463,7 @@ public: [[nodiscard]] int fdRequired() const override { + TRACE_FUNC(); return fdMinRequired; } }; @@ -462,12 +480,14 @@ public: RocksDBFactory(Manager& manager) : manager_(manager) { + TRACE_FUNC(); manager_.insert(*this); } [[nodiscard]] std::string getName() const override { + TRACE_FUNC(); return "RocksDB"; } @@ -479,6 +499,7 @@ public: Scheduler& scheduler, beast::Journal journal) override { + TRACE_FUNC(); return std::make_unique(keyBytes, keyValues, scheduler, journal, &env); } }; @@ -486,6 +507,7 @@ public: void registerRocksDBFactory(Manager& manager) { + TRACE_FUNC(); static RocksDBFactory const kINSTANCE{manager}; } diff --git a/src/libxrpl/protocol/AMMCore.cpp b/src/libxrpl/protocol/AMMCore.cpp index b4c44f0f36..ab7ed9105c 100644 --- a/src/libxrpl/protocol/AMMCore.cpp +++ b/src/libxrpl/protocol/AMMCore.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,7 @@ namespace xrpl { Currency ammLPTCurrency(Asset const& asset1, Asset const& asset2) { + TRACE_FUNC(); // AMM LPToken is 0x03 plus 19 bytes of the hash std::int32_t constexpr kAMM_CURRENCY_CODE = 0x03; auto const& [minA, maxA] = std::minmax(asset1, asset2); @@ -52,12 +54,14 @@ ammLPTCurrency(Asset const& asset1, Asset const& asset2) Issue ammLPTIssue(Asset const& asset1, Asset const& asset2, AccountID const& ammAccountID) { + TRACE_FUNC(); return Issue(ammLPTCurrency(asset1, asset2), ammAccountID); } NotTEC invalidAMMAsset(Asset const& asset, std::optional> const& pair) { + TRACE_FUNC(); auto const err = asset.visit( [](MPTIssue const& issue) -> std::optional { if (issue.getIssuer() == beast::kZERO) @@ -84,6 +88,7 @@ invalidAMMAssetPair( Asset const& asset2, std::optional> const& pair) { + TRACE_FUNC(); if (asset1 == asset2) return temBAD_AMM_TOKENS; if (auto const res = invalidAMMAsset(asset1, pair)) @@ -99,6 +104,7 @@ invalidAMMAmount( std::optional> const& pair, bool validZero) { + TRACE_FUNC(); if (auto const res = invalidAMMAsset(amount.asset(), pair)) return res; if (amount < beast::kZERO || (!validZero && amount == beast::kZERO)) @@ -109,6 +115,7 @@ invalidAMMAmount( std::optional ammAuctionTimeSlot(std::uint64_t current, STObject const& auctionSlot) { + TRACE_FUNC(); // It should be impossible for expiration to be < TOTAL_TIME_SLOT_SECS, // but check just to be safe auto const expiration = auctionSlot[sfExpiration]; @@ -128,6 +135,7 @@ ammAuctionTimeSlot(std::uint64_t current, STObject const& auctionSlot) bool ammEnabled(Rules const& rules) { + TRACE_FUNC(); return rules.enabled(featureAMM) && rules.enabled(fixUniversalNumber); } diff --git a/src/libxrpl/protocol/AccountID.cpp b/src/libxrpl/protocol/AccountID.cpp index 6639835b41..03f845cef6 100644 --- a/src/libxrpl/protocol/AccountID.cpp +++ b/src/libxrpl/protocol/AccountID.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -43,6 +44,7 @@ private: public: AccountIdCache(std::size_t count) : cache_(count) { + TRACE_FUNC(); // This is non-binding, but we try to avoid wasting memory that // is caused by overallocation. cache_.shrink_to_fit(); @@ -51,6 +53,7 @@ public: std::string toBase58(AccountID const& id) { + TRACE_FUNC(); auto const index = hasher_(id) % cache_.size(); PackedSpinlock sl(locks_, index % 64); @@ -85,6 +88,7 @@ static std::unique_ptr gAccountIdCache; void initAccountIdCache(std::size_t count) { + TRACE_FUNC(); if (!gAccountIdCache && count != 0) gAccountIdCache = std::make_unique(count); } @@ -92,6 +96,7 @@ initAccountIdCache(std::size_t count) std::string toBase58(AccountID const& v) { + TRACE_FUNC(); if (gAccountIdCache) return gAccountIdCache->toBase58(v); @@ -102,6 +107,7 @@ template <> std::optional parseBase58(std::string const& s) { + TRACE_FUNC(); auto const result = decodeBase58Token(s, TokenType::AccountID); if (result.size() != AccountID::kBYTES) return std::nullopt; @@ -146,6 +152,7 @@ parseBase58(std::string const& s) AccountID calcAccountID(PublicKey const& pk) { + TRACE_FUNC(); static_assert(AccountID::kBYTES == sizeof(RipeshaHasher::result_type)); RipeshaHasher rsh; @@ -156,6 +163,7 @@ calcAccountID(PublicKey const& pk) AccountID const& xrpAccount() { + TRACE_FUNC(); static AccountID const kACCOUNT(beast::kZERO); return kACCOUNT; } @@ -163,6 +171,7 @@ xrpAccount() AccountID const& noAccount() { + TRACE_FUNC(); static AccountID const kACCOUNT(1); return kACCOUNT; } @@ -170,6 +179,7 @@ noAccount() bool toIssuer(AccountID& issuer, std::string const& s) { + TRACE_FUNC(); if (issuer.parseHex(s)) return true; auto const account = parseBase58(s); diff --git a/src/libxrpl/protocol/Asset.cpp b/src/libxrpl/protocol/Asset.cpp index 57843ea6bf..27069a3593 100644 --- a/src/libxrpl/protocol/Asset.cpp +++ b/src/libxrpl/protocol/Asset.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -20,36 +21,42 @@ namespace xrpl { AccountID const& Asset::getIssuer() const { + TRACE_FUNC(); return std::visit([&](auto&& issue) -> AccountID const& { return issue.getIssuer(); }, issue_); } std::string Asset::getText() const { + TRACE_FUNC(); return std::visit([&](auto&& issue) { return issue.getText(); }, issue_); } void Asset::setJson(json::Value& jv) const { + TRACE_FUNC(); std::visit([&](auto&& issue) { issue.setJson(jv); }, issue_); } STAmount Asset::operator()(Number const& number) const { + TRACE_FUNC(); return STAmount{*this, number}; } std::string to_string(Asset const& asset) { + TRACE_FUNC(); return std::visit([&](auto const& issue) { return to_string(issue); }, asset.value()); } bool validJSONAsset(json::Value const& jv) { + TRACE_FUNC(); if (jv.isMember(jss::mpt_issuance_id)) return !(jv.isMember(jss::currency) || jv.isMember(jss::issuer)); return jv.isMember(jss::currency); @@ -58,6 +65,7 @@ validJSONAsset(json::Value const& jv) Asset assetFromJson(json::Value const& v) { + TRACE_FUNC(); if (!v.isMember(jss::currency) && !v.isMember(jss::mpt_issuance_id)) Throw("assetFromJson must contain currency or mpt_issuance_id"); @@ -69,6 +77,7 @@ assetFromJson(json::Value const& v) std::ostream& operator<<(std::ostream& os, Asset const& x) { + TRACE_FUNC(); std::visit([&](TIss const& issue) { os << issue; }, x.value()); return os; } diff --git a/src/libxrpl/protocol/Book.cpp b/src/libxrpl/protocol/Book.cpp index f71800b786..04f60c7005 100644 --- a/src/libxrpl/protocol/Book.cpp +++ b/src/libxrpl/protocol/Book.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -10,18 +11,21 @@ namespace xrpl { bool isConsistent(Book const& book) { + TRACE_FUNC(); return isConsistent(book.in) && isConsistent(book.out) && book.in != book.out; } std::string to_string(Book const& book) { + TRACE_FUNC(); return to_string(book.in) + "->" + to_string(book.out); } std::ostream& operator<<(std::ostream& os, Book const& x) { + TRACE_FUNC(); os << to_string(x); return os; } @@ -29,6 +33,7 @@ operator<<(std::ostream& os, Book const& x) Book reversed(Book const& book) { + TRACE_FUNC(); return Book(book.out, book.in, book.domain); } diff --git a/src/libxrpl/protocol/BuildInfo.cpp b/src/libxrpl/protocol/BuildInfo.cpp index 7ea934fe3a..7d2cff9521 100644 --- a/src/libxrpl/protocol/BuildInfo.cpp +++ b/src/libxrpl/protocol/BuildInfo.cpp @@ -5,6 +5,7 @@ #include #include // IWYU pragma: keep #include +#include #include // IWYU pragma: keep @@ -34,6 +35,7 @@ char const* const versionString = "3.2.0-b0" std::string buildVersionString() { + TRACE_FUNC(); std::string version = versionString; #if defined(DEBUG) || defined(SANITIZERS) @@ -67,6 +69,7 @@ buildVersionString() std::string const& getVersionString() { + TRACE_FUNC(); static std::string const kVALUE = [] { std::string const s = buildVersionString(); @@ -81,6 +84,7 @@ getVersionString() std::string const& getFullVersionString() { + TRACE_FUNC(); static std::string const kVALUE = systemName() + "-" + getVersionString(); return kVALUE; } @@ -91,6 +95,7 @@ static constexpr std::uint64_t kIMPLEMENTATION_VERSION_IDENTIFIER_MASK = 0xFFFF' std::uint64_t encodeSoftwareVersion(std::string_view versionStr) { + TRACE_FUNC(); std::uint64_t c = kIMPLEMENTATION_VERSION_IDENTIFIER; beast::SemanticVersion v; @@ -155,6 +160,7 @@ encodeSoftwareVersion(std::string_view versionStr) std::uint64_t getEncodedVersion() { + TRACE_FUNC(); static std::uint64_t const kCOOKIE = {encodeSoftwareVersion(getVersionString())}; return kCOOKIE; } @@ -162,6 +168,7 @@ getEncodedVersion() bool isXrpldVersion(std::uint64_t version) { + TRACE_FUNC(); return (version & kIMPLEMENTATION_VERSION_IDENTIFIER_MASK) == kIMPLEMENTATION_VERSION_IDENTIFIER; } @@ -169,6 +176,7 @@ isXrpldVersion(std::uint64_t version) bool isNewerVersion(std::uint64_t version) { + TRACE_FUNC(); if (isXrpldVersion(version)) return version > getEncodedVersion(); return false; diff --git a/src/libxrpl/protocol/ErrorCodes.cpp b/src/libxrpl/protocol/ErrorCodes.cpp index a51bb9b56d..258fda17df 100644 --- a/src/libxrpl/protocol/ErrorCodes.cpp +++ b/src/libxrpl/protocol/ErrorCodes.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -164,6 +165,7 @@ constexpr ErrorInfo kUNKNOWN_ERROR; void injectError(ErrorCodeI code, json::Value& json) { + TRACE_FUNC(); ErrorInfo const& info(getErrorInfo(code)); json[jss::error] = info.token; json[jss::error_code] = info.code; @@ -173,6 +175,7 @@ injectError(ErrorCodeI code, json::Value& json) void injectError(ErrorCodeI code, std::string const& message, json::Value& json) { + TRACE_FUNC(); ErrorInfo const& info(getErrorInfo(code)); json[jss::error] = info.token; json[jss::error_code] = info.code; @@ -182,6 +185,7 @@ injectError(ErrorCodeI code, std::string const& message, json::Value& json) ErrorInfo const& getErrorInfo(ErrorCodeI code) { + TRACE_FUNC(); if (code <= RpcSuccess || code > RpcLast) return detail::kUNKNOWN_ERROR; return detail::kSORTED_ERROR_INFOS[code - 1]; @@ -190,6 +194,7 @@ getErrorInfo(ErrorCodeI code) json::Value makeError(ErrorCodeI code) { + TRACE_FUNC(); json::Value json; injectError(code, json); return json; @@ -198,6 +203,7 @@ makeError(ErrorCodeI code) json::Value makeError(ErrorCodeI code, std::string const& message) { + TRACE_FUNC(); json::Value json; injectError(code, message, json); return json; @@ -206,12 +212,14 @@ makeError(ErrorCodeI code, std::string const& message) bool containsError(json::Value const& json) { + TRACE_FUNC(); return json.isObject() && json.isMember(jss::error); } int errorCodeHttpStatus(ErrorCodeI code) { + TRACE_FUNC(); return getErrorInfo(code).http_status; } @@ -220,6 +228,7 @@ errorCodeHttpStatus(ErrorCodeI code) std::string rpcErrorString(json::Value const& jv) { + TRACE_FUNC(); XRPL_ASSERT(RPC::containsError(jv), "xrpl::RPC::rpcErrorString : input contains an error"); return jv[jss::error].asString() + jv[jss::error_message].asString(); } diff --git a/src/libxrpl/protocol/Feature.cpp b/src/libxrpl/protocol/Feature.cpp index 3862b52e27..2ae8e413a1 100644 --- a/src/libxrpl/protocol/Feature.cpp +++ b/src/libxrpl/protocol/Feature.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,7 @@ inline std::size_t // NOLINTNEXTLINE(readability-identifier-naming) hash_value(xrpl::uint256 const& feature) { + TRACE_FUNC(); std::size_t seed = 0; using namespace boost; for (auto const& n : feature) @@ -118,6 +120,7 @@ class FeatureCollections Feature const& getByIndex(size_t i) const { + TRACE_FUNC(); if (i >= features_.size()) logicError("Invalid FeatureBitset index"); auto const& sequence = features_.get(); @@ -126,6 +129,7 @@ class FeatureCollections size_t getIndex(Feature const& feature) const { + TRACE_FUNC(); auto const& sequence = features_.get(); auto const itTo = sequence.iterator_to(feature); return itTo - sequence.begin(); @@ -133,6 +137,7 @@ class FeatureCollections Feature const* getByFeature(uint256 const& feature) const { + TRACE_FUNC(); auto const& featureIndex = features_.get(); auto const featureIt = featureIndex.find(feature); return featureIt == featureIndex.end() ? nullptr : &*featureIt; @@ -140,6 +145,7 @@ class FeatureCollections Feature const* getByName(std::string const& name) const { + TRACE_FUNC(); auto const& nameIndex = features_.get(); auto const nameIt = nameIndex.find(name); return nameIt == nameIndex.end() ? nullptr : &*nameIt; @@ -171,6 +177,7 @@ public: std::map const& allAmendments() const { + TRACE_FUNC(); return all_; } @@ -180,6 +187,7 @@ public: std::map const& supportedAmendments() const { + TRACE_FUNC(); return supported_; } @@ -187,6 +195,7 @@ public: std::size_t numDownVotedAmendments() const { + TRACE_FUNC(); return downVotes_; } @@ -194,6 +203,7 @@ public: std::size_t numUpVotedAmendments() const { + TRACE_FUNC(); return upVotes_; } }; @@ -202,12 +212,14 @@ public: FeatureCollections::FeatureCollections() { + TRACE_FUNC(); features_.reserve(xrpl::detail::kNUM_FEATURES); } std::optional FeatureCollections::getRegisteredFeature(std::string const& name) const { + TRACE_FUNC(); XRPL_ASSERT( readOnly_.load(), "xrpl::FeatureCollections::getRegisteredFeature : startup completed"); Feature const* feature = getByName(name); @@ -219,6 +231,7 @@ FeatureCollections::getRegisteredFeature(std::string const& name) const void check(bool condition, char const* logicErrorMessage) { + TRACE_FUNC(); if (!condition) logicError(logicErrorMessage); } @@ -226,6 +239,7 @@ check(bool condition, char const* logicErrorMessage) uint256 FeatureCollections::registerFeature(std::string const& name, Supported support, VoteBehavior vote) { + TRACE_FUNC(); check(!readOnly_, "Attempting to register a feature after startup."); check( support == Supported::Yes || vote == VoteBehavior::DefaultNo, @@ -275,6 +289,7 @@ FeatureCollections::registerFeature(std::string const& name, Supported support, bool FeatureCollections::registrationIsDone() { + TRACE_FUNC(); readOnly_ = true; return true; } @@ -282,6 +297,7 @@ FeatureCollections::registrationIsDone() size_t FeatureCollections::featureToBitsetIndex(uint256 const& f) const { + TRACE_FUNC(); XRPL_ASSERT( readOnly_.load(), "xrpl::FeatureCollections::featureToBitsetIndex : startup completed"); @@ -295,6 +311,7 @@ FeatureCollections::featureToBitsetIndex(uint256 const& f) const uint256 const& FeatureCollections::bitsetIndexToFeature(size_t i) const { + TRACE_FUNC(); XRPL_ASSERT( readOnly_.load(), "xrpl::FeatureCollections::bitsetIndexToFeature : startup completed"); Feature const& feature = getByIndex(i); @@ -304,6 +321,7 @@ FeatureCollections::bitsetIndexToFeature(size_t i) const std::string FeatureCollections::featureToName(uint256 const& f) const { + TRACE_FUNC(); XRPL_ASSERT(readOnly_.load(), "xrpl::FeatureCollections::featureToName : startup completed"); Feature const* feature = getByFeature(f); return (feature != nullptr) ? feature->name : to_string(f); @@ -317,6 +335,7 @@ FeatureCollections gFeatureCollections; std::map const& allAmendments() { + TRACE_FUNC(); return gFeatureCollections.allAmendments(); } @@ -326,6 +345,7 @@ allAmendments() std::map const& detail::supportedAmendments() { + TRACE_FUNC(); return gFeatureCollections.supportedAmendments(); } @@ -333,6 +353,7 @@ detail::supportedAmendments() std::size_t detail::numDownVotedAmendments() { + TRACE_FUNC(); return gFeatureCollections.numDownVotedAmendments(); } @@ -340,6 +361,7 @@ detail::numDownVotedAmendments() std::size_t detail::numUpVotedAmendments() { + TRACE_FUNC(); return gFeatureCollections.numUpVotedAmendments(); } @@ -348,12 +370,14 @@ detail::numUpVotedAmendments() std::optional getRegisteredFeature(std::string const& name) { + TRACE_FUNC(); return gFeatureCollections.getRegisteredFeature(name); } uint256 registerFeature(std::string const& name, Supported support, VoteBehavior vote) { + TRACE_FUNC(); return gFeatureCollections.registerFeature(name, support, vote); } @@ -362,6 +386,7 @@ registerFeature(std::string const& name, Supported support, VoteBehavior vote) uint256 retireFeature(std::string const& name) { + TRACE_FUNC(); return registerFeature(name, Supported::Yes, VoteBehavior::Obsolete); } @@ -369,24 +394,28 @@ retireFeature(std::string const& name) bool registrationIsDone() { + TRACE_FUNC(); return gFeatureCollections.registrationIsDone(); } size_t featureToBitsetIndex(uint256 const& f) { + TRACE_FUNC(); return gFeatureCollections.featureToBitsetIndex(f); } uint256 bitsetIndexToFeature(size_t i) { + TRACE_FUNC(); return gFeatureCollections.bitsetIndexToFeature(i); } std::string featureToName(uint256 const& f) { + TRACE_FUNC(); return gFeatureCollections.featureToName(f); } diff --git a/src/libxrpl/protocol/IOUAmount.cpp b/src/libxrpl/protocol/IOUAmount.cpp index e4326d611e..01c1173194 100644 --- a/src/libxrpl/protocol/IOUAmount.cpp +++ b/src/libxrpl/protocol/IOUAmount.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,7 @@ namespace { LocalValue& getStaticSTNumberSwitchover() { + TRACE_FUNC(); static LocalValue kR{true}; return kR; } @@ -31,12 +33,14 @@ getStaticSTNumberSwitchover() bool getSTNumberSwitchover() { + TRACE_FUNC(); return *getStaticSTNumberSwitchover(); } void setSTNumberSwitchover(bool v) { + TRACE_FUNC(); *getStaticSTNumberSwitchover() = v; } @@ -52,6 +56,7 @@ static int constexpr kMAX_EXPONENT = STAmount::kMAX_OFFSET; IOUAmount IOUAmount::fromNumber(Number const& number) { + TRACE_FUNC(); // Need to create a default IOUAmount and assign directly so it doesn't try // to normalize, which calls fromNumber IOUAmount result{}; @@ -63,12 +68,14 @@ IOUAmount::fromNumber(Number const& number) IOUAmount IOUAmount::minPositiveAmount() { + TRACE_FUNC(); return IOUAmount(kMIN_MANTISSA, kMIN_EXPONENT); } void IOUAmount::normalize() { + TRACE_FUNC(); if (mantissa_ == 0) { *this = beast::kZERO; @@ -121,6 +128,7 @@ IOUAmount::normalize() IOUAmount::IOUAmount(Number const& other) : IOUAmount(fromNumber(other)) { + TRACE_FUNC(); if (exponent_ > kMAX_EXPONENT) Throw("value overflow"); if (exponent_ < kMIN_EXPONENT) @@ -130,6 +138,7 @@ IOUAmount::IOUAmount(Number const& other) : IOUAmount(fromNumber(other)) IOUAmount& IOUAmount::operator+=(IOUAmount const& other) { + TRACE_FUNC(); if (other == beast::kZERO) return *this; @@ -176,12 +185,14 @@ IOUAmount::operator+=(IOUAmount const& other) std::string to_string(IOUAmount const& amount) { + TRACE_FUNC(); return to_string(Number{amount}); } IOUAmount mulRatio(IOUAmount const& amt, std::uint32_t num, std::uint32_t den, bool roundUp) { + TRACE_FUNC(); using namespace boost::multiprecision; if (den == 0u) diff --git a/src/libxrpl/protocol/Indexes.cpp b/src/libxrpl/protocol/Indexes.cpp index b37428a6bf..59a2be9b51 100644 --- a/src/libxrpl/protocol/Indexes.cpp +++ b/src/libxrpl/protocol/Indexes.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include @@ -95,12 +96,14 @@ template static uint256 indexHash(LedgerNameSpace space, Args const&... args) { + TRACE_FUNC(); return sha512Half(safeCast(space), args...); } uint256 getBookBase(Book const& book) { + TRACE_FUNC(); XRPL_ASSERT(isConsistent(book), "xrpl::getBookBase : input is consistent"); auto getIndexHash = [&book](Args... args) { @@ -143,6 +146,7 @@ getBookBase(Book const& book) uint256 getQualityNext(uint256 const& uBase) { + TRACE_FUNC(); static constexpr uint256 kNEXT_QUALITY( "0000000000000000000000000000000000000000000000010000000000000000"); return uBase + kNEXT_QUALITY; @@ -151,6 +155,7 @@ getQualityNext(uint256 const& uBase) std::uint64_t getQuality(uint256 const& uBase) { + TRACE_FUNC(); // VFALCO [base_uint] This assumes a certain storage format return boost::endian::big_to_native(((std::uint64_t*)uBase.end())[-1]); } @@ -158,12 +163,14 @@ getQuality(uint256 const& uBase) uint256 getTicketIndex(AccountID const& account, std::uint32_t ticketSeq) { + TRACE_FUNC(); return indexHash(LedgerNameSpace::Ticket, account, ticketSeq); } uint256 getTicketIndex(AccountID const& account, SeqProxy ticketSeq) { + TRACE_FUNC(); XRPL_ASSERT(ticketSeq.isTicket(), "xrpl::getTicketIndex : valid input"); return getTicketIndex(account, ticketSeq.value()); } @@ -171,6 +178,7 @@ getTicketIndex(AccountID const& account, SeqProxy ticketSeq) MPTID makeMptID(std::uint32_t sequence, AccountID const& account) { + TRACE_FUNC(); MPTID u; sequence = boost::endian::native_to_big(sequence); memcpy(u.data(), &sequence, sizeof(sequence)); @@ -185,18 +193,21 @@ namespace keylet { Keylet account(AccountID const& id) noexcept { + TRACE_FUNC(); return Keylet{ltACCOUNT_ROOT, indexHash(LedgerNameSpace::Account, id)}; } Keylet child(uint256 const& key) noexcept { + TRACE_FUNC(); return {ltCHILD, key}; } Keylet const& skip() noexcept { + TRACE_FUNC(); static Keylet const kRET{ltLEDGER_HASHES, indexHash(LedgerNameSpace::SkipList)}; return kRET; } @@ -204,6 +215,7 @@ skip() noexcept Keylet skip(LedgerIndex ledger) noexcept { + TRACE_FUNC(); return { ltLEDGER_HASHES, indexHash( @@ -213,6 +225,7 @@ skip(LedgerIndex ledger) noexcept Keylet const& amendments() noexcept { + TRACE_FUNC(); static Keylet const kRET{ltAMENDMENTS, indexHash(LedgerNameSpace::Amendments)}; return kRET; } @@ -220,6 +233,7 @@ amendments() noexcept Keylet const& fees() noexcept { + TRACE_FUNC(); static Keylet const kRET{ltFEE_SETTINGS, indexHash(LedgerNameSpace::FeeSettings)}; return kRET; } @@ -227,6 +241,7 @@ fees() noexcept Keylet const& negativeUNL() noexcept { + TRACE_FUNC(); static Keylet const kRET{ltNEGATIVE_UNL, indexHash(LedgerNameSpace::NegativeUnl)}; return kRET; } @@ -234,12 +249,14 @@ negativeUNL() noexcept Keylet BookT::operator()(Book const& b) const { + TRACE_FUNC(); return {ltDIR_NODE, getBookBase(b)}; } Keylet line(AccountID const& id0, AccountID const& id1, Currency const& currency) noexcept { + TRACE_FUNC(); // There is code in TrustSet that calls us with id0 == id1, to allow users // to locate and delete such "weird" trustlines. If we remove that code, we // could enable this assert: @@ -263,12 +280,14 @@ line(AccountID const& id0, AccountID const& id1, Currency const& currency) noexc Keylet offer(AccountID const& id, std::uint32_t seq) noexcept { + TRACE_FUNC(); return {ltOFFER, indexHash(LedgerNameSpace::Offer, id, seq)}; } Keylet quality(Keylet const& k, std::uint64_t q) noexcept { + TRACE_FUNC(); XRPL_ASSERT(k.type == ltDIR_NODE, "xrpl::keylet::quality : valid input type"); // Indexes are stored in big endian format: they print as hex as stored. @@ -287,6 +306,7 @@ quality(Keylet const& k, std::uint64_t q) noexcept Keylet NextT::operator()(Keylet const& k) const { + TRACE_FUNC(); XRPL_ASSERT(k.type == ltDIR_NODE, "xrpl::keylet::next_t::operator() : valid input type"); return {ltDIR_NODE, getQualityNext(k.key)}; } @@ -294,12 +314,14 @@ NextT::operator()(Keylet const& k) const Keylet TicketT::operator()(AccountID const& id, std::uint32_t ticketSeq) const { + TRACE_FUNC(); return {ltTICKET, getTicketIndex(id, ticketSeq)}; } Keylet TicketT::operator()(AccountID const& id, SeqProxy ticketSeq) const { + TRACE_FUNC(); return {ltTICKET, getTicketIndex(id, ticketSeq)}; } @@ -309,24 +331,28 @@ TicketT::operator()(AccountID const& id, SeqProxy ticketSeq) const static Keylet signers(AccountID const& account, std::uint32_t page) noexcept { + TRACE_FUNC(); return {ltSIGNER_LIST, indexHash(LedgerNameSpace::SignerList, account, page)}; } Keylet signers(AccountID const& account) noexcept { + TRACE_FUNC(); return signers(account, 0); } Keylet check(AccountID const& id, std::uint32_t seq) noexcept { + TRACE_FUNC(); return {ltCHECK, indexHash(LedgerNameSpace::Check, id, seq)}; } Keylet depositPreauth(AccountID const& owner, AccountID const& preauthorized) noexcept { + TRACE_FUNC(); return {ltDEPOSIT_PREAUTH, indexHash(LedgerNameSpace::DepositPreauth, owner, preauthorized)}; } @@ -336,6 +362,7 @@ depositPreauth( AccountID const& owner, std::set> const& authCreds) noexcept { + TRACE_FUNC(); std::vector hashes; hashes.reserve(authCreds.size()); for (auto const& o : authCreds) @@ -350,18 +377,21 @@ depositPreauth( Keylet unchecked(uint256 const& key) noexcept { + TRACE_FUNC(); return {ltANY, key}; } Keylet ownerDir(AccountID const& id) noexcept { + TRACE_FUNC(); return {ltDIR_NODE, indexHash(LedgerNameSpace::OwnerDir, id)}; } Keylet page(uint256 const& key, std::uint64_t index) noexcept { + TRACE_FUNC(); if (index == 0) return {ltDIR_NODE, key}; @@ -371,18 +401,21 @@ page(uint256 const& key, std::uint64_t index) noexcept Keylet escrow(AccountID const& src, std::uint32_t seq) noexcept { + TRACE_FUNC(); return {ltESCROW, indexHash(LedgerNameSpace::Escrow, src, seq)}; } Keylet payChan(AccountID const& src, AccountID const& dst, std::uint32_t seq) noexcept { + TRACE_FUNC(); return {ltPAYCHAN, indexHash(LedgerNameSpace::XRPPaymentChannel, src, dst, seq)}; } Keylet nftpageMin(AccountID const& owner) { + TRACE_FUNC(); std::array buf{}; std::memcpy(buf.data(), owner.data(), owner.size()); return {ltNFTOKEN_PAGE, uint256{buf}}; @@ -391,6 +424,7 @@ nftpageMin(AccountID const& owner) Keylet nftpageMax(AccountID const& owner) { + TRACE_FUNC(); uint256 id = nft::kPAGE_MASK; std::memcpy(id.data(), owner.data(), owner.size()); return {ltNFTOKEN_PAGE, id}; @@ -399,6 +433,7 @@ nftpageMax(AccountID const& owner) Keylet nftpage(Keylet const& k, uint256 const& token) { + TRACE_FUNC(); XRPL_ASSERT(k.type == ltNFTOKEN_PAGE, "xrpl::keylet::nftpage : valid input type"); return {ltNFTOKEN_PAGE, (k.key & ~nft::kPAGE_MASK) + (token & nft::kPAGE_MASK)}; } @@ -406,24 +441,28 @@ nftpage(Keylet const& k, uint256 const& token) Keylet nftoffer(AccountID const& owner, std::uint32_t seq) { + TRACE_FUNC(); return {ltNFTOKEN_OFFER, indexHash(LedgerNameSpace::NftokenOffer, owner, seq)}; } Keylet nftBuys(uint256 const& id) noexcept { + TRACE_FUNC(); return {ltDIR_NODE, indexHash(LedgerNameSpace::NftokenBuyOffers, id)}; } Keylet nftSells(uint256 const& id) noexcept { + TRACE_FUNC(); return {ltDIR_NODE, indexHash(LedgerNameSpace::NftokenSellOffers, id)}; } Keylet amm(Asset const& asset1, Asset const& asset2) noexcept { + TRACE_FUNC(); auto const& [minA, maxA] = std::minmax(asset1, asset2); return std::visit( [](TIss1 const& issue1, TIss2 const& issue2) { @@ -458,18 +497,21 @@ amm(Asset const& asset1, Asset const& asset2) noexcept Keylet amm(uint256 const& id) noexcept { + TRACE_FUNC(); return {ltAMM, id}; } Keylet delegate(AccountID const& account, AccountID const& authorizedAccount) noexcept { + TRACE_FUNC(); return {ltDELEGATE, indexHash(LedgerNameSpace::Delegate, account, authorizedAccount)}; } Keylet bridge(STXChainBridge const& bridge, STXChainBridge::ChainType chainType) { + TRACE_FUNC(); // A door account can support multiple bridges. On the locking chain // there can only be one bridge per lockingChainCurrency. On the issuing // chain there can only be one bridge per issuingChainCurrency. @@ -480,6 +522,7 @@ bridge(STXChainBridge const& bridge, STXChainBridge::ChainType chainType) Keylet xChainClaimID(STXChainBridge const& bridge, std::uint64_t seq) { + TRACE_FUNC(); return { ltXCHAIN_OWNED_CLAIM_ID, indexHash( @@ -494,6 +537,7 @@ xChainClaimID(STXChainBridge const& bridge, std::uint64_t seq) Keylet xChainCreateAccountClaimID(STXChainBridge const& bridge, std::uint64_t seq) { + TRACE_FUNC(); return { ltXCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID, indexHash( @@ -508,72 +552,84 @@ xChainCreateAccountClaimID(STXChainBridge const& bridge, std::uint64_t seq) Keylet did(AccountID const& account) noexcept { + TRACE_FUNC(); return {ltDID, indexHash(LedgerNameSpace::Did, account)}; } Keylet oracle(AccountID const& account, std::uint32_t const& documentID) noexcept { + TRACE_FUNC(); return {ltORACLE, indexHash(LedgerNameSpace::Oracle, account, documentID)}; } Keylet mptIssuance(std::uint32_t seq, AccountID const& issuer) noexcept { + TRACE_FUNC(); return mptIssuance(makeMptID(seq, issuer)); } Keylet mptIssuance(MPTID const& issuanceID) noexcept { + TRACE_FUNC(); return {ltMPTOKEN_ISSUANCE, indexHash(LedgerNameSpace::MPTokenIssuance, issuanceID)}; } Keylet mptoken(MPTID const& issuanceID, AccountID const& holder) noexcept { + TRACE_FUNC(); return mptoken(mptIssuance(issuanceID).key, holder); } Keylet mptoken(uint256 const& issuanceKey, AccountID const& holder) noexcept { + TRACE_FUNC(); return {ltMPTOKEN, indexHash(LedgerNameSpace::MPToken, issuanceKey, holder)}; } Keylet credential(AccountID const& subject, AccountID const& issuer, Slice const& credType) noexcept { + TRACE_FUNC(); return {ltCREDENTIAL, indexHash(LedgerNameSpace::Credential, subject, issuer, credType)}; } Keylet vault(AccountID const& owner, std::uint32_t seq) noexcept { + TRACE_FUNC(); return vault(indexHash(LedgerNameSpace::Vault, owner, seq)); } Keylet loanbroker(AccountID const& owner, std::uint32_t seq) noexcept { + TRACE_FUNC(); return loanbroker(indexHash(LedgerNameSpace::LoanBroker, owner, seq)); } Keylet loan(uint256 const& loanBrokerID, std::uint32_t loanSeq) noexcept { + TRACE_FUNC(); return loan(indexHash(LedgerNameSpace::Loan, loanBrokerID, loanSeq)); } Keylet permissionedDomain(AccountID const& account, std::uint32_t seq) noexcept { + TRACE_FUNC(); return {ltPERMISSIONED_DOMAIN, indexHash(LedgerNameSpace::PermissionedDomain, account, seq)}; } Keylet permissionedDomain(uint256 const& domainID) noexcept { + TRACE_FUNC(); return {ltPERMISSIONED_DOMAIN, domainID}; } diff --git a/src/libxrpl/protocol/InnerObjectFormats.cpp b/src/libxrpl/protocol/InnerObjectFormats.cpp index 5c691159d7..1fa111a901 100644 --- a/src/libxrpl/protocol/InnerObjectFormats.cpp +++ b/src/libxrpl/protocol/InnerObjectFormats.cpp @@ -2,11 +2,13 @@ #include #include +#include namespace xrpl { InnerObjectFormats::InnerObjectFormats() { + TRACE_FUNC(); // inner objects with the default fields have to be // constructed with STObject::makeInnerObject() @@ -165,6 +167,7 @@ InnerObjectFormats::InnerObjectFormats() InnerObjectFormats const& InnerObjectFormats::getInstance() { + TRACE_FUNC(); static InnerObjectFormats const kINSTANCE; return kINSTANCE; } @@ -172,6 +175,7 @@ InnerObjectFormats::getInstance() SOTemplate const* InnerObjectFormats::findSOTemplateBySField(SField const& sField) const { + TRACE_FUNC(); auto itemPtr = findByType(sField.getCode()); if (itemPtr != nullptr) return &(itemPtr->getSOTemplate()); diff --git a/src/libxrpl/protocol/Issue.cpp b/src/libxrpl/protocol/Issue.cpp index 33ad3a0835..9106053e67 100644 --- a/src/libxrpl/protocol/Issue.cpp +++ b/src/libxrpl/protocol/Issue.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -16,6 +17,7 @@ namespace xrpl { std::string Issue::getText() const { + TRACE_FUNC(); std::string ret; ret.reserve(64); @@ -45,6 +47,7 @@ Issue::getText() const void Issue::setJson(json::Value& jv) const { + TRACE_FUNC(); jv[jss::currency] = to_string(currency); if (!isXRP(currency)) jv[jss::issuer] = toBase58(account); @@ -53,24 +56,28 @@ Issue::setJson(json::Value& jv) const bool Issue::native() const { + TRACE_FUNC(); return *this == xrpIssue(); } bool Issue::integral() const { + TRACE_FUNC(); return native(); } bool isConsistent(Issue const& ac) { + TRACE_FUNC(); return isXRP(ac.currency) == isXRP(ac.account); } std::string to_string(Issue const& ac) { + TRACE_FUNC(); if (isXRP(ac.account)) return to_string(ac.currency); @@ -80,6 +87,7 @@ to_string(Issue const& ac) json::Value toJson(Issue const& is) { + TRACE_FUNC(); json::Value jv; is.setJson(jv); return jv; @@ -88,6 +96,7 @@ toJson(Issue const& is) Issue issueFromJson(json::Value const& v) { + TRACE_FUNC(); if (!v.isObject()) { Throw( @@ -139,6 +148,7 @@ issueFromJson(json::Value const& v) std::ostream& operator<<(std::ostream& os, Issue const& x) { + TRACE_FUNC(); os << to_string(x); return os; } diff --git a/src/libxrpl/protocol/Keylet.cpp b/src/libxrpl/protocol/Keylet.cpp index 26bc98c1d6..9dd1716c63 100644 --- a/src/libxrpl/protocol/Keylet.cpp +++ b/src/libxrpl/protocol/Keylet.cpp @@ -3,12 +3,14 @@ #include #include #include +#include namespace xrpl { bool Keylet::check(STLedgerEntry const& sle) const { + TRACE_FUNC(); XRPL_ASSERT( sle.getType() != ltANY && sle.getType() != ltCHILD, "xrpl::Keylet::check : valid input type"); diff --git a/src/libxrpl/protocol/LedgerFormats.cpp b/src/libxrpl/protocol/LedgerFormats.cpp index 99c636fbdc..d7973a04d2 100644 --- a/src/libxrpl/protocol/LedgerFormats.cpp +++ b/src/libxrpl/protocol/LedgerFormats.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include // IWYU pragma: keep @@ -11,6 +12,7 @@ namespace xrpl { std::vector const& LedgerFormats::getCommonFields() { + TRACE_FUNC(); static auto const kCOMMON_FIELDS = std::vector{ {sfLedgerIndex, SoeOptional}, {sfLedgerEntryType, SoeRequired}, @@ -21,6 +23,7 @@ LedgerFormats::getCommonFields() LedgerFormats::LedgerFormats() { + TRACE_FUNC(); #pragma push_macro("UNWRAP") #undef UNWRAP #pragma push_macro("LEDGER_ENTRY") @@ -41,6 +44,7 @@ LedgerFormats::LedgerFormats() LedgerFormats const& LedgerFormats::getInstance() { + TRACE_FUNC(); static LedgerFormats const kINSTANCE; return kINSTANCE; } diff --git a/src/libxrpl/protocol/LedgerHeader.cpp b/src/libxrpl/protocol/LedgerHeader.cpp index 9ddd6e180d..4142839113 100644 --- a/src/libxrpl/protocol/LedgerHeader.cpp +++ b/src/libxrpl/protocol/LedgerHeader.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -13,6 +14,7 @@ namespace xrpl { void addRaw(LedgerHeader const& info, Serializer& s, bool includeHash) { + TRACE_FUNC(); s.add32(info.seq); s.add64(info.drops.drops()); s.addBitString(info.parentHash); @@ -30,6 +32,7 @@ addRaw(LedgerHeader const& info, Serializer& s, bool includeHash) LedgerHeader deserializeHeader(Slice data, bool hasHash) { + TRACE_FUNC(); SerialIter sit(data.data(), data.size()); LedgerHeader header; @@ -53,12 +56,14 @@ deserializeHeader(Slice data, bool hasHash) LedgerHeader deserializePrefixedHeader(Slice data, bool hasHash) { + TRACE_FUNC(); return deserializeHeader(data + 4, hasHash); } uint256 calculateLedgerHash(LedgerHeader const& info) { + TRACE_FUNC(); // VFALCO This has to match addRaw in View.h. return sha512Half( HashPrefix::LedgerMaster, diff --git a/src/libxrpl/protocol/MPTAmount.cpp b/src/libxrpl/protocol/MPTAmount.cpp index 1950407ab5..4e8615b4c3 100644 --- a/src/libxrpl/protocol/MPTAmount.cpp +++ b/src/libxrpl/protocol/MPTAmount.cpp @@ -1,10 +1,12 @@ #include +#include namespace xrpl { MPTAmount& MPTAmount::operator+=(MPTAmount const& other) { + TRACE_FUNC(); value_ += other.value(); return *this; } @@ -12,6 +14,7 @@ MPTAmount::operator+=(MPTAmount const& other) MPTAmount& MPTAmount::operator-=(MPTAmount const& other) { + TRACE_FUNC(); value_ -= other.value(); return *this; } @@ -19,30 +22,35 @@ MPTAmount::operator-=(MPTAmount const& other) MPTAmount MPTAmount::operator-() const { + TRACE_FUNC(); return MPTAmount{-value_}; } bool MPTAmount::operator==(MPTAmount const& other) const { + TRACE_FUNC(); return value_ == other.value_; } bool MPTAmount::operator==(value_type other) const { + TRACE_FUNC(); return value_ == other; } bool MPTAmount::operator<(MPTAmount const& other) const { + TRACE_FUNC(); return value_ < other.value_; } MPTAmount MPTAmount::minPositiveAmount() { + TRACE_FUNC(); return MPTAmount{1}; } diff --git a/src/libxrpl/protocol/MPTIssue.cpp b/src/libxrpl/protocol/MPTIssue.cpp index e9ec852d1d..4aadf31e30 100644 --- a/src/libxrpl/protocol/MPTIssue.cpp +++ b/src/libxrpl/protocol/MPTIssue.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,7 @@ MPTIssue::MPTIssue(std::uint32_t sequence, AccountID const& account) AccountID const& MPTIssue::getIssuer() const { + TRACE_FUNC(); // MPTID is concatenation of sequence + account static_assert(sizeof(MPTID) == (sizeof(std::uint32_t) + sizeof(AccountID))); // copy from id skipping the sequence @@ -40,18 +42,21 @@ MPTIssue::getIssuer() const std::string MPTIssue::getText() const { + TRACE_FUNC(); return to_string(mptID_); } void MPTIssue::setJson(json::Value& jv) const { + TRACE_FUNC(); jv[jss::mpt_issuance_id] = to_string(mptID_); } json::Value toJson(MPTIssue const& mptIssue) { + TRACE_FUNC(); json::Value jv; mptIssue.setJson(jv); return jv; @@ -60,12 +65,14 @@ toJson(MPTIssue const& mptIssue) std::string to_string(MPTIssue const& mptIssue) { + TRACE_FUNC(); return to_string(mptIssue.getMptID()); } MPTIssue mptIssueFromJson(json::Value const& v) { + TRACE_FUNC(); if (!v.isObject()) { Throw( @@ -97,6 +104,7 @@ mptIssueFromJson(json::Value const& v) std::ostream& operator<<(std::ostream& os, MPTIssue const& x) { + TRACE_FUNC(); os << to_string(x); return os; } diff --git a/src/libxrpl/protocol/NFTSyntheticSerializer.cpp b/src/libxrpl/protocol/NFTSyntheticSerializer.cpp index 4f0a2d5071..acf381d35d 100644 --- a/src/libxrpl/protocol/NFTSyntheticSerializer.cpp +++ b/src/libxrpl/protocol/NFTSyntheticSerializer.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -17,6 +18,7 @@ insertNFTSyntheticInJson( std::shared_ptr const& transaction, TxMeta const& transactionMeta) { + TRACE_FUNC(); insertNFTokenID(response[jss::meta], transaction, transactionMeta); insertNFTokenOfferID(response[jss::meta], transaction, transactionMeta); } diff --git a/src/libxrpl/protocol/NFTokenID.cpp b/src/libxrpl/protocol/NFTokenID.cpp index b7822caf01..427c36785c 100644 --- a/src/libxrpl/protocol/NFTokenID.cpp +++ b/src/libxrpl/protocol/NFTokenID.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,7 @@ namespace xrpl { bool canHaveNFTokenID(std::shared_ptr const& serializedTx, TxMeta const& transactionMeta) { + TRACE_FUNC(); if (!serializedTx) return false; @@ -40,6 +42,7 @@ canHaveNFTokenID(std::shared_ptr const& serializedTx, TxMeta const& std::optional getNFTokenIDFromPage(TxMeta const& transactionMeta) { + TRACE_FUNC(); // The metadata does not make it obvious which NFT was added. To figure // that out we gather up all of the previous NFT IDs and all of the final // NFT IDs and compare them to find what changed. @@ -112,6 +115,7 @@ getNFTokenIDFromPage(TxMeta const& transactionMeta) std::vector getNFTokenIDFromDeletedOffer(TxMeta const& transactionMeta) { + TRACE_FUNC(); std::vector tokenIDResult; for (STObject const& node : transactionMeta.getNodes()) { @@ -138,6 +142,7 @@ insertNFTokenID( std::shared_ptr const& transaction, TxMeta const& transactionMeta) { + TRACE_FUNC(); if (!canHaveNFTokenID(transaction, transactionMeta)) return; diff --git a/src/libxrpl/protocol/NFTokenOfferID.cpp b/src/libxrpl/protocol/NFTokenOfferID.cpp index ee39222bfa..1dcbf85176 100644 --- a/src/libxrpl/protocol/NFTokenOfferID.cpp +++ b/src/libxrpl/protocol/NFTokenOfferID.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -21,6 +22,7 @@ canHaveNFTokenOfferID( std::shared_ptr const& serializedTx, TxMeta const& transactionMeta) { + TRACE_FUNC(); if (!serializedTx) return false; @@ -39,6 +41,7 @@ canHaveNFTokenOfferID( std::optional getOfferIDFromCreatedOffer(TxMeta const& transactionMeta) { + TRACE_FUNC(); for (STObject const& node : transactionMeta.getNodes()) { if (node.getFieldU16(sfLedgerEntryType) != ltNFTOKEN_OFFER || @@ -56,6 +59,7 @@ insertNFTokenOfferID( std::shared_ptr const& transaction, TxMeta const& transactionMeta) { + TRACE_FUNC(); if (!canHaveNFTokenOfferID(transaction, transactionMeta)) return; diff --git a/src/libxrpl/protocol/PathAsset.cpp b/src/libxrpl/protocol/PathAsset.cpp index 97011129e5..6af292bf11 100644 --- a/src/libxrpl/protocol/PathAsset.cpp +++ b/src/libxrpl/protocol/PathAsset.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -9,12 +10,14 @@ namespace xrpl { std::string to_string(PathAsset const& asset) { + TRACE_FUNC(); return std::visit([&](auto const& issue) { return to_string(issue); }, asset.value()); } std::ostream& operator<<(std::ostream& os, PathAsset const& x) { + TRACE_FUNC(); os << to_string(x); return os; } diff --git a/src/libxrpl/protocol/Permissions.cpp b/src/libxrpl/protocol/Permissions.cpp index 4222c63fea..7e668e8b8c 100644 --- a/src/libxrpl/protocol/Permissions.cpp +++ b/src/libxrpl/protocol/Permissions.cpp @@ -2,6 +2,7 @@ #include #include +#include #include // IWYU pragma: keep #include #include @@ -15,6 +16,7 @@ namespace xrpl { Permission::Permission() { + TRACE_FUNC(); txFeatureMap_ = { #pragma push_macro("TRANSACTION") #undef TRANSACTION @@ -92,6 +94,7 @@ Permission::Permission() Permission const& Permission::getInstance() { + TRACE_FUNC(); static Permission const kINSTANCE; return kINSTANCE; } @@ -99,6 +102,7 @@ Permission::getInstance() std::optional Permission::getPermissionName(std::uint32_t const value) const { + TRACE_FUNC(); auto const permissionValue = static_cast(value); if (auto const granular = getGranularName(permissionValue)) return granular; @@ -114,6 +118,7 @@ Permission::getPermissionName(std::uint32_t const value) const std::optional Permission::getGranularValue(std::string const& name) const { + TRACE_FUNC(); auto const it = granularPermissionMap_.find(name); if (it != granularPermissionMap_.end()) return static_cast(it->second); @@ -124,6 +129,7 @@ Permission::getGranularValue(std::string const& name) const std::optional Permission::getGranularName(GranularPermissionType const& value) const { + TRACE_FUNC(); auto const it = granularNameMap_.find(value); if (it != granularNameMap_.end()) return it->second; @@ -134,6 +140,7 @@ Permission::getGranularName(GranularPermissionType const& value) const std::optional Permission::getGranularTxType(GranularPermissionType const& gpType) const { + TRACE_FUNC(); auto const it = granularTxTypeMap_.find(gpType); if (it != granularTxTypeMap_.end()) return it->second; @@ -144,6 +151,7 @@ Permission::getGranularTxType(GranularPermissionType const& gpType) const std::optional> Permission::getTxFeature(TxType txType) const { + TRACE_FUNC(); auto const txFeaturesIt = txFeatureMap_.find(txType); XRPL_ASSERT( txFeaturesIt != txFeatureMap_.end(), @@ -157,6 +165,7 @@ Permission::getTxFeature(TxType txType) const bool Permission::isDelegable(std::uint32_t const& permissionValue, Rules const& rules) const { + TRACE_FUNC(); auto const granularPermission = getGranularName(static_cast(permissionValue)); if (granularPermission) @@ -191,12 +200,14 @@ Permission::isDelegable(std::uint32_t const& permissionValue, Rules const& rules uint32_t Permission::txToPermissionType(TxType const& type) { + TRACE_FUNC(); return static_cast(type) + 1; } TxType Permission::permissionToTxType(uint32_t const& value) { + TRACE_FUNC(); return static_cast(value - 1); } diff --git a/src/libxrpl/protocol/Protocol.cpp b/src/libxrpl/protocol/Protocol.cpp index 14230e78bd..df7dc91a29 100644 --- a/src/libxrpl/protocol/Protocol.cpp +++ b/src/libxrpl/protocol/Protocol.cpp @@ -1,15 +1,18 @@ #include +#include namespace xrpl { bool isVotingLedger(LedgerIndex seq) { + TRACE_FUNC(); return seq % kFLAG_LEDGER_INTERVAL == 0; } bool isFlagLedger(LedgerIndex seq) { + TRACE_FUNC(); return seq % kFLAG_LEDGER_INTERVAL == 0; } } // namespace xrpl diff --git a/src/libxrpl/protocol/PublicKey.cpp b/src/libxrpl/protocol/PublicKey.cpp index ad88e60fe7..d74c1c9acf 100644 --- a/src/libxrpl/protocol/PublicKey.cpp +++ b/src/libxrpl/protocol/PublicKey.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -27,6 +28,7 @@ namespace xrpl { std::ostream& operator<<(std::ostream& os, PublicKey const& pk) { + TRACE_FUNC(); os << strHex(pk); return os; } @@ -35,6 +37,7 @@ template <> std::optional parseBase58(TokenType type, std::string const& s) { + TRACE_FUNC(); auto const result = decodeBase58Token(s, type); auto const pks = makeSlice(result); if (!publicKeyType(pks)) @@ -49,6 +52,7 @@ parseBase58(TokenType type, std::string const& s) static std::optional sigPart(Slice& buf) { + TRACE_FUNC(); if (buf.size() < 3 || buf[0] != 0x02) return std::nullopt; auto const len = buf[1]; @@ -75,6 +79,7 @@ sigPart(Slice& buf) static std::string sliceToHex(Slice const& slice) { + TRACE_FUNC(); std::string s; if ((slice[0] & 0x80) != 0) { @@ -110,6 +115,7 @@ sliceToHex(Slice const& slice) std::optional ecdsaCanonicality(Slice const& sig) { + TRACE_FUNC(); using uint264 = boost::multiprecision::number publicKeyType(Slice const& slice) { + TRACE_FUNC(); if (slice.size() == 33) { if (slice[0] == 0xED) @@ -225,6 +236,7 @@ verifyDigest( Slice const& sig, bool mustBeFullyCanonical) noexcept { + TRACE_FUNC(); if (publicKeyType(publicKey) != KeyType::Secp256k1) logicError("sign: secp256k1 required for digest signing"); auto const canonicality = ecdsaCanonicality(sig); @@ -269,6 +281,7 @@ verifyDigest( bool verify(PublicKey const& publicKey, Slice const& m, Slice const& sig) noexcept { + TRACE_FUNC(); if (auto const type = publicKeyType(publicKey)) { if (*type == KeyType::Secp256k1) @@ -293,6 +306,7 @@ verify(PublicKey const& publicKey, Slice const& m, Slice const& sig) noexcept NodeID calcNodeID(PublicKey const& pk) { + TRACE_FUNC(); static_assert(NodeID::kBYTES == sizeof(RipeshaHasher::result_type)); RipeshaHasher h; diff --git a/src/libxrpl/protocol/Quality.cpp b/src/libxrpl/protocol/Quality.cpp index d3997cf2db..be87bfc62c 100644 --- a/src/libxrpl/protocol/Quality.cpp +++ b/src/libxrpl/protocol/Quality.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -21,6 +22,7 @@ Quality::Quality(Amounts const& amount) : value_(getRate(amount.out, amount.in)) Quality& Quality::operator++() { + TRACE_FUNC(); XRPL_ASSERT(value_ > 0, "xrpl::Quality::operator++() : minimum value"); --value_; return *this; @@ -29,6 +31,7 @@ Quality::operator++() Quality Quality::operator++(int) { + TRACE_FUNC(); Quality prev(*this); ++*this; return prev; @@ -37,6 +40,7 @@ Quality::operator++(int) Quality& Quality::operator--() { + TRACE_FUNC(); XRPL_ASSERT( value_ < std::numeric_limits::max(), "xrpl::Quality::operator--() : maximum value"); @@ -47,6 +51,7 @@ Quality::operator--() Quality Quality::operator--(int) { + TRACE_FUNC(); Quality prev(*this); --*this; return prev; @@ -56,6 +61,7 @@ template limit) { Amounts result(limit, DivRoundFunc(limit, quality.rate(), amount.out.asset(), roundUp)); @@ -72,12 +78,14 @@ ceilInImpl(Amounts const& amount, STAmount const& limit, bool roundUp, Quality c Amounts Quality::ceilIn(Amounts const& amount, STAmount const& limit) const { + TRACE_FUNC(); return ceilInImpl(amount, limit, /* roundUp */ true, *this); } Amounts Quality::ceilInStrict(Amounts const& amount, STAmount const& limit, bool roundUp) const { + TRACE_FUNC(); return ceilInImpl(amount, limit, roundUp, *this); } @@ -85,6 +93,7 @@ template limit) { Amounts result(MulRoundFunc(limit, quality.rate(), amount.in.asset(), roundUp), limit); @@ -101,18 +110,21 @@ ceilOutImpl(Amounts const& amount, STAmount const& limit, bool roundUp, Quality Amounts Quality::ceilOut(Amounts const& amount, STAmount const& limit) const { + TRACE_FUNC(); return ceilOutImpl(amount, limit, /* roundUp */ true, *this); } Amounts Quality::ceilOutStrict(Amounts const& amount, STAmount const& limit, bool roundUp) const { + TRACE_FUNC(); return ceilOutImpl(amount, limit, roundUp, *this); } Quality composedQuality(Quality const& lhs, Quality const& rhs) { + TRACE_FUNC(); STAmount const lhsRate(lhs.rate()); XRPL_ASSERT(lhsRate != beast::kZERO, "xrpl::composed_quality : nonzero left input"); @@ -133,6 +145,7 @@ composedQuality(Quality const& lhs, Quality const& rhs) Quality Quality::round(int digits) const { + TRACE_FUNC(); // Modulus for mantissa static std::uint64_t const kMOD[17] = { /* 0 */ 10000000000000000, diff --git a/src/libxrpl/protocol/QualityFunction.cpp b/src/libxrpl/protocol/QualityFunction.cpp index 2e9eb5745a..d695509db9 100644 --- a/src/libxrpl/protocol/QualityFunction.cpp +++ b/src/libxrpl/protocol/QualityFunction.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -13,6 +14,7 @@ namespace xrpl { QualityFunction::QualityFunction(Quality const& quality, QualityFunction::CLOBLikeTag) : m_(0), b_(0), quality_(quality) { + TRACE_FUNC(); if (quality.rate() <= beast::kZERO) Throw("QualityFunction quality rate is 0."); b_ = 1 / quality.rate(); @@ -21,6 +23,7 @@ QualityFunction::QualityFunction(Quality const& quality, QualityFunction::CLOBLi void QualityFunction::combine(QualityFunction const& qf) { + TRACE_FUNC(); m_ += b_ * qf.m_; b_ *= qf.b_; if (m_ != 0) @@ -30,6 +33,7 @@ QualityFunction::combine(QualityFunction const& qf) std::optional QualityFunction::outFromAvgQ(Quality const& quality) { + TRACE_FUNC(); if (m_ != 0 && quality.rate() != beast::kZERO) { SaveNumberRoundMode const rm(Number::setround(Number::RoundingMode::Upward)); diff --git a/src/libxrpl/protocol/RPCErr.cpp b/src/libxrpl/protocol/RPCErr.cpp index 66aef1470c..7ce4b7d149 100644 --- a/src/libxrpl/protocol/RPCErr.cpp +++ b/src/libxrpl/protocol/RPCErr.cpp @@ -3,6 +3,7 @@ #include #include #include +#include namespace xrpl { @@ -12,6 +13,7 @@ struct RPCErr; json::Value rpcError(ErrorCodeI iError) { + TRACE_FUNC(); json::Value jvResult(json::ObjectValue); RPC::injectError(iError, jvResult); return jvResult; @@ -21,6 +23,7 @@ rpcError(ErrorCodeI iError) bool isRpcError(json::Value jvResult) { + TRACE_FUNC(); return jvResult.isObject() && jvResult.isMember(jss::error); } diff --git a/src/libxrpl/protocol/Rate2.cpp b/src/libxrpl/protocol/Rate2.cpp index 27b17068e3..50b79d4d58 100644 --- a/src/libxrpl/protocol/Rate2.cpp +++ b/src/libxrpl/protocol/Rate2.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -16,6 +17,7 @@ namespace detail { STAmount asAmount(Rate const& rate) { + TRACE_FUNC(); return {noIssue(), rate.value, -9, false}; } @@ -25,6 +27,7 @@ namespace nft { Rate transferFeeAsRate(std::uint16_t fee) { + TRACE_FUNC(); return Rate{static_cast(fee) * 10000}; } @@ -33,6 +36,7 @@ transferFeeAsRate(std::uint16_t fee) STAmount multiply(STAmount const& amount, Rate const& rate) { + TRACE_FUNC(); XRPL_ASSERT(rate.value, "xrpl::nft::multiply : nonzero rate input"); if (rate == kPARITY_RATE) @@ -44,6 +48,7 @@ multiply(STAmount const& amount, Rate const& rate) STAmount multiplyRound(STAmount const& amount, Rate const& rate, bool roundUp) { + TRACE_FUNC(); XRPL_ASSERT(rate.value, "xrpl::nft::multiplyRound : nonzero rate input"); if (rate == kPARITY_RATE) @@ -55,6 +60,7 @@ multiplyRound(STAmount const& amount, Rate const& rate, bool roundUp) STAmount multiplyRound(STAmount const& amount, Rate const& rate, Asset const& asset, bool roundUp) { + TRACE_FUNC(); XRPL_ASSERT(rate.value, "xrpl::nft::multiplyRound(Issue) : nonzero rate input"); if (rate == kPARITY_RATE) @@ -68,6 +74,7 @@ multiplyRound(STAmount const& amount, Rate const& rate, Asset const& asset, bool STAmount divide(STAmount const& amount, Rate const& rate) { + TRACE_FUNC(); XRPL_ASSERT(rate.value, "xrpl::nft::divide : nonzero rate input"); if (rate == kPARITY_RATE) @@ -79,6 +86,7 @@ divide(STAmount const& amount, Rate const& rate) STAmount divideRound(STAmount const& amount, Rate const& rate, bool roundUp) { + TRACE_FUNC(); XRPL_ASSERT(rate.value, "xrpl::nft::divideRound : nonzero rate input"); if (rate == kPARITY_RATE) @@ -90,6 +98,7 @@ divideRound(STAmount const& amount, Rate const& rate, bool roundUp) STAmount divideRound(STAmount const& amount, Rate const& rate, Asset const& asset, bool roundUp) { + TRACE_FUNC(); XRPL_ASSERT(rate.value, "xrpl::nft::divideRound(Issue) : nonzero rate input"); if (rate == kPARITY_RATE) diff --git a/src/libxrpl/protocol/Rules.cpp b/src/libxrpl/protocol/Rules.cpp index 2c971749b6..19869b0dc8 100644 --- a/src/libxrpl/protocol/Rules.cpp +++ b/src/libxrpl/protocol/Rules.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -21,6 +22,7 @@ namespace { LocalValue>& getCurrentTransactionRulesRef() { + TRACE_FUNC(); static LocalValue> kR; return kR; } @@ -29,12 +31,14 @@ getCurrentTransactionRulesRef() std::optional const& getCurrentTransactionRules() { + TRACE_FUNC(); return *getCurrentTransactionRulesRef(); } void setCurrentTransactionRules(std::optional r) { + TRACE_FUNC(); // Make global changes associated with the rules before the value is moved. // Push the appropriate setting, instead of having the class pull every time // the value is needed. That could get expensive fast. @@ -65,6 +69,7 @@ public: STVector256 const& amendments) : digest_(digest), presets_(presets) { + TRACE_FUNC(); set_.reserve(amendments.size()); set_.insert(amendments.begin(), amendments.end()); } @@ -72,12 +77,14 @@ public: [[nodiscard]] std::unordered_set> const& presets() const { + TRACE_FUNC(); return presets_; } [[nodiscard]] bool enabled(uint256 const& feature) const { + TRACE_FUNC(); if (presets_.contains(feature)) return true; return set_.contains(feature); @@ -86,6 +93,7 @@ public: bool operator==(Impl const& other) const { + TRACE_FUNC(); if (!digest_ && !other.digest_) return true; if (!digest_ || !other.digest_) @@ -114,12 +122,14 @@ Rules::Rules( std::unordered_set> const& Rules::presets() const { + TRACE_FUNC(); return impl_->presets(); } bool Rules::enabled(uint256 const& feature) const { + TRACE_FUNC(); XRPL_ASSERT(impl_, "xrpl::Rules::enabled : initialized"); return impl_->enabled(feature); @@ -128,6 +138,7 @@ Rules::enabled(uint256 const& feature) const bool Rules::operator==(Rules const& other) const { + TRACE_FUNC(); XRPL_ASSERT(impl_ && other.impl_, "xrpl::Rules::operator==(Rules) const : both initialized"); if (impl_.get() == other.impl_.get()) return true; @@ -137,12 +148,14 @@ Rules::operator==(Rules const& other) const bool Rules::operator!=(Rules const& other) const { + TRACE_FUNC(); return !(*this == other); } bool isFeatureEnabled(uint256 const& feature, bool resultIfNoRules) { + TRACE_FUNC(); auto const& rules = getCurrentTransactionRules(); if (!rules) return resultIfNoRules; @@ -152,6 +165,7 @@ isFeatureEnabled(uint256 const& feature, bool resultIfNoRules) bool isFeatureEnabled(uint256 const& feature) { + TRACE_FUNC(); return isFeatureEnabled(feature, false); } diff --git a/src/libxrpl/protocol/SField.cpp b/src/libxrpl/protocol/SField.cpp index 4193bb3e27..34728de160 100644 --- a/src/libxrpl/protocol/SField.cpp +++ b/src/libxrpl/protocol/SField.cpp @@ -1,5 +1,6 @@ #include +#include #include #include @@ -83,6 +84,7 @@ SField::SField( , signingField(signing) , jsonName(fieldName.c_str()) { + TRACE_FUNC(); XRPL_ASSERT( !knownCodeToField.contains(fieldCodeMem), "xrpl::SField::SField(tid,fv,fn,meta,signing) : fieldCode is unique"); @@ -103,6 +105,7 @@ SField::SField(PrivateAccessTagT, int fc, char const* fn) , signingField(IsSigning::Yes) , jsonName(fieldName.c_str()) { + TRACE_FUNC(); XRPL_ASSERT( !knownCodeToField.contains(fieldCodeMem), "xrpl::SField::SField(fc,fn) : fieldCode is unique"); @@ -115,6 +118,7 @@ SField::SField(PrivateAccessTagT, int fc, char const* fn) SField const& SField::getField(int code) { + TRACE_FUNC(); auto it = knownCodeToField.find(code); if (it != knownCodeToField.end()) @@ -127,6 +131,7 @@ SField::getField(int code) int SField::compare(SField const& f1, SField const& f2) { + TRACE_FUNC(); // -1 = f1 comes before f2, 0 = illegal combination, 1 = f1 comes after f2 if ((f1.fieldCodeMem <= 0) || (f2.fieldCodeMem <= 0)) return 0; @@ -143,6 +148,7 @@ SField::compare(SField const& f1, SField const& f2) SField const& SField::getField(std::string const& fieldName) { + TRACE_FUNC(); auto it = knownNameToField.find(fieldName); if (it != knownNameToField.end()) diff --git a/src/libxrpl/protocol/SOTemplate.cpp b/src/libxrpl/protocol/SOTemplate.cpp index 708fd465e2..0429d9a52e 100644 --- a/src/libxrpl/protocol/SOTemplate.cpp +++ b/src/libxrpl/protocol/SOTemplate.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -23,6 +24,7 @@ SOTemplate::SOTemplate( SOTemplate::SOTemplate(std::vector uniqueFields, std::vector commonFields) : indices_(SField::getNumFields() + 1, -1) // Unmapped indices == -1 { + TRACE_FUNC(); // Add all SOElements. // elements_ = std::move(uniqueFields); @@ -53,6 +55,7 @@ SOTemplate::SOTemplate(std::vector uniqueFields, std::vector= indices_.size()) diff --git a/src/libxrpl/protocol/STAccount.cpp b/src/libxrpl/protocol/STAccount.cpp index f561c9f930..271f0b8190 100644 --- a/src/libxrpl/protocol/STAccount.cpp +++ b/src/libxrpl/protocol/STAccount.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -27,6 +28,7 @@ STAccount::STAccount(SField const& n) : STBase(n), value_(beast::kZERO), default STAccount::STAccount(SField const& n, Buffer const& v) : STAccount(n) { + TRACE_FUNC(); if (v.empty()) return; // Zero is a valid size for a defaulted STAccount. @@ -53,24 +55,28 @@ STAccount::STAccount(SField const& n, AccountID const& v) : STBase(n), value_(v) STBase* STAccount::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STAccount::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } SerializedTypeID STAccount::getSType() const { + TRACE_FUNC(); return STI_ACCOUNT; } void STAccount::add(Serializer& s) const { + TRACE_FUNC(); XRPL_ASSERT(getFName().isBinary(), "xrpl::STAccount::add : field is binary"); XRPL_ASSERT(getFName().fieldType == STI_ACCOUNT, "xrpl::STAccount::add : valid field type"); @@ -84,6 +90,7 @@ STAccount::add(Serializer& s) const bool STAccount::isEquivalent(STBase const& t) const { + TRACE_FUNC(); auto const* const tPtr = dynamic_cast(&t); return (tPtr != nullptr) && (default_ == tPtr->default_) && (value_ == tPtr->value_); } @@ -91,12 +98,14 @@ STAccount::isEquivalent(STBase const& t) const bool STAccount::isDefault() const { + TRACE_FUNC(); return default_; } std::string STAccount::getText() const { + TRACE_FUNC(); if (isDefault()) return ""; return toBase58(value()); diff --git a/src/libxrpl/protocol/STAmount.cpp b/src/libxrpl/protocol/STAmount.cpp index 25857d387e..1bec6d222b 100644 --- a/src/libxrpl/protocol/STAmount.cpp +++ b/src/libxrpl/protocol/STAmount.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -55,6 +56,7 @@ static std::uint64_t const kTEN_TO17 = kTEN_TO14 * 1000; static std::int64_t getInt64Value(STAmount const& amount, bool valid, char const* error) { + TRACE_FUNC(); if (!valid) Throw(error); XRPL_ASSERT(amount.exponent() == 0, "xrpl::getInt64Value : exponent is zero"); @@ -74,18 +76,21 @@ getInt64Value(STAmount const& amount, bool valid, char const* error) static std::int64_t getSNValue(STAmount const& amount) { + TRACE_FUNC(); return getInt64Value(amount, amount.native(), "amount is not native!"); } static std::int64_t getMPTValue(STAmount const& amount) { + TRACE_FUNC(); return getInt64Value(amount, amount.holds(), "amount is not MPT!"); } static bool areComparable(STAmount const& v1, STAmount const& v2) { + TRACE_FUNC(); return std::visit( [&](TIss1 const& issue1, TIss2 const& issue2) { if constexpr (kIS_ISSUE_V && kIS_ISSUE_V) @@ -109,6 +114,7 @@ static_assert(kINITIAL_XRP.drops() == STAmount::kMAX_NATIVE_N); STAmount::STAmount(SerialIter& sit, SField const& name) : STBase(name) { + TRACE_FUNC(); std::uint64_t value = sit.get64(); // native or MPT @@ -192,12 +198,14 @@ STAmount::STAmount(SerialIter& sit, SField const& name) : STBase(name) STAmount::STAmount(SField const& name, std::int64_t mantissa) : STBase(name), asset_(xrpIssue()), offset_(0) { + TRACE_FUNC(); set(mantissa); } STAmount::STAmount(SField const& name, std::uint64_t mantissa, bool negative) : STBase(name), asset_(xrpIssue()), value_(mantissa), offset_(0), isNegative_(negative) { + TRACE_FUNC(); XRPL_ASSERT( value_ <= std::numeric_limits::max(), "xrpl::STAmount::STAmount(SField, std::uint64_t, bool) : maximum " @@ -211,6 +219,7 @@ STAmount::STAmount(SField const& name, STAmount const& from) , offset_(from.offset_) , isNegative_(from.isNegative_) { + TRACE_FUNC(); XRPL_ASSERT( value_ <= std::numeric_limits::max(), "xrpl::STAmount::STAmount(SField, STAmount) : maximum input"); @@ -222,6 +231,7 @@ STAmount::STAmount(SField const& name, STAmount const& from) STAmount::STAmount(std::uint64_t mantissa, bool negative) : asset_(xrpIssue()), value_(mantissa), offset_(0), isNegative_(mantissa != 0 && negative) { + TRACE_FUNC(); XRPL_ASSERT( value_ <= std::numeric_limits::max(), "xrpl::STAmount::STAmount(std::uint64_t, bool) : maximum mantissa " @@ -231,6 +241,7 @@ STAmount::STAmount(std::uint64_t mantissa, bool negative) STAmount::STAmount(XRPAmount const& amount) : asset_(xrpIssue()), offset_(0), isNegative_(amount < beast::kZERO) { + TRACE_FUNC(); if (isNegative_) { value_ = unsafeCast(-amount.drops()); @@ -246,18 +257,21 @@ STAmount::STAmount(XRPAmount const& amount) std::unique_ptr STAmount::construct(SerialIter& sit, SField const& name) { + TRACE_FUNC(); return std::make_unique(sit, name); } STBase* STAmount::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STAmount::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } @@ -269,6 +283,7 @@ STAmount::move(std::size_t n, void* buf) XRPAmount STAmount::xrp() const { + TRACE_FUNC(); if (!native()) Throw("Cannot return non-native STAmount as XRPAmount"); @@ -284,6 +299,7 @@ STAmount::xrp() const IOUAmount STAmount::iou() const { + TRACE_FUNC(); if (integral()) Throw("Cannot return non-IOU STAmount as IOUAmount"); @@ -299,6 +315,7 @@ STAmount::iou() const MPTAmount STAmount::mpt() const { + TRACE_FUNC(); if (!holds()) Throw("Cannot return STAmount as MPTAmount"); @@ -314,6 +331,7 @@ STAmount::mpt() const STAmount& STAmount::operator=(IOUAmount const& iou) { + TRACE_FUNC(); XRPL_ASSERT(integral() == false, "xrpl::STAmount::operator=(IOUAmount) : is not integral"); offset_ = iou.exponent(); isNegative_ = iou < beast::kZERO; @@ -331,6 +349,7 @@ STAmount::operator=(IOUAmount const& iou) STAmount& STAmount::operator=(Number const& number) { + TRACE_FUNC(); if (!getCurrentTransactionRules() || isFeatureEnabled(featureSingleAssetVault) || isFeatureEnabled(featureLendingProtocol)) { @@ -356,6 +375,7 @@ STAmount::operator=(Number const& number) STAmount& STAmount::operator+=(STAmount const& a) { + TRACE_FUNC(); *this = *this + a; return *this; } @@ -363,6 +383,7 @@ STAmount::operator+=(STAmount const& a) STAmount& STAmount::operator-=(STAmount const& a) { + TRACE_FUNC(); *this = *this - a; return *this; } @@ -370,6 +391,7 @@ STAmount::operator-=(STAmount const& a) STAmount operator+(STAmount const& v1, STAmount const& v2) { + TRACE_FUNC(); if (!areComparable(v1, v2)) Throw("Can't add amounts that are't comparable!"); @@ -433,6 +455,7 @@ operator+(STAmount const& v1, STAmount const& v2) STAmount operator-(STAmount const& v1, STAmount const& v2) { + TRACE_FUNC(); return v1 + (-v2); } @@ -443,6 +466,7 @@ std::uint64_t const STAmount::kU_RATE_ONE = getRate(STAmount(1), STAmount(1)); void STAmount::setIssue(Asset const& asset) { + TRACE_FUNC(); asset_ = asset; } @@ -458,6 +482,7 @@ STAmount::setIssue(Asset const& asset) std::uint64_t getRate(STAmount const& offerOut, STAmount const& offerIn) { + TRACE_FUNC(); if (offerOut == beast::kZERO) return 0; @@ -500,6 +525,7 @@ getRate(STAmount const& offerOut, STAmount const& offerIn) bool canAdd(STAmount const& a, STAmount const& b) { + TRACE_FUNC(); // cannot add different currencies if (!areComparable(a, b)) return false; @@ -577,6 +603,7 @@ canAdd(STAmount const& a, STAmount const& b) bool canSubtract(STAmount const& a, STAmount const& b) { + TRACE_FUNC(); // Cannot subtract different currencies if (!areComparable(a, b)) return false; @@ -642,6 +669,7 @@ canSubtract(STAmount const& a, STAmount const& b) void STAmount::setJson(json::Value& elem) const { + TRACE_FUNC(); elem = json::ObjectValue; if (!native()) @@ -666,12 +694,14 @@ STAmount::setJson(json::Value& elem) const SerializedTypeID STAmount::getSType() const { + TRACE_FUNC(); return STI_AMOUNT; } std::string STAmount::getFullText() const { + TRACE_FUNC(); std::string ret; ret.reserve(64); @@ -682,6 +712,7 @@ STAmount::getFullText() const std::string STAmount::getText() const { + TRACE_FUNC(); // keep full internal accuracy, but make more human friendly if possible if (*this == beast::kZERO) return "0"; @@ -770,6 +801,7 @@ STAmount::getText() const json::Value STAmount::getJson(JsonOptions) const { + TRACE_FUNC(); json::Value elem; setJson(elem); return elem; @@ -778,6 +810,7 @@ STAmount::getJson(JsonOptions) const void STAmount::add(Serializer& s) const { + TRACE_FUNC(); asset_.visit( [&](MPTIssue const& issue) { auto u8 = static_cast(kMP_TOKEN >> 56); @@ -826,6 +859,7 @@ STAmount::add(Serializer& s) const bool STAmount::isEquivalent(STBase const& t) const { + TRACE_FUNC(); STAmount const* v = dynamic_cast(&t); return (v != nullptr) && (*v == *this); } @@ -833,6 +867,7 @@ STAmount::isEquivalent(STBase const& t) const bool STAmount::isDefault() const { + TRACE_FUNC(); return (value_ == 0) && native(); } @@ -857,6 +892,7 @@ STAmount::isDefault() const void STAmount::canonicalize() { + TRACE_FUNC(); if (integral()) { // native and MPT currency amounts should always have an offset of zero @@ -988,6 +1024,7 @@ STAmount::canonicalize() void STAmount::set(std::int64_t v) { + TRACE_FUNC(); if (v < 0) { isNegative_ = true; @@ -1005,6 +1042,7 @@ STAmount::set(std::int64_t v) STAmount amountFromQuality(std::uint64_t rate) { + TRACE_FUNC(); if (rate == 0) return STAmount(noIssue()); @@ -1017,6 +1055,7 @@ amountFromQuality(std::uint64_t rate) STAmount amountFromString(Asset const& asset, std::string const& amount) { + TRACE_FUNC(); auto const parts = partsFromString(amount); if ((asset.native() || asset.holds()) && parts.exponent < 0) Throw("XRP and MPT must be specified as integral amount."); @@ -1026,6 +1065,7 @@ amountFromString(Asset const& asset, std::string const& amount) STAmount amountFromJson(SField const& name, json::Value const& v) { + TRACE_FUNC(); Asset asset; json::Value value; @@ -1150,6 +1190,7 @@ amountFromJson(SField const& name, json::Value const& v) bool amountFromJsonNoThrow(STAmount& result, json::Value const& jvSource) { + TRACE_FUNC(); try { result = amountFromJson(kSF_GENERIC, jvSource); @@ -1171,6 +1212,7 @@ amountFromJsonNoThrow(STAmount& result, json::Value const& jvSource) bool operator==(STAmount const& lhs, STAmount const& rhs) { + TRACE_FUNC(); return areComparable(lhs, rhs) && lhs.negative() == rhs.negative() && lhs.exponent() == rhs.exponent() && lhs.mantissa() == rhs.mantissa(); } @@ -1178,6 +1220,7 @@ operator==(STAmount const& lhs, STAmount const& rhs) bool operator<(STAmount const& lhs, STAmount const& rhs) { + TRACE_FUNC(); if (!areComparable(lhs, rhs)) Throw("Can't compare amounts that are't comparable!"); @@ -1212,6 +1255,7 @@ operator<(STAmount const& lhs, STAmount const& rhs) STAmount operator-(STAmount const& value) { + TRACE_FUNC(); if (value.mantissa() == 0) return value; return STAmount( @@ -1234,6 +1278,7 @@ operator-(STAmount const& value) static std::uint64_t muldiv(std::uint64_t multiplier, std::uint64_t multiplicand, std::uint64_t divisor) { + TRACE_FUNC(); boost::multiprecision::uint128_t ret; boost::multiprecision::multiply(ret, multiplier, multiplicand); @@ -1256,6 +1301,7 @@ muldivRound( std::uint64_t divisor, std::uint64_t rounding) { + TRACE_FUNC(); boost::multiprecision::uint128_t ret; boost::multiprecision::multiply(ret, multiplier, multiplicand); @@ -1275,6 +1321,7 @@ muldivRound( STAmount divide(STAmount const& num, STAmount const& den, Asset const& asset) { + TRACE_FUNC(); if (den == beast::kZERO) Throw("division by zero"); @@ -1320,6 +1367,7 @@ divide(STAmount const& num, STAmount const& den, Asset const& asset) STAmount multiply(STAmount const& v1, STAmount const& v2, Asset const& asset) { + TRACE_FUNC(); if (v1 == beast::kZERO || v2 == beast::kZERO) return STAmount(asset); @@ -1413,6 +1461,7 @@ multiply(STAmount const& v1, STAmount const& v2, Asset const& asset) static void canonicalizeRound(bool integral, std::uint64_t& value, int& offset, bool) { + TRACE_FUNC(); if (integral) { if (offset < 0) @@ -1452,6 +1501,7 @@ canonicalizeRound(bool integral, std::uint64_t& value, int& offset, bool) static void canonicalizeRoundStrict(bool integral, std::uint64_t& value, int& offset, bool roundUp) { + TRACE_FUNC(); if (integral) { if (offset < 0) @@ -1489,6 +1539,7 @@ canonicalizeRoundStrict(bool integral, std::uint64_t& value, int& offset, bool r STAmount roundToScale(STAmount const& value, std::int32_t scale, Number::RoundingMode rounding) { + TRACE_FUNC(); // Nothing to do for integral types. if (value.integral()) return value; @@ -1540,6 +1591,7 @@ template (v1, v2, asset, roundUp); } STAmount mulRoundStrict(STAmount const& v1, STAmount const& v2, Asset const& asset, bool roundUp) { + TRACE_FUNC(); return mulRoundImpl(v1, v2, asset, roundUp); } @@ -1654,6 +1708,7 @@ template static STAmount divRoundImpl(STAmount const& num, STAmount const& den, Asset const& asset, bool roundUp) { + TRACE_FUNC(); if (den == beast::kZERO) Throw("division by zero"); @@ -1730,12 +1785,14 @@ divRoundImpl(STAmount const& num, STAmount const& den, Asset const& asset, bool STAmount divRound(STAmount const& num, STAmount const& den, Asset const& asset, bool roundUp) { + TRACE_FUNC(); return divRoundImpl(num, den, asset, roundUp); } STAmount divRoundStrict(STAmount const& num, STAmount const& den, Asset const& asset, bool roundUp) { + TRACE_FUNC(); return divRoundImpl(num, den, asset, roundUp); } diff --git a/src/libxrpl/protocol/STArray.cpp b/src/libxrpl/protocol/STArray.cpp index 537cb36630..3b5c1dc8dd 100644 --- a/src/libxrpl/protocol/STArray.cpp +++ b/src/libxrpl/protocol/STArray.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -22,6 +23,7 @@ STArray::STArray(STArray&& other) : STBase(other.getFName()), v_(std::move(other STArray& STArray::operator=(STArray&& other) { + TRACE_FUNC(); setFName(other.getFName()); v_ = std::move(other.v_); return *this; @@ -29,6 +31,7 @@ STArray::operator=(STArray&& other) STArray::STArray(int n) { + TRACE_FUNC(); v_.reserve(n); } @@ -38,11 +41,13 @@ STArray::STArray(SField const& f) : STBase(f) STArray::STArray(SField const& f, std::size_t n) : STBase(f) { + TRACE_FUNC(); v_.reserve(n); } STArray::STArray(SerialIter& sit, SField const& f, int depth) : STBase(f) { + TRACE_FUNC(); while (!sit.empty()) { int type = 0, field = 0; @@ -80,18 +85,21 @@ STArray::STArray(SerialIter& sit, SField const& f, int depth) : STBase(f) STBase* STArray::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STArray::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } std::string STArray::getFullText() const { + TRACE_FUNC(); std::string r = "["; bool first = true; @@ -111,6 +119,7 @@ STArray::getFullText() const std::string STArray::getText() const { + TRACE_FUNC(); std::string r = "["; bool first = true; @@ -130,6 +139,7 @@ STArray::getText() const json::Value STArray::getJson(JsonOptions p) const { + TRACE_FUNC(); json::Value v = json::ArrayValue; for (auto const& object : v_) { @@ -145,6 +155,7 @@ STArray::getJson(JsonOptions p) const void STArray::add(Serializer& s) const { + TRACE_FUNC(); for (STObject const& object : v_) { object.addFieldID(s); @@ -156,12 +167,14 @@ STArray::add(Serializer& s) const SerializedTypeID STArray::getSType() const { + TRACE_FUNC(); return STI_ARRAY; } bool STArray::isEquivalent(STBase const& t) const { + TRACE_FUNC(); auto v = dynamic_cast(&t); return v != nullptr && v_ == v->v_; } @@ -169,12 +182,14 @@ STArray::isEquivalent(STBase const& t) const bool STArray::isDefault() const { + TRACE_FUNC(); return v_.empty(); } void STArray::sort(bool (*compare)(STObject const&, STObject const&)) { + TRACE_FUNC(); std::ranges::sort(v_, compare); } diff --git a/src/libxrpl/protocol/STBase.cpp b/src/libxrpl/protocol/STBase.cpp index ec6131482f..c14d9c304b 100644 --- a/src/libxrpl/protocol/STBase.cpp +++ b/src/libxrpl/protocol/STBase.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -18,12 +19,14 @@ STBase::STBase() : fName_(&kSF_GENERIC) STBase::STBase(SField const& n) : fName_(&n) { + TRACE_FUNC(); XRPL_ASSERT(fName_, "xrpl::STBase::STBase : field is set"); } STBase& STBase::operator=(STBase const& t) { + TRACE_FUNC(); if (this == &t) return *this; @@ -35,36 +38,42 @@ STBase::operator=(STBase const& t) bool STBase::operator==(STBase const& t) const { + TRACE_FUNC(); return (getSType() == t.getSType()) && isEquivalent(t); } bool STBase::operator!=(STBase const& t) const { + TRACE_FUNC(); return (getSType() != t.getSType()) || !isEquivalent(t); } STBase* STBase::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STBase::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } SerializedTypeID STBase::getSType() const { + TRACE_FUNC(); return STI_NOTPRESENT; } std::string STBase::getFullText() const { + TRACE_FUNC(); std::string ret; if (getSType() != STI_NOTPRESENT) @@ -84,18 +93,21 @@ STBase::getFullText() const std::string STBase::getText() const { + TRACE_FUNC(); return std::string(); } json::Value STBase::getJson(JsonOptions /*options*/) const { + TRACE_FUNC(); return getText(); } void STBase::add(Serializer& s) const { + TRACE_FUNC(); // Should never be called // LCOV_EXCL_START UNREACHABLE("xrpl::STBase::add : not implemented"); @@ -105,6 +117,7 @@ STBase::add(Serializer& s) const bool STBase::isEquivalent(STBase const& t) const { + TRACE_FUNC(); XRPL_ASSERT(getSType() == STI_NOTPRESENT, "xrpl::STBase::isEquivalent : type not present"); return t.getSType() == STI_NOTPRESENT; } @@ -112,12 +125,14 @@ STBase::isEquivalent(STBase const& t) const bool STBase::isDefault() const { + TRACE_FUNC(); return true; } void STBase::setFName(SField const& n) { + TRACE_FUNC(); fName_ = &n; XRPL_ASSERT(fName_, "xrpl::STBase::setFName : field is set"); } @@ -125,12 +140,14 @@ STBase::setFName(SField const& n) SField const& STBase::getFName() const { + TRACE_FUNC(); return *fName_; } void STBase::addFieldID(Serializer& s) const { + TRACE_FUNC(); XRPL_ASSERT(fName_->isBinary(), "xrpl::STBase::addFieldID : field is binary"); s.addFieldID(fName_->fieldType, fName_->fieldValue); } @@ -140,6 +157,7 @@ STBase::addFieldID(Serializer& s) const std::ostream& operator<<(std::ostream& out, STBase const& t) { + TRACE_FUNC(); return out << t.getFullText(); } diff --git a/src/libxrpl/protocol/STBlob.cpp b/src/libxrpl/protocol/STBlob.cpp index 3f44c9b529..7ebdfc6600 100644 --- a/src/libxrpl/protocol/STBlob.cpp +++ b/src/libxrpl/protocol/STBlob.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -19,30 +20,35 @@ STBlob::STBlob(SerialIter& st, SField const& name) : STBase(name), value_(st.get STBase* STBlob::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STBlob::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } SerializedTypeID STBlob::getSType() const { + TRACE_FUNC(); return STI_VL; } std::string STBlob::getText() const { + TRACE_FUNC(); return strHex(value_); } void STBlob::add(Serializer& s) const { + TRACE_FUNC(); XRPL_ASSERT(getFName().isBinary(), "xrpl::STBlob::add : field is binary"); XRPL_ASSERT( (getFName().fieldType == STI_VL) || (getFName().fieldType == STI_ACCOUNT), @@ -53,6 +59,7 @@ STBlob::add(Serializer& s) const bool STBlob::isEquivalent(STBase const& t) const { + TRACE_FUNC(); STBlob const* v = dynamic_cast(&t); return (v != nullptr) && (value_ == v->value_); } @@ -60,6 +67,7 @@ STBlob::isEquivalent(STBase const& t) const bool STBlob::isDefault() const { + TRACE_FUNC(); return value_.empty(); } diff --git a/src/libxrpl/protocol/STCurrency.cpp b/src/libxrpl/protocol/STCurrency.cpp index 9b761864d9..d97a258141 100644 --- a/src/libxrpl/protocol/STCurrency.cpp +++ b/src/libxrpl/protocol/STCurrency.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -32,30 +33,35 @@ STCurrency::STCurrency(SField const& name, Currency const& currency) SerializedTypeID STCurrency::getSType() const { + TRACE_FUNC(); return STI_CURRENCY; } std::string STCurrency::getText() const { + TRACE_FUNC(); return to_string(currency_); } json::Value STCurrency::getJson(JsonOptions) const { + TRACE_FUNC(); return to_string(currency_); } void STCurrency::add(Serializer& s) const { + TRACE_FUNC(); s.addBitString(currency_); } bool STCurrency::isEquivalent(STBase const& t) const { + TRACE_FUNC(); STCurrency const* v = dynamic_cast(&t); return (v != nullptr) && (*v == *this); } @@ -63,30 +69,35 @@ STCurrency::isEquivalent(STBase const& t) const bool STCurrency::isDefault() const { + TRACE_FUNC(); return isXRP(currency_); } std::unique_ptr STCurrency::construct(SerialIter& sit, SField const& name) { + TRACE_FUNC(); return std::make_unique(sit, name); } STBase* STCurrency::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STCurrency::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } STCurrency currencyFromJson(SField const& name, json::Value const& v) { + TRACE_FUNC(); if (!v.isString()) { Throw("currencyFromJson currency must be a string Json value"); diff --git a/src/libxrpl/protocol/STInteger.cpp b/src/libxrpl/protocol/STInteger.cpp index d17dd49fe5..8a4c7e7446 100644 --- a/src/libxrpl/protocol/STInteger.cpp +++ b/src/libxrpl/protocol/STInteger.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,7 @@ template <> SerializedTypeID STUInt8::getSType() const { + TRACE_FUNC(); return STI_UINT8; } @@ -37,6 +39,7 @@ template <> std::string STUInt8::getText() const { + TRACE_FUNC(); if (getFName() == sfTransactionResult) { std::string token, human; @@ -56,6 +59,7 @@ template <> json::Value STUInt8::getJson(JsonOptions) const { + TRACE_FUNC(); if (getFName() == sfTransactionResult) { std::string token, human; @@ -83,6 +87,7 @@ template <> SerializedTypeID STUInt16::getSType() const { + TRACE_FUNC(); return STI_UINT16; } @@ -90,6 +95,7 @@ template <> std::string STUInt16::getText() const { + TRACE_FUNC(); if (getFName() == sfLedgerEntryType) { auto item = LedgerFormats::getInstance().findByType(safeCast(value_)); @@ -113,6 +119,7 @@ template <> json::Value STUInt16::getJson(JsonOptions) const { + TRACE_FUNC(); if (getFName() == sfLedgerEntryType) { auto item = LedgerFormats::getInstance().findByType(safeCast(value_)); @@ -144,6 +151,7 @@ template <> SerializedTypeID STUInt32::getSType() const { + TRACE_FUNC(); return STI_UINT32; } @@ -151,6 +159,7 @@ template <> std::string STUInt32::getText() const { + TRACE_FUNC(); if (getFName() == sfPermissionValue) { auto const permissionName = Permission::getInstance().getPermissionName(value_); @@ -164,6 +173,7 @@ template <> json::Value STUInt32::getJson(JsonOptions) const { + TRACE_FUNC(); if (getFName() == sfPermissionValue) { auto const permissionName = Permission::getInstance().getPermissionName(value_); @@ -186,6 +196,7 @@ template <> SerializedTypeID STUInt64::getSType() const { + TRACE_FUNC(); return STI_UINT64; } @@ -193,6 +204,7 @@ template <> std::string STUInt64::getText() const { + TRACE_FUNC(); return std::to_string(value_); } @@ -200,6 +212,7 @@ template <> json::Value STUInt64::getJson(JsonOptions) const { + TRACE_FUNC(); auto convertToString = [](uint64_t const value, int const base) { XRPL_ASSERT(base == 10 || base == 16, "xrpl::STUInt64::getJson : base 10 or 16"); std::string str(base == 10 ? 20 : 16, 0); // Allocate space depending on base @@ -229,6 +242,7 @@ template <> SerializedTypeID STInt32::getSType() const { + TRACE_FUNC(); return STI_INT32; } @@ -236,6 +250,7 @@ template <> std::string STInt32::getText() const { + TRACE_FUNC(); return std::to_string(value_); } @@ -243,6 +258,7 @@ template <> json::Value STInt32::getJson(JsonOptions) const { + TRACE_FUNC(); return value_; } diff --git a/src/libxrpl/protocol/STIssue.cpp b/src/libxrpl/protocol/STIssue.cpp index c0019c334f..6915b07056 100644 --- a/src/libxrpl/protocol/STIssue.cpp +++ b/src/libxrpl/protocol/STIssue.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -69,18 +70,21 @@ STIssue::STIssue(SerialIter& sit, SField const& name) : STBase{name} SerializedTypeID STIssue::getSType() const { + TRACE_FUNC(); return STI_ISSUE; } std::string STIssue::getText() const { + TRACE_FUNC(); return asset_.getText(); } json::Value STIssue::getJson(JsonOptions) const { + TRACE_FUNC(); json::Value jv; asset_.setJson(jv); return jv; @@ -89,6 +93,7 @@ STIssue::getJson(JsonOptions) const void STIssue::add(Serializer& s) const { + TRACE_FUNC(); asset_.visit( [&](Issue const& issue) { s.addBitString(issue.currency); @@ -107,6 +112,7 @@ STIssue::add(Serializer& s) const bool STIssue::isEquivalent(STBase const& t) const { + TRACE_FUNC(); STIssue const* v = dynamic_cast(&t); return (v != nullptr) && (*v == *this); } @@ -114,6 +120,7 @@ STIssue::isEquivalent(STBase const& t) const bool STIssue::isDefault() const { + TRACE_FUNC(); return asset_.visit( [](Issue const& issue) { return issue == xrpIssue(); }, [](MPTIssue const&) { return false; }); @@ -122,18 +129,21 @@ STIssue::isDefault() const STBase* STIssue::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STIssue::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } STIssue issueFromJson(SField const& name, json::Value const& v) { + TRACE_FUNC(); return STIssue{name, assetFromJson(v)}; } diff --git a/src/libxrpl/protocol/STLedgerEntry.cpp b/src/libxrpl/protocol/STLedgerEntry.cpp index 8bec23d319..b58f46ffef 100644 --- a/src/libxrpl/protocol/STLedgerEntry.cpp +++ b/src/libxrpl/protocol/STLedgerEntry.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -32,6 +33,7 @@ namespace xrpl { STLedgerEntry::STLedgerEntry(Keylet const& k) : STObject(sfLedgerEntry), key_(k.key), type_(k.type) { + TRACE_FUNC(); auto const format = LedgerFormats::getInstance().findByType(type_); if (format == nullptr) @@ -49,6 +51,7 @@ STLedgerEntry::STLedgerEntry(Keylet const& k) : STObject(sfLedgerEntry), key_(k. STLedgerEntry::STLedgerEntry(SerialIter& sit, uint256 const& index) : STObject(sfLedgerEntry), key_(index), type_(ltANY) { + TRACE_FUNC(); set(sit); setSLEType(); } @@ -56,12 +59,14 @@ STLedgerEntry::STLedgerEntry(SerialIter& sit, uint256 const& index) STLedgerEntry::STLedgerEntry(STObject const& object, uint256 const& index) : STObject(object), key_(index), type_(ltANY) { + TRACE_FUNC(); setSLEType(); } void STLedgerEntry::setSLEType() { + TRACE_FUNC(); auto format = LedgerFormats::getInstance().findByType( safeCast(getFieldU16(sfLedgerEntryType))); @@ -75,6 +80,7 @@ STLedgerEntry::setSLEType() std::string STLedgerEntry::getFullText() const { + TRACE_FUNC(); auto const format = LedgerFormats::getInstance().findByType(type_); if (format == nullptr) @@ -93,30 +99,35 @@ STLedgerEntry::getFullText() const STBase* STLedgerEntry::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STLedgerEntry::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } SerializedTypeID STLedgerEntry::getSType() const { + TRACE_FUNC(); return STI_LEDGERENTRY; } std::string STLedgerEntry::getText() const { + TRACE_FUNC(); return str(boost::format("{ %s, %s }") % to_string(key_) % STObject::getText()); } json::Value STLedgerEntry::getJson(JsonOptions options) const { + TRACE_FUNC(); json::Value ret(STObject::getJson(options)); ret[jss::index] = to_string(key_); @@ -133,6 +144,7 @@ STLedgerEntry::getJson(JsonOptions options) const bool STLedgerEntry::isThreadedType(Rules const& rules) const { + TRACE_FUNC(); static constexpr std::array kNEW_PREVIOUS_TXN_ID_TYPES = { ltDIR_NODE, ltAMENDMENTS, ltFEE_SETTINGS, ltNEGATIVE_UNL, ltAMM}; // Exclude PrevTxnID/PrevTxnLgrSeq if the fixPreviousTxnID amendment is not @@ -150,6 +162,7 @@ STLedgerEntry::thread( uint256& prevTxID, std::uint32_t& prevLedgerID) { + TRACE_FUNC(); uint256 const oldPrevTxID = getFieldH256(sfPreviousTxnID); JLOG(debugLog().info()) << "Thread Tx:" << txID << " prev:" << oldPrevTxID; diff --git a/src/libxrpl/protocol/STNumber.cpp b/src/libxrpl/protocol/STNumber.cpp index f6481a4d5d..0b7ed84faa 100644 --- a/src/libxrpl/protocol/STNumber.cpp +++ b/src/libxrpl/protocol/STNumber.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -33,6 +34,7 @@ STNumber::STNumber(SField const& field, Number const& value) : STTakesAsset(fiel STNumber::STNumber(SerialIter& sit, SField const& field) : STTakesAsset(field) { + TRACE_FUNC(); // We must call these methods in separate statements // to guarantee their order of execution. auto mantissa = sit.geti64(); @@ -43,18 +45,21 @@ STNumber::STNumber(SerialIter& sit, SField const& field) : STTakesAsset(field) SerializedTypeID STNumber::getSType() const { + TRACE_FUNC(); return STI_NUMBER; } std::string STNumber::getText() const { + TRACE_FUNC(); return to_string(value_); } void STNumber::associateAsset(Asset const& a) { + TRACE_FUNC(); STTakesAsset::associateAsset(a); XRPL_ASSERT_PARTS( @@ -68,6 +73,7 @@ STNumber::associateAsset(Asset const& a) void STNumber::add(Serializer& s) const { + TRACE_FUNC(); XRPL_ASSERT(getFName().isBinary(), "xrpl::STNumber::add : field is binary"); XRPL_ASSERT(getFName().fieldType == getSType(), "xrpl::STNumber::add : field type match"); @@ -115,30 +121,35 @@ STNumber::add(Serializer& s) const Number const& STNumber::value() const { + TRACE_FUNC(); return value_; } void STNumber::setValue(Number const& v) { + TRACE_FUNC(); value_ = v; } STBase* STNumber::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STNumber::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } bool STNumber::isEquivalent(STBase const& t) const { + TRACE_FUNC(); XRPL_ASSERT( t.getSType() == this->getSType(), "xrpl::STNumber::isEquivalent : field type match"); STNumber const& v = dynamic_cast(t); @@ -148,18 +159,21 @@ STNumber::isEquivalent(STBase const& t) const bool STNumber::isDefault() const { + TRACE_FUNC(); return value_ == Number(); } std::ostream& operator<<(std::ostream& out, STNumber const& rhs) { + TRACE_FUNC(); return out << rhs.getText(); } NumberParts partsFromString(std::string const& number) { + TRACE_FUNC(); static boost::regex const kRE_NUMBER( "^" // the beginning of the string "([-+]?)" // (optional) + or - character @@ -220,6 +234,7 @@ partsFromString(std::string const& number) STNumber numberFromJson(SField const& field, json::Value const& value) { + TRACE_FUNC(); NumberParts parts; if (value.isInt()) diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index 6bce2f0ab2..ca626de517 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -53,11 +54,13 @@ STObject::STObject(SField const& name) : STBase(name) STObject::STObject(SOTemplate const& type, SField const& name) : STBase(name) { + TRACE_FUNC(); set(type); } STObject::STObject(SOTemplate const& type, SerialIter& sit, SField const& name) : STBase(name) { + TRACE_FUNC(); v_.reserve(type.size()); set(sit); applyTemplate(type); // May throw @@ -65,6 +68,7 @@ STObject::STObject(SOTemplate const& type, SerialIter& sit, SField const& name) STObject::STObject(SerialIter& sit, SField const& name, int depth) noexcept(false) : STBase(name) { + TRACE_FUNC(); if (depth > 10) Throw("Maximum nesting depth of STObject exceeded"); set(sit, depth); @@ -73,6 +77,7 @@ STObject::STObject(SerialIter& sit, SField const& name, int depth) noexcept(fals STObject STObject::makeInnerObject(SField const& name) { + TRACE_FUNC(); STObject obj{name}; // The if is complicated because inner object templates were added in @@ -95,36 +100,42 @@ STObject::makeInnerObject(SField const& name) STBase* STObject::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STObject::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } SerializedTypeID STObject::getSType() const { + TRACE_FUNC(); return STI_OBJECT; } bool STObject::isDefault() const { + TRACE_FUNC(); return v_.empty(); } void STObject::add(Serializer& s) const { + TRACE_FUNC(); add(s, WhichFields::WithAllFields); // just inner elements } STObject& STObject::operator=(STObject&& other) { + TRACE_FUNC(); setFName(other.getFName()); type_ = other.type_; v_ = std::move(other.v_); @@ -134,6 +145,7 @@ STObject::operator=(STObject&& other) void STObject::set(SOTemplate const& type) { + TRACE_FUNC(); v_.clear(); v_.reserve(type.size()); type_ = &type; @@ -154,6 +166,7 @@ STObject::set(SOTemplate const& type) void STObject::applyTemplate(SOTemplate const& type) { + TRACE_FUNC(); auto throwFieldErr = [](std::string const& field, char const* description) { std::stringstream ss; ss << "Field '" << field << "' " << description; @@ -203,6 +216,7 @@ STObject::applyTemplate(SOTemplate const& type) void STObject::applyTemplateFromSField(SField const& sField) { + TRACE_FUNC(); SOTemplate const* elements = InnerObjectFormats::getInstance().findSOTemplateBySField(sField); if (elements != nullptr) applyTemplate(*elements); // May throw @@ -212,6 +226,7 @@ STObject::applyTemplateFromSField(SField const& sField) bool STObject::set(SerialIter& sit, int depth) { + TRACE_FUNC(); bool reachedEndOfObject = false; v_.clear(); @@ -273,6 +288,7 @@ STObject::set(SerialIter& sit, int depth) bool STObject::hasMatchingEntry(STBase const& t) const { + TRACE_FUNC(); STBase const* o = peekAtPField(t.getFName()); if (o == nullptr) @@ -284,6 +300,7 @@ STObject::hasMatchingEntry(STBase const& t) const std::string STObject::getFullText() const { + TRACE_FUNC(); std::string ret; bool first = true; diff --git a/src/libxrpl/protocol/STParsedJSON.cpp b/src/libxrpl/protocol/STParsedJSON.cpp index f6ebde4e52..29a2bc3b9e 100644 --- a/src/libxrpl/protocol/STParsedJSON.cpp +++ b/src/libxrpl/protocol/STParsedJSON.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -71,6 +72,7 @@ toUnsigned(U2 value) static inline std::string makeName(std::string const& object, std::string const& field) { + TRACE_FUNC(); if (field.empty()) return object; @@ -80,6 +82,7 @@ makeName(std::string const& object, std::string const& field) static inline json::Value notAnObject(std::string const& object, std::string const& field) { + TRACE_FUNC(); return RPC::makeError( RpcInvalidParams, "Field '" + makeName(object, field) + "' is not a JSON object."); } @@ -87,24 +90,28 @@ notAnObject(std::string const& object, std::string const& field) static inline json::Value notAnObject(std::string const& object) { + TRACE_FUNC(); return notAnObject(object, ""); } static inline json::Value notAnArray(std::string const& object) { + TRACE_FUNC(); return RPC::makeError(RpcInvalidParams, "Field '" + object + "' is not a JSON array."); } static inline json::Value unknownField(std::string const& object, std::string const& field) { + TRACE_FUNC(); return RPC::makeError(RpcInvalidParams, "Field '" + makeName(object, field) + "' is unknown."); } static inline json::Value outOfRange(std::string const& object, std::string const& field) { + TRACE_FUNC(); return RPC::makeError( RpcInvalidParams, "Field '" + makeName(object, field) + "' is out of range."); } @@ -112,6 +119,7 @@ outOfRange(std::string const& object, std::string const& field) static inline json::Value badType(std::string const& object, std::string const& field) { + TRACE_FUNC(); return RPC::makeError( RpcInvalidParams, "Field '" + makeName(object, field) + "' has bad type."); } @@ -119,6 +127,7 @@ badType(std::string const& object, std::string const& field) static inline json::Value invalidData(std::string const& object, std::string const& field) { + TRACE_FUNC(); return RPC::makeError( RpcInvalidParams, "Field '" + makeName(object, field) + "' has invalid data."); } @@ -126,12 +135,14 @@ invalidData(std::string const& object, std::string const& field) static inline json::Value invalidData(std::string const& object) { + TRACE_FUNC(); return invalidData(object, ""); } static inline json::Value arrayExpected(std::string const& object, std::string const& field) { + TRACE_FUNC(); return RPC::makeError( RpcInvalidParams, "Field '" + makeName(object, field) + "' must be a JSON array."); } @@ -139,6 +150,7 @@ arrayExpected(std::string const& object, std::string const& field) static inline json::Value stringExpected(std::string const& object, std::string const& field) { + TRACE_FUNC(); return RPC::makeError( RpcInvalidParams, "Field '" + makeName(object, field) + "' must be a string."); } @@ -146,12 +158,14 @@ stringExpected(std::string const& object, std::string const& field) static inline json::Value tooDeep(std::string const& object) { + TRACE_FUNC(); return RPC::makeError(RpcInvalidParams, "Field '" + object + "' exceeds nesting depth limit."); } static inline json::Value singletonExpected(std::string const& object, unsigned int index) { + TRACE_FUNC(); return RPC::makeError( RpcInvalidParams, "Field '" + object + "[" + std::to_string(index) + @@ -161,6 +175,7 @@ singletonExpected(std::string const& object, unsigned int index) static inline json::Value templateMismatch(SField const& sField) { + TRACE_FUNC(); return RPC::makeError( RpcInvalidParams, "Object '" + sField.getName() + "' contents did not meet requirements for that type."); @@ -169,6 +184,7 @@ templateMismatch(SField const& sField) static inline json::Value nonObjectInArray(std::string const& item, json::UInt index) { + TRACE_FUNC(); return RPC::makeError( RpcInvalidParams, "Item '" + item + "' at index " + std::to_string(index) + @@ -186,6 +202,7 @@ parseUnsigned( json::Value const& value, json::Value& error) { + TRACE_FUNC(); std::optional ret; try @@ -232,6 +249,7 @@ parseUint16( json::Value const& value, json::Value& error) { + TRACE_FUNC(); std::optional ret; try @@ -293,6 +311,7 @@ parseUint32( json::Value const& value, json::Value& error) { + TRACE_FUNC(); std::optional ret; try @@ -347,6 +366,7 @@ parseLeaf( json::Value const& value, json::Value& error) { + TRACE_FUNC(); std::optional ret; auto const& field = SField::getField(fieldName); @@ -965,6 +985,7 @@ parseObject( int depth, json::Value& error) { + TRACE_FUNC(); if (!json.isObjectOrNull()) { error = notAnObject(jsonName); @@ -1079,6 +1100,7 @@ parseArray( int depth, json::Value& error) { + TRACE_FUNC(); if (!json.isArrayOrNull()) { error = notAnArray(jsonName); @@ -1158,6 +1180,7 @@ parseArray( STParsedJSONObject::STParsedJSONObject(std::string const& name, json::Value const& json) { + TRACE_FUNC(); using namespace STParsedJSONDetail; object = parseObject(name, json, kSF_GENERIC, 0, error); } diff --git a/src/libxrpl/protocol/STPathSet.cpp b/src/libxrpl/protocol/STPathSet.cpp index 8c4b139792..ed9beff1fc 100644 --- a/src/libxrpl/protocol/STPathSet.cpp +++ b/src/libxrpl/protocol/STPathSet.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,7 @@ namespace xrpl { std::size_t STPathElement::getHash(STPathElement const& element) { + TRACE_FUNC(); std::size_t hashAccount = 2654435761; std::size_t hashCurrency = 2654435761; std::size_t hashIssuer = 2654435761; @@ -52,6 +54,7 @@ STPathElement::getHash(STPathElement const& element) STPathSet::STPathSet(SerialIter& sit, SField const& name) : STBase(name) { + TRACE_FUNC(); std::vector path; for (;;) { @@ -109,12 +112,14 @@ STPathSet::STPathSet(SerialIter& sit, SField const& name) : STBase(name) STBase* STPathSet::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STPathSet::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } @@ -142,6 +147,7 @@ STPathSet::assembleAdd(STPath const& base, STPathElement const& tail) bool STPathSet::isEquivalent(STBase const& t) const { + TRACE_FUNC(); STPathSet const* v = dynamic_cast(&t); return (v != nullptr) && (value_ == v->value_); } @@ -149,12 +155,14 @@ STPathSet::isEquivalent(STBase const& t) const bool STPathSet::isDefault() const { + TRACE_FUNC(); return value_.empty(); } bool STPath::hasSeen(AccountID const& account, PathAsset const& asset, AccountID const& issuer) const { + TRACE_FUNC(); for (auto& p : path_) { if (p.getAccountID() == account && p.getPathAsset() == asset && p.getIssuerID() == issuer) @@ -167,6 +175,7 @@ STPath::hasSeen(AccountID const& account, PathAsset const& asset, AccountID cons json::Value STPath::getJson(JsonOptions) const { + TRACE_FUNC(); json::Value ret(json::ArrayValue); for (auto const& it : path_) @@ -201,6 +210,7 @@ STPath::getJson(JsonOptions) const json::Value STPathSet::getJson(JsonOptions options) const { + TRACE_FUNC(); json::Value ret(json::ArrayValue); for (auto const& it : value_) ret.append(it.getJson(options)); @@ -211,12 +221,14 @@ STPathSet::getJson(JsonOptions options) const SerializedTypeID STPathSet::getSType() const { + TRACE_FUNC(); return STI_PATHSET; } void STPathSet::add(Serializer& s) const { + TRACE_FUNC(); XRPL_ASSERT(getFName().isBinary(), "xrpl::STPathSet::add : field is binary"); XRPL_ASSERT(getFName().fieldType == STI_PATHSET, "xrpl::STPathSet::add : valid field type"); bool first = true; diff --git a/src/libxrpl/protocol/STTakesAsset.cpp b/src/libxrpl/protocol/STTakesAsset.cpp index de7de002b0..45d4513d69 100644 --- a/src/libxrpl/protocol/STTakesAsset.cpp +++ b/src/libxrpl/protocol/STTakesAsset.cpp @@ -6,12 +6,14 @@ #include #include #include +#include namespace xrpl { void associateAsset(SLE& sle, Asset const& asset) { + TRACE_FUNC(); // Iterating by offset is the only way to get non-const references for (int i = 0; i < sle.getCount(); ++i) { diff --git a/src/libxrpl/protocol/STTx.cpp b/src/libxrpl/protocol/STTx.cpp index d335988ac3..c1296760e6 100644 --- a/src/libxrpl/protocol/STTx.cpp +++ b/src/libxrpl/protocol/STTx.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -55,6 +56,7 @@ namespace xrpl { static auto getTxFormat(TxType type) { + TRACE_FUNC(); auto format = TxFormats::getInstance().findByType(type); if (format == nullptr) @@ -69,6 +71,7 @@ getTxFormat(TxType type) STTx::STTx(STObject&& object) : STObject(std::move(object)) { + TRACE_FUNC(); tx_type_ = safeCast(getFieldU16(sfTransactionType)); applyTemplate(getTxFormat(tx_type_)->getSOTemplate()); // may throw tid_ = getHash(HashPrefix::TransactionId); @@ -76,6 +79,7 @@ STTx::STTx(STObject&& object) : STObject(std::move(object)) STTx::STTx(SerialIter& sit) : STObject(sfTransaction) { + TRACE_FUNC(); int const length = sit.getBytesLeft(); if ((length < kTX_MIN_SIZE_BYTES) || (length > kTX_MAX_SIZE_BYTES)) @@ -92,6 +96,7 @@ STTx::STTx(SerialIter& sit) : STObject(sfTransaction) STTx::STTx(TxType type, std::function assembler) : STObject(sfTransaction) { + TRACE_FUNC(); auto format = getTxFormat(type); set(format->getSOTemplate()); @@ -110,12 +115,14 @@ STTx::STTx(TxType type, std::function assembler) : STObject(sfT STBase* STTx::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STTx::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } @@ -123,12 +130,14 @@ STTx::move(std::size_t n, void* buf) SerializedTypeID STTx::getSType() const { + TRACE_FUNC(); return STI_TRANSACTION; } std::string STTx::getFullText() const { + TRACE_FUNC(); std::string ret = "\""; ret += to_string(getTransactionID()); ret += "\" = {"; @@ -140,6 +149,7 @@ STTx::getFullText() const boost::container::flat_set STTx::getMentionedAccounts() const { + TRACE_FUNC(); boost::container::flat_set list; for (auto const& it : *this) @@ -164,6 +174,7 @@ STTx::getMentionedAccounts() const static Blob getSigningData(STTx const& that) { + TRACE_FUNC(); Serializer s; s.add32(HashPrefix::TxSign); that.addWithoutSigningFields(s); @@ -173,12 +184,14 @@ getSigningData(STTx const& that) uint256 STTx::getSigningHash() const { + TRACE_FUNC(); return STObject::getSigningHash(HashPrefix::TxSign); } Blob STTx::getSignature(STObject const& sigObject) { + TRACE_FUNC(); try { return sigObject.getFieldVL(sfTxnSignature); @@ -192,6 +205,7 @@ STTx::getSignature(STObject const& sigObject) SeqProxy STTx::getSeqProxy() const { + TRACE_FUNC(); std::uint32_t const seq{getFieldU32(sfSequence)}; if (seq != 0) return SeqProxy::sequence(seq); @@ -209,12 +223,14 @@ STTx::getSeqProxy() const std::uint32_t STTx::getSeqValue() const { + TRACE_FUNC(); return getSeqProxy().value(); } AccountID STTx::getFeePayer() const { + TRACE_FUNC(); // If sfDelegate is present, the delegate account is the payer // note: if a delegate is specified, its authorization to act on behalf of the account is // enforced in `Transactor::checkPermission` @@ -232,6 +248,7 @@ STTx::sign( SecretKey const& secretKey, std::optional> signatureTarget) { + TRACE_FUNC(); auto const data = getSigningData(*this); auto const sig = xrpl::sign(publicKey, secretKey, makeSlice(data)); @@ -251,6 +268,7 @@ STTx::sign( Expected STTx::checkSign(Rules const& rules, STObject const& sigObject) const { + TRACE_FUNC(); try { // Determine whether we're single- or multi-signing by looking @@ -270,6 +288,7 @@ STTx::checkSign(Rules const& rules, STObject const& sigObject) const Expected STTx::checkSign(Rules const& rules) const { + TRACE_FUNC(); if (auto const ret = checkSign(rules, *this); !ret) return ret; @@ -285,6 +304,7 @@ STTx::checkSign(Rules const& rules) const Expected STTx::checkBatchSign(Rules const& rules) const { + TRACE_FUNC(); try { XRPL_ASSERT(getTxnType() == ttBATCH, "STTx::checkBatchSign : not a batch transaction"); @@ -315,6 +335,7 @@ STTx::checkBatchSign(Rules const& rules) const json::Value STTx::getJson(JsonOptions options) const { + TRACE_FUNC(); json::Value ret = STObject::getJson(JsonOptions::KNone); if (!(options & JsonOptions::KDisableApiPriorV2)) ret[jss::hash] = to_string(getTransactionID()); @@ -324,6 +345,7 @@ STTx::getJson(JsonOptions options) const json::Value STTx::getJson(JsonOptions options, bool binary) const { + TRACE_FUNC(); bool const v1 = !(options & JsonOptions::KDisableApiPriorV2); if (binary) @@ -352,6 +374,7 @@ STTx::getJson(JsonOptions options, bool binary) const std::string const& STTx::getMetaSQLInsertReplaceHeader() { + TRACE_FUNC(); static std::string const kSQL = "INSERT OR REPLACE INTO Transactions " "(TransID, TransType, FromAcct, FromSeq, LedgerSeq, Status, RawTxn, " @@ -364,6 +387,7 @@ STTx::getMetaSQLInsertReplaceHeader() std::string STTx::getMetaSQL(std::uint32_t inLedger, std::string const& escapedMetaData) const { + TRACE_FUNC(); Serializer s; add(s); return getMetaSQL(s, inLedger, TxnSql::Validated, escapedMetaData); @@ -377,6 +401,7 @@ STTx::getMetaSQL( TxnSql status, std::string const& escapedMetaData) const { + TRACE_FUNC(); static boost::format const kBF_TRANS("('%s', '%s', '%s', '%d', '%d', '%c', %s, %s)"); std::string rTxn = sqlBlobLiteral(rawTxn.peekData()); @@ -392,6 +417,7 @@ STTx::getMetaSQL( static Expected singleSignHelper(STObject const& sigObject, Slice const& data) { + TRACE_FUNC(); // We don't allow both a non-empty sfSigningPubKey and an sfSigners. // That would allow the transaction to be signed two ways. So if both // fields are present the signature is invalid. @@ -422,6 +448,7 @@ singleSignHelper(STObject const& sigObject, Slice const& data) Expected STTx::checkSingleSign(STObject const& sigObject) const { + TRACE_FUNC(); auto const data = getSigningData(*this); return singleSignHelper(sigObject, makeSlice(data)); } @@ -429,6 +456,7 @@ STTx::checkSingleSign(STObject const& sigObject) const Expected STTx::checkBatchSingleSign(STObject const& batchSigner) const { + TRACE_FUNC(); Serializer msg; serializeBatch(msg, getFlags(), getBatchTransactionIDs()); return singleSignHelper(batchSigner, msg.slice()); @@ -441,6 +469,7 @@ multiSignHelper( std::function makeMsg, Rules const& rules) { + TRACE_FUNC(); // Make sure the MultiSigners are present. Otherwise they are not // attempting multi-signing and we just have a bad SigningPubKey. if (!sigObject.isFieldPresent(sfSigners)) @@ -514,6 +543,7 @@ multiSignHelper( Expected STTx::checkBatchMultiSign(STObject const& batchSigner, Rules const& rules) const { + TRACE_FUNC(); // We can ease the computational load inside the loop a bit by // pre-constructing part of the data that we hash. Fill a Serializer // with the stuff that stays constant from signature to signature. @@ -533,6 +563,7 @@ STTx::checkBatchMultiSign(STObject const& batchSigner, Rules const& rules) const Expected STTx::checkMultiSign(Rules const& rules, STObject const& sigObject) const { + TRACE_FUNC(); // Used inside the loop in multiSignHelper to enforce that // the account owner may not multisign for themselves. auto const txnAccountID = @@ -571,6 +602,7 @@ STTx::checkMultiSign(Rules const& rules, STObject const& sigObject) const std::vector const& STTx::getBatchTransactionIDs() const { + TRACE_FUNC(); XRPL_ASSERT(getTxnType() == ttBATCH, "STTx::getBatchTransactionIDs : not a batch transaction"); XRPL_ASSERT( !getFieldArray(sfRawTransactions).empty(), @@ -596,6 +628,7 @@ STTx::getBatchTransactionIDs() const static bool isMemoOkay(STObject const& st, std::string& reason) { + TRACE_FUNC(); if (!st.isFieldPresent(sfMemos)) return true; @@ -687,6 +720,7 @@ isMemoOkay(STObject const& st, std::string& reason) static bool isAccountFieldOkay(STObject const& st) { + TRACE_FUNC(); for (int i = 0; i < st.getCount(); ++i) { auto t = dynamic_cast(st.peekAtPIndex(i)); @@ -700,6 +734,7 @@ isAccountFieldOkay(STObject const& st) static bool invalidMPTAmountInTx(STObject const& tx) { + TRACE_FUNC(); auto const txType = tx[~sfTransactionType]; if (!txType) return false; @@ -727,6 +762,7 @@ invalidMPTAmountInTx(STObject const& tx) static bool isRawTransactionOkay(STObject const& st, std::string& reason) { + TRACE_FUNC(); if (!st.isFieldPresent(sfRawTransactions)) return true; @@ -768,6 +804,7 @@ isRawTransactionOkay(STObject const& st, std::string& reason) bool passesLocalChecks(STObject const& st, std::string& reason) { + TRACE_FUNC(); if (!isMemoOkay(st, reason)) return false; @@ -798,6 +835,7 @@ passesLocalChecks(STObject const& st, std::string& reason) std::shared_ptr sterilize(STTx const& stx) { + TRACE_FUNC(); Serializer s; stx.add(s); SerialIter sit(s.slice()); @@ -807,6 +845,7 @@ sterilize(STTx const& stx) bool isPseudoTx(STObject const& tx) { + TRACE_FUNC(); auto const t = tx[~sfTransactionType]; if (!t) diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index dd4b8a0fee..de70636f9d 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -22,18 +23,21 @@ namespace xrpl { STBase* STValidation::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STValidation::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } SOTemplate const& STValidation::validationFormat() { + TRACE_FUNC(); // We can't have this be a magic static at namespace scope because // it relies on the SField's below being initialized, and we can't // guarantee the initialization order. @@ -68,36 +72,42 @@ STValidation::validationFormat() uint256 STValidation::getSigningHash() const { + TRACE_FUNC(); return STObject::getSigningHash(HashPrefix::Validation); } uint256 STValidation::getLedgerHash() const { + TRACE_FUNC(); return getFieldH256(sfLedgerHash); } uint256 STValidation::getConsensusHash() const { + TRACE_FUNC(); return getFieldH256(sfConsensusHash); } NetClock::time_point STValidation::getSignTime() const { + TRACE_FUNC(); return NetClock::time_point{NetClock::duration{getFieldU32(sfSigningTime)}}; } NetClock::time_point STValidation::getSeenTime() const noexcept { + TRACE_FUNC(); return seenTime_; } bool STValidation::isValid() const noexcept { + TRACE_FUNC(); if (!valid_) { XRPL_ASSERT( @@ -117,18 +127,21 @@ STValidation::isValid() const noexcept bool STValidation::isFull() const noexcept { + TRACE_FUNC(); return (getFlags() & kVF_FULL_VALIDATION) != 0; } Blob STValidation::getSignature() const { + TRACE_FUNC(); return getFieldVL(sfSignature); } Blob STValidation::getSerialized() const { + TRACE_FUNC(); Serializer s; add(s); return s.peekData(); diff --git a/src/libxrpl/protocol/STVar.cpp b/src/libxrpl/protocol/STVar.cpp index 8e45d3c75b..47e9540bf0 100644 --- a/src/libxrpl/protocol/STVar.cpp +++ b/src/libxrpl/protocol/STVar.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -32,17 +33,20 @@ NonPresentObjectT gNonPresentObject; STVar::~STVar() { + TRACE_FUNC(); destroy(); } STVar::STVar(STVar const& other) { + TRACE_FUNC(); if (other.p_ != nullptr) p_ = other.p_->copy(kMAX_SIZE, &d_); } STVar::STVar(STVar&& other) { + TRACE_FUNC(); if (other.onHeap()) { p_ = other.p_; @@ -57,6 +61,7 @@ STVar::STVar(STVar&& other) STVar& STVar::operator=(STVar const& rhs) { + TRACE_FUNC(); if (&rhs != this) { destroy(); @@ -76,6 +81,7 @@ STVar::operator=(STVar const& rhs) STVar& STVar::operator=(STVar&& rhs) { + TRACE_FUNC(); if (&rhs != this) { destroy(); @@ -103,6 +109,7 @@ STVar::STVar(NonPresentObjectT, SField const& name) : STVar(STI_NOTPRESENT, name STVar::STVar(SerialIter& sit, SField const& name, int depth) { + TRACE_FUNC(); if (depth > 10) Throw("Maximum nesting depth of STVar exceeded"); constructST(name.fieldType, depth, sit, name); @@ -110,6 +117,7 @@ STVar::STVar(SerialIter& sit, SField const& name, int depth) STVar::STVar(SerializedTypeID id, SField const& name) { + TRACE_FUNC(); XRPL_ASSERT( (id == STI_NOTPRESENT) || (id == name.fieldType), "xrpl::detail::STVar::STVar(SerializedTypeID) : valid type input"); @@ -119,6 +127,7 @@ STVar::STVar(SerializedTypeID id, SField const& name) void STVar::destroy() { + TRACE_FUNC(); if (onHeap()) { delete p_; @@ -136,6 +145,7 @@ template void STVar::constructST(SerializedTypeID id, int depth, Args&&... args) { + TRACE_FUNC(); auto constructWithDepth = [&]() { if constexpr (std::is_same_v...>, std::tuple>) { diff --git a/src/libxrpl/protocol/STVector256.cpp b/src/libxrpl/protocol/STVector256.cpp index d720067508..f628caee99 100644 --- a/src/libxrpl/protocol/STVector256.cpp +++ b/src/libxrpl/protocol/STVector256.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -17,6 +18,7 @@ namespace xrpl { STVector256::STVector256(SerialIter& sit, SField const& name) : STBase(name) { + TRACE_FUNC(); auto const slice = sit.getSlice(sit.getVLDataLength()); if (slice.size() % uint256::size() != 0) @@ -36,30 +38,35 @@ STVector256::STVector256(SerialIter& sit, SField const& name) : STBase(name) STBase* STVector256::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STVector256::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } SerializedTypeID STVector256::getSType() const { + TRACE_FUNC(); return STI_VECTOR256; } bool STVector256::isDefault() const { + TRACE_FUNC(); return value_.empty(); } void STVector256::add(Serializer& s) const { + TRACE_FUNC(); XRPL_ASSERT(getFName().isBinary(), "xrpl::STVector256::add : field is binary"); XRPL_ASSERT(getFName().fieldType == STI_VECTOR256, "xrpl::STVector256::add : valid field type"); s.addVL(value_.begin(), value_.end(), value_.size() * (256 / 8)); @@ -68,6 +75,7 @@ STVector256::add(Serializer& s) const bool STVector256::isEquivalent(STBase const& t) const { + TRACE_FUNC(); STVector256 const* v = dynamic_cast(&t); return (v != nullptr) && (value_ == v->value_); } @@ -75,6 +83,7 @@ STVector256::isEquivalent(STBase const& t) const json::Value STVector256::getJson(JsonOptions) const { + TRACE_FUNC(); json::Value ret(json::ArrayValue); for (auto const& vEntry : value_) diff --git a/src/libxrpl/protocol/STXChainBridge.cpp b/src/libxrpl/protocol/STXChainBridge.cpp index 35f47f891e..30228caeb8 100644 --- a/src/libxrpl/protocol/STXChainBridge.cpp +++ b/src/libxrpl/protocol/STXChainBridge.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -120,6 +121,7 @@ STXChainBridge::STXChainBridge(SerialIter& sit, SField const& name) void STXChainBridge::add(Serializer& s) const { + TRACE_FUNC(); lockingChainDoor_.add(s); lockingChainIssue_.add(s); issuingChainDoor_.add(s); @@ -129,6 +131,7 @@ STXChainBridge::add(Serializer& s) const json::Value STXChainBridge::getJson(JsonOptions jo) const { + TRACE_FUNC(); json::Value v; v[jss::LockingChainDoor] = lockingChainDoor_.getJson(jo); v[jss::LockingChainIssue] = lockingChainIssue_.getJson(jo); @@ -140,6 +143,7 @@ STXChainBridge::getJson(JsonOptions jo) const std::string STXChainBridge::getText() const { + TRACE_FUNC(); return str( boost::format("{ %s = %s, %s = %s, %s = %s, %s = %s }") % sfLockingChainDoor.getName() % lockingChainDoor_.getText() % sfLockingChainIssue.getName() % lockingChainIssue_.getText() % @@ -150,6 +154,7 @@ STXChainBridge::getText() const STObject STXChainBridge::toSTObject() const { + TRACE_FUNC(); STObject o{sfXChainBridge}; o[sfLockingChainDoor] = lockingChainDoor_; o[sfLockingChainIssue] = lockingChainIssue_; @@ -161,12 +166,14 @@ STXChainBridge::toSTObject() const SerializedTypeID STXChainBridge::getSType() const { + TRACE_FUNC(); return STI_XCHAIN_BRIDGE; } bool STXChainBridge::isEquivalent(STBase const& t) const { + TRACE_FUNC(); STXChainBridge const* v = dynamic_cast(&t); return (v != nullptr) && (*v == *this); } @@ -174,6 +181,7 @@ STXChainBridge::isEquivalent(STBase const& t) const bool STXChainBridge::isDefault() const { + TRACE_FUNC(); return lockingChainDoor_.isDefault() && lockingChainIssue_.isDefault() && issuingChainDoor_.isDefault() && issuingChainIssue_.isDefault(); } @@ -181,18 +189,21 @@ STXChainBridge::isDefault() const std::unique_ptr STXChainBridge::construct(SerialIter& sit, SField const& name) { + TRACE_FUNC(); return std::make_unique(sit, name); } STBase* STXChainBridge::copy(std::size_t n, void* buf) const { + TRACE_FUNC(); return emplace(n, buf, *this); } STBase* STXChainBridge::move(std::size_t n, void* buf) { + TRACE_FUNC(); return emplace(n, buf, std::move(*this)); } } // namespace xrpl diff --git a/src/libxrpl/protocol/SecretKey.cpp b/src/libxrpl/protocol/SecretKey.cpp index d5fe54867a..d653623343 100644 --- a/src/libxrpl/protocol/SecretKey.cpp +++ b/src/libxrpl/protocol/SecretKey.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -32,16 +33,19 @@ namespace xrpl { SecretKey::~SecretKey() { + TRACE_FUNC(); secureErase(buf_, sizeof(buf_)); } SecretKey::SecretKey(std::array const& key) { + TRACE_FUNC(); std::memcpy(buf_, key.data(), key.size()); } SecretKey::SecretKey(Slice const& slice) { + TRACE_FUNC(); if (slice.size() != sizeof(buf_)) logicError("SecretKey::SecretKey: invalid size"); std::memcpy(buf_, slice.data(), sizeof(buf_)); @@ -50,6 +54,7 @@ SecretKey::SecretKey(Slice const& slice) std::string SecretKey::toString() const { + TRACE_FUNC(); return strHex(*this); } @@ -58,6 +63,7 @@ namespace detail { void copyUint32(std::uint8_t* out, std::uint32_t v) { + TRACE_FUNC(); *out++ = v >> 24; *out++ = (v >> 16) & 0xff; *out++ = (v >> 8) & 0xff; @@ -67,6 +73,7 @@ copyUint32(std::uint8_t* out, std::uint32_t v) uint256 deriveDeterministicRootKey(Seed const& seed) { + TRACE_FUNC(); // We fill this buffer with the seed and append a 32-bit "counter" // that counts how many attempts we've had to make to generate a // non-zero key that's less than the curve's order: @@ -126,6 +133,7 @@ private: [[nodiscard]] uint256 calculateTweak(std::uint32_t seq) const { + TRACE_FUNC(); // We fill the buffer with the generator, the provided sequence // and a 32-bit counter tracking the number of attempts we have // already made looking for a non-zero key that's less than the @@ -160,6 +168,7 @@ private: public: explicit Generator(Seed const& seed) : root_(deriveDeterministicRootKey(seed)) { + TRACE_FUNC(); secp256k1_pubkey pubkey; if (secp256k1_ec_pubkey_create(secp256k1Context(), &pubkey, root_.data()) != 1) logicError("derivePublicKey: secp256k1_ec_pubkey_create failed"); @@ -173,6 +182,7 @@ public: ~Generator() { + TRACE_FUNC(); secureErase(root_.data(), root_.size()); secureErase(generator_.data(), generator_.size()); } @@ -181,6 +191,7 @@ public: std::pair operator()(std::size_t ordinal) const { + TRACE_FUNC(); // Generates Nth secret key: auto gsk = [this, tweak = calculateTweak(ordinal)]() { auto rpk = root_; @@ -204,6 +215,7 @@ public: Buffer signDigest(PublicKey const& pk, SecretKey const& sk, uint256 const& digest) { + TRACE_FUNC(); if (publicKeyType(pk.slice()) != KeyType::Secp256k1) logicError("sign: secp256k1 required for digest signing"); @@ -229,6 +241,7 @@ signDigest(PublicKey const& pk, SecretKey const& sk, uint256 const& digest) Buffer sign(PublicKey const& pk, SecretKey const& sk, Slice const& m) { + TRACE_FUNC(); auto const type = publicKeyType(pk.slice()); if (!type) logicError("sign: invalid type"); @@ -270,6 +283,7 @@ sign(PublicKey const& pk, SecretKey const& sk, Slice const& m) SecretKey randomSecretKey() { + TRACE_FUNC(); std::uint8_t buf[32]; beast::rngfill(buf, sizeof(buf), cryptoPrng()); SecretKey const sk(Slice{buf, sizeof(buf)}); @@ -280,6 +294,7 @@ randomSecretKey() SecretKey generateSecretKey(KeyType type, Seed const& seed) { + TRACE_FUNC(); if (type == KeyType::Ed25519) { auto key = sha512HalfS(Slice(seed.data(), seed.size())); @@ -302,6 +317,7 @@ generateSecretKey(KeyType type, Seed const& seed) PublicKey derivePublicKey(KeyType type, SecretKey const& sk) { + TRACE_FUNC(); switch (type) { case KeyType::Secp256k1: { @@ -334,6 +350,7 @@ derivePublicKey(KeyType type, SecretKey const& sk) std::pair generateKeyPair(KeyType type, Seed const& seed) { + TRACE_FUNC(); switch (type) { case KeyType::Secp256k1: { @@ -351,6 +368,7 @@ generateKeyPair(KeyType type, Seed const& seed) std::pair randomKeyPair(KeyType type) { + TRACE_FUNC(); auto const sk = randomSecretKey(); return {derivePublicKey(type, sk), sk}; } @@ -359,6 +377,7 @@ template <> std::optional parseBase58(TokenType type, std::string const& s) { + TRACE_FUNC(); auto const result = decodeBase58Token(s, type); if (result.empty()) return std::nullopt; diff --git a/src/libxrpl/protocol/Seed.cpp b/src/libxrpl/protocol/Seed.cpp index f15d4dcff0..43ae1be50e 100644 --- a/src/libxrpl/protocol/Seed.cpp +++ b/src/libxrpl/protocol/Seed.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -25,11 +26,13 @@ namespace xrpl { Seed::~Seed() { + TRACE_FUNC(); secureErase(buf_.data(), buf_.size()); } Seed::Seed(Slice const& slice) { + TRACE_FUNC(); if (slice.size() != buf_.size()) logicError("Seed::Seed: invalid size"); std::memcpy(buf_.data(), slice.data(), buf_.size()); @@ -37,6 +40,7 @@ Seed::Seed(Slice const& slice) Seed::Seed(uint128 const& seed) { + TRACE_FUNC(); if (seed.size() != buf_.size()) logicError("Seed::Seed: invalid size"); std::memcpy(buf_.data(), seed.data(), buf_.size()); @@ -47,6 +51,7 @@ Seed::Seed(uint128 const& seed) Seed randomSeed() { + TRACE_FUNC(); std::array buffer{}; beast::rngfill(buffer.data(), buffer.size(), cryptoPrng()); Seed const seed(makeSlice(buffer)); @@ -57,6 +62,7 @@ randomSeed() Seed generateSeed(std::string const& passPhrase) { + TRACE_FUNC(); sha512_half_hasher_s h; h(passPhrase.data(), passPhrase.size()); auto const digest = sha512_half_hasher::result_type(h); @@ -67,6 +73,7 @@ template <> std::optional parseBase58(std::string const& s) { + TRACE_FUNC(); auto const result = decodeBase58Token(s, TokenType::FamilySeed); if (result.empty()) return std::nullopt; @@ -78,6 +85,7 @@ parseBase58(std::string const& s) std::optional parseGenericSeed(std::string const& str, bool rfc1751) { + TRACE_FUNC(); if (str.empty()) return std::nullopt; @@ -115,6 +123,7 @@ parseGenericSeed(std::string const& str, bool rfc1751) std::string seedAs1751(Seed const& seed) { + TRACE_FUNC(); std::string key; std::reverse_copy(seed.data(), seed.data() + 16, std::back_inserter(key)); diff --git a/src/libxrpl/protocol/Serializer.cpp b/src/libxrpl/protocol/Serializer.cpp index d500919df9..404dcaa6aa 100644 --- a/src/libxrpl/protocol/Serializer.cpp +++ b/src/libxrpl/protocol/Serializer.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -24,6 +25,7 @@ namespace xrpl { int Serializer::add16(std::uint16_t i) { + TRACE_FUNC(); int const ret = data_.size(); data_.push_back(static_cast(i >> 8)); data_.push_back(static_cast(i & 0xff)); @@ -33,6 +35,7 @@ Serializer::add16(std::uint16_t i) int Serializer::add32(HashPrefix p) { + TRACE_FUNC(); // This should never trigger; the size & type of a hash prefix are // integral parts of the protocol and unlikely to ever change. static_assert(std::is_same_v>); @@ -44,36 +47,42 @@ template <> int Serializer::addInteger(unsigned char i) { + TRACE_FUNC(); return add8(i); } template <> int Serializer::addInteger(std::uint16_t i) { + TRACE_FUNC(); return add16(i); } template <> int Serializer::addInteger(std::uint32_t i) { + TRACE_FUNC(); return add32(i); } template <> int Serializer::addInteger(std::uint64_t i) { + TRACE_FUNC(); return add64(i); } template <> int Serializer::addInteger(std::int32_t i) { + TRACE_FUNC(); return add32(i); } int Serializer::addRaw(Blob const& vector) { + TRACE_FUNC(); int const ret = data_.size(); data_.insert(data_.end(), vector.begin(), vector.end()); return ret; @@ -82,6 +91,7 @@ Serializer::addRaw(Blob const& vector) int Serializer::addRaw(Slice slice) { + TRACE_FUNC(); int const ret = data_.size(); data_.insert(data_.end(), slice.begin(), slice.end()); return ret; @@ -90,6 +100,7 @@ Serializer::addRaw(Slice slice) int Serializer::addRaw(Serializer const& s) { + TRACE_FUNC(); int const ret = data_.size(); data_.insert(data_.end(), s.begin(), s.end()); return ret; @@ -98,6 +109,7 @@ Serializer::addRaw(Serializer const& s) int Serializer::addRaw(void const* ptr, int len) { + TRACE_FUNC(); int const ret = data_.size(); data_.insert(data_.end(), (char const*)ptr, ((char const*)ptr) + len); return ret; @@ -106,6 +118,7 @@ Serializer::addRaw(void const* ptr, int len) int Serializer::addFieldID(int type, int name) { + TRACE_FUNC(); int const ret = data_.size(); XRPL_ASSERT( (type > 0) && (type < 256) && (name > 0) && (name < 256), @@ -145,6 +158,7 @@ Serializer::addFieldID(int type, int name) int Serializer::add8(unsigned char byte) { + TRACE_FUNC(); int const ret = data_.size(); data_.push_back(byte); return ret; @@ -153,6 +167,7 @@ Serializer::add8(unsigned char byte) bool Serializer::get8(int& byte, int offset) const { + TRACE_FUNC(); if (offset >= data_.size()) return false; @@ -163,6 +178,7 @@ Serializer::get8(int& byte, int offset) const bool Serializer::chop(int bytes) { + TRACE_FUNC(); if (bytes > data_.size()) return false; @@ -173,12 +189,14 @@ Serializer::chop(int bytes) uint256 Serializer::getSHA512Half() const { + TRACE_FUNC(); return sha512Half(makeSlice(data_)); } int Serializer::addVL(Blob const& vector) { + TRACE_FUNC(); int const ret = addEncoded(vector.size()); addRaw(vector); XRPL_ASSERT( @@ -190,6 +208,7 @@ Serializer::addVL(Blob const& vector) int Serializer::addVL(Slice const& slice) { + TRACE_FUNC(); int const ret = addEncoded(slice.size()); if (!slice.empty()) addRaw(slice.data(), slice.size()); @@ -199,6 +218,7 @@ Serializer::addVL(Slice const& slice) int Serializer::addVL(void const* ptr, int len) { + TRACE_FUNC(); int const ret = addEncoded(len); if (len != 0) @@ -210,6 +230,7 @@ Serializer::addVL(void const* ptr, int len) int Serializer::addEncoded(int length) { + TRACE_FUNC(); std::array bytes{}; int numBytes = 0; @@ -244,6 +265,7 @@ Serializer::addEncoded(int length) int Serializer::encodeLengthLength(int length) { + TRACE_FUNC(); if (length < 0) Throw("len<0"); @@ -263,6 +285,7 @@ Serializer::encodeLengthLength(int length) int Serializer::decodeLengthLength(int b1) { + TRACE_FUNC(); if (b1 < 0) Throw("b1<0"); @@ -282,6 +305,7 @@ Serializer::decodeLengthLength(int b1) int Serializer::decodeVLLength(int b1) { + TRACE_FUNC(); if (b1 < 0) Throw("b1<0"); @@ -294,6 +318,7 @@ Serializer::decodeVLLength(int b1) int Serializer::decodeVLLength(int b1, int b2) { + TRACE_FUNC(); if (b1 < 193) Throw("b1<193"); @@ -306,6 +331,7 @@ Serializer::decodeVLLength(int b1, int b2) int Serializer::decodeVLLength(int b1, int b2, int b3) { + TRACE_FUNC(); if (b1 < 241) Throw("b1<241"); @@ -325,6 +351,7 @@ SerialIter::SerialIter(void const* data, std::size_t size) noexcept void SerialIter::reset() noexcept { + TRACE_FUNC(); p_ -= used_; remain_ += used_; used_ = 0; @@ -333,6 +360,7 @@ SerialIter::reset() noexcept void SerialIter::skip(int length) { + TRACE_FUNC(); if (remain_ < length) Throw("invalid SerialIter skip"); p_ += length; @@ -343,6 +371,7 @@ SerialIter::skip(int length) unsigned char SerialIter::get8() { + TRACE_FUNC(); if (remain_ < 1) Throw("invalid SerialIter get8"); unsigned char const t = *p_; @@ -355,6 +384,7 @@ SerialIter::get8() std::uint16_t SerialIter::get16() { + TRACE_FUNC(); if (remain_ < 2) Throw("invalid SerialIter get16"); auto t = p_; @@ -367,6 +397,7 @@ SerialIter::get16() std::uint32_t SerialIter::get32() { + TRACE_FUNC(); if (remain_ < 4) Throw("invalid SerialIter get32"); auto t = p_; @@ -380,6 +411,7 @@ SerialIter::get32() std::uint64_t SerialIter::get64() { + TRACE_FUNC(); if (remain_ < 8) Throw("invalid SerialIter get64"); auto t = p_; @@ -394,6 +426,7 @@ SerialIter::get64() std::int32_t SerialIter::geti32() { + TRACE_FUNC(); if (remain_ < 4) Throw("invalid SerialIter geti32"); auto t = p_; @@ -406,6 +439,7 @@ SerialIter::geti32() std::int64_t SerialIter::geti64() { + TRACE_FUNC(); if (remain_ < 8) Throw("invalid SerialIter geti64"); auto t = p_; @@ -418,6 +452,7 @@ SerialIter::geti64() void SerialIter::getFieldID(int& type, int& name) { + TRACE_FUNC(); type = get8(); name = type & 15; type >>= 4; @@ -444,6 +479,7 @@ template T SerialIter::getRawHelper(int size) { + TRACE_FUNC(); static_assert(std::is_same_v || std::is_same_v, ""); if (remain_ < size) Throw("invalid SerialIter getRaw"); @@ -465,12 +501,14 @@ SerialIter::getRawHelper(int size) Blob SerialIter::getRaw(int size) { + TRACE_FUNC(); return getRawHelper(size); } int SerialIter::getVLDataLength() { + TRACE_FUNC(); int const b1 = get8(); int datLen = 0; int const lenLen = Serializer::decodeLengthLength(b1); @@ -496,6 +534,7 @@ SerialIter::getVLDataLength() Slice SerialIter::getSlice(std::size_t bytes) { + TRACE_FUNC(); if (bytes > remain_) Throw("invalid SerialIter getSlice"); Slice const s(p_, bytes); @@ -509,12 +548,14 @@ SerialIter::getSlice(std::size_t bytes) Blob SerialIter::getVL() { + TRACE_FUNC(); return getRaw(getVLDataLength()); } Buffer SerialIter::getVLBuffer() { + TRACE_FUNC(); return getRawHelper(getVLDataLength()); } diff --git a/src/libxrpl/protocol/Sign.cpp b/src/libxrpl/protocol/Sign.cpp index 9e7ef7f999..2f25e9eddd 100644 --- a/src/libxrpl/protocol/Sign.cpp +++ b/src/libxrpl/protocol/Sign.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace xrpl { @@ -20,6 +21,7 @@ sign( SecretKey const& sk, SF_VL const& sigField) { + TRACE_FUNC(); Serializer ss; ss.add32(prefix); st.addWithoutSigningFields(ss); @@ -29,6 +31,7 @@ sign( bool verify(STObject const& st, HashPrefix const& prefix, PublicKey const& pk, SF_VL const& sigField) { + TRACE_FUNC(); auto const sig = get(st, sigField); if (!sig) return false; @@ -72,6 +75,7 @@ verify(STObject const& st, HashPrefix const& prefix, PublicKey const& pk, SF_VL Serializer buildMultiSigningData(STObject const& obj, AccountID const& signingID) { + TRACE_FUNC(); Serializer s{startMultiSigningData(obj)}; finishMultiSigningData(signingID, s); return s; @@ -80,6 +84,7 @@ buildMultiSigningData(STObject const& obj, AccountID const& signingID) Serializer startMultiSigningData(STObject const& obj) { + TRACE_FUNC(); Serializer s; s.add32(HashPrefix::TxMultiSign); obj.addWithoutSigningFields(s); diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 3654547dd2..c3dd172638 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -13,6 +14,7 @@ namespace xrpl { std::unordered_map> const& transResults() { + TRACE_FUNC(); // clang-format off // Macros are generally ugly, but they can help make code readable to @@ -229,6 +231,7 @@ transResults() bool transResultInfo(TER code, std::string& token, std::string& text) { + TRACE_FUNC(); auto& results = transResults(); auto const r = results.find(TERtoInt(code)); @@ -244,6 +247,7 @@ transResultInfo(TER code, std::string& token, std::string& text) std::string transToken(TER code) { + TRACE_FUNC(); std::string token; std::string text; @@ -253,6 +257,7 @@ transToken(TER code) std::string transHuman(TER code) { + TRACE_FUNC(); std::string token; std::string text; @@ -262,6 +267,7 @@ transHuman(TER code) std::optional transCode(std::string const& token) { + TRACE_FUNC(); static auto const kRESULTS = [] { auto& byTer = transResults(); auto range = boost::make_iterator_range(byTer.begin(), byTer.end()); diff --git a/src/libxrpl/protocol/TxFormats.cpp b/src/libxrpl/protocol/TxFormats.cpp index 083889622c..bc51ac7505 100644 --- a/src/libxrpl/protocol/TxFormats.cpp +++ b/src/libxrpl/protocol/TxFormats.cpp @@ -1,5 +1,6 @@ #include +#include #include // IWYU pragma: keep #include #include @@ -12,6 +13,7 @@ namespace xrpl { std::vector const& TxFormats::getCommonFields() { + TRACE_FUNC(); static auto const kCOMMON_FIELDS = std::vector{ {sfTransactionType, SoeRequired}, {sfFlags, SoeOptional}, @@ -36,6 +38,7 @@ TxFormats::getCommonFields() TxFormats::TxFormats() { + TRACE_FUNC(); #pragma push_macro("UNWRAP") #undef UNWRAP #pragma push_macro("TRANSACTION") @@ -56,6 +59,7 @@ TxFormats::TxFormats() TxFormats const& TxFormats::getInstance() { + TRACE_FUNC(); static TxFormats const kINSTANCE; return kINSTANCE; } diff --git a/src/libxrpl/protocol/TxMeta.cpp b/src/libxrpl/protocol/TxMeta.cpp index 0373706e84..66d728026d 100644 --- a/src/libxrpl/protocol/TxMeta.cpp +++ b/src/libxrpl/protocol/TxMeta.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -25,6 +26,7 @@ namespace xrpl { TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj) : transactionID_(txid), ledgerSeq_(ledger), nodes_(obj.getFieldArray(sfAffectedNodes)) { + TRACE_FUNC(); result_ = obj.getFieldU8(sfTransactionResult); index_ = obj.getFieldU32(sfTransactionIndex); @@ -39,6 +41,7 @@ TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj) TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, Blob const& vec) : transactionID_(txid), ledgerSeq_(ledger), nodes_(sfAffectedNodes, 32) { + TRACE_FUNC(); SerialIter sit(makeSlice(vec)); STObject const obj(sit, sfMetadata); @@ -56,12 +59,14 @@ TxMeta::TxMeta(uint256 const& transactionID, std::uint32_t ledger) , result_(255) , nodes_(sfAffectedNodes) { + TRACE_FUNC(); nodes_.reserve(32); } void TxMeta::setAffectedNode(uint256 const& node, SField const& type, std::uint16_t nodeType) { + TRACE_FUNC(); // make sure the node exists and force its type for (auto& n : nodes_) { @@ -84,6 +89,7 @@ TxMeta::setAffectedNode(uint256 const& node, SField const& type, std::uint16_t n boost::container::flat_set TxMeta::getAffectedAccounts() const { + TRACE_FUNC(); boost::container::flat_set list; list.reserve(10); @@ -148,6 +154,7 @@ TxMeta::getAffectedAccounts() const STObject& TxMeta::getAffectedNode(SLE::ref node, SField const& type) { + TRACE_FUNC(); uint256 const index = node->key(); for (auto& n : nodes_) { @@ -168,6 +175,7 @@ TxMeta::getAffectedNode(SLE::ref node, SField const& type) STObject& TxMeta::getAffectedNode(uint256 const& node) { + TRACE_FUNC(); for (auto& n : nodes_) { if (n.getFieldH256(sfLedgerIndex) == node) @@ -183,6 +191,7 @@ TxMeta::getAffectedNode(uint256 const& node) STObject TxMeta::getAsObject() const { + TRACE_FUNC(); STObject metaData(sfTransactionMetaData); XRPL_ASSERT(result_ != 255, "xrpl::TxMeta::getAsObject : result_ is set"); metaData.setFieldU8(sfTransactionResult, result_); @@ -200,6 +209,7 @@ TxMeta::getAsObject() const void TxMeta::addRaw(Serializer& s, TER result, std::uint32_t index) { + TRACE_FUNC(); result_ = TERtoInt(result); index_ = index; XRPL_ASSERT( diff --git a/src/libxrpl/protocol/UintTypes.cpp b/src/libxrpl/protocol/UintTypes.cpp index adef5e2c14..78a412a3a6 100644 --- a/src/libxrpl/protocol/UintTypes.cpp +++ b/src/libxrpl/protocol/UintTypes.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -35,6 +36,7 @@ constexpr std::size_t kISO_CODE_LENGTH = 3; std::string to_string(Currency const& currency) { + TRACE_FUNC(); if (currency == beast::kZERO) return systemCurrencyCode(); @@ -64,6 +66,7 @@ to_string(Currency const& currency) bool toCurrency(Currency& currency, std::string const& code) { + TRACE_FUNC(); if (code.empty() || (code.compare(systemCurrencyCode()) == 0)) { currency = beast::kZERO; @@ -89,6 +92,7 @@ toCurrency(Currency& currency, std::string const& code) Currency toCurrency(std::string const& code) { + TRACE_FUNC(); Currency currency; if (!toCurrency(currency, code)) currency = noCurrency(); @@ -98,6 +102,7 @@ toCurrency(std::string const& code) Currency const& xrpCurrency() { + TRACE_FUNC(); static Currency const kCURRENCY(beast::kZERO); return kCURRENCY; } @@ -105,6 +110,7 @@ xrpCurrency() Currency const& noCurrency() { + TRACE_FUNC(); static Currency const kCURRENCY(1); return kCURRENCY; } @@ -112,6 +118,7 @@ noCurrency() Currency const& badCurrency() { + TRACE_FUNC(); static Currency const kCURRENCY(0x5852500000000000); return kCURRENCY; } diff --git a/src/libxrpl/protocol/XChainAttestations.cpp b/src/libxrpl/protocol/XChainAttestations.cpp index f89ad6a52c..44458f259d 100644 --- a/src/libxrpl/protocol/XChainAttestations.cpp +++ b/src/libxrpl/protocol/XChainAttestations.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -47,6 +48,7 @@ AttestationBase::AttestationBase( bool AttestationBase::equalHelper(AttestationBase const& lhs, AttestationBase const& rhs) { + TRACE_FUNC(); return std::tie( lhs.attestationSignerAccount, lhs.publicKey, @@ -68,6 +70,7 @@ AttestationBase::equalHelper(AttestationBase const& lhs, AttestationBase const& bool AttestationBase::sameEventHelper(AttestationBase const& lhs, AttestationBase const& rhs) { + TRACE_FUNC(); return std::tie(lhs.sendingAccount, lhs.sendingAmount, lhs.wasLockingChainSend) == std::tie(rhs.sendingAccount, rhs.sendingAmount, rhs.wasLockingChainSend); } @@ -75,6 +78,7 @@ AttestationBase::sameEventHelper(AttestationBase const& lhs, AttestationBase con bool AttestationBase::verify(STXChainBridge const& bridge) const { + TRACE_FUNC(); std::vector const msg = message(bridge); return xrpl::verify(publicKey, makeSlice(msg), signature); } @@ -104,6 +108,7 @@ AttestationBase::AttestationBase(json::Value const& v) void AttestationBase::addHelper(STObject& o) const { + TRACE_FUNC(); o[sfAttestationSignerAccount] = attestationSignerAccount; o[sfPublicKey] = publicKey; o[sfSignature] = signature; @@ -170,6 +175,7 @@ AttestationClaim::AttestationClaim(STObject const& o) AttestationClaim::AttestationClaim(json::Value const& v) : AttestationBase{v}, claimID{json::getOrThrow(v, sfXChainClaimID)} { + TRACE_FUNC(); if (v.isMember(sfDestination.getJsonName())) dst = json::getOrThrow(v, sfDestination); } @@ -177,6 +183,7 @@ AttestationClaim::AttestationClaim(json::Value const& v) STObject AttestationClaim::toSTObject() const { + TRACE_FUNC(); STObject o = STObject::makeInnerObject(sfXChainClaimAttestationCollectionElement); addHelper(o); o[sfXChainClaimID] = claimID; @@ -195,6 +202,7 @@ AttestationClaim::message( std::uint64_t claimID, std::optional const& dst) { + TRACE_FUNC(); STObject o{kSF_GENERIC}; // Serialize in SField order to make python serializers easier to write o[sfXChainClaimID] = claimID; @@ -215,6 +223,7 @@ AttestationClaim::message( std::vector AttestationClaim::message(STXChainBridge const& bridge) const { + TRACE_FUNC(); return AttestationClaim::message( bridge, sendingAccount, sendingAmount, rewardAccount, wasLockingChainSend, claimID, dst); } @@ -222,12 +231,14 @@ AttestationClaim::message(STXChainBridge const& bridge) const bool AttestationClaim::validAmounts() const { + TRACE_FUNC(); return isLegalNet(sendingAmount); } bool AttestationClaim::sameEvent(AttestationClaim const& rhs) const { + TRACE_FUNC(); return AttestationClaim::sameEventHelper(*this, rhs) && tie(claimID, dst) == tie(rhs.claimID, rhs.dst); } @@ -235,6 +246,7 @@ AttestationClaim::sameEvent(AttestationClaim const& rhs) const bool operator==(AttestationClaim const& lhs, AttestationClaim const& rhs) { + TRACE_FUNC(); return AttestationClaim::equalHelper(lhs, rhs) && tie(lhs.claimID, lhs.dst) == tie(rhs.claimID, rhs.dst); } @@ -311,6 +323,7 @@ AttestationCreateAccount::AttestationCreateAccount( STObject AttestationCreateAccount::toSTObject() const { + TRACE_FUNC(); STObject o = STObject::makeInnerObject(sfXChainCreateAccountAttestationCollectionElement); addHelper(o); @@ -332,6 +345,7 @@ AttestationCreateAccount::message( std::uint64_t createCount, AccountID const& dst) { + TRACE_FUNC(); STObject o{kSF_GENERIC}; // Serialize in SField order to make python serializers easier to write o[sfXChainAccountCreateCount] = createCount; @@ -352,6 +366,7 @@ AttestationCreateAccount::message( std::vector AttestationCreateAccount::message(STXChainBridge const& bridge) const { + TRACE_FUNC(); return AttestationCreateAccount::message( bridge, sendingAccount, @@ -366,12 +381,14 @@ AttestationCreateAccount::message(STXChainBridge const& bridge) const bool AttestationCreateAccount::validAmounts() const { + TRACE_FUNC(); return isLegalNet(rewardAmount) && isLegalNet(sendingAmount); } bool AttestationCreateAccount::sameEvent(AttestationCreateAccount const& rhs) const { + TRACE_FUNC(); return AttestationCreateAccount::sameEventHelper(*this, rhs) && std::tie(createCount, toCreate, rewardAmount) == std::tie(rhs.createCount, rhs.toCreate, rhs.rewardAmount); @@ -380,6 +397,7 @@ AttestationCreateAccount::sameEvent(AttestationCreateAccount const& rhs) const bool operator==(AttestationCreateAccount const& lhs, AttestationCreateAccount const& rhs) { + TRACE_FUNC(); return AttestationCreateAccount::equalHelper(lhs, rhs) && std::tie(lhs.createCount, lhs.toCreate, lhs.rewardAmount) == std::tie(rhs.createCount, rhs.toCreate, rhs.rewardAmount); @@ -460,6 +478,7 @@ XChainClaimAttestation::XChainClaimAttestation( STObject XChainClaimAttestation::toSTObject() const { + TRACE_FUNC(); STObject o = STObject::makeInnerObject(sfXChainClaimProofSig); o[sfAttestationSignerAccount] = STAccount{sfAttestationSignerAccount, keyAccount}; o[sfPublicKey] = publicKey; @@ -474,6 +493,7 @@ XChainClaimAttestation::toSTObject() const bool operator==(XChainClaimAttestation const& lhs, XChainClaimAttestation const& rhs) { + TRACE_FUNC(); return std::tie( lhs.keyAccount, lhs.publicKey, @@ -499,6 +519,7 @@ XChainClaimAttestation::MatchFields::MatchFields( AttestationMatch XChainClaimAttestation::match(XChainClaimAttestation::MatchFields const& rhs) const { + TRACE_FUNC(); if (std::tie(amount, wasLockingChainSend) != std::tie(rhs.amount, rhs.wasLockingChainSend)) return AttestationMatch::NonDstMismatch; if (dst != rhs.dst) @@ -564,6 +585,7 @@ XChainCreateAccountAttestation::XChainCreateAccountAttestation( STObject XChainCreateAccountAttestation::toSTObject() const { + TRACE_FUNC(); STObject o = STObject::makeInnerObject(sfXChainCreateAccountProofSig); o[sfAttestationSignerAccount] = STAccount{sfAttestationSignerAccount, keyAccount}; @@ -589,6 +611,7 @@ XChainCreateAccountAttestation::MatchFields::MatchFields( AttestationMatch XChainCreateAccountAttestation::match(XChainCreateAccountAttestation::MatchFields const& rhs) const { + TRACE_FUNC(); if (std::tie(amount, rewardAmount, wasLockingChainSend) != std::tie(rhs.amount, rhs.rewardAmount, rhs.wasLockingChainSend)) return AttestationMatch::NonDstMismatch; @@ -600,6 +623,7 @@ XChainCreateAccountAttestation::match(XChainCreateAccountAttestation::MatchField bool operator==(XChainCreateAccountAttestation const& lhs, XChainCreateAccountAttestation const& rhs) { + TRACE_FUNC(); return std::tie( lhs.keyAccount, lhs.publicKey, @@ -631,6 +655,7 @@ template typename XChainAttestationsBase::AttCollection::const_iterator XChainAttestationsBase::begin() const { + TRACE_FUNC(); return attestations_.begin(); } @@ -638,6 +663,7 @@ template typename XChainAttestationsBase::AttCollection::const_iterator XChainAttestationsBase::end() const { + TRACE_FUNC(); return attestations_.end(); } @@ -645,6 +671,7 @@ template typename XChainAttestationsBase::AttCollection::iterator XChainAttestationsBase::begin() { + TRACE_FUNC(); return attestations_.begin(); } @@ -652,12 +679,14 @@ template typename XChainAttestationsBase::AttCollection::iterator XChainAttestationsBase::end() { + TRACE_FUNC(); return attestations_.end(); } template XChainAttestationsBase::XChainAttestationsBase(json::Value const& v) { + TRACE_FUNC(); if (!v.isObject()) { Throw( @@ -682,6 +711,7 @@ XChainAttestationsBase::XChainAttestationsBase(json::Value const& template XChainAttestationsBase::XChainAttestationsBase(STArray const& arr) { + TRACE_FUNC(); if (arr.size() > kMAX_ATTESTATIONS) Throw("XChainAttestationsBase exceeded max number of attestations"); @@ -694,6 +724,7 @@ template STArray XChainAttestationsBase::toSTArray() const { + TRACE_FUNC(); STArray r{TAttestation::arrayFieldName, attestations_.size()}; for (auto const& e : attestations_) r.emplaceBack(e.toSTObject()); diff --git a/src/libxrpl/protocol/digest.cpp b/src/libxrpl/protocol/digest.cpp index 2e1b2b25cf..bba518713b 100644 --- a/src/libxrpl/protocol/digest.cpp +++ b/src/libxrpl/protocol/digest.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -9,6 +10,7 @@ namespace xrpl { OpensslRipemd160Hasher::OpensslRipemd160Hasher() { + TRACE_FUNC(); static_assert(sizeof(decltype(OpensslRipemd160Hasher::ctx_)) == sizeof(RIPEMD160_CTX), ""); auto const ctx = reinterpret_cast(ctx_); RIPEMD160_Init(ctx); @@ -17,6 +19,7 @@ OpensslRipemd160Hasher::OpensslRipemd160Hasher() void OpensslRipemd160Hasher::operator()(void const* data, std::size_t size) noexcept { + TRACE_FUNC(); auto const ctx = reinterpret_cast(ctx_); RIPEMD160_Update(ctx, data, size); } @@ -24,6 +27,7 @@ OpensslRipemd160Hasher::operator()(void const* data, std::size_t size) noexcept OpensslRipemd160Hasher:: operator result_type() noexcept { + TRACE_FUNC(); auto const ctx = reinterpret_cast(ctx_); result_type digest; RIPEMD160_Final(digest.data(), ctx); @@ -34,6 +38,7 @@ operator result_type() noexcept OpensslSha512Hasher::OpensslSha512Hasher() { + TRACE_FUNC(); static_assert(sizeof(decltype(OpensslSha512Hasher::ctx_)) == sizeof(SHA512_CTX), ""); auto const ctx = reinterpret_cast(ctx_); SHA512_Init(ctx); @@ -42,6 +47,7 @@ OpensslSha512Hasher::OpensslSha512Hasher() void OpensslSha512Hasher::operator()(void const* data, std::size_t size) noexcept { + TRACE_FUNC(); auto const ctx = reinterpret_cast(ctx_); SHA512_Update(ctx, data, size); } @@ -49,6 +55,7 @@ OpensslSha512Hasher::operator()(void const* data, std::size_t size) noexcept OpensslSha512Hasher:: operator result_type() noexcept { + TRACE_FUNC(); auto const ctx = reinterpret_cast(ctx_); result_type digest; SHA512_Final(digest.data(), ctx); @@ -59,6 +66,7 @@ operator result_type() noexcept OpensslSha256Hasher::OpensslSha256Hasher() { + TRACE_FUNC(); static_assert(sizeof(decltype(OpensslSha256Hasher::ctx_)) == sizeof(SHA256_CTX), ""); auto const ctx = reinterpret_cast(ctx_); SHA256_Init(ctx); @@ -67,6 +75,7 @@ OpensslSha256Hasher::OpensslSha256Hasher() void OpensslSha256Hasher::operator()(void const* data, std::size_t size) noexcept { + TRACE_FUNC(); auto const ctx = reinterpret_cast(ctx_); SHA256_Update(ctx, data, size); } @@ -74,6 +83,7 @@ OpensslSha256Hasher::operator()(void const* data, std::size_t size) noexcept OpensslSha256Hasher:: operator result_type() noexcept { + TRACE_FUNC(); auto const ctx = reinterpret_cast(ctx_); result_type digest; SHA256_Final(digest.data(), ctx); diff --git a/src/libxrpl/protocol/tokens.cpp b/src/libxrpl/protocol/tokens.cpp index 91063d3fa6..533746a500 100644 --- a/src/libxrpl/protocol/tokens.cpp +++ b/src/libxrpl/protocol/tokens.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -138,6 +139,7 @@ template static typename Hasher::result_type digest(void const* data, std::size_t size) noexcept { + TRACE_FUNC(); Hasher h; h(data, size); return static_cast(h); @@ -147,6 +149,7 @@ template const& v) { + TRACE_FUNC(); return digest(v.data(), v.size()); } @@ -155,6 +158,7 @@ template static typename Hasher::result_type digest2(Args const&... args) { + TRACE_FUNC(); return digest(digest(args...)); } @@ -170,6 +174,7 @@ digest2(Args const&... args) static void checksum(void* out, void const* message, std::size_t size) { + TRACE_FUNC(); auto const h = digest2(message, size); std::memcpy(out, h.data(), 4); } @@ -177,6 +182,7 @@ checksum(void* out, void const* message, std::size_t size) [[nodiscard]] std::string encodeBase58Token(TokenType type, void const* token, std::size_t size) { + TRACE_FUNC(); #ifndef _MSC_VER return b58_fast::encodeBase58Token(type, token, size); #else @@ -187,6 +193,7 @@ encodeBase58Token(TokenType type, void const* token, std::size_t size) [[nodiscard]] std::string decodeBase58Token(std::string const& s, TokenType type) { + TRACE_FUNC(); #ifndef _MSC_VER return b58_fast::decodeBase58Token(s, type); #else @@ -201,6 +208,7 @@ namespace detail { std::string encodeBase58(void const* message, std::size_t size, void* temp, std::size_t tempSize) { + TRACE_FUNC(); auto pbegin = reinterpret_cast(message); auto const pend = pbegin + size; @@ -248,6 +256,7 @@ encodeBase58(void const* message, std::size_t size, void* temp, std::size_t temp std::string decodeBase58(std::string const& s) { + TRACE_FUNC(); auto psz = reinterpret_cast(s.c_str()); auto remain = s.size(); // Skip and count leading zeroes @@ -296,6 +305,7 @@ decodeBase58(std::string const& s) std::string encodeBase58Token(TokenType type, void const* token, std::size_t size) { + TRACE_FUNC(); // expanded token includes type + 4 byte checksum auto const expanded = 1 + size + 4; @@ -319,6 +329,7 @@ encodeBase58Token(TokenType type, void const* token, std::size_t size) std::string decodeBase58Token(std::string const& s, TokenType type) { + TRACE_FUNC(); std::string const ret = detail::decodeBase58(s); // Reject zero length tokens @@ -349,6 +360,7 @@ namespace detail { B58Result> b256ToB58Be(std::span input, std::span out) { + TRACE_FUNC(); // Max valid input is 38 bytes: // (33 bytes for nodepublic + 1 byte token + 4 bytes checksum) if (input.size() > 38) @@ -470,6 +482,7 @@ b256ToB58Be(std::span input, std::span out) B58Result> b58ToB256Be(std::string_view input, std::span out) { + TRACE_FUNC(); // Convert from b58 to b 58^10 // Max encoded value is 38 bytes @@ -610,6 +623,7 @@ encodeBase58Token( std::span input, std::span out) { + TRACE_FUNC(); constexpr std::size_t kTMP_BUF_SIZE = 128; std::array buf{}; if (input.size() > kTMP_BUF_SIZE - 5) @@ -638,6 +652,7 @@ encodeBase58Token( B58Result> decodeBase58Token(TokenType type, std::string_view s, std::span outBuf) { + TRACE_FUNC(); std::array tmpBuf{}; auto const decodeResult = detail::b58ToB256Be(s, std::span(tmpBuf.data(), tmpBuf.size())); @@ -673,6 +688,7 @@ decodeBase58Token(TokenType type, std::string_view s, std::span ou [[nodiscard]] std::string encodeBase58Token(TokenType type, void const* token, std::size_t size) { + TRACE_FUNC(); std::string sr; // The largest object encoded as base58 is 33 bytes; This will be encoded in // at most ceil(log(2^256,58)) bytes, or 46 bytes. 128 is plenty (and @@ -693,6 +709,7 @@ encodeBase58Token(TokenType type, void const* token, std::size_t size) [[nodiscard]] std::string decodeBase58Token(std::string const& s, TokenType type) { + TRACE_FUNC(); std::string sr; // The largest object encoded as base58 is 33 bytes; 64 is plenty (and // there's no benefit making it smaller) diff --git a/src/libxrpl/rdb/DatabaseCon.cpp b/src/libxrpl/rdb/DatabaseCon.cpp index ac27a080c5..fea81c364a 100644 --- a/src/libxrpl/rdb/DatabaseCon.cpp +++ b/src/libxrpl/rdb/DatabaseCon.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,7 @@ public: std::shared_ptr fromId(std::uintptr_t id) { + TRACE_FUNC(); std::scoped_lock const l{mutex_}; auto it = checkpointers_.find(id); if (it != checkpointers_.end()) @@ -40,6 +42,7 @@ public: void erase(std::uintptr_t id) { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; checkpointers_.erase(id); } @@ -50,6 +53,7 @@ public: JobQueue& jobQueue, ServiceRegistry& registry) { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; auto const id = nextId_++; auto const r = makeCheckpointer(id, session, jobQueue, registry); @@ -63,11 +67,13 @@ CheckpointersCollection gCheckpointers; std::shared_ptr checkpointerFromId(std::uintptr_t id) { + TRACE_FUNC(); return gCheckpointers.fromId(id); } DatabaseCon::~DatabaseCon() { + TRACE_FUNC(); if (checkpointer_) { gCheckpointers.erase(checkpointer_->id()); @@ -92,6 +98,7 @@ std::unique_ptr const> DatabaseCon::Setup::globalPragma void DatabaseCon::setupCheckpointing(JobQueue* q, ServiceRegistry& registry) { + TRACE_FUNC(); if (q == nullptr) Throw("No JobQueue"); checkpointer_ = gCheckpointers.create(session_, *q, registry); diff --git a/src/libxrpl/rdb/SociDB.cpp b/src/libxrpl/rdb/SociDB.cpp index 541933b3b0..87e6541e38 100644 --- a/src/libxrpl/rdb/SociDB.cpp +++ b/src/libxrpl/rdb/SociDB.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include // IWYU pragma: keep @@ -39,6 +40,7 @@ namespace detail { std::string getSociSqliteInit(std::string const& name, std::string const& dir, std::string const& ext) { + TRACE_FUNC(); if (name.empty()) { Throw( @@ -53,6 +55,7 @@ getSociSqliteInit(std::string const& name, std::string const& dir, std::string c std::string getSociInit(BasicConfig const& config, std::string const& dbName) { + TRACE_FUNC(); auto const& section = config.section("sqdb"); auto const backendName = get(section, "backend", "sqlite"); @@ -78,24 +81,28 @@ DBConfig::DBConfig(BasicConfig const& config, std::string const& dbName) std::string DBConfig::connectionString() const { + TRACE_FUNC(); return connectionString_; } void DBConfig::open(soci::session& s) const { + TRACE_FUNC(); s.open(soci::sqlite3, connectionString()); } void open(soci::session& s, BasicConfig const& config, std::string const& dbName) { + TRACE_FUNC(); DBConfig(config, dbName).open(s); } void open(soci::session& s, std::string const& beName, std::string const& connectionString) { + TRACE_FUNC(); if (beName == "sqlite") { s.open(soci::sqlite3, connectionString); @@ -109,6 +116,7 @@ open(soci::session& s, std::string const& beName, std::string const& connectionS static sqlite_api::sqlite3* getConnection(soci::session& s) { + TRACE_FUNC(); sqlite_api::sqlite3* result = nullptr; // NOLINT(misc-const-correctness) auto be = s.get_backend(); if (auto b = dynamic_cast(be)) @@ -123,6 +131,7 @@ getConnection(soci::session& s) std::uint32_t getKBUsedAll(soci::session& s) { + TRACE_FUNC(); if (getConnection(s) == nullptr) Throw("No connection found."); return static_cast(sqlite_api::sqlite3_memory_used() / kilobytes(1)); @@ -131,6 +140,7 @@ getKBUsedAll(soci::session& s) std::uint32_t getKBUsedDB(soci::session& s) { + TRACE_FUNC(); // This function will have to be customized when other backends are added if (auto conn = getConnection(s)) { @@ -145,6 +155,7 @@ getKBUsedDB(soci::session& s) void convert(soci::blob& from, std::vector& to) { + TRACE_FUNC(); to.resize(from.get_len()); if (to.empty()) return; @@ -154,6 +165,7 @@ convert(soci::blob& from, std::vector& to) void convert(soci::blob& from, std::string& to) { + TRACE_FUNC(); std::vector tmp; convert(from, tmp); to.assign(tmp.begin(), tmp.end()); @@ -162,6 +174,7 @@ convert(soci::blob& from, std::string& to) void convert(std::vector const& from, soci::blob& to) { + TRACE_FUNC(); if (!from.empty()) { to.write(0, reinterpret_cast(&from[0]), from.size()); @@ -175,6 +188,7 @@ convert(std::vector const& from, soci::blob& to) void convert(std::string const& from, soci::blob& to) { + TRACE_FUNC(); if (!from.empty()) { to.write(0, from.data(), from.size()); @@ -209,6 +223,7 @@ public: , jobQueue_(q) , j_(registry.getJournal("WALCheckpointer")) { + TRACE_FUNC(); if (auto [conn, keepAlive] = getConnection(); conn) { (void)keepAlive; @@ -219,6 +234,7 @@ public: std::pair> getConnection() const { + TRACE_FUNC(); if (auto p = session_.lock()) { return {xrpl::getConnection(*p), p}; @@ -229,6 +245,7 @@ public: std::uintptr_t id() const override { + TRACE_FUNC(); return id_; } @@ -237,6 +254,7 @@ public: void schedule() override { + TRACE_FUNC(); { std::scoped_lock const lock(mutex_); if (running_) @@ -266,6 +284,7 @@ public: void checkpoint() override { + TRACE_FUNC(); auto [conn, keepAlive] = getConnection(); (void)keepAlive; if (conn == nullptr) @@ -305,6 +324,7 @@ protected: static int sqliteWALHook(void* cpId, sqlite_api::sqlite3* conn, char const* dbName, int walSize) { + TRACE_FUNC(); if (walSize >= gCheckpointPageCount) { if (auto checkpointer = checkpointerFromId(reinterpret_cast(cpId))) @@ -329,6 +349,7 @@ makeCheckpointer( JobQueue& queue, ServiceRegistry& registry) { + TRACE_FUNC(); return std::make_shared(id, std::move(session), queue, registry); } diff --git a/src/libxrpl/resource/Charge.cpp b/src/libxrpl/resource/Charge.cpp index e174c13522..c17d9def69 100644 --- a/src/libxrpl/resource/Charge.cpp +++ b/src/libxrpl/resource/Charge.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -15,18 +16,21 @@ Charge::Charge(value_type cost, std::string label) : cost_(cost), label_(std::mo std::string const& Charge::label() const { + TRACE_FUNC(); return label_; } Charge::value_type Charge::cost() const { + TRACE_FUNC(); return cost_; } std::string Charge::toString() const { + TRACE_FUNC(); std::stringstream ss; ss << label_ << " ($" << cost_ << ")"; return ss.str(); @@ -35,6 +39,7 @@ Charge::toString() const std::ostream& operator<<(std::ostream& os, Charge const& v) { + TRACE_FUNC(); os << v.toString(); return os; } @@ -42,18 +47,21 @@ operator<<(std::ostream& os, Charge const& v) bool Charge::operator==(Charge const& c) const { + TRACE_FUNC(); return c.cost_ == cost_; } std::strong_ordering Charge::operator<=>(Charge const& c) const { + TRACE_FUNC(); return cost_ <=> c.cost_; } Charge Charge::operator*(value_type m) const { + TRACE_FUNC(); return Charge(cost_ * m, label_); } diff --git a/src/libxrpl/resource/Consumer.cpp b/src/libxrpl/resource/Consumer.cpp index 58d5775a31..ce11056a2d 100644 --- a/src/libxrpl/resource/Consumer.cpp +++ b/src/libxrpl/resource/Consumer.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -24,6 +25,7 @@ Consumer::Consumer() : logic_(nullptr), entry_(nullptr) Consumer::Consumer(Consumer const& other) : logic_(other.logic_), entry_(nullptr) { + TRACE_FUNC(); if ((logic_ != nullptr) && (other.entry_ != nullptr)) { entry_ = other.entry_; @@ -33,6 +35,7 @@ Consumer::Consumer(Consumer const& other) : logic_(other.logic_), entry_(nullptr Consumer::~Consumer() { + TRACE_FUNC(); if ((logic_ != nullptr) && (entry_ != nullptr)) logic_->release(*entry_); } @@ -40,6 +43,7 @@ Consumer::~Consumer() Consumer& Consumer::operator=(Consumer const& other) { + TRACE_FUNC(); if (this == &other) return *this; @@ -60,6 +64,7 @@ Consumer::operator=(Consumer const& other) std::string Consumer::toString() const { + TRACE_FUNC(); if (logic_ == nullptr) return "(none)"; @@ -69,6 +74,7 @@ Consumer::toString() const bool Consumer::isUnlimited() const { + TRACE_FUNC(); if (entry_ != nullptr) return entry_->isUnlimited(); @@ -78,6 +84,7 @@ Consumer::isUnlimited() const Disposition Consumer::disposition() const { + TRACE_FUNC(); Disposition d = Disposition::Ok; if ((logic_ != nullptr) && (entry_ != nullptr)) d = logic_->charge(*entry_, Charge(0)); @@ -88,6 +95,7 @@ Consumer::disposition() const Disposition Consumer::charge(Charge const& what, std::string const& context) { + TRACE_FUNC(); Disposition d = Disposition::Ok; if ((logic_ != nullptr) && (entry_ != nullptr) && !entry_->isUnlimited()) @@ -99,6 +107,7 @@ Consumer::charge(Charge const& what, std::string const& context) bool Consumer::warn() { + TRACE_FUNC(); XRPL_ASSERT(entry_, "xrpl::Resource::Consumer::warn : non-null entry"); return logic_->warn(*entry_); } @@ -106,6 +115,7 @@ Consumer::warn() bool Consumer::disconnect(beast::Journal const& j) { + TRACE_FUNC(); XRPL_ASSERT(entry_, "xrpl::Resource::Consumer::disconnect : non-null entry"); bool const d = logic_->disconnect(*entry_); if (d) @@ -118,6 +128,7 @@ Consumer::disconnect(beast::Journal const& j) int Consumer::balance() { + TRACE_FUNC(); XRPL_ASSERT(entry_, "xrpl::Resource::Consumer::balance : non-null entry"); return logic_->balance(*entry_); } @@ -125,6 +136,7 @@ Consumer::balance() Entry& Consumer::entry() { + TRACE_FUNC(); XRPL_ASSERT(entry_, "xrpl::Resource::Consumer::entry : non-null entry"); return *entry_; } @@ -132,12 +144,14 @@ Consumer::entry() void Consumer::setPublicKey(PublicKey const& publicKey) { + TRACE_FUNC(); entry_->publicKey = publicKey; } std::ostream& operator<<(std::ostream& os, Consumer const& v) { + TRACE_FUNC(); os << v.toString(); return os; } diff --git a/src/libxrpl/resource/ResourceManager.cpp b/src/libxrpl/resource/ResourceManager.cpp index e3b4d9cc5c..7b4691cdf3 100644 --- a/src/libxrpl/resource/ResourceManager.cpp +++ b/src/libxrpl/resource/ResourceManager.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -39,6 +40,7 @@ public: ManagerImp(beast::insight::Collector::ptr const& collector, beast::Journal journal) : journal_(journal), logic_(collector, stopwatch(), journal) { + TRACE_FUNC(); thread_ = std::thread{&ManagerImp::run, this}; } @@ -49,6 +51,7 @@ public: ~ManagerImp() override { + TRACE_FUNC(); { std::scoped_lock const lock(mutex_); stop_ = true; @@ -60,6 +63,7 @@ public: Consumer newInboundEndpoint(beast::IP::Endpoint const& address) override { + TRACE_FUNC(); return logic_.newInboundEndpoint(address); } @@ -69,6 +73,7 @@ public: bool const proxy, std::string_view forwardedFor) override { + TRACE_FUNC(); if (!proxy) return newInboundEndpoint(address); @@ -87,24 +92,28 @@ public: Consumer newOutboundEndpoint(beast::IP::Endpoint const& address) override { + TRACE_FUNC(); return logic_.newOutboundEndpoint(address); } Consumer newUnlimitedEndpoint(beast::IP::Endpoint const& address) override { + TRACE_FUNC(); return logic_.newUnlimitedEndpoint(address); } Gossip exportConsumers() override { + TRACE_FUNC(); return logic_.exportConsumers(); } void importConsumers(std::string const& origin, Gossip const& gossip) override { + TRACE_FUNC(); logic_.importConsumers(origin, gossip); } @@ -113,12 +122,14 @@ public: json::Value getJson() override { + TRACE_FUNC(); return logic_.getJson(); } json::Value getJson(int threshold) override { + TRACE_FUNC(); return logic_.getJson(threshold); } @@ -127,6 +138,7 @@ public: void onWrite(beast::PropertyStream::Map& map) override { + TRACE_FUNC(); logic_.onWrite(map); } @@ -136,6 +148,7 @@ private: void run() { + TRACE_FUNC(); beast::setCurrentThreadName("Resource::Mngr"); for (;;) { @@ -161,6 +174,7 @@ Manager::~Manager() = default; std::unique_ptr makeManager(beast::insight::Collector::ptr const& collector, beast::Journal journal) { + TRACE_FUNC(); return std::make_unique(collector, journal); } diff --git a/src/libxrpl/server/InfoSub.cpp b/src/libxrpl/server/InfoSub.cpp index 87b48296a1..093ca60c35 100644 --- a/src/libxrpl/server/InfoSub.cpp +++ b/src/libxrpl/server/InfoSub.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,7 @@ InfoSub::InfoSub(Source& source, Consumer consumer) InfoSub::~InfoSub() { + TRACE_FUNC(); source_.unsubTransactions(seq_); source_.unsubRTTransactions(seq_); source_.unsubLedger(seq_); @@ -56,12 +58,14 @@ InfoSub::~InfoSub() Resource::Consumer& InfoSub::getConsumer() { + TRACE_FUNC(); return consumer_; } std::uint64_t InfoSub::getSeq() const { + TRACE_FUNC(); return seq_; } @@ -73,6 +77,7 @@ InfoSub::onSendEmpty() void InfoSub::insertSubAccountInfo(AccountID const& account, bool rt) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); if (rt) @@ -88,6 +93,7 @@ InfoSub::insertSubAccountInfo(AccountID const& account, bool rt) void InfoSub::deleteSubAccountInfo(AccountID const& account, bool rt) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); if (rt) @@ -103,6 +109,7 @@ InfoSub::deleteSubAccountInfo(AccountID const& account, bool rt) bool InfoSub::insertSubAccountHistory(AccountID const& account) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); return accountHistorySubscriptions_.insert(account).second; } @@ -110,6 +117,7 @@ InfoSub::insertSubAccountHistory(AccountID const& account) void InfoSub::deleteSubAccountHistory(AccountID const& account) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); accountHistorySubscriptions_.erase(account); } @@ -117,30 +125,35 @@ InfoSub::deleteSubAccountHistory(AccountID const& account) void InfoSub::clearRequest() { + TRACE_FUNC(); request_.reset(); } void InfoSub::setRequest(std::shared_ptr const& req) { + TRACE_FUNC(); request_ = req; } std::shared_ptr const& InfoSub::getRequest() { + TRACE_FUNC(); return request_; } void InfoSub::setApiVersion(unsigned int apiVersion) { + TRACE_FUNC(); apiVersion_ = apiVersion; } unsigned int InfoSub::getApiVersion() const noexcept { + TRACE_FUNC(); XRPL_ASSERT(apiVersion_ > 0, "xrpl::InfoSub::getApiVersion : valid API version"); return apiVersion_; } diff --git a/src/libxrpl/server/JSONRPCUtil.cpp b/src/libxrpl/server/JSONRPCUtil.cpp index f38ff280ac..82c1719c9e 100644 --- a/src/libxrpl/server/JSONRPCUtil.cpp +++ b/src/libxrpl/server/JSONRPCUtil.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -14,6 +15,7 @@ namespace xrpl { std::string getHTTPHeaderTimestamp() { + TRACE_FUNC(); // CHECKME This is probably called often enough that optimizing it makes // sense. There's no point in doing all this work if this function // gets called multiple times a second. @@ -33,6 +35,7 @@ getHTTPHeaderTimestamp() void httpReply(int nStatus, std::string const& content, json::Output const& output, beast::Journal j) { + TRACE_FUNC(); JLOG(j.trace()) << "HTTP Reply " << nStatus << " " << content; if (content.empty() && nStatus == 401) diff --git a/src/libxrpl/server/LoadFeeTrack.cpp b/src/libxrpl/server/LoadFeeTrack.cpp index 085e846145..b16bd027e9 100644 --- a/src/libxrpl/server/LoadFeeTrack.cpp +++ b/src/libxrpl/server/LoadFeeTrack.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -16,6 +17,7 @@ namespace xrpl { bool LoadFeeTrack::raiseLocalFee() { + TRACE_FUNC(); std::scoped_lock const sl(lock_); if (++raiseCount_ < 2) @@ -41,6 +43,7 @@ LoadFeeTrack::raiseLocalFee() bool LoadFeeTrack::lowerLocalFee() { + TRACE_FUNC(); std::scoped_lock const sl(lock_); std::uint32_t const origFee = localTxnLoadFee_; raiseCount_ = 0; @@ -63,6 +66,7 @@ LoadFeeTrack::lowerLocalFee() XRPAmount scaleFeeLoad(XRPAmount fee, LoadFeeTrack const& feeTrack, Fees const& fees, bool bUnlimited) { + TRACE_FUNC(); if (fee == 0) return fee; diff --git a/src/libxrpl/server/Manifest.cpp b/src/libxrpl/server/Manifest.cpp index fd38d02d6b..dc959b9b90 100644 --- a/src/libxrpl/server/Manifest.cpp +++ b/src/libxrpl/server/Manifest.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -44,6 +45,7 @@ namespace xrpl { std::string to_string(Manifest const& m) { + TRACE_FUNC(); auto const mk = toBase58(TokenType::NodePublic, m.masterKey); if (m.revoked()) @@ -59,6 +61,7 @@ to_string(Manifest const& m) std::optional deserializeManifest(Slice s, beast::Journal journal) { + TRACE_FUNC(); if (s.empty()) return std::nullopt; @@ -171,6 +174,7 @@ template Stream& logMftAct(Stream& s, std::string const& action, PublicKey const& pk, std::uint32_t seq) { + TRACE_FUNC(); s << "Manifest: " << action << ";Pk: " << toBase58(TokenType::NodePublic, pk) << ";Seq: " << seq << ";"; return s; @@ -185,6 +189,7 @@ logMftAct( std::uint32_t seq, std::uint32_t oldSeq) { + TRACE_FUNC(); s << "Manifest: " << action << ";Pk: " << toBase58(TokenType::NodePublic, pk) << ";Seq: " << seq << ";OldSeq: " << oldSeq << ";"; return s; @@ -193,6 +198,7 @@ logMftAct( bool Manifest::verify() const { + TRACE_FUNC(); STObject st(kSF_GENERIC); SerialIter sit(serialized.data(), serialized.size()); st.set(sit); @@ -213,6 +219,7 @@ Manifest::verify() const uint256 Manifest::hash() const { + TRACE_FUNC(); STObject st(kSF_GENERIC); SerialIter sit(serialized.data(), serialized.size()); st.set(sit); @@ -222,6 +229,7 @@ Manifest::hash() const bool Manifest::revoked() const { + TRACE_FUNC(); /* The maximum possible sequence number means that the master key has been revoked. @@ -232,6 +240,7 @@ Manifest::revoked() const bool Manifest::revoked(std::uint32_t sequence) { + TRACE_FUNC(); // The maximum possible sequence number means that the master key has // been revoked. return sequence == std::numeric_limits::max(); @@ -240,6 +249,7 @@ Manifest::revoked(std::uint32_t sequence) std::optional Manifest::getSignature() const { + TRACE_FUNC(); STObject st(kSF_GENERIC); SerialIter sit(serialized.data(), serialized.size()); st.set(sit); @@ -251,6 +261,7 @@ Manifest::getSignature() const Blob Manifest::getMasterSignature() const { + TRACE_FUNC(); STObject st(kSF_GENERIC); SerialIter sit(serialized.data(), serialized.size()); st.set(sit); @@ -260,6 +271,7 @@ Manifest::getMasterSignature() const std::optional loadValidatorToken(std::vector const& blob, beast::Journal journal) { + TRACE_FUNC(); try { std::string tokenStr; @@ -308,6 +320,7 @@ loadValidatorToken(std::vector const& blob, beast::Journal journal) std::optional ManifestCache::getSigningKey(PublicKey const& pk) const { + TRACE_FUNC(); std::shared_lock const lock{mutex_}; auto const iter = map_.find(pk); @@ -320,6 +333,7 @@ ManifestCache::getSigningKey(PublicKey const& pk) const PublicKey ManifestCache::getMasterKey(PublicKey const& pk) const { + TRACE_FUNC(); std::shared_lock const lock{mutex_}; if (auto const iter = signingToMasterKeys_.find(pk); iter != signingToMasterKeys_.end()) @@ -331,6 +345,7 @@ ManifestCache::getMasterKey(PublicKey const& pk) const std::optional ManifestCache::getSequence(PublicKey const& pk) const { + TRACE_FUNC(); std::shared_lock const lock{mutex_}; auto const iter = map_.find(pk); @@ -343,6 +358,7 @@ ManifestCache::getSequence(PublicKey const& pk) const std::optional ManifestCache::getDomain(PublicKey const& pk) const { + TRACE_FUNC(); std::shared_lock const lock{mutex_}; auto const iter = map_.find(pk); @@ -355,6 +371,7 @@ ManifestCache::getDomain(PublicKey const& pk) const std::optional ManifestCache::getManifest(PublicKey const& pk) const { + TRACE_FUNC(); std::shared_lock const lock{mutex_}; auto const iter = map_.find(pk); @@ -367,6 +384,7 @@ ManifestCache::getManifest(PublicKey const& pk) const bool ManifestCache::revoked(PublicKey const& pk) const { + TRACE_FUNC(); std::shared_lock const lock{mutex_}; auto const iter = map_.find(pk); @@ -379,6 +397,7 @@ ManifestCache::revoked(PublicKey const& pk) const ManifestDisposition ManifestCache::applyManifest(Manifest m) { + TRACE_FUNC(); // Check the manifest against the conditions that do not require a // `unique_lock` (write lock) on the `mutex_`. Since the signature can be // relatively expensive, the `checkSignature` parameter determines if the @@ -536,6 +555,7 @@ ManifestCache::applyManifest(Manifest m) void ManifestCache::load(DatabaseCon& dbCon, std::string const& dbTable) { + TRACE_FUNC(); auto db = dbCon.checkoutDb(); xrpl::getManifests(*db, dbTable, *this, j_); } @@ -547,6 +567,7 @@ ManifestCache::load( std::string const& configManifest, std::vector const& configRevocation) { + TRACE_FUNC(); load(dbCon, dbTable); if (!configManifest.empty()) @@ -601,6 +622,7 @@ ManifestCache::save( std::string const& dbTable, std::function const& isTrusted) { + TRACE_FUNC(); std::shared_lock const lock{mutex_}; auto db = dbCon.checkoutDb(); diff --git a/src/libxrpl/server/Port.cpp b/src/libxrpl/server/Port.cpp index 228b65df43..86c4edc8d0 100644 --- a/src/libxrpl/server/Port.cpp +++ b/src/libxrpl/server/Port.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,7 @@ namespace xrpl { bool Port::secure() const { + TRACE_FUNC(); return protocol.count("peer") > 0 || protocol.count("https") > 0 || protocol.count("wss") > 0 || protocol.count("wss2") > 0; } @@ -33,6 +35,7 @@ Port::secure() const std::string Port::protocols() const { + TRACE_FUNC(); std::string s; for (auto iter = protocol.cbegin(); iter != protocol.cend(); ++iter) s += (iter != protocol.cbegin() ? "," : "") + *iter; @@ -42,6 +45,7 @@ Port::protocols() const std::ostream& operator<<(std::ostream& os, Port const& p) { + TRACE_FUNC(); os << "'" << p.name << "' (ip=" << p.ip << ":" << p.port << ", "; if (!p.admin_nets_v4.empty() || !p.admin_nets_v6.empty()) @@ -88,6 +92,7 @@ populate( std::vector& nets4, std::vector& nets6) { + TRACE_FUNC(); auto const optResult = section.get(field); if (!optResult) return; @@ -193,6 +198,7 @@ populate( void parsePort(ParsedPort& port, Section const& section, std::ostream& log) { + TRACE_FUNC(); port.name = section.name(); { auto const optResult = section.get("ip"); diff --git a/src/libxrpl/server/State.cpp b/src/libxrpl/server/State.cpp index 3d2ed37e98..f87d62fb71 100644 --- a/src/libxrpl/server/State.cpp +++ b/src/libxrpl/server/State.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -20,6 +21,7 @@ namespace xrpl { void initStateDB(soci::session& session, BasicConfig const& config, std::string const& dbName) { + TRACE_FUNC(); open(session, config, dbName); session << "PRAGMA synchronous=FULL;"; @@ -69,6 +71,7 @@ initStateDB(soci::session& session, BasicConfig const& config, std::string const LedgerIndex getCanDelete(soci::session& session) { + TRACE_FUNC(); LedgerIndex seq = 0; session << "SELECT CanDeleteSeq FROM CanDelete WHERE Key = 1;", soci::into(seq); ; @@ -78,6 +81,7 @@ getCanDelete(soci::session& session) LedgerIndex setCanDelete(soci::session& session, LedgerIndex canDelete) { + TRACE_FUNC(); session << "UPDATE CanDelete SET CanDeleteSeq = :canDelete WHERE Key = 1;", soci::use(canDelete); return canDelete; @@ -86,6 +90,7 @@ setCanDelete(soci::session& session, LedgerIndex canDelete) SavedState getSavedState(soci::session& session) { + TRACE_FUNC(); SavedState state; session << "SELECT WritableDb, ArchiveDb, LastRotatedLedger" " FROM DbState WHERE Key = 1;", @@ -97,6 +102,7 @@ getSavedState(soci::session& session) void setSavedState(soci::session& session, SavedState const& state) { + TRACE_FUNC(); session << "UPDATE DbState" " SET WritableDb = :writableDb," " ArchiveDb = :archiveDb," @@ -108,6 +114,7 @@ setSavedState(soci::session& session, SavedState const& state) void setLastRotated(soci::session& session, LedgerIndex seq) { + TRACE_FUNC(); session << "UPDATE DbState SET LastRotatedLedger = :seq" " WHERE Key = 1;", soci::use(seq); diff --git a/src/libxrpl/server/Vacuum.cpp b/src/libxrpl/server/Vacuum.cpp index 140ef04def..601b61946b 100644 --- a/src/libxrpl/server/Vacuum.cpp +++ b/src/libxrpl/server/Vacuum.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -20,6 +21,7 @@ namespace xrpl { bool doVacuumDB(DatabaseCon::Setup const& setup, beast::Journal j) { + TRACE_FUNC(); boost::filesystem::path const dbPath = setup.dataDir / kTX_DB_NAME; uintmax_t const dbSize = file_size(dbPath); diff --git a/src/libxrpl/server/Wallet.cpp b/src/libxrpl/server/Wallet.cpp index ee579c7b9f..af9a16be91 100644 --- a/src/libxrpl/server/Wallet.cpp +++ b/src/libxrpl/server/Wallet.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -38,6 +39,7 @@ namespace xrpl { std::unique_ptr makeWalletDB(DatabaseCon::Setup const& setup, beast::Journal j) { + TRACE_FUNC(); // wallet database return std::make_unique( setup, kWALLET_DB_NAME, std::array(), kWALLET_DB_INIT, j); @@ -46,6 +48,7 @@ makeWalletDB(DatabaseCon::Setup const& setup, beast::Journal j) std::unique_ptr makeTestWalletDB(DatabaseCon::Setup const& setup, std::string const& dbname, beast::Journal j) { + TRACE_FUNC(); // wallet database return std::make_unique( setup, dbname.data(), std::array(), kWALLET_DB_INIT, j); @@ -58,6 +61,7 @@ getManifests( ManifestCache& cache, beast::Journal j) { + TRACE_FUNC(); // Load manifests stored in database std::string const sql = "SELECT RawData FROM " + dbTable + ";"; soci::blob sociRawData(session); @@ -87,6 +91,7 @@ getManifests( static void saveManifest(soci::session& session, std::string const& dbTable, std::string const& serialized) { + TRACE_FUNC(); // soci does not support bulk insertion of blob data // Do not reuse blob because manifest ecdsa signatures vary in length // but blob write length is expected to be >= the last write @@ -103,6 +108,7 @@ saveManifests( hash_map const& map, beast::Journal j) { + TRACE_FUNC(); soci::transaction tr(session); session << "DELETE FROM " << dbTable; for (auto const& v : map) @@ -123,6 +129,7 @@ saveManifests( void addValidatorManifest(soci::session& session, std::string const& serialized) { + TRACE_FUNC(); soci::transaction tr(session); saveManifest(session, "ValidatorManifests", serialized); tr.commit(); @@ -131,12 +138,14 @@ addValidatorManifest(soci::session& session, std::string const& serialized) void clearNodeIdentity(soci::session& session) { + TRACE_FUNC(); session << "DELETE FROM NodeIdentity;"; } std::pair getNodeIdentity(soci::session& session) { + TRACE_FUNC(); { // SOCI requires boost::optional (not std::optional) as the parameter. boost::optional pubKO, priKO; @@ -172,6 +181,7 @@ getNodeIdentity(soci::session& session) std::unordered_set, KeyEqual> getPeerReservationTable(soci::session& session, beast::Journal j) { + TRACE_FUNC(); std::unordered_set, KeyEqual> table; // These values must be boost::optionals (not std) because SOCI expects // boost::optionals. @@ -210,6 +220,7 @@ insertPeerReservation( PublicKey const& nodeId, std::string const& description) { + TRACE_FUNC(); auto const sNodeId = toBase58(TokenType::NodePublic, nodeId); session << "INSERT INTO PeerReservations (PublicKey, Description) " "VALUES (:nodeId, :desc) " @@ -221,6 +232,7 @@ insertPeerReservation( void deletePeerReservation(soci::session& session, PublicKey const& nodeId) { + TRACE_FUNC(); auto const sNodeId = toBase58(TokenType::NodePublic, nodeId); session << "DELETE FROM PeerReservations WHERE PublicKey = :nodeId", soci::use(sNodeId); } @@ -228,6 +240,7 @@ deletePeerReservation(soci::session& session, PublicKey const& nodeId) bool createFeatureVotes(soci::session& session) { + TRACE_FUNC(); soci::transaction tr(session); std::string const sql = "SELECT count(*) FROM sqlite_master " @@ -257,6 +270,7 @@ readAmendments( boost::optional amendmentName, boost::optional vote)> const& callback) { + TRACE_FUNC(); // lambda that converts the internally stored int to an AmendmentVote. auto intToVote = [](boost::optional const& dbVote) -> boost::optional { return safeCast(dbVote.value_or(1)); @@ -291,6 +305,7 @@ voteAmendment( std::string const& name, AmendmentVote vote) { + TRACE_FUNC(); soci::transaction tr(session); std::string sql = "INSERT INTO FeatureVotes (AmendmentHash, AmendmentName, Veto) VALUES " diff --git a/src/libxrpl/shamap/SHAMap.cpp b/src/libxrpl/shamap/SHAMap.cpp index 795c097118..0f24cba498 100644 --- a/src/libxrpl/shamap/SHAMap.cpp +++ b/src/libxrpl/shamap/SHAMap.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -43,6 +44,7 @@ namespace xrpl { [[nodiscard]] intr_ptr::SharedPtr makeTypedLeaf(SHAMapNodeType type, boost::intrusive_ptr item, std::uint32_t owner) { + TRACE_FUNC(); if (type == SHAMapNodeType::TnTransactionNm) return intr_ptr::makeShared(std::move(item), owner); @@ -60,6 +62,7 @@ makeTypedLeaf(SHAMapNodeType type, boost::intrusive_ptr item, SHAMap::SHAMap(SHAMapType t, Family& f) : f_(f), journal_(f.journal()), state_(SHAMapState::Modifying), type_(t) { + TRACE_FUNC(); root_ = intr_ptr::makeShared(cowid_); } @@ -70,6 +73,7 @@ SHAMap::SHAMap(SHAMapType t, Family& f) SHAMap::SHAMap(SHAMapType t, uint256 const& hash, Family& f) : f_(f), journal_(f.journal()), state_(SHAMapState::Synching), type_(t) { + TRACE_FUNC(); root_ = intr_ptr::makeShared(cowid_); } @@ -83,6 +87,7 @@ SHAMap::SHAMap(SHAMap const& other, bool isMutable) , type_(other.type_) , backed_(other.backed_) { + TRACE_FUNC(); // If either map may change, they cannot share nodes if ((state_ != SHAMapState::Immutable) || (other.state_ != SHAMapState::Immutable)) { @@ -93,6 +98,7 @@ SHAMap::SHAMap(SHAMap const& other, bool isMutable) std::shared_ptr SHAMap::snapShot(bool isMutable) const { + TRACE_FUNC(); return std::make_shared(*this, isMutable); } @@ -102,6 +108,7 @@ SHAMap::dirtyUp( uint256 const& target, intr_ptr::SharedPtr child) { + TRACE_FUNC(); // walk the tree up from through the inner nodes to the root_ // update hashes and links // stack is a path of inner nodes up to, but not including, child @@ -132,6 +139,7 @@ SHAMap::dirtyUp( SHAMapLeafNode* SHAMap::walkTowardsKey(uint256 const& id, SharedPtrNodeStack* stack) const { + TRACE_FUNC(); XRPL_ASSERT( stack == nullptr || stack->empty(), "xrpl::SHAMap::walkTowardsKey : empty stack input"); auto inNode = root_; @@ -159,6 +167,7 @@ SHAMap::walkTowardsKey(uint256 const& id, SharedPtrNodeStack* stack) const SHAMapLeafNode* SHAMap::findKey(uint256 const& id) const { + TRACE_FUNC(); SHAMapLeafNode* leaf = walkTowardsKey(id); // NOLINT(misc-const-correctness) if ((leaf != nullptr) && leaf->peekItem()->key() != id) leaf = nullptr; @@ -168,6 +177,7 @@ SHAMap::findKey(uint256 const& id) const intr_ptr::SharedPtr SHAMap::fetchNodeFromDB(SHAMapHash const& hash) const { + TRACE_FUNC(); XRPL_ASSERT(backed_, "xrpl::SHAMap::fetchNodeFromDB : is backed"); auto obj = f_.db().fetchNodeObject(hash.asUint256(), ledgerSeq_); return finishFetch(hash, obj); @@ -176,6 +186,7 @@ SHAMap::fetchNodeFromDB(SHAMapHash const& hash) const intr_ptr::SharedPtr SHAMap::finishFetch(SHAMapHash const& hash, std::shared_ptr const& object) const { + TRACE_FUNC(); XRPL_ASSERT(backed_, "xrpl::SHAMap::finishFetch : is backed"); try @@ -211,6 +222,7 @@ SHAMap::finishFetch(SHAMapHash const& hash, std::shared_ptr const& o intr_ptr::SharedPtr SHAMap::checkFilter(SHAMapHash const& hash, SHAMapSyncFilter* filter) const { + TRACE_FUNC(); if (auto nodeData = filter->getNode(hash)) { try @@ -237,6 +249,7 @@ SHAMap::checkFilter(SHAMapHash const& hash, SHAMapSyncFilter* filter) const intr_ptr::SharedPtr SHAMap::fetchNodeNT(SHAMapHash const& hash, SHAMapSyncFilter* filter) const { + TRACE_FUNC(); auto node = cacheLookup(hash); if (node) return node; @@ -260,6 +273,7 @@ SHAMap::fetchNodeNT(SHAMapHash const& hash, SHAMapSyncFilter* filter) const intr_ptr::SharedPtr SHAMap::fetchNodeNT(SHAMapHash const& hash) const { + TRACE_FUNC(); auto node = cacheLookup(hash); if (!node && backed_) @@ -272,6 +286,7 @@ SHAMap::fetchNodeNT(SHAMapHash const& hash) const intr_ptr::SharedPtr SHAMap::fetchNode(SHAMapHash const& hash) const { + TRACE_FUNC(); auto node = fetchNodeNT(hash); if (!node) @@ -283,6 +298,7 @@ SHAMap::fetchNode(SHAMapHash const& hash) const SHAMapTreeNode* SHAMap::descendThrow(SHAMapInnerNode* parent, int branch) const { + TRACE_FUNC(); SHAMapTreeNode* ret = descend(parent, branch); // NOLINT(misc-const-correctness) if ((ret == nullptr) && !parent->isEmptyBranch(branch)) @@ -294,6 +310,7 @@ SHAMap::descendThrow(SHAMapInnerNode* parent, int branch) const intr_ptr::SharedPtr SHAMap::descendThrow(SHAMapInnerNode& parent, int branch) const { + TRACE_FUNC(); intr_ptr::SharedPtr ret = descend(parent, branch); if (!ret && !parent.isEmptyBranch(branch)) @@ -305,6 +322,7 @@ SHAMap::descendThrow(SHAMapInnerNode& parent, int branch) const SHAMapTreeNode* SHAMap::descend(SHAMapInnerNode* parent, int branch) const { + TRACE_FUNC(); SHAMapTreeNode* ret = parent->getChildPointer(branch); // NOLINT(misc-const-correctness) if ((ret != nullptr) || !backed_) return ret; @@ -320,6 +338,7 @@ SHAMap::descend(SHAMapInnerNode* parent, int branch) const intr_ptr::SharedPtr SHAMap::descend(SHAMapInnerNode& parent, int branch) const { + TRACE_FUNC(); intr_ptr::SharedPtr node = parent.getChild(branch); if (node || !backed_) return node; @@ -337,6 +356,7 @@ SHAMap::descend(SHAMapInnerNode& parent, int branch) const intr_ptr::SharedPtr SHAMap::descendNoStore(SHAMapInnerNode& parent, int branch) const { + TRACE_FUNC(); intr_ptr::SharedPtr ret = parent.getChild(branch); if (!ret && backed_) ret = fetchNode(parent.getChildHash(branch)); @@ -350,6 +370,7 @@ SHAMap::descend( int branch, SHAMapSyncFilter* filter) const { + TRACE_FUNC(); XRPL_ASSERT(parent->isInner(), "xrpl::SHAMap::descend : valid parent input"); XRPL_ASSERT( (branch >= 0) && (branch < kBRANCH_FACTOR), "xrpl::SHAMap::descend : valid branch input"); @@ -381,6 +402,7 @@ SHAMap::descendAsync( bool& pending, descendCallback&& callback) const { + TRACE_FUNC(); pending = false; SHAMapTreeNode* ret = parent->getChildPointer(branch); // NOLINT(misc-const-correctness) @@ -419,6 +441,7 @@ template intr_ptr::SharedPtr SHAMap::unshareNode(intr_ptr::SharedPtr node, SHAMapNodeID const& nodeID) { + TRACE_FUNC(); // make sure the node is suitable for the intended operation (copy on write) XRPL_ASSERT(node->cowid() <= cowid_, "xrpl::SHAMap::unshareNode : node valid for cowid"); if (node->cowid() != cowid_) @@ -439,6 +462,7 @@ SHAMap::belowHelper( int branch, std::tuple, std::function> const& loopParams) const { + TRACE_FUNC(); auto& [init, cmp, incr] = loopParams; if (node->isLeaf()) { @@ -482,6 +506,7 @@ SHAMapLeafNode* SHAMap::lastBelow(intr_ptr::SharedPtr node, SharedPtrNodeStack& stack, int branch) const { + TRACE_FUNC(); auto init = kBRANCH_FACTOR - 1; auto cmp = [](int i) { return i >= 0; }; auto incr = [](int& i) { --i; }; @@ -492,6 +517,7 @@ SHAMapLeafNode* SHAMap::firstBelow(intr_ptr::SharedPtr node, SharedPtrNodeStack& stack, int branch) const { + TRACE_FUNC(); auto init = 0; auto cmp = [](int i) { return i <= kBRANCH_FACTOR; }; auto incr = [](int& i) { ++i; }; @@ -503,6 +529,7 @@ static boost::intrusive_ptr const kNO_ITEM; boost::intrusive_ptr const& SHAMap::onlyBelow(SHAMapTreeNode* node) const { + TRACE_FUNC(); // If there is only one item below this node, return it while (!node->isLeaf()) @@ -542,6 +569,7 @@ SHAMap::onlyBelow(SHAMapTreeNode* node) const SHAMapLeafNode const* SHAMap::peekFirstItem(SharedPtrNodeStack& stack) const { + TRACE_FUNC(); XRPL_ASSERT(stack.empty(), "xrpl::SHAMap::peekFirstItem : empty stack input"); SHAMapLeafNode const* node = firstBelow(root_, stack); if (node == nullptr) @@ -556,6 +584,7 @@ SHAMap::peekFirstItem(SharedPtrNodeStack& stack) const SHAMapLeafNode const* SHAMap::peekNextItem(uint256 const& id, SharedPtrNodeStack& stack) const { + TRACE_FUNC(); XRPL_ASSERT(!stack.empty(), "xrpl::SHAMap::peekNextItem : non-empty stack input"); XRPL_ASSERT(stack.top().first->isLeaf(), "xrpl::SHAMap::peekNextItem : stack starts with leaf"); stack.pop(); @@ -585,6 +614,7 @@ SHAMap::peekNextItem(uint256 const& id, SharedPtrNodeStack& stack) const boost::intrusive_ptr const& SHAMap::peekItem(uint256 const& id) const { + TRACE_FUNC(); SHAMapLeafNode const* leaf = findKey(id); if (leaf == nullptr) @@ -596,6 +626,7 @@ SHAMap::peekItem(uint256 const& id) const boost::intrusive_ptr const& SHAMap::peekItem(uint256 const& id, SHAMapHash& hash) const { + TRACE_FUNC(); SHAMapLeafNode const* leaf = findKey(id); if (leaf == nullptr) @@ -608,6 +639,7 @@ SHAMap::peekItem(uint256 const& id, SHAMapHash& hash) const SHAMap::ConstIterator SHAMap::upperBound(uint256 const& id) const { + TRACE_FUNC(); SharedPtrNodeStack stack; walkTowardsKey(id, &stack); while (!stack.empty()) @@ -641,6 +673,7 @@ SHAMap::upperBound(uint256 const& id) const SHAMap::ConstIterator SHAMap::lowerBound(uint256 const& id) const { + TRACE_FUNC(); SharedPtrNodeStack stack; walkTowardsKey(id, &stack); while (!stack.empty()) @@ -676,12 +709,14 @@ SHAMap::lowerBound(uint256 const& id) const bool SHAMap::hasItem(uint256 const& id) const { + TRACE_FUNC(); return (findKey(id) != nullptr); } bool SHAMap::delItem(uint256 const& id) { + TRACE_FUNC(); // delete the item with this ID XRPL_ASSERT(state_ != SHAMapState::Immutable, "xrpl::SHAMap::delItem : not immutable"); @@ -767,6 +802,7 @@ SHAMap::delItem(uint256 const& id) bool SHAMap::addGiveItem(SHAMapNodeType type, boost::intrusive_ptr item) { + TRACE_FUNC(); XRPL_ASSERT(state_ != SHAMapState::Immutable, "xrpl::SHAMap::addGiveItem : not immutable"); XRPL_ASSERT(type != SHAMapNodeType::TnInner, "xrpl::SHAMap::addGiveItem : valid type input"); @@ -836,12 +872,14 @@ SHAMap::addGiveItem(SHAMapNodeType type, boost::intrusive_ptr bool SHAMap::addItem(SHAMapNodeType type, boost::intrusive_ptr item) { + TRACE_FUNC(); return addGiveItem(type, std::move(item)); } SHAMapHash SHAMap::getHash() const { + TRACE_FUNC(); auto hash = root_->getHash(); if (hash.isZero()) { @@ -854,6 +892,7 @@ SHAMap::getHash() const bool SHAMap::updateGiveItem(SHAMapNodeType type, boost::intrusive_ptr item) { + TRACE_FUNC(); // can't change the tag but can change the hash uint256 const tag = item->key(); @@ -894,6 +933,7 @@ SHAMap::updateGiveItem(SHAMapNodeType type, boost::intrusive_ptrgetHash()) return true; @@ -940,6 +980,7 @@ SHAMap::fetchRoot(SHAMapHash const& hash, SHAMapSyncFilter* filter) intr_ptr::SharedPtr SHAMap::writeNode(NodeObjectType t, intr_ptr::SharedPtr node) const { + TRACE_FUNC(); XRPL_ASSERT(node->cowid() == 0, "xrpl::SHAMap::writeNode : valid input node"); XRPL_ASSERT(backed_, "xrpl::SHAMap::writeNode : is backed"); @@ -958,6 +999,7 @@ template intr_ptr::SharedPtr SHAMap::preFlushNode(intr_ptr::SharedPtr node) const { + TRACE_FUNC(); // A shared node should never need to be flushed // because that would imply someone modified it XRPL_ASSERT(node->cowid(), "xrpl::SHAMap::preFlushNode : valid input node"); @@ -974,6 +1016,7 @@ SHAMap::preFlushNode(intr_ptr::SharedPtr node) const int SHAMap::unshare() { + TRACE_FUNC(); // Don't share nodes with parent map return walkSubTree(false, NodeObjectType::Unknown); } @@ -981,6 +1024,7 @@ SHAMap::unshare() int SHAMap::flushDirty(NodeObjectType t) { + TRACE_FUNC(); // We only write back if this map is backed. return walkSubTree(backed_, t); } @@ -988,6 +1032,7 @@ SHAMap::flushDirty(NodeObjectType t) int SHAMap::walkSubTree(bool doWrite, NodeObjectType t) { + TRACE_FUNC(); XRPL_ASSERT(!doWrite || backed_, "xrpl::SHAMap::walkSubTree : valid input"); int flushed = 0; @@ -1111,6 +1156,7 @@ SHAMap::walkSubTree(bool doWrite, NodeObjectType t) void SHAMap::dump(bool hash) const { + TRACE_FUNC(); int leafCount = 0; JLOG(journal_.info()) << " MAP Contains"; @@ -1158,6 +1204,7 @@ SHAMap::dump(bool hash) const intr_ptr::SharedPtr SHAMap::cacheLookup(SHAMapHash const& hash) const { + TRACE_FUNC(); auto ret = f_.getTreeNodeCache()->fetch(hash.asUint256()); XRPL_ASSERT(!ret || !ret->cowid(), "xrpl::SHAMap::cacheLookup : not found or zero cowid"); return ret; @@ -1166,6 +1213,7 @@ SHAMap::cacheLookup(SHAMapHash const& hash) const void SHAMap::canonicalize(SHAMapHash const& hash, intr_ptr::SharedPtr& node) const { + TRACE_FUNC(); XRPL_ASSERT(backed_, "xrpl::SHAMap::canonicalize : is backed"); XRPL_ASSERT(node->cowid() == 0, "xrpl::SHAMap::canonicalize : valid node input"); XRPL_ASSERT(node->getHash() == hash, "xrpl::SHAMap::canonicalize : node hash do match"); @@ -1176,6 +1224,7 @@ SHAMap::canonicalize(SHAMapHash const& hash, intr_ptr::SharedPtr void SHAMap::invariants() const { + TRACE_FUNC(); (void)getHash(); // update node hashes auto node = root_.get(); XRPL_ASSERT(node, "xrpl::SHAMap::invariants : non-null root node"); diff --git a/src/libxrpl/shamap/SHAMapDelta.cpp b/src/libxrpl/shamap/SHAMapDelta.cpp index b1aeac18e8..a211a1422e 100644 --- a/src/libxrpl/shamap/SHAMapDelta.cpp +++ b/src/libxrpl/shamap/SHAMapDelta.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -38,6 +39,7 @@ SHAMap::walkBranch( Delta& differences, int& maxCount) const { + TRACE_FUNC(); // Walk a branch of a SHAMap that's matched by an empty branch or single // item in the other map std::stack> nodeStack; @@ -129,6 +131,7 @@ SHAMap::walkBranch( bool SHAMap::compare(SHAMap const& otherMap, Delta& differences, int maxCount) const { + TRACE_FUNC(); // compare two hash trees, add up to maxCount differences to the difference // table return value: true=complete table of differences given, false=too // many differences throws on corrupt tables or missing nodes CAUTION: @@ -244,6 +247,7 @@ SHAMap::compare(SHAMap const& otherMap, Delta& differences, int maxCount) const void SHAMap::walkMap(std::vector& missingNodes, int maxMissing) const { + TRACE_FUNC(); if (!root_->isInner()) // root_ is only node, and we have it return; @@ -282,6 +286,7 @@ SHAMap::walkMap(std::vector& missingNodes, int maxMissing) co bool SHAMap::walkMapParallel(std::vector& missingNodes, int maxMissing) const { + TRACE_FUNC(); if (!root_->isInner()) // root_ is only node, and we have it return false; diff --git a/src/libxrpl/shamap/SHAMapInnerNode.cpp b/src/libxrpl/shamap/SHAMapInnerNode.cpp index a0adc10a61..cf6c8f45a9 100644 --- a/src/libxrpl/shamap/SHAMapInnerNode.cpp +++ b/src/libxrpl/shamap/SHAMapInnerNode.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,7 @@ SHAMapInnerNode::~SHAMapInnerNode() = default; void SHAMapInnerNode::partialDestructor() { + TRACE_FUNC(); intr_ptr::SharedPtr* children = nullptr; // structured bindings can't be captured in c++ 17; use tie instead std::tie(std::ignore, std::ignore, children) = hashesAndChildren_.getHashesAndChildren(); @@ -47,6 +49,7 @@ template void SHAMapInnerNode::iterChildren(F&& f) const { + TRACE_FUNC(); hashesAndChildren_.iterChildren(isBranch_, std::forward(f)); } @@ -54,24 +57,28 @@ template void SHAMapInnerNode::iterNonEmptyChildIndexes(F&& f) const { + TRACE_FUNC(); hashesAndChildren_.iterNonEmptyChildIndexes(isBranch_, std::forward(f)); } void SHAMapInnerNode::resizeChildArrays(std::uint8_t toAllocate) { + TRACE_FUNC(); hashesAndChildren_ = TaggedPointer(std::move(hashesAndChildren_), isBranch_, toAllocate); } std::optional SHAMapInnerNode::getChildIndex(int i) const { + TRACE_FUNC(); return hashesAndChildren_.getChildIndex(isBranch_, i); } intr_ptr::SharedPtr SHAMapInnerNode::clone(std::uint32_t cowid) const { + TRACE_FUNC(); auto const branchCount = getBranchCount(); auto const thisIsSparse = !hashesAndChildren_.isDense(); auto p = intr_ptr::makeShared(cowid, branchCount); @@ -121,6 +128,7 @@ SHAMapInnerNode::clone(std::uint32_t cowid) const intr_ptr::SharedPtr SHAMapInnerNode::makeFullInner(Slice data, SHAMapHash const& hash, bool hashValid) { + TRACE_FUNC(); // A full inner node is serialized as 16 256-bit hashes, back to back: if (data.size() != kBRANCH_FACTOR * uint256::kBYTES) Throw("Invalid FI node"); @@ -156,6 +164,7 @@ SHAMapInnerNode::makeFullInner(Slice data, SHAMapHash const& hash, bool hashVali intr_ptr::SharedPtr SHAMapInnerNode::makeCompressedInner(Slice data) { + TRACE_FUNC(); // A compressed inner node is serialized as a series of 33 byte chunks, // representing a one byte "position" and a 256-bit hash: constexpr std::size_t kCHUNK_SIZE = uint256::kBYTES + 1; @@ -191,6 +200,7 @@ SHAMapInnerNode::makeCompressedInner(Slice data) void SHAMapInnerNode::updateHash() { + TRACE_FUNC(); uint256 nh; if (isBranch_ != 0) { @@ -206,6 +216,7 @@ SHAMapInnerNode::updateHash() void SHAMapInnerNode::updateHashDeep() { + TRACE_FUNC(); SHAMapHash* hashes = nullptr; intr_ptr::SharedPtr* children = nullptr; // structured bindings can't be captured in c++ 17; use tie instead @@ -220,6 +231,7 @@ SHAMapInnerNode::updateHashDeep() void SHAMapInnerNode::serializeForWire(Serializer& s) const { + TRACE_FUNC(); XRPL_ASSERT(!isEmpty(), "xrpl::SHAMapInnerNode::serializeForWire : is non-empty"); // If the node is sparse, then only send non-empty branches: @@ -243,6 +255,7 @@ SHAMapInnerNode::serializeForWire(Serializer& s) const void SHAMapInnerNode::serializeWithPrefix(Serializer& s) const { + TRACE_FUNC(); XRPL_ASSERT(!isEmpty(), "xrpl::SHAMapInnerNode::serializeWithPrefix : is non-empty"); s.add32(HashPrefix::InnerNode); @@ -252,6 +265,7 @@ SHAMapInnerNode::serializeWithPrefix(Serializer& s) const std::string SHAMapInnerNode::getString(SHAMapNodeID const& id) const { + TRACE_FUNC(); std::string ret = SHAMapTreeNode::getString(id); auto hashes = hashesAndChildren_.getHashes(); iterNonEmptyChildIndexes([&](auto branchNum, auto indexNum) { @@ -267,6 +281,7 @@ SHAMapInnerNode::getString(SHAMapNodeID const& id) const void SHAMapInnerNode::setChild(int m, intr_ptr::SharedPtr child) { + TRACE_FUNC(); XRPL_ASSERT( (m >= 0) && (m < kBRANCH_FACTOR), "xrpl::SHAMapInnerNode::setChild : valid branch input"); XRPL_ASSERT(cowid_, "xrpl::SHAMapInnerNode::setChild : nonzero cowid"); @@ -309,6 +324,7 @@ SHAMapInnerNode::setChild(int m, intr_ptr::SharedPtr child) void SHAMapInnerNode::shareChild(int m, intr_ptr::SharedPtr const& child) { + TRACE_FUNC(); XRPL_ASSERT( (m >= 0) && (m < kBRANCH_FACTOR), "xrpl::SHAMapInnerNode::shareChild : valid branch input"); XRPL_ASSERT(cowid_, "xrpl::SHAMapInnerNode::shareChild : nonzero cowid"); @@ -323,6 +339,7 @@ SHAMapInnerNode::shareChild(int m, intr_ptr::SharedPtr const& ch SHAMapTreeNode* SHAMapInnerNode::getChildPointer(int branch) { + TRACE_FUNC(); XRPL_ASSERT( branch >= 0 && branch < kBRANCH_FACTOR, "xrpl::SHAMapInnerNode::getChildPointer : valid branch input"); @@ -340,6 +357,7 @@ SHAMapInnerNode::getChildPointer(int branch) intr_ptr::SharedPtr SHAMapInnerNode::getChild(int branch) { + TRACE_FUNC(); XRPL_ASSERT( branch >= 0 && branch < kBRANCH_FACTOR, "xrpl::SHAMapInnerNode::getChild : valid branch input"); @@ -356,6 +374,7 @@ SHAMapInnerNode::getChild(int branch) SHAMapHash const& SHAMapInnerNode::getChildHash(int m) const { + TRACE_FUNC(); XRPL_ASSERT( (m >= 0) && (m < kBRANCH_FACTOR), "xrpl::SHAMapInnerNode::getChildHash : valid branch input"); @@ -368,6 +387,7 @@ SHAMapInnerNode::getChildHash(int m) const intr_ptr::SharedPtr SHAMapInnerNode::canonicalizeChild(int branch, intr_ptr::SharedPtr node) { + TRACE_FUNC(); XRPL_ASSERT( branch >= 0 && branch < kBRANCH_FACTOR, "xrpl::SHAMapInnerNode::canonicalizeChild : valid branch input"); @@ -402,6 +422,7 @@ SHAMapInnerNode::canonicalizeChild(int branch, intr_ptr::SharedPtr #include #include +#include #include @@ -18,6 +19,7 @@ namespace xrpl { SHAMapLeafNode::SHAMapLeafNode(boost::intrusive_ptr item, std::uint32_t cowid) : SHAMapTreeNode(cowid), item_(std::move(item)) { + TRACE_FUNC(); XRPL_ASSERT( item_->size() >= 12, "xrpl::SHAMapLeafNode::SHAMapLeafNode(boost::intrusive_ptr<" @@ -30,6 +32,7 @@ SHAMapLeafNode::SHAMapLeafNode( SHAMapHash const& hash) : SHAMapTreeNode(cowid, hash), item_(std::move(item)) { + TRACE_FUNC(); XRPL_ASSERT( item_->size() >= 12, "xrpl::SHAMapLeafNode::SHAMapLeafNode(boost::intrusive_ptr<" @@ -40,12 +43,14 @@ SHAMapLeafNode::SHAMapLeafNode( boost::intrusive_ptr const& SHAMapLeafNode::peekItem() const { + TRACE_FUNC(); return item_; } bool SHAMapLeafNode::setItem(boost::intrusive_ptr item) { + TRACE_FUNC(); XRPL_ASSERT(cowid_, "xrpl::SHAMapLeafNode::setItem : nonzero cowid"); item_ = std::move(item); @@ -59,6 +64,7 @@ SHAMapLeafNode::setItem(boost::intrusive_ptr item) std::string SHAMapLeafNode::getString(SHAMapNodeID const& id) const { + TRACE_FUNC(); std::string ret = SHAMapTreeNode::getString(id); auto const type = getType(); @@ -92,6 +98,7 @@ SHAMapLeafNode::getString(SHAMapNodeID const& id) const void SHAMapLeafNode::invariants(bool) const { + TRACE_FUNC(); XRPL_ASSERT(hash_.isNonZero(), "xrpl::SHAMapLeafNode::invariants : nonzero hash"); XRPL_ASSERT(item_, "xrpl::SHAMapLeafNode::invariants : non-null item"); } diff --git a/src/libxrpl/shamap/SHAMapNodeID.cpp b/src/libxrpl/shamap/SHAMapNodeID.cpp index f7caf8ae02..1f60ffd01c 100644 --- a/src/libxrpl/shamap/SHAMapNodeID.cpp +++ b/src/libxrpl/shamap/SHAMapNodeID.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -16,6 +17,7 @@ namespace xrpl { static uint256 const& depthMask(unsigned int depth) { + TRACE_FUNC(); // Need to be named before converting // NOLINTNEXTLINE(cppcoreguidelines-use-enum-class) enum { MaskSize = 65 }; @@ -45,6 +47,7 @@ depthMask(unsigned int depth) // canonicalize the hash to a node ID for this depth SHAMapNodeID::SHAMapNodeID(unsigned int depth, uint256 const& hash) : id_(hash), depth_(depth) { + TRACE_FUNC(); XRPL_ASSERT( depth <= SHAMap::kLEAF_DEPTH, "xrpl::SHAMapNodeID::SHAMapNodeID : maximum depth input"); XRPL_ASSERT( @@ -55,6 +58,7 @@ SHAMapNodeID::SHAMapNodeID(unsigned int depth, uint256 const& hash) : id_(hash), std::string SHAMapNodeID::getRawString() const { + TRACE_FUNC(); Serializer s(33); s.addBitString(id_); s.add8(depth_); @@ -64,6 +68,7 @@ SHAMapNodeID::getRawString() const SHAMapNodeID SHAMapNodeID::getChildNodeID(unsigned int m) const { + TRACE_FUNC(); XRPL_ASSERT( m < SHAMap::kBRANCH_FACTOR, "xrpl::SHAMapNodeID::getChildNodeID : valid branch input"); @@ -92,6 +97,7 @@ SHAMapNodeID::getChildNodeID(unsigned int m) const [[nodiscard]] std::optional deserializeSHAMapNodeID(void const* data, std::size_t size) { + TRACE_FUNC(); std::optional ret; if (size == 33) @@ -112,6 +118,7 @@ deserializeSHAMapNodeID(void const* data, std::size_t size) [[nodiscard]] unsigned int selectBranch(SHAMapNodeID const& id, uint256 const& hash) { + TRACE_FUNC(); auto const depth = id.getDepth(); auto branch = static_cast(*(hash.begin() + (depth / 2))); @@ -131,6 +138,7 @@ selectBranch(SHAMapNodeID const& id, uint256 const& hash) SHAMapNodeID SHAMapNodeID::createID(int depth, uint256 const& key) { + TRACE_FUNC(); XRPL_ASSERT((depth >= 0) && (depth < 65), "xrpl::SHAMapNodeID::createID : valid branch input"); return SHAMapNodeID(depth, key & depthMask(depth)); } diff --git a/src/libxrpl/shamap/SHAMapSync.cpp b/src/libxrpl/shamap/SHAMapSync.cpp index 348928f863..f33c8a6fea 100644 --- a/src/libxrpl/shamap/SHAMapSync.cpp +++ b/src/libxrpl/shamap/SHAMapSync.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include @@ -36,6 +37,7 @@ SHAMap::visitLeaves( std::function const& item)> const& leafFunction) const { + TRACE_FUNC(); visitNodes([&leafFunction](SHAMapTreeNode& node) { if (!node.isInner()) leafFunction(safeDowncast(node).peekItem()); @@ -46,6 +48,7 @@ SHAMap::visitLeaves( void SHAMap::visitNodes(std::function const& function) const { + TRACE_FUNC(); if (!root_) return; @@ -110,6 +113,7 @@ SHAMap::visitDifferences( SHAMap const* have, std::function const& function) const { + TRACE_FUNC(); // Visit every node in this SHAMap that is not present // in the specified SHAMap if (!root_) @@ -177,6 +181,7 @@ SHAMap::visitDifferences( void SHAMap::gmnProcessNodes(MissingNodes& mn, MissingNodes::StackEntry& se) { + TRACE_FUNC(); SHAMapInnerNode*& node = std::get<0>(se); SHAMapNodeID& nodeID = std::get<1>(se); int& firstChild = std::get<2>(se); @@ -262,6 +267,7 @@ SHAMap::gmnProcessNodes(MissingNodes& mn, MissingNodes::StackEntry& se) void SHAMap::gmnProcessDeferredReads(MissingNodes& mn) { + TRACE_FUNC(); // Process all deferred reads int complete = 0; while (complete != mn.deferred) @@ -309,6 +315,7 @@ SHAMap::gmnProcessDeferredReads(MissingNodes& mn) std::vector> SHAMap::getMissingNodes(int max, SHAMapSyncFilter* filter) { + TRACE_FUNC(); XRPL_ASSERT(root_->getHash().isNonZero(), "xrpl::SHAMap::getMissingNodes : nonzero root hash"); XRPL_ASSERT(max > 0, "xrpl::SHAMap::getMissingNodes : valid max input"); @@ -419,6 +426,7 @@ SHAMap::getNodeFat( bool fatLeaves, std::uint32_t depth) const { + TRACE_FUNC(); // Gets a node and some of its children // to a specified depth @@ -505,12 +513,14 @@ SHAMap::getNodeFat( void SHAMap::serializeRoot(Serializer& s) const { + TRACE_FUNC(); root_->serializeForWire(s); } SHAMapAddNode SHAMap::addRootNode(SHAMapHash const& hash, Slice const& rootNode, SHAMapSyncFilter* filter) { + TRACE_FUNC(); // we already have a root_ node if (root_->getHash().isNonZero()) { @@ -546,6 +556,7 @@ SHAMap::addRootNode(SHAMapHash const& hash, Slice const& rootNode, SHAMapSyncFil SHAMapAddNode SHAMap::addKnownNode(SHAMapNodeID const& node, Slice const& rawNode, SHAMapSyncFilter* filter) { + TRACE_FUNC(); XRPL_ASSERT(!node.isRoot(), "xrpl::SHAMap::addKnownNode : valid node input"); if (!isSynching()) @@ -656,6 +667,7 @@ SHAMap::addKnownNode(SHAMapNodeID const& node, Slice const& rawNode, SHAMapSyncF bool SHAMap::deepCompare(SHAMap& other) const { + TRACE_FUNC(); // Intended for debug/test only std::stack> stack; @@ -727,6 +739,7 @@ SHAMap::deepCompare(SHAMap& other) const bool SHAMap::hasInnerNode(SHAMapNodeID const& targetNodeID, SHAMapHash const& targetNodeHash) const { + TRACE_FUNC(); auto node = root_.get(); SHAMapNodeID nodeID; @@ -749,6 +762,7 @@ SHAMap::hasInnerNode(SHAMapNodeID const& targetNodeID, SHAMapHash const& targetN bool SHAMap::hasLeafNode(uint256 const& tag, SHAMapHash const& targetNodeHash) const { + TRACE_FUNC(); auto node = root_.get(); SHAMapNodeID nodeID; @@ -776,6 +790,7 @@ SHAMap::hasLeafNode(uint256 const& tag, SHAMapHash const& targetNodeHash) const std::optional> SHAMap::getProofPath(uint256 const& key) const { + TRACE_FUNC(); SharedPtrNodeStack stack; walkTowardsKey(key, &stack); @@ -809,6 +824,7 @@ SHAMap::getProofPath(uint256 const& key) const bool SHAMap::verifyProofPath(uint256 const& rootHash, uint256 const& key, std::vector const& path) { + TRACE_FUNC(); if (path.empty() || path.size() > 65) return false; diff --git a/src/libxrpl/shamap/SHAMapTreeNode.cpp b/src/libxrpl/shamap/SHAMapTreeNode.cpp index ac405f3286..713d9336ce 100644 --- a/src/libxrpl/shamap/SHAMapTreeNode.cpp +++ b/src/libxrpl/shamap/SHAMapTreeNode.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,7 @@ namespace xrpl { intr_ptr::SharedPtr SHAMapTreeNode::makeTransaction(Slice data, SHAMapHash const& hash, bool hashValid) { + TRACE_FUNC(); auto item = makeShamapitem(sha512Half(HashPrefix::TransactionId, data), data); if (hashValid) @@ -39,6 +41,7 @@ SHAMapTreeNode::makeTransaction(Slice data, SHAMapHash const& hash, bool hashVal intr_ptr::SharedPtr SHAMapTreeNode::makeTransactionWithMeta(Slice data, SHAMapHash const& hash, bool hashValid) { + TRACE_FUNC(); Serializer s(data.data(), data.size()); uint256 tag; @@ -63,6 +66,7 @@ SHAMapTreeNode::makeTransactionWithMeta(Slice data, SHAMapHash const& hash, bool intr_ptr::SharedPtr SHAMapTreeNode::makeAccountState(Slice data, SHAMapHash const& hash, bool hashValid) { + TRACE_FUNC(); Serializer s(data.data(), data.size()); uint256 tag; @@ -90,6 +94,7 @@ SHAMapTreeNode::makeAccountState(Slice data, SHAMapHash const& hash, bool hashVa intr_ptr::SharedPtr SHAMapTreeNode::makeFromWire(Slice rawNode) { + TRACE_FUNC(); if (rawNode.empty()) return {}; @@ -121,6 +126,7 @@ SHAMapTreeNode::makeFromWire(Slice rawNode) intr_ptr::SharedPtr SHAMapTreeNode::makeFromPrefix(Slice rawNode, SHAMapHash const& hash) { + TRACE_FUNC(); if (rawNode.size() < 4) Throw("prefix: short node"); @@ -154,6 +160,7 @@ SHAMapTreeNode::makeFromPrefix(Slice rawNode, SHAMapHash const& hash) std::string SHAMapTreeNode::getString(SHAMapNodeID const& id) const { + TRACE_FUNC(); return to_string(id); } diff --git a/src/libxrpl/tx/ApplyContext.cpp b/src/libxrpl/tx/ApplyContext.cpp index 94d35cf5d9..c29b2fc7da 100644 --- a/src/libxrpl/tx/ApplyContext.cpp +++ b/src/libxrpl/tx/ApplyContext.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -43,6 +44,7 @@ ApplyContext::ApplyContext( , flags_(flags) , parentBatchId_(parentBatchId) { + TRACE_FUNC(); XRPL_ASSERT( parentBatchId.has_value() == ((flags_ & TapBatch) == TapBatch), "Parent Batch ID should be set if batch apply flag is set"); @@ -52,12 +54,14 @@ ApplyContext::ApplyContext( void ApplyContext::discard() { + TRACE_FUNC(); view_.emplace(&base_, flags_); } std::optional ApplyContext::apply(TER ter) { + TRACE_FUNC(); // NOLINTNEXTLINE(bugprone-unchecked-optional-access) view_ emplaced in constructor return view_->apply(base_, tx, ter, parentBatchId_, (flags_ & TapDryRun) != 0u, journal); } @@ -65,6 +69,7 @@ ApplyContext::apply(TER ter) std::size_t ApplyContext::size() { + TRACE_FUNC(); return view_->size(); // NOLINT(bugprone-unchecked-optional-access) } @@ -76,12 +81,14 @@ ApplyContext::visit( std::shared_ptr const&, std::shared_ptr const&)> const& func) { + TRACE_FUNC(); view_->visit(base_, func); // NOLINT(bugprone-unchecked-optional-access) } TER ApplyContext::failInvariantCheck(TER const result) { + TRACE_FUNC(); // If we already failed invariant checks before and we are now attempting to // only charge a fee, and even that fails the invariant checks something is // very wrong. We switch to tefINVARIANT_FAILED, which does NOT get included @@ -99,6 +106,7 @@ ApplyContext::checkInvariantsHelper( XRPAmount const fee, std::index_sequence) { + TRACE_FUNC(); try { auto checkers = getInvariantChecks(); @@ -144,6 +152,7 @@ ApplyContext::checkInvariantsHelper( TER ApplyContext::checkInvariants(TER const result, XRPAmount const fee) { + TRACE_FUNC(); XRPL_ASSERT( isTesSuccess(result) || isTecClaim(result), "xrpl::ApplyContext::checkInvariants : is tesSUCCESS or tecCLAIM"); diff --git a/src/libxrpl/tx/SignerEntries.cpp b/src/libxrpl/tx/SignerEntries.cpp index d425c86ca6..66e5f32d76 100644 --- a/src/libxrpl/tx/SignerEntries.cpp +++ b/src/libxrpl/tx/SignerEntries.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -21,6 +22,7 @@ namespace xrpl { Expected, NotTEC> SignerEntries::deserialize(STObject const& obj, beast::Journal journal, std::string_view annotation) { + TRACE_FUNC(); if (!obj.isFieldPresent(sfSignerEntries)) { JLOG(journal.trace()) << "Malformed " << annotation << ": Need signer entry array."; diff --git a/src/libxrpl/tx/Transactor.cpp b/src/libxrpl/tx/Transactor.cpp index 79dec33c66..5d7d6e80da 100644 --- a/src/libxrpl/tx/Transactor.cpp +++ b/src/libxrpl/tx/Transactor.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -56,6 +57,7 @@ namespace xrpl { NotTEC preflight0(PreflightContext const& ctx, std::uint32_t flagMask) { + TRACE_FUNC(); if (isPseudoTx(ctx.tx) && ctx.tx.isFlag(tfInnerBatchTxn)) { JLOG(ctx.j.warn()) << "Pseudo transactions cannot contain the " @@ -114,6 +116,7 @@ namespace detail { NotTEC preflightCheckSigningKey(STObject const& sigObject, beast::Journal j) { + TRACE_FUNC(); if (auto const spk = sigObject.getFieldVL(sfSigningPubKey); !spk.empty() && !publicKeyType(makeSlice(spk))) { @@ -126,6 +129,7 @@ preflightCheckSigningKey(STObject const& sigObject, beast::Journal j) std::optional preflightCheckSimulateKeys(ApplyFlags flags, STObject const& sigObject, beast::Journal j) { + TRACE_FUNC(); if ((flags & TapDryRun) != 0u) // simulation { std::optional const signature = sigObject[~sfTxnSignature]; @@ -169,6 +173,7 @@ preflightCheckSimulateKeys(ApplyFlags flags, STObject const& sigObject, beast::J NotTEC Transactor::preflight1(PreflightContext const& ctx, std::uint32_t flagMask) { + TRACE_FUNC(); if (ctx.tx.isFieldPresent(sfDelegate)) { if (!ctx.rules.enabled(featurePermissionDelegationV1_1)) @@ -223,6 +228,7 @@ Transactor::preflight1(PreflightContext const& ctx, std::uint32_t flagMask) NotTEC Transactor::preflight2(PreflightContext const& ctx) { + TRACE_FUNC(); if (auto const ret = detail::preflightCheckSimulateKeys(ctx.flags, ctx.tx, ctx.j)) { // Skips following checks if the transaction is being simulated, @@ -269,6 +275,7 @@ Transactor::Transactor(ApplyContext& ctx) bool Transactor::validDataLength(std::optional const& slice, std::size_t maxLength) { + TRACE_FUNC(); if (!slice) return true; return !slice->empty() && slice->length() <= maxLength; @@ -277,18 +284,21 @@ Transactor::validDataLength(std::optional const& slice, std::size_t maxLe std::uint32_t Transactor::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfUniversalMask; } NotTEC Transactor::preflightSigValidated(PreflightContext const& ctx) { + TRACE_FUNC(); return tesSUCCESS; } NotTEC Transactor::checkPermission(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); auto const delegate = tx[~sfDelegate]; if (!delegate) return tesSUCCESS; @@ -305,6 +315,7 @@ Transactor::checkPermission(ReadView const& view, STTx const& tx) XRPAmount Transactor::calculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); // Returns the fee in fee units. // The computation has two parts: @@ -324,6 +335,7 @@ Transactor::calculateBaseFee(ReadView const& view, STTx const& tx) XRPAmount Transactor::calculateOwnerReserveFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); // Assumption: One reserve increment is typically much greater than one base // fee. // This check is in an assert so that it will come to the attention of @@ -348,12 +360,14 @@ Transactor::minimumFee( Fees const& fees, ApplyFlags flags) { + TRACE_FUNC(); return scaleFeeLoad(baseFee, registry.getFeeTrack(), fees, (flags & TapUnlimited) != 0u); } TER Transactor::checkFee(PreclaimContext const& ctx, XRPAmount baseFee) { + TRACE_FUNC(); if (!ctx.tx[sfFee].native()) return temBAD_FEE; @@ -421,6 +435,7 @@ Transactor::checkFee(PreclaimContext const& ctx, XRPAmount baseFee) TER Transactor::payFee() { + TRACE_FUNC(); auto const feePaid = ctx_.tx[sfFee].xrp(); auto const feePayer = ctx_.tx.getFeePayer(); @@ -441,6 +456,7 @@ Transactor::payFee() NotTEC Transactor::checkSeqProxy(ReadView const& view, STTx const& tx, beast::Journal j) { + TRACE_FUNC(); auto const id = tx.getAccountID(sfAccount); auto const sle = view.read(keylet::account(id)); @@ -506,6 +522,7 @@ Transactor::checkSeqProxy(ReadView const& view, STTx const& tx, beast::Journal j NotTEC Transactor::checkPriorTxAndLastLedger(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const id = ctx.tx.getAccountID(sfAccount); auto const sle = ctx.view.read(keylet::account(id)); @@ -534,6 +551,7 @@ Transactor::checkPriorTxAndLastLedger(PreclaimContext const& ctx) TER Transactor::consumeSeqProxy(SLE::pointer const& sleAccount) { + TRACE_FUNC(); XRPL_ASSERT(sleAccount, "xrpl::Transactor::consumeSeqProxy : non-null account"); SeqProxy const seqProx = ctx_.tx.getSeqProxy(); if (seqProx.isSeq()) @@ -555,6 +573,7 @@ Transactor::ticketDelete( uint256 const& ticketIndex, beast::Journal j) { + TRACE_FUNC(); // Delete the Ticket, adjust the account root ticket count, and // reduce the owner count. SLE::pointer const sleTicket = view.peek(keylet::kTICKET(ticketIndex)); @@ -617,12 +636,14 @@ Transactor::ticketDelete( void Transactor::preCompute() { + TRACE_FUNC(); XRPL_ASSERT(account_ != beast::kZERO, "xrpl::Transactor::preCompute : nonzero account"); } TER Transactor::apply() { + TRACE_FUNC(); preCompute(); // If the transactor requires a valid account and the transaction doesn't @@ -665,6 +686,7 @@ Transactor::checkSign( STObject const& sigObject, beast::Journal const j) { + TRACE_FUNC(); { auto const sle = view.read(keylet::account(idAccount)); @@ -725,6 +747,7 @@ Transactor::checkSign( NotTEC Transactor::checkSign(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const idAccount = ctx.tx.isFieldPresent(sfDelegate) ? ctx.tx.getAccountID(sfDelegate) : ctx.tx.getAccountID(sfAccount); return checkSign(ctx.view, ctx.flags, ctx.parentBatchId, idAccount, ctx.tx, ctx.j); @@ -733,6 +756,7 @@ Transactor::checkSign(PreclaimContext const& ctx) NotTEC Transactor::checkBatchSign(PreclaimContext const& ctx) { + TRACE_FUNC(); NotTEC ret = tesSUCCESS; STArray const& signers{ctx.tx.getFieldArray(sfBatchSigners)}; for (auto const& signer : signers) @@ -782,6 +806,7 @@ Transactor::checkSingleSign( std::shared_ptr sleAccount, beast::Journal const j) { + TRACE_FUNC(); bool const isMasterDisabled = sleAccount->isFlag(lsfDisableMaster); // Signed with regular key. @@ -814,6 +839,7 @@ Transactor::checkMultiSign( STObject const& sigObject, beast::Journal const j) { + TRACE_FUNC(); // Get id's SignerList and Quorum. std::shared_ptr const sleAccountSigners = view.read(keylet::signers(id)); // If the signer list doesn't exist the account is not multi-signing. @@ -971,6 +997,7 @@ Transactor::checkMultiSign( static void removeUnfundedOffers(ApplyView& view, std::vector const& offers, beast::Journal viewJ) { + TRACE_FUNC(); int removed = 0; for (auto const& index : offers) @@ -991,6 +1018,7 @@ removeExpiredNFTokenOffers( std::vector const& offers, beast::Journal viewJ) { + TRACE_FUNC(); std::size_t removed = 0; for (auto const& index : offers) @@ -1007,6 +1035,7 @@ removeExpiredNFTokenOffers( static void removeExpiredCredentials(ApplyView& view, std::vector const& creds, beast::Journal viewJ) { + TRACE_FUNC(); for (auto const& index : creds) { if (auto const sle = view.peek(keylet::credential(index))) @@ -1020,6 +1049,7 @@ removeDeletedTrustLines( std::vector const& trustLines, beast::Journal viewJ) { + TRACE_FUNC(); if (trustLines.size() > kMAX_DELETABLE_AMM_TRUST_LINES) { JLOG(viewJ.error()) << "removeDeletedTrustLines: deleted trustlines exceed max " @@ -1040,6 +1070,7 @@ removeDeletedTrustLines( static void removeDeletedMPTs(ApplyView& view, std::vector const& mpts, beast::Journal viewJ) { + TRACE_FUNC(); // There could be at most two MPTs - one for each side of AMM pool if (mpts.size() > 2) { @@ -1065,6 +1096,7 @@ removeDeletedMPTs(ApplyView& view, std::vector const& mpts, beast::Jour std::pair Transactor::reset(XRPAmount fee) { + TRACE_FUNC(); ctx_.discard(); auto const txnAcct = view().peek(keylet::account(ctx_.tx.getAccountID(sfAccount))); @@ -1116,12 +1148,14 @@ Transactor::reset(XRPAmount fee) void Transactor::trapTransaction(uint256 txHash) const { + TRACE_FUNC(); JLOG(j_.debug()) << "Transaction trapped: " << txHash; } [[nodiscard]] TER Transactor::checkTransactionInvariants(TER result, XRPAmount fee) { + TRACE_FUNC(); try { // Phase 1: visit modified entries @@ -1156,6 +1190,7 @@ Transactor::checkTransactionInvariants(TER result, XRPAmount fee) [[nodiscard]] TER Transactor::checkInvariants(TER result, XRPAmount fee) { + TRACE_FUNC(); // Transaction invariants first (more specific). These check post-conditions of the specific // transaction. If these fail, the transaction's core logic is wrong. auto const txResult = checkTransactionInvariants(result, fee); @@ -1176,6 +1211,7 @@ Transactor::checkInvariants(TER result, XRPAmount fee) ApplyResult Transactor::operator()() { + TRACE_FUNC(); JLOG(j_.trace()) << "apply: " << ctx_.tx.getTransactionID(); // These global updates really should have been for every Transaction diff --git a/src/libxrpl/tx/apply.cpp b/src/libxrpl/tx/apply.cpp index 228d15778f..049a80330b 100644 --- a/src/libxrpl/tx/apply.cpp +++ b/src/libxrpl/tx/apply.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,7 @@ constexpr HashRouterFlags kSF_LOCALGOOD = HashRouterFlags::PRIVATE4; // Local c std::pair checkValidity(HashRouter& router, STTx const& tx, Rules const& rules) { + TRACE_FUNC(); auto const id = tx.getTransactionID(); auto const flags = router.getFlags(id); @@ -112,6 +114,7 @@ checkValidity(HashRouter& router, STTx const& tx, Rules const& rules) void forceValidity(HashRouter& router, uint256 const& txid, Validity validity) { + TRACE_FUNC(); HashRouterFlags flags = HashRouterFlags::UNDEFINED; switch (validity) { @@ -133,6 +136,7 @@ template ApplyResult apply(ServiceRegistry& registry, OpenView& view, PreflightChecks&& preflightChecks) { + TRACE_FUNC(); NumberSO const stNumberSO{view.rules().enabled(fixUniversalNumber)}; return doApply(preclaim(preflightChecks(), registry, view), registry, view); } @@ -140,6 +144,7 @@ apply(ServiceRegistry& registry, OpenView& view, PreflightChecks&& preflightChec ApplyResult apply(ServiceRegistry& registry, OpenView& view, STTx const& tx, ApplyFlags flags, beast::Journal j) { + TRACE_FUNC(); return apply( registry, view, [&]() mutable { return preflight(registry, view.rules(), tx, flags, j); }); } @@ -153,6 +158,7 @@ apply( ApplyFlags flags, beast::Journal j) { + TRACE_FUNC(); return apply(registry, view, [&]() mutable { return preflight(registry, view.rules(), parentBatchId, tx, flags, j); }); @@ -165,6 +171,7 @@ applyBatchTransactions( STTx const& batchTxn, beast::Journal j) { + TRACE_FUNC(); XRPL_ASSERT( batchTxn.getTxnType() == ttBATCH && !batchTxn.getFieldArray(sfRawTransactions).empty(), "Batch transaction missing sfRawTransactions"); @@ -229,6 +236,7 @@ applyTransaction( ApplyFlags flags, beast::Journal j) { + TRACE_FUNC(); // Returns false if the transaction has need not be retried. if (retryAssured) flags = flags | TapRetry; diff --git a/src/libxrpl/tx/applySteps.cpp b/src/libxrpl/tx/applySteps.cpp index 7833341808..dd2cb0c61b 100644 --- a/src/libxrpl/tx/applySteps.cpp +++ b/src/libxrpl/tx/applySteps.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -58,6 +59,7 @@ template auto withTxnType(Rules const& rules, TxType txnType, F&& f) { + TRACE_FUNC(); // These global updates really should have been for every Transaction // step: preflight, preclaim, calculateBaseFee, and doApply. Unfortunately, // they were only included in doApply (via Transactor::operator()). That may @@ -121,6 +123,7 @@ template TxConsequences consequencesHelper(PreflightContext const& ctx) { + TRACE_FUNC(); return TxConsequences(ctx.tx); }; @@ -130,6 +133,7 @@ template TxConsequences consequencesHelper(PreflightContext const& ctx) { + TRACE_FUNC(); return TxConsequences(ctx.tx, TxConsequences::Category::Blocker); }; @@ -139,12 +143,14 @@ template TxConsequences consequencesHelper(PreflightContext const& ctx) { + TRACE_FUNC(); return T::makeTxConsequences(ctx); }; static std::pair invokePreflight(PreflightContext const& ctx) { + TRACE_FUNC(); try { return withTxnType(ctx.rules, ctx.tx.getTxnType(), [&]() { @@ -167,6 +173,7 @@ invokePreflight(PreflightContext const& ctx) static TER invokePreclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); try { // use name hiding to accomplish compile-time polymorphism of static @@ -242,6 +249,7 @@ invokePreclaim(PreclaimContext const& ctx) static XRPAmount invokeCalculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); try { return withTxnType(view.rules(), tx.getTxnType(), [&]() { @@ -264,6 +272,7 @@ TxConsequences::TxConsequences(NotTEC pfResult) , seqProx_(SeqProxy::sequence(0)) , sequencesConsumed_(0) { + TRACE_FUNC(); XRPL_ASSERT( !isTesSuccess(pfResult), "xrpl::TxConsequences::TxConsequences : is not tesSUCCESS"); } @@ -279,22 +288,26 @@ TxConsequences::TxConsequences(STTx const& tx) TxConsequences::TxConsequences(STTx const& tx, Category category) : TxConsequences(tx) { + TRACE_FUNC(); isBlocker_ = (category == TxConsequences::Category::Blocker); } TxConsequences::TxConsequences(STTx const& tx, XRPAmount potentialSpend) : TxConsequences(tx) { + TRACE_FUNC(); potentialSpend_ = potentialSpend; } TxConsequences::TxConsequences(STTx const& tx, std::uint32_t sequencesConsumed) : TxConsequences(tx) { + TRACE_FUNC(); sequencesConsumed_ = sequencesConsumed; } static ApplyResult invokeApply(ApplyContext& ctx) { + TRACE_FUNC(); try { return withTxnType(ctx.view().rules(), ctx.tx.getTxnType(), [&]() { @@ -319,6 +332,7 @@ invokeApply(ApplyContext& ctx) std::unique_ptr makeTransactor(ApplyContext& ctx) { + TRACE_FUNC(); return withTxnType( ctx.view().rules(), ctx.tx.getTxnType(), [&]() -> std::unique_ptr { return std::make_unique(ctx); @@ -333,6 +347,7 @@ preflight( ApplyFlags flags, beast::Journal j) { + TRACE_FUNC(); PreflightContext const pfCtx(registry, tx, rules, flags, j); try { @@ -354,6 +369,7 @@ preflight( ApplyFlags flags, beast::Journal j) { + TRACE_FUNC(); PreflightContext const pfCtx(registry, tx, parentBatchId, rules, flags, j); try { @@ -369,6 +385,7 @@ preflight( PreclaimResult preclaim(PreflightResult const& preflightResult, ServiceRegistry& registry, OpenView const& view) { + TRACE_FUNC(); std::optional ctx; if (preflightResult.rules != view.rules()) { @@ -429,18 +446,21 @@ preclaim(PreflightResult const& preflightResult, ServiceRegistry& registry, Open XRPAmount calculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); return invokeCalculateBaseFee(view, tx); } XRPAmount calculateDefaultBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); return Transactor::calculateBaseFee(view, tx); } ApplyResult doApply(PreclaimResult const& preclaimResult, ServiceRegistry& registry, OpenView& view) { + TRACE_FUNC(); if (preclaimResult.view.seq() != view.seq()) { // Logic error from the caller. Don't have enough diff --git a/src/libxrpl/tx/invariants/AMMInvariant.cpp b/src/libxrpl/tx/invariants/AMMInvariant.cpp index 6469799eb6..b990ab48b0 100644 --- a/src/libxrpl/tx/invariants/AMMInvariant.cpp +++ b/src/libxrpl/tx/invariants/AMMInvariant.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,7 @@ ValidAMM::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (isDelete) return; @@ -68,6 +70,7 @@ validBalances( STAmount const& lptAMMBalance, ValidAMM::ZeroAllowed zeroAllowed) { + TRACE_FUNC(); bool const positive = amount > beast::kZERO && amount2 > beast::kZERO && lptAMMBalance > beast::kZERO; if (zeroAllowed == ValidAMM::ZeroAllowed::Yes) @@ -81,6 +84,7 @@ validBalances( bool ValidAMM::finalizeVote(bool enforce, beast::Journal const& j) const { + TRACE_FUNC(); if (lptAMMBalanceAfter_ != lptAMMBalanceBefore_ || ammPoolChanged_) { // LPTokens and the pool can not change on vote @@ -99,6 +103,7 @@ ValidAMM::finalizeVote(bool enforce, beast::Journal const& j) const bool ValidAMM::finalizeBid(bool enforce, beast::Journal const& j) const { + TRACE_FUNC(); if (ammPoolChanged_) { // The pool can not change on bid @@ -131,6 +136,7 @@ ValidAMM::finalizeCreate( bool enforce, beast::Journal const& j) const { + TRACE_FUNC(); if (!ammAccount_) { // LCOV_EXCL_START @@ -171,6 +177,7 @@ ValidAMM::finalizeCreate( bool ValidAMM::finalizeDelete(bool enforce, TER res, beast::Journal const& j) const { + TRACE_FUNC(); if (ammAccount_) { // LCOV_EXCL_START @@ -188,6 +195,7 @@ ValidAMM::finalizeDelete(bool enforce, TER res, beast::Journal const& j) const bool ValidAMM::finalizeDEX(bool enforce, beast::Journal const& j) const { + TRACE_FUNC(); if (ammAccount_) { // LCOV_EXCL_START @@ -207,6 +215,7 @@ ValidAMM::generalInvariant( ZeroAllowed zeroAllowed, beast::Journal const& j) const { + TRACE_FUNC(); // NOLINTBEGIN(bugprone-unchecked-optional-access) ammAccount_ and lptAMMBalanceAfter_ set // together in visitEntry; callers only invoke this inside else-of-if(!ammAccount_) auto const [amount, amount2] = ammPoolHolds( @@ -253,6 +262,7 @@ ValidAMM::finalizeDeposit( bool enforce, beast::Journal const& j) const { + TRACE_FUNC(); if (!ammAccount_) { // LCOV_EXCL_START @@ -276,6 +286,7 @@ ValidAMM::finalizeWithdraw( bool enforce, beast::Journal const& j) const { + TRACE_FUNC(); if (!ammAccount_) { // Last Withdraw or Clawback deleted AMM @@ -297,6 +308,7 @@ ValidAMM::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); // Delete may return tecINCOMPLETE if there are too many // trustlines to delete. if (!isTesSuccess(result) && result != tecINCOMPLETE) diff --git a/src/libxrpl/tx/invariants/FreezeInvariant.cpp b/src/libxrpl/tx/invariants/FreezeInvariant.cpp index eaaeb7fc6f..6333283a0b 100644 --- a/src/libxrpl/tx/invariants/FreezeInvariant.cpp +++ b/src/libxrpl/tx/invariants/FreezeInvariant.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -27,6 +28,7 @@ TransfersNotFrozen::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); /* * A trust line freeze state alone doesn't determine if a transfer is * frozen. The transfer must be examined "end-to-end" because both sides of @@ -59,6 +61,7 @@ TransfersNotFrozen::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); /* * We check this invariant regardless of deep freeze amendment status, * allowing for detection and logging of potential issues even when the @@ -111,6 +114,7 @@ TransfersNotFrozen::isValidEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); // `after` can never be null, even if the trust line is deleted. XRPL_ASSERT(after, "xrpl::TransfersNotFrozen::isValidEntry : valid after."); if (!after) @@ -139,6 +143,7 @@ TransfersNotFrozen::calculateBalanceChange( std::shared_ptr const& after, bool isDelete) { + TRACE_FUNC(); auto const getBalance = [](auto const& line, auto const& other, bool zero) { STAmount const amt = line ? line->at(sfBalance) : other->at(sfBalance).zeroed(); return zero ? amt.zeroed() : amt; @@ -164,6 +169,7 @@ TransfersNotFrozen::calculateBalanceChange( void TransfersNotFrozen::recordBalance(Issue const& issue, BalanceChange change) { + TRACE_FUNC(); XRPL_ASSERT( change.balanceChangeSign, "xrpl::TransfersNotFrozen::recordBalance : valid trustline " @@ -184,6 +190,7 @@ TransfersNotFrozen::recordBalanceChanges( std::shared_ptr const& after, STAmount const& balanceChange) { + TRACE_FUNC(); auto const balanceChangeSign = balanceChange.signum(); auto const currency = after->at(sfBalance).get().currency; @@ -201,6 +208,7 @@ TransfersNotFrozen::recordBalanceChanges( std::shared_ptr TransfersNotFrozen::findIssuer(AccountID const& issuerID, ReadView const& view) { + TRACE_FUNC(); if (auto it = possibleIssuers_.find(issuerID); it != possibleIssuers_.end()) { return it->second; @@ -217,6 +225,7 @@ TransfersNotFrozen::validateIssuerChanges( beast::Journal const& j, bool enforce) { + TRACE_FUNC(); if (!issuer) { return false; @@ -259,6 +268,7 @@ TransfersNotFrozen::validateFrozenState( bool enforce, bool globalFreeze) { + TRACE_FUNC(); bool const freeze = change.balanceChangeSign < 0 && change.line->isFlag(high ? lsfLowFreeze : lsfHighFreeze); bool const deepFreeze = change.line->isFlag(high ? lsfLowDeepFreeze : lsfHighDeepFreeze); diff --git a/src/libxrpl/tx/invariants/InvariantCheck.cpp b/src/libxrpl/tx/invariants/InvariantCheck.cpp index 4f25a91bdf..68d2fcac1d 100644 --- a/src/libxrpl/tx/invariants/InvariantCheck.cpp +++ b/src/libxrpl/tx/invariants/InvariantCheck.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -50,6 +51,7 @@ namespace xrpl { bool hasPrivilege(STTx const& tx, Privilege priv) { + TRACE_FUNC(); switch (tx.getTxnType()) { #include @@ -69,6 +71,7 @@ TransactionFeeCheck::visitEntry( std::shared_ptr const&, std::shared_ptr const&) { + TRACE_FUNC(); // nothing to do } @@ -80,6 +83,7 @@ TransactionFeeCheck::finalize( ReadView const&, beast::Journal const& j) { + TRACE_FUNC(); // We should never charge a negative fee if (fee.drops() < 0) { @@ -115,6 +119,7 @@ XRPNotCreated::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); /* We go through all modified ledger entries, looking only at account roots, * escrow payments, and payment channels. We remove from the total any * previous XRP values and add to the total any new XRP values. The net @@ -170,6 +175,7 @@ XRPNotCreated::finalize( ReadView const&, beast::Journal const& j) const { + TRACE_FUNC(); // The net change should never be positive, as this would mean that the // transaction created XRP out of thin air. That's not possible. if (drops_ > 0) @@ -197,6 +203,7 @@ XRPBalanceChecks::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); auto isBad = [](STAmount const& balance) { if (!balance.native()) return true; @@ -230,6 +237,7 @@ XRPBalanceChecks::finalize( ReadView const&, beast::Journal const& j) const { + TRACE_FUNC(); if (bad_) { JLOG(j.fatal()) << "Invariant failed: incorrect account XRP balance"; @@ -247,6 +255,7 @@ NoBadOffers::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); auto isBad = [](STAmount const& pays, STAmount const& gets) { // An offer should never be negative if (pays < beast::kZERO) @@ -274,6 +283,7 @@ NoBadOffers::finalize( ReadView const&, beast::Journal const& j) const { + TRACE_FUNC(); if (bad_) { JLOG(j.fatal()) << "Invariant failed: offer with a bad amount"; @@ -291,6 +301,7 @@ NoZeroEscrow::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); auto isBad = [](STAmount const& amount) { // XRP case if (amount.native()) @@ -381,6 +392,7 @@ NoZeroEscrow::finalize( ReadView const&, beast::Journal const& j) const { + TRACE_FUNC(); if (bad_) { JLOG(j.fatal()) << "Invariant failed: escrow specifies invalid amount"; @@ -398,6 +410,7 @@ AccountRootsNotDeleted::visitEntry( std::shared_ptr const& before, std::shared_ptr const&) { + TRACE_FUNC(); if (isDelete && before && before->getType() == ltACCOUNT_ROOT) accountsDeleted_++; } @@ -410,6 +423,7 @@ AccountRootsNotDeleted::finalize( ReadView const&, beast::Journal const& j) const { + TRACE_FUNC(); // AMM account root can be deleted as the result of AMM withdraw/delete // transaction when the total AMM LP Tokens balance goes to 0. // A successful AccountDelete or AMMDelete MUST delete exactly @@ -451,6 +465,7 @@ AccountRootsDeletedClean::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (isDelete && before && before->getType() == ltACCOUNT_ROOT) accountsDeleted_.emplace_back(before, after); } @@ -463,6 +478,7 @@ AccountRootsDeletedClean::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); // Always check for objects in the ledger, but to prevent differing // transaction processing results, however unlikely, only fail if the // feature is enabled. Enabled, or not, though, a fatal-level message will @@ -571,6 +587,7 @@ LedgerEntryTypesMatch::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (before && after && before->getType() != after->getType()) typeMismatch_ = true; @@ -604,6 +621,7 @@ LedgerEntryTypesMatch::finalize( ReadView const&, beast::Journal const& j) const { + TRACE_FUNC(); if ((!typeMismatch_) && (!invalidTypeAdded_)) return true; @@ -628,6 +646,7 @@ NoXRPTrustLines::visitEntry( std::shared_ptr const&, std::shared_ptr const& after) { + TRACE_FUNC(); bool const overwriteFixEnabled = isFeatureEnabled(fixSecurity3_1_3, true); if (after && after->getType() == ltRIPPLE_STATE) @@ -656,6 +675,7 @@ NoXRPTrustLines::finalize( ReadView const&, beast::Journal const& j) const { + TRACE_FUNC(); if (!xrpTrustLine_) return true; @@ -671,6 +691,7 @@ NoDeepFreezeTrustLinesWithoutFreeze::visitEntry( std::shared_ptr const&, std::shared_ptr const& after) { + TRACE_FUNC(); if (after && after->getType() == ltRIPPLE_STATE) { bool const overwriteFixEnabled = isFeatureEnabled(fixSecurity3_1_3, true); @@ -702,6 +723,7 @@ NoDeepFreezeTrustLinesWithoutFreeze::finalize( ReadView const&, beast::Journal const& j) const { + TRACE_FUNC(); if (!deepFreezeWithoutFreeze_) return true; @@ -718,6 +740,7 @@ ValidNewAccountRoot::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (!before && after->getType() == ltACCOUNT_ROOT) { accountsCreated_++; @@ -735,6 +758,7 @@ ValidNewAccountRoot::finalize( ReadView const& view, beast::Journal const& j) const { + TRACE_FUNC(); if (accountsCreated_ == 0) return true; @@ -795,6 +819,7 @@ ValidClawback::visitEntry( std::shared_ptr const& before, std::shared_ptr const&) { + TRACE_FUNC(); if (before && before->getType() == ltRIPPLE_STATE) trustlinesChanged_++; @@ -810,6 +835,7 @@ ValidClawback::finalize( ReadView const& view, beast::Journal const& j) const { + TRACE_FUNC(); if (tx.getTxnType() != ttCLAWBACK) return true; @@ -883,6 +909,7 @@ ValidPseudoAccounts::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (isDelete) { // Deletion is ignored @@ -949,6 +976,7 @@ ValidPseudoAccounts::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); bool const enforce = view.rules().enabled(featureSingleAssetVault); XRPL_ASSERT( errors_.empty() || enforce, @@ -974,6 +1002,7 @@ NoModifiedUnmodifiableFields::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (isDelete || !before) { // Creation and deletion are ignored @@ -991,6 +1020,7 @@ NoModifiedUnmodifiableFields::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); static auto const kFIELD_CHANGED = [](auto const& before, auto const& after, auto const& field) { diff --git a/src/libxrpl/tx/invariants/LoanBrokerInvariant.cpp b/src/libxrpl/tx/invariants/LoanBrokerInvariant.cpp index b98d769393..b9201d0405 100644 --- a/src/libxrpl/tx/invariants/LoanBrokerInvariant.cpp +++ b/src/libxrpl/tx/invariants/LoanBrokerInvariant.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -25,6 +26,7 @@ ValidLoanBroker::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (after) { if (after->getType() == ltLOAN_BROKER) @@ -56,6 +58,7 @@ ValidLoanBroker::goodZeroDirectory( SLE::const_ref dir, beast::Journal const& j) { + TRACE_FUNC(); auto const next = dir->at(~sfIndexNext); auto const prev = dir->at(~sfIndexPrevious); if ((prev && (*prev != 0u)) || (next && (*next != 0u))) @@ -99,6 +102,7 @@ ValidLoanBroker::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); // Loan Brokers will not exist on ledger if the Lending Protocol amendment // is not enabled, so there's no need to check it. diff --git a/src/libxrpl/tx/invariants/LoanInvariant.cpp b/src/libxrpl/tx/invariants/LoanInvariant.cpp index e3dff3dde9..6aead32151 100644 --- a/src/libxrpl/tx/invariants/LoanInvariant.cpp +++ b/src/libxrpl/tx/invariants/LoanInvariant.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -22,6 +23,7 @@ ValidLoan::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (after && after->getType() == ltLOAN) { loans_.emplace_back(before, after); @@ -36,6 +38,7 @@ ValidLoan::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); // Loans will not exist on ledger if the Lending Protocol amendment // is not enabled, so there's no need to check it. diff --git a/src/libxrpl/tx/invariants/MPTInvariant.cpp b/src/libxrpl/tx/invariants/MPTInvariant.cpp index 9b8838f145..c5d8b8da59 100644 --- a/src/libxrpl/tx/invariants/MPTInvariant.cpp +++ b/src/libxrpl/tx/invariants/MPTInvariant.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,7 @@ ValidMPTIssuance::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (after && after->getType() == ltMPTOKEN_ISSUANCE) { if (isDelete) @@ -66,6 +68,7 @@ ValidMPTIssuance::finalize( ReadView const& view, beast::Journal const& j) const { + TRACE_FUNC(); auto const& rules = view.rules(); bool const mptV2Enabled = rules.enabled(featureMPTokensV2); if (isTesSuccess(result) || (mptV2Enabled && result == tecINCOMPLETE)) @@ -285,6 +288,7 @@ ValidMPTPayment::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (overflow_) return; @@ -352,6 +356,7 @@ ValidMPTPayment::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); if (isTesSuccess(result)) { bool const enforce = view.rules().enabled(featureMPTokensV2); diff --git a/src/libxrpl/tx/invariants/NFTInvariant.cpp b/src/libxrpl/tx/invariants/NFTInvariant.cpp index da415d2ad8..febaf8105d 100644 --- a/src/libxrpl/tx/invariants/NFTInvariant.cpp +++ b/src/libxrpl/tx/invariants/NFTInvariant.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ ValidNFTokenPage::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); static constexpr uint256 const& kPAGE_BITS = nft::kPAGE_MASK; static constexpr uint256 const kACCOUNT_BITS = ~kPAGE_BITS; @@ -137,6 +139,7 @@ ValidNFTokenPage::finalize( ReadView const& view, beast::Journal const& j) const { + TRACE_FUNC(); if (badLink_) { JLOG(j.fatal()) << "Invariant failed: NFT page is improperly linked."; @@ -192,6 +195,7 @@ NFTokenCountTracking::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (before && before->getType() == ltACCOUNT_ROOT) { beforeMintedTotal_ += (*before)[~sfMintedNFTokens].value_or(0); @@ -213,6 +217,7 @@ NFTokenCountTracking::finalize( ReadView const& view, beast::Journal const& j) const { + TRACE_FUNC(); if (!hasPrivilege(tx, ChangeNftCounts)) { if (beforeMintedTotal_ != afterMintedTotal_) diff --git a/src/libxrpl/tx/invariants/PermissionedDEXInvariant.cpp b/src/libxrpl/tx/invariants/PermissionedDEXInvariant.cpp index 6466812743..0e558a3840 100644 --- a/src/libxrpl/tx/invariants/PermissionedDEXInvariant.cpp +++ b/src/libxrpl/tx/invariants/PermissionedDEXInvariant.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -24,6 +25,7 @@ ValidPermissionedDEX::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (after && after->getType() == ltDIR_NODE) { if (after->isFieldPresent(sfDomainID)) @@ -64,6 +66,7 @@ ValidPermissionedDEX::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); auto const txType = tx.getTxnType(); if ((txType != ttPAYMENT && txType != ttOFFER_CREATE) || !isTesSuccess(result)) return true; diff --git a/src/libxrpl/tx/invariants/PermissionedDomainInvariant.cpp b/src/libxrpl/tx/invariants/PermissionedDomainInvariant.cpp index 784a2503ca..c958b1c3ea 100644 --- a/src/libxrpl/tx/invariants/PermissionedDomainInvariant.cpp +++ b/src/libxrpl/tx/invariants/PermissionedDomainInvariant.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,7 @@ ValidPermissionedDomain::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); if (before && before->getType() != ltPERMISSIONED_DOMAIN) return; if (after && after->getType() != ltPERMISSIONED_DOMAIN) @@ -69,6 +71,7 @@ ValidPermissionedDomain::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); auto check = [](SleStatus const& sleStatus, beast::Journal const& j) { if (!sleStatus.credentialsSize) { diff --git a/src/libxrpl/tx/invariants/VaultInvariant.cpp b/src/libxrpl/tx/invariants/VaultInvariant.cpp index 0dad8c18a0..e182ed689d 100644 --- a/src/libxrpl/tx/invariants/VaultInvariant.cpp +++ b/src/libxrpl/tx/invariants/VaultInvariant.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -33,6 +34,7 @@ namespace xrpl { ValidVault::Vault ValidVault::Vault::make(SLE const& from) { + TRACE_FUNC(); XRPL_ASSERT(from.getType() == ltVAULT, "ValidVault::Vault::make : from Vault object"); ValidVault::Vault self; @@ -51,6 +53,7 @@ ValidVault::Vault::make(SLE const& from) ValidVault::Shares ValidVault::Shares::make(SLE const& from) { + TRACE_FUNC(); XRPL_ASSERT( from.getType() == ltMPTOKEN_ISSUANCE, "ValidVault::Shares::make : from MPTokenIssuance object"); @@ -68,6 +71,7 @@ ValidVault::visitEntry( std::shared_ptr const& before, std::shared_ptr const& after) { + TRACE_FUNC(); // If `before` is empty, this means an object is being created, in which // case `isDelete` must be false. Otherwise `before` and `after` are set and // `isDelete` indicates whether an object is being deleted or modified. @@ -194,6 +198,7 @@ ValidVault::finalize( ReadView const& view, beast::Journal const& j) { + TRACE_FUNC(); bool const enforce = view.rules().enabled(featureSingleAssetVault); if (!isTesSuccess(ret)) @@ -1052,6 +1057,7 @@ ValidVault::finalize( [[nodiscard]] ValidVault::DeltaInfo ValidVault::DeltaInfo::makeDelta(Number const& before, Number const& after, Asset const& asset) { + TRACE_FUNC(); return { .delta = after - before, .scale = std::max(xrpl::scale(after, asset), xrpl::scale(before, asset))}; @@ -1060,6 +1066,7 @@ ValidVault::DeltaInfo::makeDelta(Number const& before, Number const& after, Asse [[nodiscard]] std::int32_t ValidVault::computeCoarsestScale(std::vector const& numbers) { + TRACE_FUNC(); if (numbers.empty()) return 0; diff --git a/src/libxrpl/tx/paths/AMMLiquidity.cpp b/src/libxrpl/tx/paths/AMMLiquidity.cpp index 87eb29f104..771adc50cb 100644 --- a/src/libxrpl/tx/paths/AMMLiquidity.cpp +++ b/src/libxrpl/tx/paths/AMMLiquidity.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -51,6 +52,7 @@ template TAmounts AMMLiquidity::fetchBalances(ReadView const& view) const { + TRACE_FUNC(); auto const amountIn = ammAccountHolds(view, ammAccountID_, assetIn_); auto const amountOut = ammAccountHolds(view, ammAccountID_, assetOut_); // This should not happen. @@ -64,6 +66,7 @@ template TAmounts AMMLiquidity::generateFibSeqOffer(TAmounts const& balances) const { + TRACE_FUNC(); TAmounts cur{}; cur.in = toAmount( @@ -126,6 +129,7 @@ template T maxOut(T const& out, Asset const& asset) { + TRACE_FUNC(); Number const res = out * Number{99, -2}; return toAmount(asset, res, Number::RoundingMode::Downward); } @@ -135,6 +139,7 @@ template std::optional> AMMLiquidity::maxOffer(TAmounts const& balances, Rules const& rules) const { + TRACE_FUNC(); if (!rules.enabled(fixAMMOverflowOffer)) { return AMMOffer( @@ -156,6 +161,7 @@ std::optional> AMMLiquidity::getOffer(ReadView const& view, std::optional const& clobQuality) const { + TRACE_FUNC(); // Can't generate more offers if multi-path. if (ammContext_.maxItersReached()) return std::nullopt; diff --git a/src/libxrpl/tx/paths/AMMOffer.cpp b/src/libxrpl/tx/paths/AMMOffer.cpp index 3a7bd8f1df..5079091d4a 100644 --- a/src/libxrpl/tx/paths/AMMOffer.cpp +++ b/src/libxrpl/tx/paths/AMMOffer.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -37,6 +38,7 @@ template Asset const& AMMOffer::assetIn() const { + TRACE_FUNC(); return ammLiquidity_.assetIn(); } @@ -44,6 +46,7 @@ template Asset const& AMMOffer::assetOut() const { + TRACE_FUNC(); return ammLiquidity_.assetOut(); } @@ -51,6 +54,7 @@ template AccountID const& AMMOffer::owner() const { + TRACE_FUNC(); return ammLiquidity_.ammAccount(); } @@ -58,6 +62,7 @@ template TAmounts const& AMMOffer::amount() const { + TRACE_FUNC(); return amounts_; } @@ -65,6 +70,7 @@ template void AMMOffer::consume(ApplyView& view, TAmounts const& consumed) { + TRACE_FUNC(); // Consumed offer must be less or equal to the original if (consumed.in > amounts_.in || consumed.out > amounts_.out) Throw("Invalid consumed AMM offer."); @@ -84,6 +90,7 @@ AMMOffer::limitOut( TOut const& limit, bool roundUp) const { + TRACE_FUNC(); // Change the offer size proportionally to the original offer quality // to keep the strands quality order unchanged. The taker pays slightly // more for the offer in this case, which results in a slightly higher @@ -107,6 +114,7 @@ TAmounts AMMOffer::limitIn(TAmounts const& offerAmount, TIn const& limit, bool roundUp) const { + TRACE_FUNC(); // See the comments above in limitOut(). if (ammLiquidity_.multiPath()) { @@ -123,6 +131,7 @@ template QualityFunction AMMOffer::getQualityFunc() const { + TRACE_FUNC(); if (ammLiquidity_.multiPath()) return QualityFunction{quality(), QualityFunction::CLOBLikeTag{}}; return QualityFunction{balances_, ammLiquidity_.tradingFee(), QualityFunction::AMMTag{}}; @@ -132,6 +141,7 @@ template bool AMMOffer::checkInvariant(TAmounts const& consumed, beast::Journal j) const { + TRACE_FUNC(); if (consumed.in > amounts_.in || consumed.out > amounts_.out) { JLOG(j.error()) << "AMMOffer::checkInvariant failed: consumed " << to_string(consumed.in) diff --git a/src/libxrpl/tx/paths/BookStep.cpp b/src/libxrpl/tx/paths/BookStep.cpp index 113155e530..2072b1ff3c 100644 --- a/src/libxrpl/tx/paths/BookStep.cpp +++ b/src/libxrpl/tx/paths/BookStep.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include @@ -103,6 +104,7 @@ private: , j_(ctx.j) , strandDeliver_(ctx.strandDeliver) { + TRACE_FUNC(); if (auto const ammSle = ctx.view.read(keylet::amm(in, out)); ammSle && ammSle->getFieldAmount(sfLPTokenBalance) != beast::kZERO) { @@ -121,12 +123,14 @@ public: [[nodiscard]] Book const& book() const { + TRACE_FUNC(); return book_; } [[nodiscard]] std::optional cachedIn() const override { + TRACE_FUNC(); if (!cache_) return std::nullopt; return EitherAmount(cache_->in); @@ -135,6 +139,7 @@ public: [[nodiscard]] std::optional cachedOut() const override { + TRACE_FUNC(); if (!cache_) return std::nullopt; return EitherAmount(cache_->out); @@ -143,12 +148,14 @@ public: [[nodiscard]] DebtDirection debtDirection(ReadView const& sb, StrandDirection dir) const override { + TRACE_FUNC(); return ownerPaysTransferFee_ ? DebtDirection::Issues : DebtDirection::Redeems; } [[nodiscard]] std::optional bookStepBook() const override { + TRACE_FUNC(); return book_; } @@ -185,6 +192,7 @@ public: [[nodiscard]] bool inactive() const override { + TRACE_FUNC(); return inactive_; } @@ -192,6 +200,7 @@ protected: std::string logStringImpl(char const* name) const { + TRACE_FUNC(); std::ostringstream ostr; ostr << name << ": " << "\ninIss: " << book_.in.getIssuer() << "\noutIss: " << book_.out.getIssuer() @@ -206,12 +215,14 @@ private: friend bool operator==(BookStep const& lhs, BookStep const& rhs) { + TRACE_FUNC(); return lhs.book_ == rhs.book_; } friend bool operator!=(BookStep const& lhs, BookStep const& rhs) { + TRACE_FUNC(); return !(lhs == rhs); } @@ -303,6 +314,7 @@ public: FlowOfferStream&, bool) const { + TRACE_FUNC(); return false; } @@ -310,6 +322,7 @@ public: [[nodiscard]] bool checkQualityThreshold(Quality const& quality) const { + TRACE_FUNC(); return true; } @@ -318,6 +331,7 @@ public: [[nodiscard]] std::optional qualityThreshold(Quality const& lobQuality) const { + TRACE_FUNC(); return lobQuality; } @@ -325,6 +339,7 @@ public: std::uint32_t getOfrInRate(Step const*, AccountID const&, std::uint32_t trIn) const { + TRACE_FUNC(); return trIn; } @@ -332,6 +347,7 @@ public: std::uint32_t getOfrOutRate(Step const*, AccountID const&, AccountID const&, std::uint32_t trOut) const { + TRACE_FUNC(); return trOut; } @@ -344,6 +360,7 @@ public: OfferType, Rules const&) const { + TRACE_FUNC(); // Charge the offer owner, not the sender // Charge a fee even if the owner is the same as the issuer // (the old code does not charge a fee) @@ -364,6 +381,7 @@ public: [[nodiscard]] std::string logString() const override { + TRACE_FUNC(); return this->logStringImpl("BookPaymentStep"); } }; @@ -381,6 +399,7 @@ private: static Quality getQuality(std::optional const& limitQuality) { + TRACE_FUNC(); // It's really a programming error if the quality is missing. XRPL_ASSERT(limitQuality, "xrpl::BookOfferCrossingStep::getQuality : nonzero quality"); if (!limitQuality) @@ -406,6 +425,7 @@ public: FlowOfferStream& offers, bool const offerAttempted) const { + TRACE_FUNC(); // This method supports some correct but slightly surprising // behavior in offer crossing. The scenario: // @@ -458,6 +478,7 @@ public: [[nodiscard]] bool checkQualityThreshold(Quality const& quality) const { + TRACE_FUNC(); return !defaultPath_ || quality >= qualityThreshold_; } @@ -474,6 +495,7 @@ public: [[nodiscard]] std::optional qualityThreshold(Quality const& lobQuality) const { + TRACE_FUNC(); if (this->ammLiquidity_ && !this->ammLiquidity_->multiPath() && qualityThreshold_ > lobQuality) return std::nullopt; @@ -485,6 +507,7 @@ public: std::uint32_t getOfrInRate(Step const* prevStep, AccountID const& owner, std::uint32_t trIn) const { + TRACE_FUNC(); auto const srcAcct = (prevStep != nullptr) ? prevStep->directStepSrcAcct() : std::nullopt; return owner == srcAcct // If offer crossing && prevStep is DirectI @@ -500,6 +523,7 @@ public: AccountID const& strandDst, std::uint32_t trOut) const { + TRACE_FUNC(); return // If offer crossing (prevStep != nullptr) && prevStep->bookStepBook() && // && prevStep is BookStep owner == strandDst // && dest is offer owner @@ -516,6 +540,7 @@ public: OfferType offerType, Rules const& rules) const { + TRACE_FUNC(); // Offer x-ing does not charge a transfer fee when the offer's owner // is the same as the strand dst. It is important that // `qualityUpperBound` is an upper bound on the quality (it is used to @@ -548,6 +573,7 @@ public: [[nodiscard]] std::string logString() const override { + TRACE_FUNC(); return this->logStringImpl("BookOfferCrossingStep"); } @@ -562,6 +588,7 @@ template bool BookStep::equal(Step const& rhs) const { + TRACE_FUNC(); if (auto bs = dynamic_cast const*>(&rhs)) return book_ == bs->book_; return false; @@ -571,6 +598,7 @@ template std::pair, DebtDirection> BookStep::qualityUpperBound(ReadView const& v, DebtDirection prevStepDir) const { + TRACE_FUNC(); auto const dir = this->debtDirection(v, StrandDirection::Forward); std::optional> const res = tipOfferQuality(v); @@ -589,6 +617,7 @@ template std::pair, DebtDirection> BookStep::getQualityFunc(ReadView const& v, DebtDirection prevStepDir) const { + TRACE_FUNC(); auto const dir = this->debtDirection(v, StrandDirection::Forward); std::optional const res = tipOfferQualityF(v); @@ -624,6 +653,7 @@ template std::uint32_t BookStep::offersUsed() const { + TRACE_FUNC(); return offersUsed_; } @@ -639,6 +669,7 @@ limitStepIn( std::uint32_t transferRateOut, TIn const& limit) { + TRACE_FUNC(); if (limit < stpAmt.in) { stpAmt.in = limit; @@ -668,6 +699,7 @@ limitStepOut( std::uint32_t transferRateOut, TOut const& limit) { + TRACE_FUNC(); if (limit < stpAmt.out) { stpAmt.out = limit; @@ -689,6 +721,7 @@ BookStep::forEachOffer( DebtDirection prevStepDir, Callback& callback) const { + TRACE_FUNC(); // Charge the offer owner, not the sender // Charge a fee even if the owner is the same as the issuer // (the old code does not charge a fee) @@ -862,6 +895,7 @@ BookStep::consumeOffer( TAmounts const& stepAmt, TOut const& ownerGives) const { + TRACE_FUNC(); if (!offer.checkInvariant(ofrAmt, j_)) { // purposely written as separate if statements so we get logging even @@ -905,6 +939,7 @@ BookStep::getAMMOffer( ReadView const& view, std::optional const& clobQuality) const { + TRACE_FUNC(); if (ammLiquidity_) return ammLiquidity_->getOffer(view, clobQuality); return std::nullopt; @@ -914,6 +949,7 @@ template std::optional>> BookStep::tip(ReadView const& view) const { + TRACE_FUNC(); // This can be simplified (and sped up) if directories are never empty. Sandbox sb(&view, TapNone); BookTip bt(sb, book_); @@ -953,6 +989,7 @@ auto BookStep::tipOfferQuality(ReadView const& view) const -> std::optional> { + TRACE_FUNC(); auto const res = tip(view); if (!res) { @@ -970,6 +1007,7 @@ template std::optional BookStep::tipOfferQualityF(ReadView const& view) const { + TRACE_FUNC(); auto const res = tip(view); if (!res) { @@ -987,6 +1025,7 @@ template static auto sum(TCollection const& col) { + TRACE_FUNC(); using TResult = std::decay_t; if (col.empty()) return TResult{beast::kZERO}; @@ -1001,6 +1040,7 @@ BookStep::revImp( boost::container::flat_set& ofrsToRm, TOut const& out) { + TRACE_FUNC(); cache_.reset(); TAmounts result(beast::kZERO, beast::kZERO); @@ -1112,6 +1152,7 @@ BookStep::fwdImp( boost::container::flat_set& ofrsToRm, TIn const& in) { + TRACE_FUNC(); XRPL_ASSERT(cache_, "xrpl::BookStep::fwdImp : cache is set"); TAmounts result(beast::kZERO, beast::kZERO); @@ -1273,6 +1314,7 @@ BookStep::validFwd( ApplyView& afView, EitherAmount const& in) { + TRACE_FUNC(); if (!cache_) { JLOG(j_.trace()) << "Expected valid cache in validFwd"; @@ -1309,6 +1351,7 @@ template TER BookStep::check(StrandContext const& ctx) const { + TRACE_FUNC(); if (book_.in == book_.out) { JLOG(j_.debug()) << "BookStep: Book with same in and out issuer " << *this; @@ -1385,6 +1428,7 @@ BookStep::rate( Asset const& asset, AccountID const& dstAccount) const { + TRACE_FUNC(); auto const& issuer = asset.getIssuer(); if (isXRP(issuer) || issuer == dstAccount) return kPARITY_RATE; @@ -1397,6 +1441,7 @@ template bool BookStep::checkMPTDEX(ReadView const& view, AccountID const& owner) const { + TRACE_FUNC(); if (!isTesSuccess(canTrade(view, book_.in)) || !isTesSuccess(canTrade(view, book_.out))) return false; @@ -1454,6 +1499,7 @@ template static bool equalHelper(Step const& step, xrpl::Book const& book) { + TRACE_FUNC(); if (auto bs = dynamic_cast const*>(&step)) return book == bs->book(); return false; @@ -1462,6 +1508,7 @@ equalHelper(Step const& step, xrpl::Book const& book) bool bookStepEqual(Step const& step, xrpl::Book const& book) { + TRACE_FUNC(); return std::visit( [&](TIn const&, TOut const&) { using TIn_ = typename TIn::amount_type; @@ -1490,6 +1537,7 @@ template static std::pair> makeBookStepHelper(StrandContext const& ctx, Asset const& in, Asset const& out) { + TRACE_FUNC(); TER ter = tefINTERNAL; std::unique_ptr r; if (ctx.offerCrossing != OfferCrossing::No) @@ -1513,18 +1561,21 @@ makeBookStepHelper(StrandContext const& ctx, Asset const& in, Asset const& out) std::pair> makeBookStepIi(StrandContext const& ctx, Issue const& in, Issue const& out) { + TRACE_FUNC(); return makeBookStepHelper(ctx, in, out); } std::pair> makeBookStepIx(StrandContext const& ctx, Issue const& in) { + TRACE_FUNC(); return makeBookStepHelper(ctx, in, xrpIssue()); } std::pair> makeBookStepXi(StrandContext const& ctx, Issue const& out) { + TRACE_FUNC(); return makeBookStepHelper(ctx, xrpIssue(), out); } @@ -1532,30 +1583,35 @@ makeBookStepXi(StrandContext const& ctx, Issue const& out) std::pair> makeBookStepMm(StrandContext const& ctx, MPTIssue const& in, MPTIssue const& out) { + TRACE_FUNC(); return makeBookStepHelper(ctx, in, out); } std::pair> makeBookStepMi(StrandContext const& ctx, MPTIssue const& in, Issue const& out) { + TRACE_FUNC(); return makeBookStepHelper(ctx, in, out); } std::pair> makeBookStepIm(StrandContext const& ctx, Issue const& in, MPTIssue const& out) { + TRACE_FUNC(); return makeBookStepHelper(ctx, in, out); } std::pair> makeBookStepMx(StrandContext const& ctx, MPTIssue const& in) { + TRACE_FUNC(); return makeBookStepHelper(ctx, in, xrpIssue()); } std::pair> makeBookStepXm(StrandContext const& ctx, MPTIssue const& out) { + TRACE_FUNC(); return makeBookStepHelper(ctx, xrpIssue(), out); } diff --git a/src/libxrpl/tx/paths/BookTip.cpp b/src/libxrpl/tx/paths/BookTip.cpp index 5be512aa84..f1a8a3f8b8 100644 --- a/src/libxrpl/tx/paths/BookTip.cpp +++ b/src/libxrpl/tx/paths/BookTip.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -20,6 +21,7 @@ BookTip::BookTip(ApplyView& view, Book const& book) bool BookTip::step(beast::Journal j) { + TRACE_FUNC(); if (valid_) { if (entry_) diff --git a/src/libxrpl/tx/paths/DirectStep.cpp b/src/libxrpl/tx/paths/DirectStep.cpp index 7373f8a341..75a835a08b 100644 --- a/src/libxrpl/tx/paths/DirectStep.cpp +++ b/src/libxrpl/tx/paths/DirectStep.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -104,22 +105,26 @@ public: [[nodiscard]] AccountID const& src() const { + TRACE_FUNC(); return src_; } [[nodiscard]] AccountID const& dst() const { + TRACE_FUNC(); return dst_; } [[nodiscard]] Currency const& currency() const { + TRACE_FUNC(); return currency_; } [[nodiscard]] std::optional cachedIn() const override { + TRACE_FUNC(); if (!cache_) return std::nullopt; return EitherAmount(cache_->in); @@ -128,6 +133,7 @@ public: [[nodiscard]] std::optional cachedOut() const override { + TRACE_FUNC(); if (!cache_) return std::nullopt; return EitherAmount(cache_->out); @@ -136,12 +142,14 @@ public: [[nodiscard]] std::optional directStepSrcAcct() const override { + TRACE_FUNC(); return src_; } [[nodiscard]] std::optional> directStepAccts() const override { + TRACE_FUNC(); return std::make_pair(src_, dst_); } @@ -186,12 +194,14 @@ public: friend bool operator==(DirectStepI const& lhs, DirectStepI const& rhs) { + TRACE_FUNC(); return lhs.src_ == rhs.src_ && lhs.dst_ == rhs.dst_ && lhs.currency_ == rhs.currency_; } friend bool operator!=(DirectStepI const& lhs, DirectStepI const& rhs) { + TRACE_FUNC(); return !(lhs == rhs); } @@ -199,6 +209,7 @@ protected: std::string logStringImpl(char const* name) const { + TRACE_FUNC(); std::ostringstream ostr; ostr << name << ": " << "\nSrc: " << src_ << "\nDst: " << dst_; @@ -209,6 +220,7 @@ private: [[nodiscard]] bool equal(Step const& rhs) const override { + TRACE_FUNC(); if (auto ds = dynamic_cast(&rhs)) { return *this == *ds; @@ -245,6 +257,7 @@ public: static bool verifyPrevStepDebtDirection(DebtDirection) { + TRACE_FUNC(); // A payment doesn't care whether or not prevStepRedeems. return true; } @@ -252,6 +265,7 @@ public: static bool verifyDstQualityIn(std::uint32_t dstQIn) { + TRACE_FUNC(); // Payments have no particular expectations for what dstQIn will be. return true; } @@ -274,6 +288,7 @@ public: [[nodiscard]] std::string logString() const override { + TRACE_FUNC(); return logStringImpl("DirectIPaymentStep"); } }; @@ -296,6 +311,7 @@ public: static bool verifyPrevStepDebtDirection(DebtDirection prevStepDir) { + TRACE_FUNC(); // During offer crossing we rely on the fact that prevStepRedeems // will *always* issue. That's because: // o If there's a prevStep_, it will always be a BookStep. @@ -309,6 +325,7 @@ public: static bool verifyDstQualityIn(std::uint32_t dstQIn) { + TRACE_FUNC(); // Due to a couple of factors dstQIn is always QUALITY_ONE for // offer crossing. If that changes we need to know. return dstQIn == QUALITY_ONE; @@ -332,6 +349,7 @@ public: [[nodiscard]] std::string logString() const override { + TRACE_FUNC(); return logStringImpl("DirectIOfferCrossingStep"); } }; @@ -341,6 +359,7 @@ public: std::uint32_t DirectIPaymentStep::quality(ReadView const& sb, QualityDirection qDir) const { + TRACE_FUNC(); if (src_ == dst_) return QUALITY_ONE; @@ -382,6 +401,7 @@ DirectIPaymentStep::quality(ReadView const& sb, QualityDirection qDir) const std::uint32_t DirectIOfferCrossingStep::quality(ReadView const&, QualityDirection qDir) { + TRACE_FUNC(); // If offer crossing then ignore trust line Quality fields. This // preserves a long-standing tradition. return QUALITY_ONE; @@ -390,12 +410,14 @@ DirectIOfferCrossingStep::quality(ReadView const&, QualityDirection qDir) std::pair DirectIPaymentStep::maxFlow(ReadView const& sb, IOUAmount const&) const { + TRACE_FUNC(); return maxPaymentFlow(sb); } std::pair DirectIOfferCrossingStep::maxFlow(ReadView const& sb, IOUAmount const& desired) const { + TRACE_FUNC(); // When isLast and offer crossing then ignore trust line limits. Offer // crossing has the ability to exceed the limit set by a trust line. // We presume that if someone is creating an offer then they intend to @@ -417,6 +439,7 @@ DirectIOfferCrossingStep::maxFlow(ReadView const& sb, IOUAmount const& desired) TER DirectIPaymentStep::check(StrandContext const& ctx, std::shared_ptr const& sleSrc) const { + TRACE_FUNC(); // Since this is a payment a trust line must be present. Perform all // trust line related checks. { @@ -467,6 +490,7 @@ DirectIPaymentStep::check(StrandContext const& ctx, std::shared_ptr c TER DirectIOfferCrossingStep::check(StrandContext const&, std::shared_ptr const&) { + TRACE_FUNC(); // The standard checks are all we can do because any remaining checks // require the existence of a trust line. Offer crossing does not // require a pre-existing trust line. @@ -479,6 +503,7 @@ template std::pair DirectStepI::maxPaymentFlow(ReadView const& sb) const { + TRACE_FUNC(); auto const srcOwed = toAmount( accountHolds(sb, src_, currency_, dst_, FreezeHandling::IgnoreFreeze, j_)); @@ -493,6 +518,7 @@ template DebtDirection DirectStepI::debtDirection(ReadView const& sb, StrandDirection dir) const { + TRACE_FUNC(); if (dir == StrandDirection::Forward && cache_) return cache_->srcDebtDir; @@ -508,6 +534,7 @@ DirectStepI::revImp( boost::container::flat_set& /*ofrsToRm*/, IOUAmount const& out) { + TRACE_FUNC(); cache_.reset(); auto const [maxSrcToDst, srcDebtDir] = static_cast(this)->maxFlow(sb, out); @@ -580,6 +607,7 @@ DirectStepI::setCacheLimiting( IOUAmount const& fwdOut, DebtDirection srcDebtDir) { + TRACE_FUNC(); // NOLINTBEGIN(bugprone-unchecked-optional-access) cache_ always set before setCacheLimiting is // called if (cache_->in < fwdIn) @@ -622,6 +650,7 @@ DirectStepI::fwdImp( boost::container::flat_set& /*ofrsToRm*/, IOUAmount const& in) { + TRACE_FUNC(); XRPL_ASSERT(cache_, "xrpl::DirectStepI::fwdImp : cache is set"); // NOLINTBEGIN(bugprone-unchecked-optional-access) assert above @@ -687,6 +716,7 @@ template std::pair DirectStepI::validFwd(PaymentSandbox& sb, ApplyView& afView, EitherAmount const& in) { + TRACE_FUNC(); if (!cache_) { JLOG(j_.trace()) << "Expected valid cache in validFwd"; @@ -739,6 +769,7 @@ template std::pair DirectStepI::qualitiesSrcRedeems(ReadView const& sb) const { + TRACE_FUNC(); if (prevStep_ == nullptr) return {QUALITY_ONE, QUALITY_ONE}; @@ -756,6 +787,7 @@ std::pair DirectStepI::qualitiesSrcIssues(ReadView const& sb, DebtDirection prevStepDebtDirection) const { + TRACE_FUNC(); // Charge a transfer rate when issuing and previous step redeems XRPL_ASSERT( @@ -780,6 +812,7 @@ DirectStepI::qualities( DebtDirection srcDebtDir, StrandDirection strandDir) const { + TRACE_FUNC(); if (redeems(srcDebtDir)) { return qualitiesSrcRedeems(sb); @@ -797,6 +830,7 @@ template std::uint32_t DirectStepI::lineQualityIn(ReadView const& v) const { + TRACE_FUNC(); // dst quality in return static_cast(this)->quality(v, QualityDirection::In); } @@ -805,6 +839,7 @@ template std::pair, DebtDirection> DirectStepI::qualityUpperBound(ReadView const& v, DebtDirection prevStepDir) const { + TRACE_FUNC(); auto const dir = this->debtDirection(v, StrandDirection::Forward); auto const [srcQOut, dstQIn] = @@ -824,6 +859,7 @@ template TER DirectStepI::check(StrandContext const& ctx) const { + TRACE_FUNC(); // The following checks apply for both payments and offer crossing. if (!src_ || !dst_) { @@ -911,6 +947,7 @@ directStepEqual( AccountID const& dst, Currency const& currency) { + TRACE_FUNC(); if (auto ds = dynamic_cast const*>(&step)) { return ds->src() == src && ds->dst() == dst && ds->currency() == currency; @@ -928,6 +965,7 @@ makeDirectStepI( AccountID const& dst, Currency const& c) { + TRACE_FUNC(); TER ter = tefINTERNAL; std::unique_ptr r; if (ctx.offerCrossing != OfferCrossing::No) diff --git a/src/libxrpl/tx/paths/Flow.cpp b/src/libxrpl/tx/paths/Flow.cpp index 39a9e83e69..9d70438afe 100644 --- a/src/libxrpl/tx/paths/Flow.cpp +++ b/src/libxrpl/tx/paths/Flow.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -24,6 +25,7 @@ template static auto finishFlow(PaymentSandbox& sb, Asset const& srcAsset, Asset const& dstAsset, FlowResult&& f) { + TRACE_FUNC(); path::RippleCalc::Output result; if (isTesSuccess(f.ter)) { @@ -58,6 +60,7 @@ flow( beast::Journal j, path::detail::FlowDebugInfo* flowDebugInfo) { + TRACE_FUNC(); Asset const srcAsset = [&]() -> Asset { if (sendMax) return sendMax->asset(); diff --git a/src/libxrpl/tx/paths/MPTEndpointStep.cpp b/src/libxrpl/tx/paths/MPTEndpointStep.cpp index 25c9062e47..d2dd2a9d8a 100644 --- a/src/libxrpl/tx/paths/MPTEndpointStep.cpp +++ b/src/libxrpl/tx/paths/MPTEndpointStep.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -106,6 +107,7 @@ private: (ctx.isFirst || (ctx.prevStep != nullptr && !ctx.prevStep->bookStepBook()))) , j_(ctx.j) { + TRACE_FUNC(); XRPL_ASSERT( src_ == mptIssue_.getIssuer() || dst_ == mptIssue_.getIssuer(), "MPTEndpointStep::MPTEndpointStep src or dst must be an issuer"); @@ -115,22 +117,26 @@ public: [[nodiscard]] AccountID const& src() const { + TRACE_FUNC(); return src_; } [[nodiscard]] AccountID const& dst() const { + TRACE_FUNC(); return dst_; } [[nodiscard]] MPTID const& mptID() const { + TRACE_FUNC(); return mptIssue_.getMptID(); } [[nodiscard]] std::optional cachedIn() const override { + TRACE_FUNC(); if (!cache_) return std::nullopt; return EitherAmount(cache_->in); @@ -139,6 +145,7 @@ public: [[nodiscard]] std::optional cachedOut() const override { + TRACE_FUNC(); if (!cache_) return std::nullopt; return EitherAmount(cache_->out); @@ -147,12 +154,14 @@ public: [[nodiscard]] std::optional directStepSrcAcct() const override { + TRACE_FUNC(); return src_; } [[nodiscard]] std::optional> directStepAccts() const override { + TRACE_FUNC(); return std::make_pair(src_, dst_); } @@ -197,12 +206,14 @@ public: friend bool operator==(MPTEndpointStep const& lhs, MPTEndpointStep const& rhs) { + TRACE_FUNC(); return lhs.src_ == rhs.src_ && lhs.dst_ == rhs.dst_ && lhs.mptIssue_ == rhs.mptIssue_; } friend bool operator!=(MPTEndpointStep const& lhs, MPTEndpointStep const& rhs) { + TRACE_FUNC(); return !(lhs == rhs); } @@ -210,6 +221,7 @@ protected: std::string logStringImpl(char const* name) const { + TRACE_FUNC(); std::ostringstream ostr; ostr << name << ": " << "\nSrc: " << src_ << "\nDst: " << dst_; @@ -220,6 +232,7 @@ private: [[nodiscard]] bool equal(Step const& rhs) const override { + TRACE_FUNC(); if (auto ds = dynamic_cast(&rhs)) { return *this == *ds; @@ -257,6 +270,7 @@ public: static bool verifyPrevStepDebtDirection(DebtDirection) { + TRACE_FUNC(); // A payment doesn't care regardless of prevStepRedeems. return true; } @@ -269,6 +283,7 @@ public: [[nodiscard]] std::string logString() const override { + TRACE_FUNC(); return logStringImpl("MPTEndpointPaymentStep"); } @@ -276,6 +291,7 @@ public: static TER checkCreateMPT(ApplyView&, DebtDirection) { + TRACE_FUNC(); return tesSUCCESS; } }; @@ -299,6 +315,7 @@ public: static bool verifyPrevStepDebtDirection(DebtDirection prevStepDir) { + TRACE_FUNC(); // During offer crossing we rely on the fact that prevStepRedeems // will *always* issue. That's because: // o If there's a prevStep_, it will always be a BookStep. @@ -317,6 +334,7 @@ public: [[nodiscard]] std::string logString() const override { + TRACE_FUNC(); return logStringImpl("MPTEndpointOfferCrossingStep"); } @@ -331,6 +349,7 @@ TER MPTEndpointPaymentStep::check(StrandContext const& ctx, std::shared_ptr const& sleSrc) const { + TRACE_FUNC(); // Since this is a payment, MPToken must be present. Perform all // MPToken related checks. @@ -395,12 +414,14 @@ MPTEndpointPaymentStep::check(StrandContext const& ctx, std::shared_ptr const&) { + TRACE_FUNC(); return tesSUCCESS; } TER MPTEndpointOfferCrossingStep::checkCreateMPT(ApplyView& view, xrpl::DebtDirection srcDebtDir) { + TRACE_FUNC(); // TakerPays is the last step if offer crossing if (isLast_) { @@ -424,6 +445,7 @@ template std::pair MPTEndpointStep::maxPaymentFlow(ReadView const& sb) const { + TRACE_FUNC(); auto const maxFlow = accountFunds( sb, src_, mptIssue_, FreezeHandling::IgnoreFreeze, AuthHandling::IgnoreAuth, j_); @@ -455,6 +477,7 @@ template DebtDirection MPTEndpointStep::debtDirection(ReadView const& sb, StrandDirection dir) const { + TRACE_FUNC(); if (dir == StrandDirection::Forward && cache_) return cache_->srcDebtDir; @@ -469,6 +492,7 @@ MPTEndpointStep::revImp( boost::container::flat_set& /*ofrsToRm*/, MPTAmount const& out) { + TRACE_FUNC(); cache_.reset(); auto const [maxSrcToDst, srcDebtDir] = static_cast(this)->maxPaymentFlow(sb); @@ -557,6 +581,7 @@ MPTEndpointStep::setCacheLimiting( MPTAmount const& fwdOut, DebtDirection srcDebtDir) { + TRACE_FUNC(); // NOLINTBEGIN(bugprone-unchecked-optional-access) cache_ always set before setCacheLimiting is // called if (cache_->in < fwdIn) @@ -599,6 +624,7 @@ MPTEndpointStep::fwdImp( boost::container::flat_set& /*ofrsToRm*/, MPTAmount const& in) { + TRACE_FUNC(); XRPL_ASSERT(cache_, "MPTEndpointStep::fwdImp : valid cache"); // NOLINTBEGIN(bugprone-unchecked-optional-access) assert above @@ -681,6 +707,7 @@ template std::pair MPTEndpointStep::validFwd(PaymentSandbox& sb, ApplyView& afView, EitherAmount const& in) { + TRACE_FUNC(); if (!cache_) { JLOG(j_.trace()) << "Expected valid cache in validFwd"; @@ -732,6 +759,7 @@ template std::pair MPTEndpointStep::qualitiesSrcRedeems(ReadView const& sb) const { + TRACE_FUNC(); if (prevStep_ == nullptr) return {QUALITY_ONE, QUALITY_ONE}; @@ -750,6 +778,7 @@ MPTEndpointStep::qualitiesSrcIssues( ReadView const& sb, DebtDirection prevStepDebtDirection) const { + TRACE_FUNC(); // Charge a transfer rate when issuing and previous step redeems XRPL_ASSERT( @@ -772,6 +801,7 @@ MPTEndpointStep::qualities( DebtDirection srcDebtDir, StrandDirection strandDir) const { + TRACE_FUNC(); if (redeems(srcDebtDir)) { return qualitiesSrcRedeems(sb); @@ -789,6 +819,7 @@ template std::uint32_t MPTEndpointStep::lineQualityIn(ReadView const& v) const { + TRACE_FUNC(); // dst quality in return QUALITY_ONE; } @@ -797,6 +828,7 @@ template std::pair, DebtDirection> MPTEndpointStep::qualityUpperBound(ReadView const& v, DebtDirection prevStepDir) const { + TRACE_FUNC(); auto const dir = this->debtDirection(v, StrandDirection::Forward); auto const [srcQOut, dstQIn] = @@ -817,6 +849,7 @@ template TER MPTEndpointStep::check(StrandContext const& ctx) const { + TRACE_FUNC(); // The following checks apply for both payments and offer crossing. if (!src_ || !dst_) { @@ -893,6 +926,7 @@ template void MPTEndpointStep::resetCache(xrpl::DebtDirection dir) { + TRACE_FUNC(); cache_.emplace(MPTAmount(beast::kZERO), MPTAmount(beast::kZERO), MPTAmount(beast::kZERO), dir); } @@ -905,6 +939,7 @@ makeMptEndpointStep( AccountID const& dst, MPTID const& mpt) { + TRACE_FUNC(); TER ter = tefINTERNAL; std::unique_ptr r; if (ctx.offerCrossing != OfferCrossing::No) @@ -934,6 +969,7 @@ mptEndpointStepEqual( AccountID const& dst, MPTID const& mptid) { + TRACE_FUNC(); if (auto ds = dynamic_cast const*>(&step)) { return ds->src() == src && ds->dst() == dst && ds->mptID() == mptid; diff --git a/src/libxrpl/tx/paths/OfferStream.cpp b/src/libxrpl/tx/paths/OfferStream.cpp index b5ac45503a..08e2058d04 100644 --- a/src/libxrpl/tx/paths/OfferStream.cpp +++ b/src/libxrpl/tx/paths/OfferStream.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -36,6 +37,7 @@ namespace { bool checkIssuers(ReadView const& view, Book const& book) { + TRACE_FUNC(); auto issuerExists = [](ReadView const& view, Asset const& asset) -> bool { auto const& issuer = asset.getIssuer(); return isXRP(issuer) || view.exists(keylet::account(issuer)); @@ -61,6 +63,7 @@ TOfferStreamBase::TOfferStreamBase( , tip_(view, book_) , counter_(counter) { + TRACE_FUNC(); XRPL_ASSERT(validBook_, "xrpl::TOfferStreamBase::TOfferStreamBase : valid book"); } @@ -70,6 +73,7 @@ template void TOfferStreamBase::erase(ApplyView& view) { + TRACE_FUNC(); // NIKB NOTE This should be using ApplyView::dirRemove, which would // correctly remove the directory if its the last entry. // Unfortunately this is a protocol breaking change. @@ -110,6 +114,7 @@ accountFundsHelper( AuthHandling authHandling, beast::Journal j) { + TRACE_FUNC(); if constexpr (std::is_same_v) { if (id == asset.getIssuer()) @@ -135,6 +140,7 @@ template [[nodiscard]] bool TOfferStreamBase::shouldRmSmallIncreasedQOffer() const { + TRACE_FUNC(); // Consider removing the offer if: // o `TakerPays` is XRP (because of XRP drops granularity) or // o `TakerPays` and `TakerGets` are both IOU and `TakerPays`<`TakerGets` @@ -191,6 +197,7 @@ template bool TOfferStreamBase::step() { + TRACE_FUNC(); // Modifying the order or logic of these // operations causes a protocol breaking change. @@ -336,6 +343,7 @@ template void FlowOfferStream::permRmOffer(uint256 const& offerIndex) { + TRACE_FUNC(); permToRemove_.insert(offerIndex); } diff --git a/src/libxrpl/tx/paths/PaySteps.cpp b/src/libxrpl/tx/paths/PaySteps.cpp index 68bd501d87..f572aeaed9 100644 --- a/src/libxrpl/tx/paths/PaySteps.cpp +++ b/src/libxrpl/tx/paths/PaySteps.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -35,6 +36,7 @@ namespace xrpl { bool checkNear(IOUAmount const& expected, IOUAmount const& actual) { + TRACE_FUNC(); double const ratTol = 0.001; if (abs(expected.exponent() - actual.exponent()) > 1) return false; @@ -57,6 +59,7 @@ checkNear(IOUAmount const& expected, IOUAmount const& actual) static bool isXRPAccount(STPathElement const& pe) { + TRACE_FUNC(); if (pe.getNodeType() != STPathElement::TypeAccount) return false; return isXRP(pe.getAccountID()); @@ -69,6 +72,7 @@ toStep( STPathElement const* e2, Asset const& curAsset) { + TRACE_FUNC(); auto& j = ctx.j; if (ctx.isFirst && e1->isAccount() && @@ -181,6 +185,7 @@ toStrand( std::optional const& domainID, beast::Journal j) { + TRACE_FUNC(); if (isXRP(src) || isXRP(dst) || !isConsistent(deliver) || (sendMaxAsset && !isConsistent(*sendMaxAsset))) return {temBAD_PATH, Strand{}}; @@ -586,6 +591,7 @@ toStrands( std::optional const& domainID, beast::Journal j) { + TRACE_FUNC(); std::vector result; result.reserve(1 + paths.size()); // Insert the strand into result if it is not already part of the vector diff --git a/src/libxrpl/tx/paths/RippleCalc.cpp b/src/libxrpl/tx/paths/RippleCalc.cpp index 06e386344d..4f60599e32 100644 --- a/src/libxrpl/tx/paths/RippleCalc.cpp +++ b/src/libxrpl/tx/paths/RippleCalc.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -49,6 +50,7 @@ RippleCalc::rippleCalculate( ServiceRegistry& registry, Input const* const pInputs) { + TRACE_FUNC(); Output flowOut; PaymentSandbox flowSB(&view); auto j = registry.getJournal("Flow"); diff --git a/src/libxrpl/tx/paths/XRPEndpointStep.cpp b/src/libxrpl/tx/paths/XRPEndpointStep.cpp index 244e1cffea..0a7eafbb49 100644 --- a/src/libxrpl/tx/paths/XRPEndpointStep.cpp +++ b/src/libxrpl/tx/paths/XRPEndpointStep.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -48,6 +49,7 @@ private: [[nodiscard]] std::optional cached() const { + TRACE_FUNC(); if (!cache_) return std::nullopt; return EitherAmount(*cache_); @@ -62,12 +64,14 @@ public: [[nodiscard]] AccountID const& acc() const { + TRACE_FUNC(); return acc_; } [[nodiscard]] std::optional> directStepAccts() const override { + TRACE_FUNC(); if (isLast_) return std::make_pair(xrpAccount(), acc_); return std::make_pair(acc_, xrpAccount()); @@ -76,18 +80,21 @@ public: [[nodiscard]] std::optional cachedIn() const override { + TRACE_FUNC(); return cached(); } [[nodiscard]] std::optional cachedOut() const override { + TRACE_FUNC(); return cached(); } [[nodiscard]] DebtDirection debtDirection(ReadView const& sb, StrandDirection dir) const override { + TRACE_FUNC(); return DebtDirection::Issues; } @@ -119,12 +126,14 @@ protected: XRPAmount xrpLiquidImpl(ReadView& sb, std::int32_t reserveReduction) const { + TRACE_FUNC(); return xrpl::xrpLiquid(sb, acc_, reserveReduction, j_); } std::string logStringImpl(char const* name) const { + TRACE_FUNC(); std::ostringstream ostr; ostr << name << ": " << "\nAcc: " << acc_; @@ -139,12 +148,14 @@ private: friend bool operator!=(XRPEndpointStep const& lhs, XRPEndpointStep const& rhs) { + TRACE_FUNC(); return !(lhs == rhs); } [[nodiscard]] bool equal(Step const& rhs) const override { + TRACE_FUNC(); if (auto ds = dynamic_cast(&rhs)) { return *this == *ds; @@ -175,6 +186,7 @@ public: XRPAmount xrpLiquid(ReadView& sb) const { + TRACE_FUNC(); return xrpLiquidImpl(sb, 0); ; } @@ -182,6 +194,7 @@ public: [[nodiscard]] std::string logString() const override { + TRACE_FUNC(); return logStringImpl("XRPEndpointPaymentStep"); } }; @@ -200,6 +213,7 @@ private: static std::int32_t computeReserveReduction(StrandContext const& ctx, AccountID const& acc) { + TRACE_FUNC(); if (ctx.isFirst) { return ctx.strandDeliver.visit( @@ -227,12 +241,14 @@ public: XRPAmount xrpLiquid(ReadView& sb) const { + TRACE_FUNC(); return xrpLiquidImpl(sb, reserveReduction_); } [[nodiscard]] std::string logString() const override { + TRACE_FUNC(); return logStringImpl("XRPEndpointOfferCrossingStep"); } @@ -246,6 +262,7 @@ template inline bool operator==(XRPEndpointStep const& lhs, XRPEndpointStep const& rhs) { + TRACE_FUNC(); return lhs.acc_ == rhs.acc_ && lhs.isLast_ == rhs.isLast_; } @@ -253,6 +270,7 @@ template std::pair, DebtDirection> XRPEndpointStep::qualityUpperBound(ReadView const& v, DebtDirection prevStepDir) const { + TRACE_FUNC(); return {Quality{STAmount::kU_RATE_ONE}, this->debtDirection(v, StrandDirection::Forward)}; } @@ -264,6 +282,7 @@ XRPEndpointStep::revImp( boost::container::flat_set& ofrsToRm, XRPAmount const& out) { + TRACE_FUNC(); auto const balance = static_cast(this)->xrpLiquid(sb); auto const result = isLast_ ? out : std::min(balance, out); @@ -286,6 +305,7 @@ XRPEndpointStep::fwdImp( boost::container::flat_set& ofrsToRm, XRPAmount const& in) { + TRACE_FUNC(); XRPL_ASSERT(cache_, "xrpl::XRPEndpointStep::fwdImp : cache is set"); auto const balance = static_cast(this)->xrpLiquid(sb); @@ -305,6 +325,7 @@ template std::pair XRPEndpointStep::validFwd(PaymentSandbox& sb, ApplyView& afView, EitherAmount const& in) { + TRACE_FUNC(); if (!cache_) { JLOG(j_.error()) << "Expected valid cache in validFwd"; @@ -337,6 +358,7 @@ template TER XRPEndpointStep::check(StrandContext const& ctx) const { + TRACE_FUNC(); if (!acc_) { JLOG(j_.debug()) << "XRPEndpointStep: specified bad account."; @@ -381,6 +403,7 @@ namespace test { bool xrpEndpointStepEqual(Step const& step, AccountID const& acc) { + TRACE_FUNC(); if (auto xs = dynamic_cast const*>(&step)) { return xs->acc() == acc; @@ -394,6 +417,7 @@ xrpEndpointStepEqual(Step const& step, AccountID const& acc) std::pair> makeXrpEndpointStep(StrandContext const& ctx, AccountID const& acc) { + TRACE_FUNC(); TER ter = tefINTERNAL; std::unique_ptr r; if (ctx.offerCrossing != OfferCrossing::No) diff --git a/src/libxrpl/tx/transactors/account/AccountDelete.cpp b/src/libxrpl/tx/transactors/account/AccountDelete.cpp index f9d1913dff..079adc02f3 100644 --- a/src/libxrpl/tx/transactors/account/AccountDelete.cpp +++ b/src/libxrpl/tx/transactors/account/AccountDelete.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -40,12 +41,14 @@ namespace xrpl { bool AccountDelete::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return !ctx.tx.isFieldPresent(sfCredentialIDs) || ctx.rules.enabled(featureCredentials); } NotTEC AccountDelete::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfAccount] == ctx.tx[sfDestination]) { // An account cannot be deleted and give itself the resulting XRP. @@ -61,6 +64,7 @@ AccountDelete::preflight(PreflightContext const& ctx) XRPAmount AccountDelete::calculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); // The fee required for AccountDelete is one owner reserve. return calculateOwnerReserveFee(view, tx); } @@ -85,6 +89,7 @@ offerDelete( std::shared_ptr const& sleDel, beast::Journal j) { + TRACE_FUNC(); return offerDelete(view, sleDel, j); } @@ -97,6 +102,7 @@ removeSignersFromLedger( std::shared_ptr const& sleDel, beast::Journal j) { + TRACE_FUNC(); return SignerListSet::removeFromLedger(registry, view, account, j); } @@ -109,6 +115,7 @@ removeTicketFromLedger( std::shared_ptr const&, beast::Journal j) { + TRACE_FUNC(); return Transactor::ticketDelete(view, account, delIndex, j); } @@ -121,6 +128,7 @@ removeDepositPreauthFromLedger( std::shared_ptr const&, beast::Journal j) { + TRACE_FUNC(); return DepositPreauth::removeFromLedger(view, delIndex, j); } @@ -133,6 +141,7 @@ removeNFTokenOfferFromLedger( std::shared_ptr const& sleDel, beast::Journal) { + TRACE_FUNC(); if (!nft::deleteTokenOffer(view, sleDel)) return tefBAD_LEDGER; // LCOV_EXCL_LINE @@ -148,6 +157,7 @@ removeDIDFromLedger( std::shared_ptr const& sleDel, beast::Journal j) { + TRACE_FUNC(); return DIDDelete::deleteSLE(view, sleDel, account, j); } @@ -160,6 +170,7 @@ removeOracleFromLedger( std::shared_ptr const& sleDel, beast::Journal j) { + TRACE_FUNC(); return OracleDelete::deleteOracle(view, sleDel, account, j); } @@ -172,6 +183,7 @@ removeCredentialFromLedger( std::shared_ptr const& sleDel, beast::Journal j) { + TRACE_FUNC(); return credentials::deleteSLE(view, sleDel, j); } @@ -184,6 +196,7 @@ removeDelegateFromLedger( std::shared_ptr const& sleDel, beast::Journal j) { + TRACE_FUNC(); return DelegateSet::deleteDelegate(view, sleDel, j); } @@ -193,6 +206,7 @@ removeDelegateFromLedger( DeleterFuncPtr nonObligationDeleter(LedgerEntryType t) { + TRACE_FUNC(); switch (t) { case ltOFFER: @@ -223,6 +237,7 @@ nonObligationDeleter(LedgerEntryType t) TER AccountDelete::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); AccountID const account{ctx.tx[sfAccount]}; AccountID const dst{ctx.tx[sfDestination]}; @@ -344,6 +359,7 @@ AccountDelete::preclaim(PreclaimContext const& ctx) TER AccountDelete::doApply() { + TRACE_FUNC(); auto src = view().peek(keylet::account(account_)); XRPL_ASSERT(src, "xrpl::AccountDelete::doApply : non-null source account"); @@ -432,6 +448,7 @@ AccountDelete::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/account/AccountSet.cpp b/src/libxrpl/tx/transactors/account/AccountSet.cpp index da24640bfa..92401cd09a 100644 --- a/src/libxrpl/tx/transactors/account/AccountSet.cpp +++ b/src/libxrpl/tx/transactors/account/AccountSet.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -34,6 +35,7 @@ namespace xrpl { TxConsequences AccountSet::makeTxConsequences(PreflightContext const& ctx) { + TRACE_FUNC(); // The AccountSet may be a blocker, but only if it sets or clears // specific account flags. auto getTxConsequencesCategory = [](STTx const& tx) { @@ -60,12 +62,14 @@ AccountSet::makeTxConsequences(PreflightContext const& ctx) std::uint32_t AccountSet::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfAccountSetMask; } NotTEC AccountSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto& tx = ctx.tx; auto& j = ctx.j; @@ -178,6 +182,7 @@ AccountSet::preflight(PreflightContext const& ctx) NotTEC AccountSet::checkPermission(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); // AccountSet is prohibited to be granted on a transaction level, // but some granular permissions are allowed. auto const delegate = tx[~sfDelegate]; @@ -227,6 +232,7 @@ AccountSet::checkPermission(ReadView const& view, STTx const& tx) TER AccountSet::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const id = ctx.tx[sfAccount]; std::uint32_t const uTxFlags = ctx.tx.getFlags(); @@ -290,6 +296,7 @@ AccountSet::preclaim(PreclaimContext const& ctx) TER AccountSet::doApply() { + TRACE_FUNC(); auto const sle = view().peek(keylet::account(account_)); if (!sle) return tefINTERNAL; // LCOV_EXCL_LINE @@ -668,6 +675,7 @@ AccountSet::visitInvariantEntry( bool AccountSet::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/account/SetRegularKey.cpp b/src/libxrpl/tx/transactors/account/SetRegularKey.cpp index bc59ed4fc1..7796e38bd4 100644 --- a/src/libxrpl/tx/transactors/account/SetRegularKey.cpp +++ b/src/libxrpl/tx/transactors/account/SetRegularKey.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include @@ -20,6 +21,7 @@ namespace xrpl { XRPAmount SetRegularKey::calculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); auto const id = tx.getAccountID(sfAccount); auto const spk = tx.getSigningPubKey(); @@ -43,6 +45,7 @@ SetRegularKey::calculateBaseFee(ReadView const& view, STTx const& tx) NotTEC SetRegularKey::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx.isFieldPresent(sfRegularKey) && (ctx.tx.getAccountID(sfRegularKey) == ctx.tx.getAccountID(sfAccount))) { @@ -55,6 +58,7 @@ SetRegularKey::preflight(PreflightContext const& ctx) TER SetRegularKey::doApply() { + TRACE_FUNC(); auto const sle = view().peek(keylet::account(account_)); if (!sle) return tefINTERNAL; // LCOV_EXCL_LINE @@ -96,6 +100,7 @@ SetRegularKey::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/account/SignerListSet.cpp b/src/libxrpl/tx/transactors/account/SignerListSet.cpp index 3060abe6df..d577557460 100644 --- a/src/libxrpl/tx/transactors/account/SignerListSet.cpp +++ b/src/libxrpl/tx/transactors/account/SignerListSet.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -42,6 +43,7 @@ static std::uint32_t const kDEFAULT_SIGNER_LIST_ID = 0; std::tuple, SignerListSet::Operation> SignerListSet::determineOperation(STTx const& tx, ApplyFlags flags, beast::Journal j) { + TRACE_FUNC(); // Check the quorum. A non-zero quorum means we're creating or replacing // the list. A zero quorum means we're destroying the list. auto const quorum = tx[sfSignerQuorum]; @@ -73,6 +75,7 @@ SignerListSet::determineOperation(STTx const& tx, ApplyFlags flags, beast::Journ std::uint32_t SignerListSet::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); // 0 means "Allow any flags" return ctx.rules.enabled(fixInvalidTxFlags) ? tfUniversalMask : 0; } @@ -80,6 +83,7 @@ SignerListSet::getFlagsMask(PreflightContext const& ctx) NotTEC SignerListSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const result = determineOperation(ctx.tx, ctx.flags, ctx.j); if (!isTesSuccess(std::get<0>(result))) @@ -110,6 +114,7 @@ SignerListSet::preflight(PreflightContext const& ctx) TER SignerListSet::doApply() { + TRACE_FUNC(); // Perform the operation preCompute() decided on. switch (do_) { @@ -131,6 +136,7 @@ SignerListSet::doApply() void SignerListSet::preCompute() { + TRACE_FUNC(); // Get the quorum and operation info. auto result = determineOperation(ctx_.tx, view().flags(), j_); XRPL_ASSERT( @@ -152,6 +158,7 @@ SignerListSet::preCompute() static int signerCountBasedOwnerCountDelta(std::size_t entryCount, Rules const& rules) { + TRACE_FUNC(); // We always compute the full change in OwnerCount, taking into account: // o The fact that we're adding/removing a SignerList and // o Accounting for the number of entries in the list. @@ -185,6 +192,7 @@ removeSignersFromLedger( Keylet const& signerListKeylet, beast::Journal j) { + TRACE_FUNC(); // We have to examine the current SignerList so we know how much to // reduce the OwnerCount. SLE::pointer const signers = view.peek(signerListKeylet); @@ -230,6 +238,7 @@ SignerListSet::removeFromLedger( AccountID const& account, beast::Journal j) { + TRACE_FUNC(); auto const accountKeylet = keylet::account(account); auto const ownerDirKeylet = keylet::ownerDir(account); auto const signerListKeylet = keylet::signers(account); @@ -246,6 +255,7 @@ SignerListSet::validateQuorumAndSignerEntries( beast::Journal j, Rules const& rules) { + TRACE_FUNC(); // Reject if there are too many or too few entries in the list. { std::size_t const signerCount = signers.size(); @@ -300,6 +310,7 @@ SignerListSet::validateQuorumAndSignerEntries( TER SignerListSet::replaceSignerList() { + TRACE_FUNC(); auto const accountKeylet = keylet::account(account_); auto const ownerDirKeylet = keylet::ownerDir(account_); auto const signerListKeylet = keylet::signers(account_); @@ -356,6 +367,7 @@ SignerListSet::replaceSignerList() TER SignerListSet::destroySignerList() { + TRACE_FUNC(); auto const accountKeylet = keylet::account(account_); // Destroying the signer list is only allowed if either the master key // is enabled or there is a regular key. @@ -375,6 +387,7 @@ SignerListSet::destroySignerList() void SignerListSet::writeSignersToSLE(SLE::pointer const& ledgerEntry, std::uint32_t flags) const { + TRACE_FUNC(); // Assign the quorum, default SignerListID, and flags. if (ctx_.view().rules().enabled(fixIncludeKeyletFields)) { @@ -421,6 +434,7 @@ SignerListSet::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp b/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp index 09e5a7284a..085d5cee14 100644 --- a/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp +++ b/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -117,6 +118,7 @@ checkAttestationPublicKey( PublicKey const& pk, beast::Journal j) { + TRACE_FUNC(); if (!signersList.contains(attestationSignerAccount)) { return tecNO_PERMISSION; @@ -196,6 +198,7 @@ claimHelper( std::unordered_map const& signersList, beast::Journal j) { + TRACE_FUNC(); // Remove attestations that are not valid signers. They may be no longer // part of the signers list, or their master key may have been disabled, // or their regular key may have changed @@ -286,6 +289,7 @@ onNewAttestations( std::unordered_map const& signersList, beast::Journal j) { + TRACE_FUNC(); bool changed = false; for (auto att = attBegin; att != attEnd; ++att) { @@ -347,6 +351,7 @@ onClaim( std::unordered_map const& signersList, beast::Journal j) { + TRACE_FUNC(); XChainClaimAttestation::MatchFields const toMatch{ sendingAmount, wasLockingChainSend, std::nullopt}; return claimHelper(attestations, view, toMatch, CheckDst::Ignore, quorum, signersList, j); @@ -400,6 +405,7 @@ transferHelper( std::optional const& submittingAccountInfo, beast::Journal j) { + TRACE_FUNC(); if (dst == src) return tesSUCCESS; @@ -532,6 +538,7 @@ struct FinalizeClaimHelperResult [[nodiscard]] bool isTesSuccess() const { + TRACE_FUNC(); return (!mainFundsTer || xrpl::isTesSuccess(*mainFundsTer)) && (!rewardTer || xrpl::isTesSuccess(*rewardTer)) && (!rmSleTer || xrpl::isTesSuccess(*rmSleTer)); @@ -540,6 +547,7 @@ struct FinalizeClaimHelperResult [[nodiscard]] TER ter() const { + TRACE_FUNC(); if (isTesSuccess()) return tesSUCCESS; @@ -609,6 +617,7 @@ finalizeClaimHelper( DepositAuthPolicy depositAuthPolicy, beast::Journal j) { + TRACE_FUNC(); FinalizeClaimHelperResult result; STXChainBridge::ChainType const dstChain = STXChainBridge::otherChain(srcChain); @@ -748,6 +757,7 @@ finalizeClaimHelper( std::tuple, std::uint32_t, TER> getSignersListAndQuorum(ReadView const& view, SLE const& sleBridge, beast::Journal j) { + TRACE_FUNC(); std::unordered_map r; std::uint32_t q = std::numeric_limits::max(); @@ -785,6 +795,7 @@ template std::shared_ptr readOrpeekBridge(F&& getter, STXChainBridge const& bridgeSpec) { + TRACE_FUNC(); auto tryGet = [&](STXChainBridge::ChainType ct) -> std::shared_ptr { if (auto r = getter(bridgeSpec, ct)) { @@ -801,6 +812,7 @@ readOrpeekBridge(F&& getter, STXChainBridge const& bridgeSpec) std::shared_ptr peekBridge(ApplyView& v, STXChainBridge const& bridgeSpec) { + TRACE_FUNC(); return readOrpeekBridge( [&v](STXChainBridge const& b, STXChainBridge::ChainType ct) -> std::shared_ptr { return v.peek(keylet::bridge(b, ct)); @@ -811,6 +823,7 @@ peekBridge(ApplyView& v, STXChainBridge const& bridgeSpec) std::shared_ptr readBridge(ReadView const& v, STXChainBridge const& bridgeSpec) { + TRACE_FUNC(); return readOrpeekBridge( [&v](STXChainBridge const& b, STXChainBridge::ChainType ct) -> std::shared_ptr { return v.read(keylet::bridge(b, ct)); @@ -833,6 +846,7 @@ applyClaimAttestations( std::uint32_t quorum, beast::Journal j) { + TRACE_FUNC(); if (attBegin == attEnd) return tesSUCCESS; @@ -959,6 +973,7 @@ applyCreateAccountAttestations( std::uint32_t quorum, beast::Journal j) { + TRACE_FUNC(); if (attBegin == attEnd) return tesSUCCESS; @@ -1152,6 +1167,7 @@ template std::optional toClaim(STTx const& tx) { + TRACE_FUNC(); static_assert( std::is_same_v || std::is_same_v); @@ -1172,6 +1188,7 @@ template NotTEC attestationPreflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (!publicKeyType(ctx.tx[sfPublicKey])) return temMALFORMED; @@ -1198,6 +1215,7 @@ template TER attestationPreclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const att = toClaim(ctx.tx); // checked in preflight if (!att) @@ -1226,6 +1244,7 @@ template TER attestationDoApply(ApplyContext& ctx) { + TRACE_FUNC(); auto const att = toClaim(ctx.tx); if (!att) { @@ -1330,6 +1349,7 @@ attestationDoApply(ApplyContext& ctx) NotTEC XChainCreateBridge::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const account = ctx.tx[sfAccount]; auto const reward = ctx.tx[sfSignatureReward]; auto const minAccountCreate = ctx.tx[~sfMinAccountCreateAmount]; @@ -1399,6 +1419,7 @@ XChainCreateBridge::preflight(PreflightContext const& ctx) TER XChainCreateBridge::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const account = ctx.tx[sfAccount]; auto const bridgeSpec = ctx.tx[sfXChainBridge]; STXChainBridge::ChainType const chainType = @@ -1448,6 +1469,7 @@ XChainCreateBridge::preclaim(PreclaimContext const& ctx) TER XChainCreateBridge::doApply() { + TRACE_FUNC(); auto const account = ctx_.tx[sfAccount]; auto const bridgeSpec = ctx_.tx[sfXChainBridge]; auto const reward = ctx_.tx[sfSignatureReward]; @@ -1494,12 +1516,14 @@ XChainCreateBridge::doApply() std::uint32_t BridgeModify::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfXChainModifyBridgeMask; } NotTEC BridgeModify::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const account = ctx.tx[sfAccount]; auto const reward = ctx.tx[~sfSignatureReward]; auto const minAccountCreate = ctx.tx[~sfMinAccountCreateAmount]; @@ -1541,6 +1565,7 @@ BridgeModify::preflight(PreflightContext const& ctx) TER BridgeModify::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const account = ctx.tx[sfAccount]; auto const bridgeSpec = ctx.tx[sfXChainBridge]; @@ -1558,6 +1583,7 @@ BridgeModify::preclaim(PreclaimContext const& ctx) TER BridgeModify::doApply() { + TRACE_FUNC(); auto const account = ctx_.tx[sfAccount]; auto const bridgeSpec = ctx_.tx[sfXChainBridge]; auto const reward = ctx_.tx[~sfSignatureReward]; @@ -1595,6 +1621,7 @@ BridgeModify::doApply() NotTEC XChainClaim::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); STXChainBridge const bridgeSpec = ctx.tx[sfXChainBridge]; auto const amount = ctx.tx[sfAmount]; @@ -1611,6 +1638,7 @@ XChainClaim::preflight(PreflightContext const& ctx) TER XChainClaim::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); AccountID const account = ctx.tx[sfAccount]; STXChainBridge const bridgeSpec = ctx.tx[sfXChainBridge]; STAmount const& thisChainAmount = ctx.tx[sfAmount]; @@ -1703,6 +1731,7 @@ XChainClaim::preclaim(PreclaimContext const& ctx) TER XChainClaim::doApply() { + TRACE_FUNC(); PaymentSandbox psb(&ctx_.view()); AccountID const account = ctx_.tx[sfAccount]; @@ -1822,6 +1851,7 @@ XChainClaim::doApply() TxConsequences XChainCommit::makeTxConsequences(PreflightContext const& ctx) { + TRACE_FUNC(); auto const maxSpend = [&] { auto const amount = ctx.tx[sfAmount]; if (amount.native() && amount.signum() > 0) @@ -1835,6 +1865,7 @@ XChainCommit::makeTxConsequences(PreflightContext const& ctx) NotTEC XChainCommit::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const amount = ctx.tx[sfAmount]; auto const bridgeSpec = ctx.tx[sfXChainBridge]; @@ -1851,6 +1882,7 @@ XChainCommit::preflight(PreflightContext const& ctx) TER XChainCommit::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const bridgeSpec = ctx.tx[sfXChainBridge]; auto const amount = ctx.tx[sfAmount]; @@ -1902,6 +1934,7 @@ XChainCommit::preclaim(PreclaimContext const& ctx) TER XChainCommit::doApply() { + TRACE_FUNC(); PaymentSandbox psb(&ctx_.view()); auto const account = ctx_.tx[sfAccount]; @@ -1949,6 +1982,7 @@ XChainCommit::doApply() NotTEC XChainCreateClaimID::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const reward = ctx.tx[sfSignatureReward]; if (!isXRP(reward) || reward.signum() < 0 || !isLegalNet(reward)) @@ -1960,6 +1994,7 @@ XChainCreateClaimID::preflight(PreflightContext const& ctx) TER XChainCreateClaimID::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const account = ctx.tx[sfAccount]; auto const bridgeSpec = ctx.tx[sfXChainBridge]; auto const sleBridge = readBridge(ctx.view, bridgeSpec); @@ -1996,6 +2031,7 @@ XChainCreateClaimID::preclaim(PreclaimContext const& ctx) TER XChainCreateClaimID::doApply() { + TRACE_FUNC(); auto const account = ctx_.tx[sfAccount]; auto const bridgeSpec = ctx_.tx[sfXChainBridge]; auto const reward = ctx_.tx[sfSignatureReward]; @@ -2057,18 +2093,21 @@ XChainCreateClaimID::doApply() NotTEC XChainAddClaimAttestation::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); return attestationPreflight(ctx); } TER XChainAddClaimAttestation::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); return attestationPreclaim(ctx); } TER XChainAddClaimAttestation::doApply() { + TRACE_FUNC(); return attestationDoApply(ctx_); } @@ -2077,18 +2116,21 @@ XChainAddClaimAttestation::doApply() NotTEC XChainAddAccountCreateAttestation::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); return attestationPreflight(ctx); } TER XChainAddAccountCreateAttestation::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); return attestationPreclaim(ctx); } TER XChainAddAccountCreateAttestation::doApply() { + TRACE_FUNC(); return attestationDoApply(ctx_); } @@ -2097,6 +2139,7 @@ XChainAddAccountCreateAttestation::doApply() NotTEC XChainCreateAccountCommit::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const amount = ctx.tx[sfAmount]; if (amount.signum() <= 0 || !amount.native()) @@ -2115,6 +2158,7 @@ XChainCreateAccountCommit::preflight(PreflightContext const& ctx) TER XChainCreateAccountCommit::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); STXChainBridge const bridgeSpec = ctx.tx[sfXChainBridge]; STAmount const amount = ctx.tx[sfAmount]; STAmount const reward = ctx.tx[sfSignatureReward]; @@ -2178,6 +2222,7 @@ XChainCreateAccountCommit::preclaim(PreclaimContext const& ctx) TER XChainCreateAccountCommit::doApply() { + TRACE_FUNC(); PaymentSandbox psb(&ctx_.view()); AccountID const account = ctx_.tx[sfAccount]; @@ -2238,6 +2283,7 @@ XChainCreateBridge::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } @@ -2257,6 +2303,7 @@ BridgeModify::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } @@ -2271,6 +2318,7 @@ XChainClaim::visitInvariantEntry( bool XChainClaim::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } @@ -2290,6 +2338,7 @@ XChainCommit::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } @@ -2309,6 +2358,7 @@ XChainCreateClaimID::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } @@ -2328,6 +2378,7 @@ XChainAddClaimAttestation::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } @@ -2347,6 +2398,7 @@ XChainAddAccountCreateAttestation::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } @@ -2366,6 +2418,7 @@ XChainCreateAccountCommit::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/check/CheckCancel.cpp b/src/libxrpl/tx/transactors/check/CheckCancel.cpp index c30c116e58..3e363c4e50 100644 --- a/src/libxrpl/tx/transactors/check/CheckCancel.cpp +++ b/src/libxrpl/tx/transactors/check/CheckCancel.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -21,12 +22,14 @@ namespace xrpl { NotTEC CheckCancel::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); return tesSUCCESS; } TER CheckCancel::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const sleCheck = ctx.view.read(keylet::check(ctx.tx[sfCheckID])); if (!sleCheck) { @@ -56,6 +59,7 @@ CheckCancel::preclaim(PreclaimContext const& ctx) TER CheckCancel::doApply() { + TRACE_FUNC(); auto const sleCheck = view().peek(keylet::check(ctx_.tx[sfCheckID])); if (!sleCheck) { @@ -112,6 +116,7 @@ CheckCancel::visitInvariantEntry( bool CheckCancel::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/check/CheckCash.cpp b/src/libxrpl/tx/transactors/check/CheckCash.cpp index 34288425a5..fbd7705b3a 100644 --- a/src/libxrpl/tx/transactors/check/CheckCash.cpp +++ b/src/libxrpl/tx/transactors/check/CheckCash.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -39,6 +40,7 @@ namespace xrpl { bool CheckCash::checkExtraFeatures(xrpl::PreflightContext const& ctx) { + TRACE_FUNC(); auto const optAmount = ctx.tx[~sfAmount]; auto const optDeliverMin = ctx.tx[~sfDeliverMin]; @@ -50,6 +52,7 @@ CheckCash::checkExtraFeatures(xrpl::PreflightContext const& ctx) NotTEC CheckCash::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); // Exactly one of Amount or DeliverMin must be present. auto const optAmount = ctx.tx[~sfAmount]; auto const optDeliverMin = ctx.tx[~sfDeliverMin]; @@ -81,6 +84,7 @@ CheckCash::preflight(PreflightContext const& ctx) TER CheckCash::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const sleCheck = ctx.view.read(keylet::check(ctx.tx[sfCheckID])); if (!sleCheck) { @@ -281,6 +285,7 @@ CheckCash::preclaim(PreclaimContext const& ctx) TER CheckCash::doApply() { + TRACE_FUNC(); // Flow requires that we operate on a PaymentSandbox, rather than // directly on a View. PaymentSandbox psb(&ctx_.view()); @@ -599,6 +604,7 @@ CheckCash::visitInvariantEntry( bool CheckCash::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/check/CheckCreate.cpp b/src/libxrpl/tx/transactors/check/CheckCreate.cpp index 6a13819615..7840d520e0 100644 --- a/src/libxrpl/tx/transactors/check/CheckCreate.cpp +++ b/src/libxrpl/tx/transactors/check/CheckCreate.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -33,12 +34,14 @@ namespace xrpl { bool CheckCreate::checkExtraFeatures(xrpl::PreflightContext const& ctx) { + TRACE_FUNC(); return ctx.rules.enabled(featureMPTokensV2) || !ctx.tx[sfSendMax].holds(); } NotTEC CheckCreate::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfAccount] == ctx.tx[sfDestination]) { // They wrote a check to themselves. @@ -77,6 +80,7 @@ CheckCreate::preflight(PreflightContext const& ctx) TER CheckCreate::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); AccountID const dstId{ctx.tx[sfDestination]}; AccountID const srcId{ctx.tx[sfAccount]}; auto const sleDst = ctx.view.read(keylet::account(dstId)); @@ -177,6 +181,7 @@ CheckCreate::preclaim(PreclaimContext const& ctx) TER CheckCreate::doApply() { + TRACE_FUNC(); auto const sle = view().peek(keylet::account(account_)); if (!sle) return tefINTERNAL; // LCOV_EXCL_LINE @@ -258,6 +263,7 @@ CheckCreate::visitInvariantEntry( bool CheckCreate::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp b/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp index 0dd21d3bd5..0eb2a0399b 100644 --- a/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp +++ b/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ using namespace credentials; std::uint32_t CredentialAccept::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); // 0 means "Allow any flags" return ctx.rules.enabled(fixInvalidTxFlags) ? tfUniversalMask : 0; } @@ -36,6 +38,7 @@ CredentialAccept::getFlagsMask(PreflightContext const& ctx) NotTEC CredentialAccept::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ctx.tx[sfIssuer]) { JLOG(ctx.j.trace()) << "Malformed transaction: Issuer field zeroed."; @@ -55,6 +58,7 @@ CredentialAccept::preflight(PreflightContext const& ctx) TER CredentialAccept::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); AccountID const subject = ctx.tx[sfAccount]; AccountID const issuer = ctx.tx[sfIssuer]; auto const credType(ctx.tx[sfCredentialType]); @@ -86,6 +90,7 @@ CredentialAccept::preclaim(PreclaimContext const& ctx) TER CredentialAccept::doApply() { + TRACE_FUNC(); AccountID const issuer{ctx_.tx[sfIssuer]}; // Both exist as credential object exist itself (checked in preclaim) @@ -139,6 +144,7 @@ CredentialAccept::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp b/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp index e54c48287f..4ab7f17879 100644 --- a/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp +++ b/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,7 @@ using namespace credentials; std::uint32_t CredentialCreate::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); // 0 means "Allow any flags" return ctx.rules.enabled(fixInvalidTxFlags) ? tfUniversalMask : 0; } @@ -52,6 +54,7 @@ CredentialCreate::getFlagsMask(PreflightContext const& ctx) NotTEC CredentialCreate::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const& tx = ctx.tx; auto& j = ctx.j; @@ -81,6 +84,7 @@ CredentialCreate::preflight(PreflightContext const& ctx) TER CredentialCreate::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const credType(ctx.tx[sfCredentialType]); auto const subject = ctx.tx[sfSubject]; @@ -102,6 +106,7 @@ CredentialCreate::preclaim(PreclaimContext const& ctx) TER CredentialCreate::doApply() { + TRACE_FUNC(); auto const subject = ctx_.tx[sfSubject]; auto const credType(ctx_.tx[sfCredentialType]); Keylet const credentialKey = keylet::credential(subject, account_, credType); @@ -194,6 +199,7 @@ CredentialCreate::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/credentials/CredentialDelete.cpp b/src/libxrpl/tx/transactors/credentials/CredentialDelete.cpp index 42880bfdf8..86ed5a53ae 100644 --- a/src/libxrpl/tx/transactors/credentials/CredentialDelete.cpp +++ b/src/libxrpl/tx/transactors/credentials/CredentialDelete.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,7 @@ using namespace credentials; std::uint32_t CredentialDelete::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); // 0 means "Allow any flags" return ctx.rules.enabled(fixInvalidTxFlags) ? tfUniversalMask : 0; } @@ -32,6 +34,7 @@ CredentialDelete::getFlagsMask(PreflightContext const& ctx) NotTEC CredentialDelete::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const subject = ctx.tx[~sfSubject]; auto const issuer = ctx.tx[~sfIssuer]; @@ -64,6 +67,7 @@ CredentialDelete::preflight(PreflightContext const& ctx) TER CredentialDelete::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); AccountID const account{ctx.tx[sfAccount]}; auto const subject = ctx.tx[~sfSubject].value_or(account); auto const issuer = ctx.tx[~sfIssuer].value_or(account); @@ -78,6 +82,7 @@ CredentialDelete::preclaim(PreclaimContext const& ctx) TER CredentialDelete::doApply() { + TRACE_FUNC(); auto const subject = ctx_.tx[~sfSubject].value_or(account_); auto const issuer = ctx_.tx[~sfIssuer].value_or(account_); @@ -112,6 +117,7 @@ CredentialDelete::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp b/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp index baf208a305..0c082eadc1 100644 --- a/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp +++ b/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -24,6 +25,7 @@ namespace xrpl { NotTEC DelegateSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const& permissions = ctx.tx.getFieldArray(sfPermissions); if (permissions.size() > kPERMISSION_MAX_SIZE) return temARRAY_TOO_LARGE; @@ -49,6 +51,7 @@ DelegateSet::preflight(PreflightContext const& ctx) TER DelegateSet::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); if (!ctx.view.exists(keylet::account(ctx.tx[sfAccount]))) return terNO_ACCOUNT; // LCOV_EXCL_LINE @@ -68,6 +71,7 @@ DelegateSet::preclaim(PreclaimContext const& ctx) TER DelegateSet::doApply() { + TRACE_FUNC(); auto const sleOwner = ctx_.view().peek(keylet::account(account_)); if (!sleOwner) return tefINTERNAL; // LCOV_EXCL_LINE @@ -134,6 +138,7 @@ DelegateSet::doApply() TER DelegateSet::deleteDelegate(ApplyView& view, std::shared_ptr const& sle, beast::Journal j) { + TRACE_FUNC(); if (!sle) return tecINTERNAL; // LCOV_EXCL_LINE @@ -184,6 +189,7 @@ DelegateSet::visitInvariantEntry( bool DelegateSet::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/delegate/DelegateUtils.cpp b/src/libxrpl/tx/transactors/delegate/DelegateUtils.cpp index 4d3d97e443..0f730f7fd9 100644 --- a/src/libxrpl/tx/transactors/delegate/DelegateUtils.cpp +++ b/src/libxrpl/tx/transactors/delegate/DelegateUtils.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -14,6 +15,7 @@ namespace xrpl { NotTEC checkTxPermission(std::shared_ptr const& delegate, STTx const& tx) { + TRACE_FUNC(); if (!delegate) return terNO_DELEGATE_PERMISSION; @@ -36,6 +38,7 @@ loadGranularPermission( TxType const& txType, std::unordered_set& granularPermissions) { + TRACE_FUNC(); if (!delegate) return; diff --git a/src/libxrpl/tx/transactors/dex/AMMBid.cpp b/src/libxrpl/tx/transactors/dex/AMMBid.cpp index d4783c783b..60f6f4d569 100644 --- a/src/libxrpl/tx/transactors/dex/AMMBid.cpp +++ b/src/libxrpl/tx/transactors/dex/AMMBid.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,7 @@ namespace xrpl { bool AMMBid::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ammEnabled(ctx.rules)) return false; @@ -50,6 +52,7 @@ AMMBid::checkExtraFeatures(PreflightContext const& ctx) NotTEC AMMBid::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (auto const res = invalidAMMAssetPair(ctx.tx[sfAsset], ctx.tx[sfAsset2])) { JLOG(ctx.j.debug()) << "AMM Bid: Invalid asset pair."; @@ -105,6 +108,7 @@ AMMBid::preflight(PreflightContext const& ctx) TER AMMBid::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const ammSle = ctx.view.read(keylet::amm(ctx.tx[sfAsset], ctx.tx[sfAsset2])); if (!ammSle) { @@ -179,6 +183,7 @@ AMMBid::preclaim(PreclaimContext const& ctx) static std::pair applyBid(ApplyContext& ctx, Sandbox& sb, AccountID const& account, beast::Journal j) { + TRACE_FUNC(); using namespace std::chrono; auto const ammSle = sb.peek(keylet::amm(ctx.tx[sfAsset], ctx.tx[sfAsset2])); if (!ammSle) @@ -367,6 +372,7 @@ applyBid(ApplyContext& ctx, Sandbox& sb, AccountID const& account, beast::Journa TER AMMBid::doApply() { + TRACE_FUNC(); // This is the ledger view that we work against. Transactions are applied // as we go on processing transactions. Sandbox sb(&ctx_.view()); @@ -389,6 +395,7 @@ AMMBid::visitInvariantEntry( bool AMMBid::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/dex/AMMClawback.cpp b/src/libxrpl/tx/transactors/dex/AMMClawback.cpp index 112d290e72..c14790378c 100644 --- a/src/libxrpl/tx/transactors/dex/AMMClawback.cpp +++ b/src/libxrpl/tx/transactors/dex/AMMClawback.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -36,12 +37,14 @@ namespace xrpl { std::uint32_t AMMClawback::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfAMMClawbackMask; } bool AMMClawback::checkExtraFeatures(xrpl::PreflightContext const& ctx) { + TRACE_FUNC(); if (!ctx.rules.enabled(featureAMMClawback)) return false; @@ -55,6 +58,7 @@ AMMClawback::checkExtraFeatures(xrpl::PreflightContext const& ctx) NotTEC AMMClawback::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); AccountID const issuer = ctx.tx[sfAccount]; AccountID const holder = ctx.tx[sfHolder]; @@ -103,6 +107,7 @@ AMMClawback::preflight(PreflightContext const& ctx) TER AMMClawback::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const asset = ctx.tx[sfAsset]; auto const asset2 = ctx.tx[sfAsset2]; auto const sleIssuer = ctx.view.read(keylet::account(ctx.tx[sfAccount])); @@ -160,6 +165,7 @@ AMMClawback::preclaim(PreclaimContext const& ctx) TER AMMClawback::doApply() { + TRACE_FUNC(); Sandbox sb(&ctx_.view()); auto const ter = applyGuts(sb); @@ -172,6 +178,7 @@ AMMClawback::doApply() TER AMMClawback::applyGuts(Sandbox& sb) { + TRACE_FUNC(); std::optional const clawAmount = ctx_.tx[~sfAmount]; AccountID const issuer = ctx_.tx[sfAccount]; AccountID const holder = ctx_.tx[sfHolder]; @@ -307,6 +314,7 @@ AMMClawback::equalWithdrawMatchingOneAmount( STAmount const& holdLPtokens, STAmount const& amount) { + TRACE_FUNC(); auto frac = Number{amount} / amountBalance; auto amount2Withdraw = amount2Balance * frac; @@ -398,6 +406,7 @@ AMMClawback::visitInvariantEntry( bool AMMClawback::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/dex/AMMCreate.cpp b/src/libxrpl/tx/transactors/dex/AMMCreate.cpp index c90ea0a6ab..5a3e56ba2d 100644 --- a/src/libxrpl/tx/transactors/dex/AMMCreate.cpp +++ b/src/libxrpl/tx/transactors/dex/AMMCreate.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -42,6 +43,7 @@ namespace xrpl { bool AMMCreate::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ammEnabled(ctx.rules)) return false; @@ -55,6 +57,7 @@ AMMCreate::checkExtraFeatures(PreflightContext const& ctx) NotTEC AMMCreate::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const amount = ctx.tx[sfAmount]; auto const amount2 = ctx.tx[sfAmount2]; @@ -88,6 +91,7 @@ AMMCreate::preflight(PreflightContext const& ctx) XRPAmount AMMCreate::calculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); // The fee required for AMMCreate is one owner reserve. return calculateOwnerReserveFee(view, tx); } @@ -95,6 +99,7 @@ AMMCreate::calculateBaseFee(ReadView const& view, STTx const& tx) TER AMMCreate::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const accountID = ctx.tx[sfAccount]; auto const amount = ctx.tx[sfAmount]; auto const amount2 = ctx.tx[sfAmount2]; @@ -238,6 +243,7 @@ AMMCreate::preclaim(PreclaimContext const& ctx) static std::pair applyCreate(ApplyContext& ctx, Sandbox& sb, AccountID const& account, beast::Journal j) { + TRACE_FUNC(); auto const amount = ctx.tx[sfAmount]; auto const amount2 = ctx.tx[sfAmount2]; @@ -381,6 +387,7 @@ applyCreate(ApplyContext& ctx, Sandbox& sb, AccountID const& account, beast::Jou TER AMMCreate::doApply() { + TRACE_FUNC(); // This is the ledger view that we work against. Transactions are applied // as we go on processing transactions. Sandbox sb(&ctx_.view()); @@ -403,6 +410,7 @@ AMMCreate::visitInvariantEntry( bool AMMCreate::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/dex/AMMDelete.cpp b/src/libxrpl/tx/transactors/dex/AMMDelete.cpp index 0ca7fd7c34..6f6b0a8185 100644 --- a/src/libxrpl/tx/transactors/dex/AMMDelete.cpp +++ b/src/libxrpl/tx/transactors/dex/AMMDelete.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -22,6 +23,7 @@ namespace xrpl { bool AMMDelete::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ammEnabled(ctx.rules)) return false; @@ -32,12 +34,14 @@ AMMDelete::checkExtraFeatures(PreflightContext const& ctx) NotTEC AMMDelete::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); return tesSUCCESS; } TER AMMDelete::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const ammSle = ctx.view.read(keylet::amm(ctx.tx[sfAsset], ctx.tx[sfAsset2])); if (!ammSle) { @@ -55,6 +59,7 @@ AMMDelete::preclaim(PreclaimContext const& ctx) TER AMMDelete::doApply() { + TRACE_FUNC(); // This is the ledger view that we work against. Transactions are applied // as we go on processing transactions. Sandbox sb(&ctx_.view()); @@ -77,6 +82,7 @@ AMMDelete::visitInvariantEntry( bool AMMDelete::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/dex/AMMDeposit.cpp b/src/libxrpl/tx/transactors/dex/AMMDeposit.cpp index d2995c309f..675d91906c 100644 --- a/src/libxrpl/tx/transactors/dex/AMMDeposit.cpp +++ b/src/libxrpl/tx/transactors/dex/AMMDeposit.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,7 @@ namespace xrpl { bool AMMDeposit::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ammEnabled(ctx.rules)) return false; @@ -51,12 +53,14 @@ AMMDeposit::checkExtraFeatures(PreflightContext const& ctx) std::uint32_t AMMDeposit::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfAMMDepositMask; } NotTEC AMMDeposit::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const flags = ctx.tx.getFlags(); auto const amount = ctx.tx[~sfAmount]; auto const amount2 = ctx.tx[~sfAmount2]; @@ -178,6 +182,7 @@ AMMDeposit::preflight(PreflightContext const& ctx) TER AMMDeposit::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const accountID = ctx.tx[sfAccount]; auto const ammSle = ctx.view.read(keylet::amm(ctx.tx[sfAsset], ctx.tx[sfAsset2])); @@ -381,6 +386,7 @@ AMMDeposit::preclaim(PreclaimContext const& ctx) std::pair AMMDeposit::applyGuts(Sandbox& sb) { + TRACE_FUNC(); auto const amount = ctx_.tx[~sfAmount]; auto const amount2 = ctx_.tx[~sfAmount2]; auto const ePrice = ctx_.tx[~sfEPrice]; @@ -485,6 +491,7 @@ AMMDeposit::applyGuts(Sandbox& sb) TER AMMDeposit::doApply() { + TRACE_FUNC(); // This is the ledger view that we work against. Transactions are applied // as we go on processing transactions. Sandbox sb(&ctx_.view()); @@ -510,6 +517,7 @@ AMMDeposit::deposit( std::optional const& lpTokensDepositMin, std::uint16_t tfee) { + TRACE_FUNC(); // Check account has sufficient funds. // Return true if it does, false otherwise. auto checkBalance = [&](auto const& depositAmount) -> TER { @@ -619,6 +627,7 @@ adjustLPTokensOut( STAmount const& lptAMMBalance, STAmount const& lpTokensDeposit) { + TRACE_FUNC(); if (!rules.enabled(fixAMMv1_3)) return lpTokensDeposit; return adjustLPTokens(lptAMMBalance, lpTokensDeposit, IsDeposit::Yes); @@ -639,6 +648,7 @@ AMMDeposit::equalDepositTokens( std::optional const& deposit2Min, std::uint16_t tfee) { + TRACE_FUNC(); try { auto const tokensAdj = adjustLPTokensOut(view.rules(), lptAMMBalance, lpTokensDeposit); @@ -712,6 +722,7 @@ AMMDeposit::equalDepositLimit( std::optional const& lpTokensDepositMin, std::uint16_t tfee) { + TRACE_FUNC(); auto frac = Number{amount} / amountBalance; auto tokensAdj = getRoundedLPTokens(view.rules(), lptAMMBalance, frac, IsDeposit::Yes); if (tokensAdj == beast::kZERO) @@ -791,6 +802,7 @@ AMMDeposit::singleDeposit( std::optional const& lpTokensDepositMin, std::uint16_t tfee) { + TRACE_FUNC(); auto const tokens = adjustLPTokensOut( view.rules(), lptAMMBalance, lpTokensOut(amountBalance, amount, lptAMMBalance, tfee)); if (tokens == beast::kZERO) @@ -838,6 +850,7 @@ AMMDeposit::singleDepositTokens( STAmount const& lpTokensDeposit, std::uint16_t tfee) { + TRACE_FUNC(); auto const tokensAdj = adjustLPTokensOut(view.rules(), lptAMMBalance, lpTokensDeposit); if (view.rules().enabled(fixAMMv1_3) && tokensAdj == beast::kZERO) return {tecAMM_INVALID_TOKENS, STAmount{}}; @@ -894,6 +907,7 @@ AMMDeposit::singleDepositEPrice( STAmount const& ePrice, std::uint16_t tfee) { + TRACE_FUNC(); if (amount != beast::kZERO) { auto const tokens = adjustLPTokensOut( @@ -993,6 +1007,7 @@ AMMDeposit::equalDepositInEmptyState( Asset const& lptIssue, std::uint16_t tfee) { + TRACE_FUNC(); return deposit( view, ammAccount, @@ -1018,6 +1033,7 @@ AMMDeposit::visitInvariantEntry( bool AMMDeposit::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/dex/AMMVote.cpp b/src/libxrpl/tx/transactors/dex/AMMVote.cpp index 4ab3653792..ff4ab5cb6b 100644 --- a/src/libxrpl/tx/transactors/dex/AMMVote.cpp +++ b/src/libxrpl/tx/transactors/dex/AMMVote.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ namespace xrpl { bool AMMVote::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ammEnabled(ctx.rules)) return false; @@ -41,6 +43,7 @@ AMMVote::checkExtraFeatures(PreflightContext const& ctx) NotTEC AMMVote::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (auto const res = invalidAMMAssetPair(ctx.tx[sfAsset], ctx.tx[sfAsset2])) { JLOG(ctx.j.debug()) << "AMM Vote: invalid asset pair."; @@ -59,6 +62,7 @@ AMMVote::preflight(PreflightContext const& ctx) TER AMMVote::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const ammSle = ctx.view.read(keylet::amm(ctx.tx[sfAsset], ctx.tx[sfAsset2])); if (!ammSle) { @@ -82,6 +86,7 @@ AMMVote::preclaim(PreclaimContext const& ctx) static std::pair applyVote(ApplyContext& ctx, Sandbox& sb, AccountID const& account, beast::Journal j) { + TRACE_FUNC(); auto const feeNew = ctx.tx[sfTradingFee]; auto ammSle = sb.peek(keylet::amm(ctx.tx[sfAsset], ctx.tx[sfAsset2])); if (!ammSle) @@ -238,6 +243,7 @@ applyVote(ApplyContext& ctx, Sandbox& sb, AccountID const& account, beast::Journ TER AMMVote::doApply() { + TRACE_FUNC(); // This is the ledger view that we work against. Transactions are applied // as we go on processing transactions. Sandbox sb(&ctx_.view()); @@ -260,6 +266,7 @@ AMMVote::visitInvariantEntry( bool AMMVote::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/dex/AMMWithdraw.cpp b/src/libxrpl/tx/transactors/dex/AMMWithdraw.cpp index bae9d098a3..9e36d4c0a1 100644 --- a/src/libxrpl/tx/transactors/dex/AMMWithdraw.cpp +++ b/src/libxrpl/tx/transactors/dex/AMMWithdraw.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -44,6 +45,7 @@ namespace xrpl { bool AMMWithdraw::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ammEnabled(ctx.rules)) return false; @@ -58,12 +60,14 @@ AMMWithdraw::checkExtraFeatures(PreflightContext const& ctx) std::uint32_t AMMWithdraw::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfAMMWithdrawMask; } NotTEC AMMWithdraw::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const flags = ctx.tx.getFlags(); auto const amount = ctx.tx[~sfAmount]; @@ -180,6 +184,7 @@ tokensWithdraw( std::optional const& tokensIn, std::uint32_t flags) { + TRACE_FUNC(); if ((flags & (tfWithdrawAll | tfOneAssetWithdrawAll)) != 0u) return lpTokens; return tokensIn; @@ -188,6 +193,7 @@ tokensWithdraw( TER AMMWithdraw::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const accountID = ctx.tx[sfAccount]; auto const ammSle = ctx.view.read(keylet::amm(ctx.tx[sfAsset], ctx.tx[sfAsset2])); @@ -311,6 +317,7 @@ AMMWithdraw::preclaim(PreclaimContext const& ctx) std::pair AMMWithdraw::applyGuts(Sandbox& sb) { + TRACE_FUNC(); auto const amount = ctx_.tx[~sfAmount]; auto const amount2 = ctx_.tx[~sfAmount2]; auto const ePrice = ctx_.tx[~sfEPrice]; @@ -429,6 +436,7 @@ AMMWithdraw::applyGuts(Sandbox& sb) TER AMMWithdraw::doApply() { + TRACE_FUNC(); // This is the ledger view that we work against. Transactions are applied // as we go on processing transactions. Sandbox sb(&ctx_.view()); @@ -452,6 +460,7 @@ AMMWithdraw::withdraw( STAmount const& lpTokensWithdraw, std::uint16_t tfee) { + TRACE_FUNC(); TER ter; STAmount newLPTokenBalance; std::tie(ter, newLPTokenBalance, std::ignore, std::ignore) = withdraw( @@ -491,6 +500,7 @@ AMMWithdraw::withdraw( XRPAmount const& priorBalance, beast::Journal const& journal) { + TRACE_FUNC(); auto const lpTokens = ammLPHolds(view, ammSle, account, journal); auto const expected = ammHolds( view, ammSle, amountWithdraw.asset(), std::nullopt, freezeHandling, authHandling, journal); @@ -724,6 +734,7 @@ adjustLPTokensIn( STAmount const& lpTokensWithdraw, WithdrawAll withdrawAll) { + TRACE_FUNC(); if (!rules.enabled(fixAMMv1_3) || withdrawAll == WithdrawAll::Yes) return lpTokensWithdraw; return adjustLPTokens(lptAMMBalance, lpTokensWithdraw, IsDeposit::No); @@ -743,6 +754,7 @@ AMMWithdraw::equalWithdrawTokens( STAmount const& lpTokensWithdraw, std::uint16_t tfee) { + TRACE_FUNC(); TER ter; STAmount newLPTokenBalance; std::tie(ter, newLPTokenBalance, std::ignore, std::ignore) = equalWithdrawTokens( @@ -773,6 +785,7 @@ AMMWithdraw::deleteAMMAccountIfEmpty( Asset const& asset2, beast::Journal const& journal) { + TRACE_FUNC(); TER ter; bool updateBalance = true; if (lpTokenBalance == beast::kZERO) @@ -813,6 +826,7 @@ AMMWithdraw::equalWithdrawTokens( XRPAmount const& priorBalance, beast::Journal const& journal) { + TRACE_FUNC(); try { // Withdrawing all tokens in the pool @@ -916,6 +930,7 @@ AMMWithdraw::equalWithdrawLimit( STAmount const& amount2, std::uint16_t tfee) { + TRACE_FUNC(); auto frac = Number{amount} / amountBalance; auto tokensAdj = getRoundedLPTokens(view.rules(), lptAMMBalance, frac, IsDeposit::No); if (view.rules().enabled(fixAMMv1_3) && tokensAdj == beast::kZERO) @@ -984,6 +999,7 @@ AMMWithdraw::singleWithdraw( STAmount const& amount, std::uint16_t tfee) { + TRACE_FUNC(); auto const tokens = adjustLPTokensIn( view.rules(), lptAMMBalance, @@ -1036,6 +1052,7 @@ AMMWithdraw::singleWithdrawTokens( STAmount const& lpTokensWithdraw, std::uint16_t tfee) { + TRACE_FUNC(); auto const tokensAdj = adjustLPTokensIn(view.rules(), lptAMMBalance, lpTokensWithdraw, isWithdrawAll(ctx_.tx)); if (view.rules().enabled(fixAMMv1_3) && tokensAdj == beast::kZERO) @@ -1089,6 +1106,7 @@ AMMWithdraw::singleWithdrawEPrice( STAmount const& ePrice, std::uint16_t tfee) { + TRACE_FUNC(); // LPTokens is asset in => E = t / a and formula (8) is: // a = A*(t1**2 + t1*(f - 2))/(t1*f - 1) // substitute a as t/E => @@ -1141,6 +1159,7 @@ AMMWithdraw::singleWithdrawEPrice( WithdrawAll AMMWithdraw::isWithdrawAll(STTx const& tx) { + TRACE_FUNC(); if ((tx[sfFlags] & (tfWithdrawAll | tfOneAssetWithdrawAll)) != 0u) return WithdrawAll::Yes; return WithdrawAll::No; @@ -1156,6 +1175,7 @@ AMMWithdraw::visitInvariantEntry( bool AMMWithdraw::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/dex/OfferCancel.cpp b/src/libxrpl/tx/transactors/dex/OfferCancel.cpp index 72682149a3..cda4a6f1fd 100644 --- a/src/libxrpl/tx/transactors/dex/OfferCancel.cpp +++ b/src/libxrpl/tx/transactors/dex/OfferCancel.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -17,6 +18,7 @@ namespace xrpl { NotTEC OfferCancel::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfOfferSequence] == 0u) { JLOG(ctx.j.trace()) << "OfferCancel::preflight: missing sequence"; @@ -31,6 +33,7 @@ OfferCancel::preflight(PreflightContext const& ctx) TER OfferCancel::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const id = ctx.tx[sfAccount]; auto const offerSequence = ctx.tx[sfOfferSequence]; @@ -53,6 +56,7 @@ OfferCancel::preclaim(PreclaimContext const& ctx) TER OfferCancel::doApply() { + TRACE_FUNC(); auto const offerSequence = ctx_.tx[sfOfferSequence]; auto const sle = view().read(keylet::account(account_)); @@ -80,6 +84,7 @@ OfferCancel::visitInvariantEntry( bool OfferCancel::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/dex/OfferCreate.cpp b/src/libxrpl/tx/transactors/dex/OfferCreate.cpp index b69ed766c5..c51a547c46 100644 --- a/src/libxrpl/tx/transactors/dex/OfferCreate.cpp +++ b/src/libxrpl/tx/transactors/dex/OfferCreate.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -55,6 +56,7 @@ namespace xrpl { TxConsequences OfferCreate::makeTxConsequences(PreflightContext const& ctx) { + TRACE_FUNC(); auto calculateMaxXRPSpend = [](STTx const& tx) -> XRPAmount { auto const& amount{tx[sfTakerGets]}; return amount.native() ? amount.xrp() : beast::kZERO; @@ -66,6 +68,7 @@ OfferCreate::makeTxConsequences(PreflightContext const& ctx) bool OfferCreate::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx.isFieldPresent(sfDomainID) && !ctx.rules.enabled(featurePermissionedDEX)) return false; @@ -76,6 +79,7 @@ OfferCreate::checkExtraFeatures(PreflightContext const& ctx) std::uint32_t OfferCreate::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); // The tfOfferCreateMask is built assuming that PermissionedDEX is // enabled if (ctx.rules.enabled(featurePermissionedDEX)) @@ -88,6 +92,7 @@ OfferCreate::getFlagsMask(PreflightContext const& ctx) NotTEC OfferCreate::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto& tx = ctx.tx; auto& j = ctx.j; @@ -166,6 +171,7 @@ OfferCreate::preflight(PreflightContext const& ctx) TER OfferCreate::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const id = ctx.tx[sfAccount]; auto saTakerPays = ctx.tx[sfTakerPays]; @@ -252,6 +258,7 @@ OfferCreate::checkAcceptAsset( beast::Journal const j, Asset const& asset) { + TRACE_FUNC(); // Only valid for custom currencies XRPL_ASSERT(!isXRP(asset), "xrpl::OfferCreate::checkAcceptAsset : input is not XRP"); @@ -334,6 +341,7 @@ OfferCreate::flowCross( Amounts const& takerAmount, std::optional const& domainID) { + TRACE_FUNC(); try { // If the taker is unfunded before we begin crossing there's nothing @@ -538,6 +546,7 @@ OfferCreate::flowCross( std::string OfferCreate::formatAmount(STAmount const& amount) { + TRACE_FUNC(); std::string txt = amount.getText(); txt += "/"; amount.asset().visit( @@ -555,6 +564,7 @@ OfferCreate::applyHybrid( STAmount const& saTakerGets, std::function)> const& setDir) { + TRACE_FUNC(); if (!sleOffer->isFieldPresent(sfDomainID)) return tecINTERNAL; // LCOV_EXCL_LINE @@ -595,6 +605,7 @@ OfferCreate::applyHybrid( std::pair OfferCreate::applyGuts(Sandbox& sb, Sandbox& sbCancel) { + TRACE_FUNC(); using beast::kZERO; std::uint32_t const uTxFlags = ctx_.tx.getFlags(); @@ -951,6 +962,7 @@ OfferCreate::applyGuts(Sandbox& sb, Sandbox& sbCancel) TER OfferCreate::doApply() { + TRACE_FUNC(); // This is the ledger view that we work against. Transactions are applied // as we go on processing transactions. Sandbox sb(&ctx_.view()); @@ -983,6 +995,7 @@ OfferCreate::visitInvariantEntry( bool OfferCreate::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/did/DIDDelete.cpp b/src/libxrpl/tx/transactors/did/DIDDelete.cpp index a323822b9c..ea3eca6494 100644 --- a/src/libxrpl/tx/transactors/did/DIDDelete.cpp +++ b/src/libxrpl/tx/transactors/did/DIDDelete.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include @@ -23,12 +24,14 @@ namespace xrpl { NotTEC DIDDelete::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); return tesSUCCESS; } TER DIDDelete::deleteSLE(ApplyContext& ctx, Keylet sleKeylet, AccountID const owner) { + TRACE_FUNC(); auto const sle = ctx.view().peek(sleKeylet); if (!sle) return tecNO_ENTRY; @@ -43,6 +46,7 @@ DIDDelete::deleteSLE( AccountID const owner, beast::Journal j) { + TRACE_FUNC(); // Remove object from owner directory if (!view.dirRemove(keylet::ownerDir(owner), (*sle)[sfOwnerNode], sle->key(), true)) { @@ -67,6 +71,7 @@ DIDDelete::deleteSLE( TER DIDDelete::doApply() { + TRACE_FUNC(); return deleteSLE(ctx_, keylet::did(account_), account_); } @@ -81,6 +86,7 @@ DIDDelete::visitInvariantEntry( bool DIDDelete::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/did/DIDSet.cpp b/src/libxrpl/tx/transactors/did/DIDSet.cpp index 69bb9dd839..876e0f5572 100644 --- a/src/libxrpl/tx/transactors/did/DIDSet.cpp +++ b/src/libxrpl/tx/transactors/did/DIDSet.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,7 @@ namespace xrpl { NotTEC DIDSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ctx.tx.isFieldPresent(sfURI) && !ctx.tx.isFieldPresent(sfDIDDocument) && !ctx.tx.isFieldPresent(sfData)) return temEMPTY_DID; @@ -66,6 +68,7 @@ DIDSet::preflight(PreflightContext const& ctx) static TER addSLE(ApplyContext& ctx, std::shared_ptr const& sle, AccountID const& owner) { + TRACE_FUNC(); auto const sleAccount = ctx.view().peek(keylet::account(owner)); if (!sleAccount) return tefINTERNAL; // LCOV_EXCL_LINE @@ -99,6 +102,7 @@ addSLE(ApplyContext& ctx, std::shared_ptr const& sle, AccountID const& owne TER DIDSet::doApply() { + TRACE_FUNC(); // Edit ledger object if it already exists Keylet const didKeylet = keylet::did(account_); if (auto const sleDID = ctx_.view().peek(didKeylet)) @@ -161,6 +165,7 @@ DIDSet::visitInvariantEntry( bool DIDSet::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/escrow/EscrowCancel.cpp b/src/libxrpl/tx/transactors/escrow/EscrowCancel.cpp index 9a48123201..00cda8a0cf 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowCancel.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowCancel.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ namespace xrpl { NotTEC EscrowCancel::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); return tesSUCCESS; } @@ -48,6 +50,7 @@ escrowCancelPreclaimHelper( AccountID const& account, STAmount const& amount) { + TRACE_FUNC(); AccountID const& issuer = amount.getIssuer(); // If the issuer is the same as the account, return tecINTERNAL if (issuer == account) @@ -67,6 +70,7 @@ escrowCancelPreclaimHelper( AccountID const& account, STAmount const& amount) { + TRACE_FUNC(); AccountID const issuer = amount.getIssuer(); // If the issuer is the same as the account, return tecINTERNAL if (issuer == account) @@ -91,6 +95,7 @@ escrowCancelPreclaimHelper( TER EscrowCancel::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); if (ctx.view.rules().enabled(featureTokenEscrow)) { auto const k = keylet::escrow(ctx.tx[sfOwner], ctx.tx[sfOfferSequence]); @@ -118,6 +123,7 @@ EscrowCancel::preclaim(PreclaimContext const& ctx) TER EscrowCancel::doApply() { + TRACE_FUNC(); auto const k = keylet::escrow(ctx_.tx[sfOwner], ctx_.tx[sfOfferSequence]); auto const slep = ctx_.view().peek(k); if (!slep) @@ -235,6 +241,7 @@ EscrowCancel::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp b/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp index d5bbe17325..65a31bbcb8 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -77,6 +78,7 @@ namespace xrpl { TxConsequences EscrowCreate::makeTxConsequences(PreflightContext const& ctx) { + TRACE_FUNC(); auto const amount = ctx.tx[sfAmount]; return TxConsequences{ctx.tx, isXRP(amount) ? amount.xrp() : beast::kZERO}; } @@ -89,6 +91,7 @@ template <> NotTEC escrowCreatePreflightHelper(PreflightContext const& ctx) { + TRACE_FUNC(); STAmount const amount = ctx.tx[sfAmount]; if (amount.native() || amount <= beast::kZERO) return temBAD_AMOUNT; @@ -103,6 +106,7 @@ template <> NotTEC escrowCreatePreflightHelper(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ctx.rules.enabled(featureMPTokensV1)) return temDISABLED; @@ -116,6 +120,7 @@ escrowCreatePreflightHelper(PreflightContext const& ctx) NotTEC EscrowCreate::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); STAmount const amount{ctx.tx[sfAmount]}; if (!isXRP(amount)) { @@ -184,6 +189,7 @@ escrowCreatePreclaimHelper( AccountID const& dest, STAmount const& amount) { + TRACE_FUNC(); Issue const& issue = amount.get(); AccountID const& issuer = amount.getIssuer(); // If the issuer is the same as the account, return tecNO_PERMISSION @@ -255,6 +261,7 @@ escrowCreatePreclaimHelper( AccountID const& dest, STAmount const& amount) { + TRACE_FUNC(); AccountID const issuer = amount.getIssuer(); // If the issuer is the same as the account, return tecNO_PERMISSION if (issuer == account) @@ -327,6 +334,7 @@ escrowCreatePreclaimHelper( TER EscrowCreate::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); STAmount const amount{ctx.tx[sfAmount]}; AccountID const account{ctx.tx[sfAccount]}; AccountID const dest{ctx.tx[sfDestination]}; @@ -376,6 +384,7 @@ escrowLockApplyHelper( STAmount const& amount, beast::Journal journal) { + TRACE_FUNC(); // Defensive: Issuer cannot create an escrow if (issuer == sender) return tecINTERNAL; // LCOV_EXCL_LINE @@ -396,6 +405,7 @@ escrowLockApplyHelper( STAmount const& amount, beast::Journal journal) { + TRACE_FUNC(); // Defensive: Issuer cannot create an escrow if (issuer == sender) return tecINTERNAL; // LCOV_EXCL_LINE @@ -409,6 +419,7 @@ escrowLockApplyHelper( TER EscrowCreate::doApply() { + TRACE_FUNC(); auto const closeTime = ctx_.view().header().parentCloseTime; if (ctx_.tx[~sfCancelAfter] && after(closeTime, ctx_.tx[sfCancelAfter])) @@ -546,6 +557,7 @@ EscrowCreate::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp b/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp index 116466a1a3..b46421a9fb 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -47,6 +48,7 @@ constexpr HashRouterFlags kSF_CF_VALID = HashRouterFlags::PRIVATE6; static bool checkCondition(Slice f, Slice c) { + TRACE_FUNC(); using namespace xrpl::cryptoconditions; std::error_code ec; @@ -65,12 +67,14 @@ checkCondition(Slice f, Slice c) bool EscrowFinish::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return !ctx.tx.isFieldPresent(sfCredentialIDs) || ctx.rules.enabled(featureCredentials); } NotTEC EscrowFinish::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const cb = ctx.tx[~sfCondition]; auto const fb = ctx.tx[~sfFulfillment]; @@ -85,6 +89,7 @@ EscrowFinish::preflight(PreflightContext const& ctx) NotTEC EscrowFinish::preflightSigValidated(PreflightContext const& ctx) { + TRACE_FUNC(); auto const cb = ctx.tx[~sfCondition]; auto const fb = ctx.tx[~sfFulfillment]; @@ -120,6 +125,7 @@ EscrowFinish::preflightSigValidated(PreflightContext const& ctx) XRPAmount EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); XRPAmount extraFee{0}; if (auto const fb = tx[~sfFulfillment]) @@ -144,6 +150,7 @@ escrowFinishPreclaimHelper( AccountID const& dest, STAmount const& amount) { + TRACE_FUNC(); AccountID const& issuer = amount.getIssuer(); // If the issuer is the same as the account, return tesSUCCESS if (issuer == dest) @@ -167,6 +174,7 @@ escrowFinishPreclaimHelper( AccountID const& dest, STAmount const& amount) { + TRACE_FUNC(); AccountID const& issuer = amount.getIssuer(); // If the issuer is the same as the dest, return tesSUCCESS if (issuer == dest) @@ -195,6 +203,7 @@ escrowFinishPreclaimHelper( TER EscrowFinish::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); if (ctx.view.rules().enabled(featureCredentials)) { if (auto const err = credentials::valid(ctx.tx, ctx.view, ctx.tx[sfAccount], ctx.j); @@ -229,6 +238,7 @@ EscrowFinish::preclaim(PreclaimContext const& ctx) TER EscrowFinish::doApply() { + TRACE_FUNC(); auto const k = keylet::escrow(ctx_.tx[sfOwner], ctx_.tx[sfOfferSequence]); auto const slep = ctx_.view().peek(k); if (!slep) @@ -415,6 +425,7 @@ EscrowFinish::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverClawback.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverClawback.cpp index 14bc5f7a51..46bedf6869 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverClawback.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverClawback.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -36,12 +37,14 @@ namespace xrpl { bool LoanBrokerCoverClawback::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC LoanBrokerCoverClawback::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const brokerID = ctx.tx[~sfLoanBrokerID]; auto const amount = ctx.tx[~sfAmount]; @@ -86,6 +89,7 @@ LoanBrokerCoverClawback::preflight(PreflightContext const& ctx) Expected determineBrokerID(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); // If the broker ID was provided in the transaction, that's all we // need. if (auto const brokerID = tx[~sfLoanBrokerID]) @@ -133,6 +137,7 @@ determineAsset( AccountID const& brokerPseudoAccountID, STAmount const& amount) { + TRACE_FUNC(); if (amount.holds()) return amount.asset(); @@ -162,6 +167,7 @@ determineClawAmount( Asset const& vaultAsset, std::optional const& amount) { + TRACE_FUNC(); auto const maxClawAmount = [&]() { // Always round the minimum required up NumberRoundModeGuard const mg1(Number::RoundingMode::Upward); @@ -193,6 +199,7 @@ template <> TER preclaimHelper(PreclaimContext const& ctx, SLE const& sleIssuer, STAmount const& clawAmount) { + TRACE_FUNC(); // If AllowTrustLineClawback is not set or NoFreeze is set, return no // permission if (!(sleIssuer.isFlag(lsfAllowTrustLineClawback)) || (sleIssuer.isFlag(lsfNoFreeze))) @@ -208,6 +215,7 @@ preclaimHelper( SLE const& sleIssuer, STAmount const& clawAmount) { + TRACE_FUNC(); auto const issuanceKey = keylet::mptIssuance(clawAmount.get().getMptID()); auto const sleIssuance = ctx.view.read(issuanceKey); if (!sleIssuance) @@ -226,6 +234,7 @@ preclaimHelper( TER LoanBrokerCoverClawback::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const& tx = ctx.tx; auto const account = tx[sfAccount]; @@ -321,6 +330,7 @@ LoanBrokerCoverClawback::preclaim(PreclaimContext const& ctx) TER LoanBrokerCoverClawback::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto const account = tx[sfAccount]; auto const findBrokerID = determineBrokerID(view(), tx); @@ -375,6 +385,7 @@ LoanBrokerCoverClawback::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverDeposit.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverDeposit.cpp index a8fa91b648..fc0a5fe2a1 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverDeposit.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverDeposit.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -21,12 +22,14 @@ namespace xrpl { bool LoanBrokerCoverDeposit::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC LoanBrokerCoverDeposit::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfLoanBrokerID] == beast::kZERO) return temINVALID; @@ -43,6 +46,7 @@ LoanBrokerCoverDeposit::preflight(PreflightContext const& ctx) TER LoanBrokerCoverDeposit::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const& tx = ctx.tx; auto const account = tx[sfAccount]; @@ -103,6 +107,7 @@ LoanBrokerCoverDeposit::preclaim(PreclaimContext const& ctx) TER LoanBrokerCoverDeposit::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto const brokerID = tx[sfLoanBrokerID]; @@ -149,6 +154,7 @@ LoanBrokerCoverDeposit::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverWithdraw.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverWithdraw.cpp index ca4136be0a..d838338090 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverWithdraw.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverWithdraw.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include @@ -26,12 +27,14 @@ namespace xrpl { bool LoanBrokerCoverWithdraw::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC LoanBrokerCoverWithdraw::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfLoanBrokerID] == beast::kZERO) return temINVALID; @@ -56,6 +59,7 @@ LoanBrokerCoverWithdraw::preflight(PreflightContext const& ctx) TER LoanBrokerCoverWithdraw::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const& tx = ctx.tx; auto const account = tx[sfAccount]; @@ -159,6 +163,7 @@ LoanBrokerCoverWithdraw::preclaim(PreclaimContext const& ctx) TER LoanBrokerCoverWithdraw::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto const brokerID = tx[sfLoanBrokerID]; @@ -202,6 +207,7 @@ LoanBrokerCoverWithdraw::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp index 0d6d6e6cd6..7c8586d304 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -24,12 +25,14 @@ namespace xrpl { bool LoanBrokerDelete::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC LoanBrokerDelete::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfLoanBrokerID] == beast::kZERO) return temINVALID; @@ -39,6 +42,7 @@ LoanBrokerDelete::preflight(PreflightContext const& ctx) TER LoanBrokerDelete::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const& tx = ctx.tx; auto const account = tx[sfAccount]; @@ -112,6 +116,7 @@ LoanBrokerDelete::preclaim(PreclaimContext const& ctx) TER LoanBrokerDelete::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto const brokerID = tx[sfLoanBrokerID]; @@ -207,6 +212,7 @@ LoanBrokerDelete::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp index bf00a344a7..1ee49f7fcf 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -28,12 +29,14 @@ namespace xrpl { bool LoanBrokerSet::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC LoanBrokerSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); using namespace Lending; auto const& tx = ctx.tx; @@ -83,6 +86,7 @@ LoanBrokerSet::preflight(PreflightContext const& ctx) std::vector> const& LoanBrokerSet::getValueFields() { + TRACE_FUNC(); static std::vector> const kVALUE_FIELDS{~sfDebtMaximum}; return kVALUE_FIELDS; @@ -91,6 +95,7 @@ LoanBrokerSet::getValueFields() TER LoanBrokerSet::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const& tx = ctx.tx; auto const account = tx[sfAccount]; @@ -172,6 +177,7 @@ LoanBrokerSet::preclaim(PreclaimContext const& ctx) TER LoanBrokerSet::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto& view = ctx_.view(); @@ -294,6 +300,7 @@ LoanBrokerSet::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/lending/LoanDelete.cpp b/src/libxrpl/tx/transactors/lending/LoanDelete.cpp index ff33bfb9fb..43f3da5fa6 100644 --- a/src/libxrpl/tx/transactors/lending/LoanDelete.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanDelete.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include @@ -23,12 +24,14 @@ namespace xrpl { bool LoanDelete::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC LoanDelete::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfLoanID] == beast::kZERO) return temINVALID; @@ -38,6 +41,7 @@ LoanDelete::preflight(PreflightContext const& ctx) TER LoanDelete::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const& tx = ctx.tx; auto const account = tx[sfAccount]; @@ -74,6 +78,7 @@ LoanDelete::preclaim(PreclaimContext const& ctx) TER LoanDelete::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto& view = ctx_.view(); @@ -152,6 +157,7 @@ LoanDelete::visitInvariantEntry( bool LoanDelete::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/lending/LoanManage.cpp b/src/libxrpl/tx/transactors/lending/LoanManage.cpp index d1cd5de505..15225a3c72 100644 --- a/src/libxrpl/tx/transactors/lending/LoanManage.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanManage.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -33,18 +34,21 @@ namespace xrpl { bool LoanManage::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } std::uint32_t LoanManage::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfLoanManageMask; } NotTEC LoanManage::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfLoanID] == beast::kZERO) return temINVALID; @@ -66,6 +70,7 @@ LoanManage::preflight(PreflightContext const& ctx) TER LoanManage::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const& tx = ctx.tx; auto const account = tx[sfAccount]; @@ -132,6 +137,7 @@ LoanManage::preclaim(PreclaimContext const& ctx) static Number owedToVault(SLE::ref loanSle) { + TRACE_FUNC(); // Spec section 3.2.3.2, defines the default amount as // // DefaultAmount = (Loan.PrincipalOutstanding + Loan.InterestOutstanding) @@ -155,6 +161,7 @@ LoanManage::defaultLoan( Asset const& vaultAsset, beast::Journal j) { + TRACE_FUNC(); // Calculate the amount of the Default that First-Loss Capital covers: std::int32_t const loanScale = loanSle->at(sfLoanScale); @@ -305,6 +312,7 @@ LoanManage::impairLoan( Asset const& vaultAsset, beast::Journal j) { + TRACE_FUNC(); Number const lossUnrealized = owedToVault(loanSle); // The vault may be at a different scale than the loan. Reduce rounding @@ -347,6 +355,7 @@ LoanManage::unimpairLoan( Asset const& vaultAsset, beast::Journal j) { + TRACE_FUNC(); // The vault may be at a different scale than the loan. Reduce rounding // errors during the accounting by rounding some of the values to that // scale. @@ -391,6 +400,7 @@ LoanManage::unimpairLoan( TER LoanManage::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto& view = ctx_.view(); @@ -445,6 +455,7 @@ LoanManage::visitInvariantEntry( bool LoanManage::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/lending/LoanPay.cpp b/src/libxrpl/tx/transactors/lending/LoanPay.cpp index b8d73bfd65..15f8ac9dcb 100644 --- a/src/libxrpl/tx/transactors/lending/LoanPay.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanPay.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -36,18 +37,21 @@ namespace xrpl { bool LoanPay::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } std::uint32_t LoanPay::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfLoanPayMask; } NotTEC LoanPay::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfLoanID] == beast::kZERO) return temINVALID; @@ -73,6 +77,7 @@ LoanPay::preflight(PreflightContext const& ctx) XRPAmount LoanPay::calculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); using namespace Lending; auto const normalCost = Transactor::calculateBaseFee(view, tx); @@ -156,6 +161,7 @@ LoanPay::calculateBaseFee(ReadView const& view, STTx const& tx) TER LoanPay::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const& tx = ctx.tx; auto const account = tx[sfAccount]; @@ -259,6 +265,7 @@ LoanPay::preclaim(PreclaimContext const& ctx) TER LoanPay::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto& view = ctx_.view(); @@ -656,6 +663,7 @@ LoanPay::visitInvariantEntry( bool LoanPay::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/lending/LoanSet.cpp b/src/libxrpl/tx/transactors/lending/LoanSet.cpp index 9503eeef03..7edc25c8b8 100644 --- a/src/libxrpl/tx/transactors/lending/LoanSet.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanSet.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -40,18 +41,21 @@ namespace xrpl { bool LoanSet::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } std::uint32_t LoanSet::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfLoanSetMask; } NotTEC LoanSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); using namespace Lending; auto const& tx = ctx.tx; @@ -140,6 +144,7 @@ LoanSet::preflight(PreflightContext const& ctx) NotTEC LoanSet::checkSign(PreclaimContext const& ctx) { + TRACE_FUNC(); if (auto ret = Transactor::checkSign(ctx)) return ret; @@ -168,6 +173,7 @@ LoanSet::checkSign(PreclaimContext const& ctx) XRPAmount LoanSet::calculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); auto const normalCost = Transactor::calculateBaseFee(view, tx); // Compute the additional cost of each signature in the @@ -195,6 +201,7 @@ LoanSet::calculateBaseFee(ReadView const& view, STTx const& tx) std::vector> const& LoanSet::getValueFields() { + TRACE_FUNC(); static std::vector> const kVALUE_FIELDS{ ~sfPrincipalRequested, ~sfLoanOriginationFee, @@ -210,12 +217,14 @@ LoanSet::getValueFields() static std::uint32_t getStartDate(ReadView const& view) { + TRACE_FUNC(); return view.header().closeTime.time_since_epoch().count(); } TER LoanSet::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const& tx = ctx.tx; { @@ -368,6 +377,7 @@ LoanSet::preclaim(PreclaimContext const& ctx) TER LoanSet::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto& view = ctx_.view(); @@ -657,6 +667,7 @@ LoanSet::visitInvariantEntry( bool LoanSet::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/nft/NFTokenAcceptOffer.cpp b/src/libxrpl/tx/transactors/nft/NFTokenAcceptOffer.cpp index 06bd1301cb..090897cc5f 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenAcceptOffer.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenAcceptOffer.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,7 @@ namespace xrpl { NotTEC NFTokenAcceptOffer::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const bo = ctx.tx[~sfNFTokenBuyOffer]; auto const so = ctx.tx[~sfNFTokenSellOffer]; @@ -54,6 +56,7 @@ NFTokenAcceptOffer::preflight(PreflightContext const& ctx) TER NFTokenAcceptOffer::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const checkOffer = [&ctx](std::optional id) -> std::pair, TER> { if (id) @@ -332,6 +335,7 @@ NFTokenAcceptOffer::preclaim(PreclaimContext const& ctx) TER NFTokenAcceptOffer::pay(AccountID const& from, AccountID const& to, STAmount const& amount) { + TRACE_FUNC(); // This should never happen, but it's easy and quick to check. if (amount < beast::kZERO) return tecINTERNAL; // LCOV_EXCL_LINE @@ -358,6 +362,7 @@ NFTokenAcceptOffer::transferNFToken( AccountID const& seller, uint256 const& nftokenID) { + TRACE_FUNC(); auto tokenAndPage = nft::findTokenAndPage(view(), seller, nftokenID); if (!tokenAndPage) @@ -405,6 +410,7 @@ NFTokenAcceptOffer::transferNFToken( TER NFTokenAcceptOffer::acceptOffer(std::shared_ptr const& offer) { + TRACE_FUNC(); bool const isSell = offer->isFlag(lsfSellNFToken); AccountID const owner = (*offer)[sfOwner]; AccountID const& seller = isSell ? owner : account_; @@ -440,6 +446,7 @@ NFTokenAcceptOffer::acceptOffer(std::shared_ptr const& offer) TER NFTokenAcceptOffer::doApply() { + TRACE_FUNC(); auto const loadToken = [this](std::optional const& id) { std::shared_ptr sle; if (id) @@ -584,6 +591,7 @@ NFTokenAcceptOffer::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/nft/NFTokenBurn.cpp b/src/libxrpl/tx/transactors/nft/NFTokenBurn.cpp index fb57b14c15..b64e38fcf5 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenBurn.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenBurn.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -20,12 +21,14 @@ namespace xrpl { NotTEC NFTokenBurn::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); return tesSUCCESS; } TER NFTokenBurn::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const owner = [&ctx]() { if (ctx.tx.isFieldPresent(sfOwner)) return ctx.tx.getAccountID(sfOwner); @@ -59,6 +62,7 @@ NFTokenBurn::preclaim(PreclaimContext const& ctx) TER NFTokenBurn::doApply() { + TRACE_FUNC(); // Remove the token, effectively burning it: auto const ret = nft::removeToken( view(), @@ -105,6 +109,7 @@ NFTokenBurn::visitInvariantEntry( bool NFTokenBurn::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/nft/NFTokenCancelOffer.cpp b/src/libxrpl/tx/transactors/nft/NFTokenCancelOffer.cpp index e76d7677aa..7395da9a95 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenCancelOffer.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenCancelOffer.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,7 @@ namespace xrpl { NotTEC NFTokenCancelOffer::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (auto const& ids = ctx.tx[sfNFTokenOffers]; ids.empty() || (ids.size() > kMAX_TOKEN_OFFER_CANCEL_COUNT)) return temMALFORMED; @@ -40,6 +42,7 @@ NFTokenCancelOffer::preflight(PreflightContext const& ctx) TER NFTokenCancelOffer::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const account = ctx.tx[sfAccount]; auto const& ids = ctx.tx[sfNFTokenOffers]; @@ -81,6 +84,7 @@ NFTokenCancelOffer::preclaim(PreclaimContext const& ctx) TER NFTokenCancelOffer::doApply() { + TRACE_FUNC(); for (auto const& id : ctx_.tx[sfNFTokenOffers]) { if (auto offer = view().peek(keylet::nftoffer(id)); @@ -113,6 +117,7 @@ NFTokenCancelOffer::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/nft/NFTokenCreateOffer.cpp b/src/libxrpl/tx/transactors/nft/NFTokenCreateOffer.cpp index 9ca5220a8c..5a18ab2448 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenCreateOffer.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenCreateOffer.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -21,12 +22,14 @@ namespace xrpl { std::uint32_t NFTokenCreateOffer::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfNFTokenCreateOfferMask; } NotTEC NFTokenCreateOffer::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const txFlags = ctx.tx.getFlags(); auto const nftFlags = nft::getFlags(ctx.tx[sfNFTokenID]); @@ -50,6 +53,7 @@ NFTokenCreateOffer::preflight(PreflightContext const& ctx) TER NFTokenCreateOffer::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); if (hasExpired(ctx.view, ctx.tx[~sfExpiration])) return tecEXPIRED; @@ -77,6 +81,7 @@ NFTokenCreateOffer::preclaim(PreclaimContext const& ctx) TER NFTokenCreateOffer::doApply() { + TRACE_FUNC(); // Use implementation shared with NFTokenMint return nft::tokenOfferCreateApply( view(), @@ -107,6 +112,7 @@ NFTokenCreateOffer::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/nft/NFTokenMint.cpp b/src/libxrpl/tx/transactors/nft/NFTokenMint.cpp index c7cb37ad94..8938ee1f4c 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenMint.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenMint.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -35,12 +36,14 @@ namespace xrpl { static std::uint16_t extractNFTokenFlagsFromTxFlags(std::uint32_t txFlags) { + TRACE_FUNC(); return static_cast(txFlags & 0x0000FFFF); } static bool hasOfferFields(PreflightContext const& ctx) { + TRACE_FUNC(); return ctx.tx.isFieldPresent(sfAmount) || ctx.tx.isFieldPresent(sfDestination) || ctx.tx.isFieldPresent(sfExpiration); } @@ -48,12 +51,14 @@ hasOfferFields(PreflightContext const& ctx) bool NFTokenMint::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return ctx.rules.enabled(featureNFTokenMintOffer) || !hasOfferFields(ctx); } std::uint32_t NFTokenMint::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); // Prior to fixRemoveNFTokenAutoTrustLine, transfer of an NFToken between // accounts allowed a TrustLine to be added to the issuer of that token // without explicit permission from that issuer. This was enabled by @@ -84,6 +89,7 @@ NFTokenMint::getFlagsMask(PreflightContext const& ctx) NotTEC NFTokenMint::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (auto const f = ctx.tx[~sfTransferFee]) { if (f > kMAX_TRANSFER_FEE) @@ -139,6 +145,7 @@ NFTokenMint::createNFTokenID( nft::Taxon taxon, std::uint32_t tokenSeq) { + TRACE_FUNC(); // An issuer may issue several NFTs with the same taxon; to ensure that NFTs // are spread across multiple pages we lightly mix the taxon up by using the // sequence (which is not under the issuer's direct control) as the seed for @@ -182,6 +189,7 @@ NFTokenMint::createNFTokenID( TER NFTokenMint::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); // The issuer of the NFT may or may not be the account executing this // transaction. Check that and verify that this is allowed: if (auto issuer = ctx.tx[~sfIssuer]) @@ -222,6 +230,7 @@ NFTokenMint::preclaim(PreclaimContext const& ctx) TER NFTokenMint::doApply() { + TRACE_FUNC(); auto const issuer = ctx_.tx[~sfIssuer].value_or(account_); auto const tokenSeq = [this, &issuer]() -> Expected { @@ -354,6 +363,7 @@ NFTokenMint::visitInvariantEntry( bool NFTokenMint::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/nft/NFTokenModify.cpp b/src/libxrpl/tx/transactors/nft/NFTokenModify.cpp index b56ee9b061..d0e7defe36 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenModify.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenModify.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -21,6 +22,7 @@ namespace xrpl { NotTEC NFTokenModify::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (auto owner = ctx.tx[~sfOwner]; owner == ctx.tx[sfAccount]) return temMALFORMED; @@ -36,6 +38,7 @@ NFTokenModify::preflight(PreflightContext const& ctx) TER NFTokenModify::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); AccountID const account = ctx.tx[sfAccount]; AccountID const owner = ctx.tx[ctx.tx.isFieldPresent(sfOwner) ? sfOwner : sfAccount]; @@ -62,6 +65,7 @@ NFTokenModify::preclaim(PreclaimContext const& ctx) TER NFTokenModify::doApply() { + TRACE_FUNC(); uint256 const nftokenID = ctx_.tx[sfNFTokenID]; AccountID const owner = ctx_.tx[ctx_.tx.isFieldPresent(sfOwner) ? sfOwner : sfAccount]; @@ -84,6 +88,7 @@ NFTokenModify::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/oracle/OracleDelete.cpp b/src/libxrpl/tx/transactors/oracle/OracleDelete.cpp index c6896b78d4..c55187672d 100644 --- a/src/libxrpl/tx/transactors/oracle/OracleDelete.cpp +++ b/src/libxrpl/tx/transactors/oracle/OracleDelete.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include @@ -20,12 +21,14 @@ namespace xrpl { NotTEC OracleDelete::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); return tesSUCCESS; } TER OracleDelete::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); if (!ctx.view.exists(keylet::account(ctx.tx.getAccountID(sfAccount)))) return terNO_ACCOUNT; // LCOV_EXCL_LINE @@ -55,6 +58,7 @@ OracleDelete::deleteOracle( AccountID const& account, beast::Journal j) { + TRACE_FUNC(); if (!sle) return tecINTERNAL; // LCOV_EXCL_LINE @@ -82,6 +86,7 @@ OracleDelete::deleteOracle( TER OracleDelete::doApply() { + TRACE_FUNC(); if (auto sle = ctx_.view().peek(keylet::oracle(account_, ctx_.tx[sfOracleDocumentID]))) return deleteOracle(ctx_.view(), sle, account_, j_); @@ -104,6 +109,7 @@ OracleDelete::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/oracle/OracleSet.cpp b/src/libxrpl/tx/transactors/oracle/OracleSet.cpp index 7c2a817ed1..e02f23cb69 100644 --- a/src/libxrpl/tx/transactors/oracle/OracleSet.cpp +++ b/src/libxrpl/tx/transactors/oracle/OracleSet.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,7 @@ namespace xrpl { static inline std::pair tokenPairKey(STObject const& pair) { + TRACE_FUNC(); return std::make_pair( pair.getFieldCurrency(sfBaseAsset).currency(), pair.getFieldCurrency(sfQuoteAsset).currency()); @@ -40,6 +42,7 @@ tokenPairKey(STObject const& pair) NotTEC OracleSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const& dataSeries = ctx.tx.getFieldArray(sfPriceDataSeries); if (dataSeries.empty()) return temARRAY_EMPTY; @@ -62,6 +65,7 @@ OracleSet::preflight(PreflightContext const& ctx) TER OracleSet::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const sleSetter = ctx.view.read(keylet::account(ctx.tx.getAccountID(sfAccount))); if (!sleSetter) return terNO_ACCOUNT; // LCOV_EXCL_LINE @@ -182,6 +186,7 @@ OracleSet::preclaim(PreclaimContext const& ctx) static bool adjustOwnerCount(ApplyContext& ctx, int count) { + TRACE_FUNC(); if (auto const sleAccount = ctx.view().peek(keylet::account(ctx.tx[sfAccount]))) { adjustOwnerCount(ctx.view(), sleAccount, count, ctx.journal); @@ -194,6 +199,7 @@ adjustOwnerCount(ApplyContext& ctx, int count) static void setPriceDataInnerObjTemplate(STObject& obj) { + TRACE_FUNC(); if (SOTemplate const* elements = InnerObjectFormats::getInstance().findSOTemplateBySField(sfPriceData)) obj.set(*elements); @@ -202,6 +208,7 @@ setPriceDataInnerObjTemplate(STObject& obj) TER OracleSet::doApply() { + TRACE_FUNC(); auto const oracleID = keylet::oracle(account_, ctx_.tx[sfOracleDocumentID]); auto populatePriceData = [](STObject& priceData, STObject const& entry) { @@ -339,6 +346,7 @@ OracleSet::visitInvariantEntry( bool OracleSet::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp b/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp index e4a060ea31..9f762d2c16 100644 --- a/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp +++ b/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,7 @@ namespace xrpl { bool DepositPreauth::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); bool const authArrPresent = ctx.tx.isFieldPresent(sfAuthorizeCredentials); bool const unauthArrPresent = ctx.tx.isFieldPresent(sfUnauthorizeCredentials); bool const authCredPresent = authArrPresent || unauthArrPresent; @@ -42,6 +44,7 @@ DepositPreauth::checkExtraFeatures(PreflightContext const& ctx) NotTEC DepositPreauth::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); bool const authArrPresent = ctx.tx.isFieldPresent(sfAuthorizeCredentials); bool const unauthArrPresent = ctx.tx.isFieldPresent(sfUnauthorizeCredentials); int const authCredPresent = @@ -96,6 +99,7 @@ DepositPreauth::preflight(PreflightContext const& ctx) TER DepositPreauth::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); AccountID const account(ctx.tx[sfAccount]); // Determine which operation we're performing: authorizing or unauthorizing. @@ -151,6 +155,7 @@ DepositPreauth::preclaim(PreclaimContext const& ctx) TER DepositPreauth::doApply() { + TRACE_FUNC(); if (ctx_.tx.isFieldPresent(sfAuthorize)) { auto const sleOwner = view().peek(keylet::account(account_)); @@ -266,6 +271,7 @@ DepositPreauth::doApply() TER DepositPreauth::removeFromLedger(ApplyView& view, uint256 const& preauthIndex, beast::Journal j) { + TRACE_FUNC(); // Existence already checked in preclaim and AccountDelete auto const slePreauth{view.peek(keylet::depositPreauth(preauthIndex))}; if (!slePreauth) @@ -313,6 +319,7 @@ DepositPreauth::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/payment/Payment.cpp b/src/libxrpl/tx/transactors/payment/Payment.cpp index d283874296..61b32d5b46 100644 --- a/src/libxrpl/tx/transactors/payment/Payment.cpp +++ b/src/libxrpl/tx/transactors/payment/Payment.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -48,6 +49,7 @@ namespace xrpl { TxConsequences Payment::makeTxConsequences(PreflightContext const& ctx) { + TRACE_FUNC(); auto calculateMaxXRPSpend = [](STTx const& tx) -> XRPAmount { STAmount const maxAmount = tx.isFieldPresent(sfSendMax) ? tx[sfSendMax] : tx[sfAmount]; @@ -65,6 +67,7 @@ getMaxSourceAmount( STAmount const& dstAmount, std::optional const& sendMax) { + TRACE_FUNC(); if (sendMax) { return *sendMax; @@ -85,6 +88,7 @@ getMaxSourceAmount( bool Payment::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx.isFieldPresent(sfCredentialIDs) && !ctx.rules.enabled(featureCredentials)) return false; if (ctx.tx.isFieldPresent(sfDomainID) && !ctx.rules.enabled(featurePermissionedDEX)) @@ -96,6 +100,7 @@ Payment::checkExtraFeatures(PreflightContext const& ctx) std::uint32_t Payment::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); auto& tx = ctx.tx; STAmount const dstAmount(tx.getFieldAmount(sfAmount)); @@ -112,6 +117,7 @@ Payment::getFlagsMask(PreflightContext const& ctx) NotTEC Payment::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto& tx = ctx.tx; auto& j = ctx.j; @@ -271,6 +277,7 @@ Payment::preflight(PreflightContext const& ctx) NotTEC Payment::checkPermission(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); auto const delegate = tx[~sfDelegate]; if (!delegate) return tesSUCCESS; @@ -310,6 +317,7 @@ Payment::checkPermission(ReadView const& view, STTx const& tx) TER Payment::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); // Ripple if source or destination is non-native or if there are paths. std::uint32_t const txFlags = ctx.tx.getFlags(); bool const partialPaymentAllowed = (txFlags & tfPartialPayment) != 0u; @@ -403,6 +411,7 @@ Payment::preclaim(PreclaimContext const& ctx) TER Payment::doApply() { + TRACE_FUNC(); auto const deliverMin = ctx_.tx[~sfDeliverMin]; // Ripple if source or destination is non-native or if there are paths. @@ -689,6 +698,7 @@ Payment::visitInvariantEntry( bool Payment::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelClaim.cpp b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelClaim.cpp index ec2d4dd70d..c71a59e392 100644 --- a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelClaim.cpp +++ b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelClaim.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -31,18 +32,21 @@ namespace xrpl { bool PaymentChannelClaim::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return !ctx.tx.isFieldPresent(sfCredentialIDs) || ctx.rules.enabled(featureCredentials); } std::uint32_t PaymentChannelClaim::getFlagsMask(PreflightContext const&) { + TRACE_FUNC(); return tfPaymentChannelClaimMask; } NotTEC PaymentChannelClaim::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const bal = ctx.tx[~sfBalance]; if (bal && (!isXRP(*bal) || *bal <= beast::kZERO)) return temBAD_AMOUNT; @@ -96,6 +100,7 @@ PaymentChannelClaim::preflight(PreflightContext const& ctx) TER PaymentChannelClaim::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); if (!ctx.view.rules().enabled(featureCredentials)) return Transactor::preclaim(ctx); @@ -109,6 +114,7 @@ PaymentChannelClaim::preclaim(PreclaimContext const& ctx) TER PaymentChannelClaim::doApply() { + TRACE_FUNC(); Keylet const k(ltPAYCHAN, ctx_.tx[sfChannel]); auto const slep = ctx_.view().peek(k); if (!slep) @@ -217,6 +223,7 @@ PaymentChannelClaim::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp index c86590aa98..f87ea56e50 100644 --- a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp +++ b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -50,12 +51,14 @@ namespace xrpl { TxConsequences PaymentChannelCreate::makeTxConsequences(PreflightContext const& ctx) { + TRACE_FUNC(); return TxConsequences{ctx.tx, ctx.tx[sfAmount].xrp()}; } NotTEC PaymentChannelCreate::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (!isXRP(ctx.tx[sfAmount]) || (ctx.tx[sfAmount] <= beast::kZERO)) return temBAD_AMOUNT; @@ -71,6 +74,7 @@ PaymentChannelCreate::preflight(PreflightContext const& ctx) TER PaymentChannelCreate::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const account = ctx.tx[sfAccount]; auto const sle = ctx.view.read(keylet::account(account)); if (!sle) @@ -121,6 +125,7 @@ PaymentChannelCreate::preclaim(PreclaimContext const& ctx) TER PaymentChannelCreate::doApply() { + TRACE_FUNC(); auto const account = ctx_.tx[sfAccount]; auto const sle = ctx_.view().peek(keylet::account(account)); if (!sle) @@ -202,6 +207,7 @@ PaymentChannelCreate::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelFund.cpp b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelFund.cpp index 4d2590c382..a1eca261b5 100644 --- a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelFund.cpp +++ b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelFund.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -25,12 +26,14 @@ namespace xrpl { TxConsequences PaymentChannelFund::makeTxConsequences(PreflightContext const& ctx) { + TRACE_FUNC(); return TxConsequences{ctx.tx, ctx.tx[sfAmount].xrp()}; } NotTEC PaymentChannelFund::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (!isXRP(ctx.tx[sfAmount]) || (ctx.tx[sfAmount] <= beast::kZERO)) return temBAD_AMOUNT; @@ -40,6 +43,7 @@ PaymentChannelFund::preflight(PreflightContext const& ctx) TER PaymentChannelFund::doApply() { + TRACE_FUNC(); Keylet const k(ltPAYCHAN, ctx_.tx[sfChannel]); auto const slep = ctx_.view().peek(k); if (!slep) @@ -122,6 +126,7 @@ PaymentChannelFund::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainDelete.cpp b/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainDelete.cpp index befae454b7..bc6f2295a0 100644 --- a/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainDelete.cpp +++ b/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainDelete.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -19,6 +20,7 @@ namespace xrpl { NotTEC PermissionedDomainDelete::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const domain = ctx.tx.getFieldH256(sfDomainID); if (domain == beast::kZERO) return temMALFORMED; @@ -29,6 +31,7 @@ PermissionedDomainDelete::preflight(PreflightContext const& ctx) TER PermissionedDomainDelete::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const domain = ctx.tx.getFieldH256(sfDomainID); auto const sleDomain = ctx.view.read(keylet::permissionedDomain(domain)); @@ -48,6 +51,7 @@ PermissionedDomainDelete::preclaim(PreclaimContext const& ctx) TER PermissionedDomainDelete::doApply() { + TRACE_FUNC(); XRPL_ASSERT( ctx_.tx.isFieldPresent(sfDomainID), "xrpl::PermissionedDomainDelete::doApply : required field present"); @@ -89,6 +93,7 @@ PermissionedDomainDelete::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp b/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp index 92f260db4e..684e5070e7 100644 --- a/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp +++ b/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -25,12 +26,14 @@ namespace xrpl { bool PermissionedDomainSet::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return ctx.rules.enabled(featureCredentials); } NotTEC PermissionedDomainSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (auto err = credentials::checkArray( ctx.tx.getFieldArray(sfAcceptedCredentials), kMAX_PERMISSIONED_DOMAIN_CREDENTIALS_ARRAY_SIZE, @@ -48,6 +51,7 @@ PermissionedDomainSet::preflight(PreflightContext const& ctx) TER PermissionedDomainSet::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const account = ctx.tx.getAccountID(sfAccount); if (!ctx.view.exists(keylet::account(account))) @@ -77,6 +81,7 @@ PermissionedDomainSet::preclaim(PreclaimContext const& ctx) TER PermissionedDomainSet::doApply() { + TRACE_FUNC(); auto const ownerSle = view().peek(keylet::account(account_)); if (!ownerSle) return tefINTERNAL; // LCOV_EXCL_LINE @@ -147,6 +152,7 @@ PermissionedDomainSet::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/system/Batch.cpp b/src/libxrpl/tx/transactors/system/Batch.cpp index f9ae9dc912..57f7e72f20 100644 --- a/src/libxrpl/tx/transactors/system/Batch.cpp +++ b/src/libxrpl/tx/transactors/system/Batch.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -53,6 +54,7 @@ namespace xrpl { XRPAmount Batch::calculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); XRPAmount const maxAmount{std::numeric_limits::max()}; // batchBase: view.fees().base for batch processing + default base fee @@ -164,6 +166,7 @@ Batch::calculateBaseFee(ReadView const& view, STTx const& tx) std::uint32_t Batch::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfBatchMask; } @@ -203,6 +206,7 @@ Batch::getFlagsMask(PreflightContext const& ctx) NotTEC Batch::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const parentBatchId = ctx.tx.getTransactionID(); auto const flags = ctx.tx.getFlags(); @@ -385,6 +389,7 @@ Batch::preflight(PreflightContext const& ctx) NotTEC Batch::preflightSigValidated(PreflightContext const& ctx) { + TRACE_FUNC(); auto const parentBatchId = ctx.tx.getTransactionID(); auto const outerAccount = ctx.tx.getAccountID(sfAccount); auto const& rawTxns = ctx.tx.getFieldArray(sfRawTransactions); @@ -492,6 +497,7 @@ Batch::preflightSigValidated(PreflightContext const& ctx) NotTEC Batch::checkSign(PreclaimContext const& ctx) { + TRACE_FUNC(); if (auto ret = Transactor::checkSign(ctx); !isTesSuccess(ret)) return ret; @@ -514,6 +520,7 @@ Batch::checkSign(PreclaimContext const& ctx) TER Batch::doApply() { + TRACE_FUNC(); return tesSUCCESS; } @@ -528,6 +535,7 @@ Batch::visitInvariantEntry( bool Batch::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/system/Change.cpp b/src/libxrpl/tx/transactors/system/Change.cpp index 5f51f935f3..8fcbee160f 100644 --- a/src/libxrpl/tx/transactors/system/Change.cpp +++ b/src/libxrpl/tx/transactors/system/Change.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -33,6 +34,7 @@ template <> NotTEC Transactor::invokePreflight(PreflightContext const& ctx) { + TRACE_FUNC(); // 0 means "Allow any flags" // The check for tfEnableAmendmentMask is gated by LendingProtocol because // that feature introduced this parameter, and it's not worth adding another @@ -75,6 +77,7 @@ Transactor::invokePreflight(PreflightContext const& ctx) TER Change::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); // If tapOPEN_LEDGER is resurrected into ApplyFlags, // this block can be moved to preflight. if (ctx.view.open()) @@ -135,6 +138,7 @@ Change::preclaim(PreclaimContext const& ctx) TER Change::doApply() { + TRACE_FUNC(); switch (ctx_.tx.getTxnType()) { case ttAMENDMENT: @@ -154,12 +158,14 @@ Change::doApply() void Change::preCompute() { + TRACE_FUNC(); XRPL_ASSERT(account_ == beast::kZERO, "xrpl::Change::preCompute : zero account"); } TER Change::applyAmendment() { + TRACE_FUNC(); uint256 const amendment(ctx_.tx.getFieldH256(sfAmendment)); auto const k = keylet::amendments(); @@ -256,6 +262,7 @@ Change::applyAmendment() TER Change::applyFee() { + TRACE_FUNC(); auto const k = keylet::fees(); SLE::pointer feeObject = view().peek(k); @@ -296,6 +303,7 @@ Change::applyFee() TER Change::applyUNLModify() { + TRACE_FUNC(); if (!isFlagLedger(view().seq())) { JLOG(j_.warn()) << "N-UNL: applyUNLModify, not a flag ledger, seq=" << view().seq(); @@ -421,6 +429,7 @@ Change::visitInvariantEntry( bool Change::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/system/LedgerStateFix.cpp b/src/libxrpl/tx/transactors/system/LedgerStateFix.cpp index 2bc71f8c86..52e19e12c2 100644 --- a/src/libxrpl/tx/transactors/system/LedgerStateFix.cpp +++ b/src/libxrpl/tx/transactors/system/LedgerStateFix.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -19,6 +20,7 @@ namespace xrpl { NotTEC LedgerStateFix::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); switch (static_cast(ctx.tx[sfLedgerFixType])) { case FixType::NfTokenPageLink: @@ -36,6 +38,7 @@ LedgerStateFix::preflight(PreflightContext const& ctx) XRPAmount LedgerStateFix::calculateBaseFee(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); // The fee required for LedgerStateFix is one owner reserve, just like // the fee for AccountDelete. return calculateOwnerReserveFee(view, tx); @@ -44,6 +47,7 @@ LedgerStateFix::calculateBaseFee(ReadView const& view, STTx const& tx) TER LedgerStateFix::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); if (static_cast(ctx.tx[sfLedgerFixType]) == FixType::NfTokenPageLink) { AccountID const owner{ctx.tx[sfOwner]}; @@ -60,6 +64,7 @@ LedgerStateFix::preclaim(PreclaimContext const& ctx) TER LedgerStateFix::doApply() { + TRACE_FUNC(); if (static_cast(ctx_.tx[sfLedgerFixType]) == FixType::NfTokenPageLink) { if (!nft::repairNFTokenDirectoryLinks(view(), ctx_.tx[sfOwner])) @@ -88,6 +93,7 @@ LedgerStateFix::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/system/TicketCreate.cpp b/src/libxrpl/tx/transactors/system/TicketCreate.cpp index 75095772dd..0859a8b604 100644 --- a/src/libxrpl/tx/transactors/system/TicketCreate.cpp +++ b/src/libxrpl/tx/transactors/system/TicketCreate.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -24,6 +25,7 @@ namespace xrpl { TxConsequences TicketCreate::makeTxConsequences(PreflightContext const& ctx) { + TRACE_FUNC(); // Create TxConsequences identifying the number of sequences consumed. return TxConsequences{ctx.tx, ctx.tx[sfTicketCount]}; } @@ -31,6 +33,7 @@ TicketCreate::makeTxConsequences(PreflightContext const& ctx) NotTEC TicketCreate::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (std::uint32_t const count = ctx.tx[sfTicketCount]; count < kMIN_VALID_COUNT || count > kMAX_VALID_COUNT) return temINVALID_COUNT; @@ -41,6 +44,7 @@ TicketCreate::preflight(PreflightContext const& ctx) TER TicketCreate::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const id = ctx.tx[sfAccount]; auto const sleAccountRoot = ctx.view.read(keylet::account(id)); if (!sleAccountRoot) @@ -67,6 +71,7 @@ TicketCreate::preclaim(PreclaimContext const& ctx) TER TicketCreate::doApply() { + TRACE_FUNC(); SLE::pointer const sleAccountRoot = view().peek(keylet::account(account_)); if (!sleAccountRoot) return tefINTERNAL; // LCOV_EXCL_LINE @@ -150,6 +155,7 @@ TicketCreate::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/token/Clawback.cpp b/src/libxrpl/tx/transactors/token/Clawback.cpp index 8c99ce9b08..1475e0940f 100644 --- a/src/libxrpl/tx/transactors/token/Clawback.cpp +++ b/src/libxrpl/tx/transactors/token/Clawback.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,7 @@ template <> NotTEC preflightHelper(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx.isFieldPresent(sfHolder)) return temMALFORMED; @@ -56,6 +58,7 @@ template <> NotTEC preflightHelper(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ctx.rules.enabled(featureMPTokensV1)) return temDISABLED; @@ -78,6 +81,7 @@ preflightHelper(PreflightContext const& ctx) NotTEC Clawback::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (auto const ret = std::visit( [&](T const&) { return preflightHelper(ctx); }, ctx.tx[sfAmount].asset().value()); @@ -105,6 +109,7 @@ preclaimHelper( AccountID const& holder, STAmount const& clawAmount) { + TRACE_FUNC(); std::uint32_t const issuerFlagsIn = sleIssuer.getFieldU32(sfFlags); // If AllowTrustLineClawback is not set or NoFreeze is set, return no @@ -158,6 +163,7 @@ preclaimHelper( AccountID const& holder, STAmount const& clawAmount) { + TRACE_FUNC(); auto const issuanceKey = keylet::mptIssuance(clawAmount.get().getMptID()); auto const sleIssuance = ctx.view.read(issuanceKey); if (!sleIssuance) @@ -187,6 +193,7 @@ preclaimHelper( TER Clawback::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); AccountID const issuer = ctx.tx[sfAccount]; auto const clawAmount = ctx.tx[sfAmount]; AccountID const holder = clawAmount.holds() ? clawAmount.getIssuer() : ctx.tx[sfHolder]; @@ -222,6 +229,7 @@ template <> TER applyHelper(ApplyContext& ctx) { + TRACE_FUNC(); AccountID const issuer = ctx.tx[sfAccount]; STAmount clawAmount = ctx.tx[sfAmount]; AccountID const holder = clawAmount.getIssuer(); // cannot be reference @@ -248,6 +256,7 @@ template <> TER applyHelper(ApplyContext& ctx) { + TRACE_FUNC(); AccountID const issuer = ctx.tx[sfAccount]; auto clawAmount = ctx.tx[sfAmount]; AccountID const holder = ctx.tx[sfHolder]; @@ -273,6 +282,7 @@ applyHelper(ApplyContext& ctx) TER Clawback::doApply() { + TRACE_FUNC(); return std::visit( [&](T const&) { return applyHelper(ctx_); }, ctx_.tx[sfAmount].asset().value()); @@ -289,6 +299,7 @@ Clawback::visitInvariantEntry( bool Clawback::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/token/MPTokenAuthorize.cpp b/src/libxrpl/tx/transactors/token/MPTokenAuthorize.cpp index c0fbb7f10b..146edec168 100644 --- a/src/libxrpl/tx/transactors/token/MPTokenAuthorize.cpp +++ b/src/libxrpl/tx/transactors/token/MPTokenAuthorize.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -22,12 +23,14 @@ namespace xrpl { std::uint32_t MPTokenAuthorize::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfMPTokenAuthorizeMask; } NotTEC MPTokenAuthorize::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfAccount] == ctx.tx[~sfHolder]) return temMALFORMED; @@ -37,6 +40,7 @@ MPTokenAuthorize::preflight(PreflightContext const& ctx) TER MPTokenAuthorize::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const accountID = ctx.tx[sfAccount]; auto const holderID = ctx.tx[~sfHolder]; @@ -145,6 +149,7 @@ MPTokenAuthorize::preclaim(PreclaimContext const& ctx) TER MPTokenAuthorize::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; return authorizeMPToken( ctx_.view(), @@ -172,6 +177,7 @@ MPTokenAuthorize::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp b/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp index 64652a80b0..ce30678973 100644 --- a/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp +++ b/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,7 @@ namespace xrpl { bool MPTokenIssuanceCreate::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx.isFieldPresent(sfDomainID) && !(ctx.rules.enabled(featurePermissionedDomains) && ctx.rules.enabled(featureSingleAssetVault))) @@ -42,6 +44,7 @@ MPTokenIssuanceCreate::checkExtraFeatures(PreflightContext const& ctx) std::uint32_t MPTokenIssuanceCreate::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); // This mask is only compared against sfFlags return tfMPTokenIssuanceCreateMask; } @@ -49,6 +52,7 @@ MPTokenIssuanceCreate::getFlagsMask(PreflightContext const& ctx) NotTEC MPTokenIssuanceCreate::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); // If the mutable flags field is included, at least one flag must be // specified. if (auto const mutableFlags = ctx.tx[~sfMutableFlags]; mutableFlags && @@ -97,6 +101,7 @@ MPTokenIssuanceCreate::preflight(PreflightContext const& ctx) Expected MPTokenIssuanceCreate::create(ApplyView& view, beast::Journal journal, MPTCreateArgs const& args) { + TRACE_FUNC(); auto const acct = view.peek(keylet::account(args.account)); if (!acct) return Unexpected(tecINTERNAL); // LCOV_EXCL_LINE @@ -153,6 +158,7 @@ MPTokenIssuanceCreate::create(ApplyView& view, beast::Journal journal, MPTCreate TER MPTokenIssuanceCreate::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto const result = create( view(), @@ -188,6 +194,7 @@ MPTokenIssuanceCreate::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/token/MPTokenIssuanceDestroy.cpp b/src/libxrpl/tx/transactors/token/MPTokenIssuanceDestroy.cpp index 80b185641a..987e90c4ec 100644 --- a/src/libxrpl/tx/transactors/token/MPTokenIssuanceDestroy.cpp +++ b/src/libxrpl/tx/transactors/token/MPTokenIssuanceDestroy.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -16,12 +17,14 @@ namespace xrpl { NotTEC MPTokenIssuanceDestroy::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); return tesSUCCESS; } TER MPTokenIssuanceDestroy::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); // ensure that issuance exists auto const sleMPT = ctx.view.read(keylet::mptIssuance(ctx.tx[sfMPTokenIssuanceID])); if (!sleMPT) @@ -44,6 +47,7 @@ MPTokenIssuanceDestroy::preclaim(PreclaimContext const& ctx) TER MPTokenIssuanceDestroy::doApply() { + TRACE_FUNC(); auto const mpt = view().peek(keylet::mptIssuance(ctx_.tx[sfMPTokenIssuanceID])); if (account_ != mpt->getAccountID(sfIssuer)) return tecINTERNAL; // LCOV_EXCL_LINE @@ -74,6 +78,7 @@ MPTokenIssuanceDestroy::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/token/MPTokenIssuanceSet.cpp b/src/libxrpl/tx/transactors/token/MPTokenIssuanceSet.cpp index fb0ff06ac2..70d4b8b83a 100644 --- a/src/libxrpl/tx/transactors/token/MPTokenIssuanceSet.cpp +++ b/src/libxrpl/tx/transactors/token/MPTokenIssuanceSet.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ namespace xrpl { bool MPTokenIssuanceSet::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return !ctx.tx.isFieldPresent(sfDomainID) || (ctx.rules.enabled(featurePermissionedDomains) && ctx.rules.enabled(featureSingleAssetVault)); @@ -39,6 +41,7 @@ MPTokenIssuanceSet::checkExtraFeatures(PreflightContext const& ctx) std::uint32_t MPTokenIssuanceSet::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfMPTokenIssuanceSetMask; } @@ -75,6 +78,7 @@ static constexpr std::array kMPT_MUTABILITY_FLAGS = { NotTEC MPTokenIssuanceSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto const mutableFlags = ctx.tx[~sfMutableFlags]; auto const metadata = ctx.tx[~sfMPTokenMetadata]; auto const transferFee = ctx.tx[~sfTransferFee]; @@ -144,6 +148,7 @@ MPTokenIssuanceSet::preflight(PreflightContext const& ctx) NotTEC MPTokenIssuanceSet::checkPermission(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); auto const delegate = tx[~sfDelegate]; if (!delegate) return tesSUCCESS; @@ -179,6 +184,7 @@ MPTokenIssuanceSet::checkPermission(ReadView const& view, STTx const& tx) TER MPTokenIssuanceSet::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); // ensure that issuance exists auto const sleMptIssuance = ctx.view.read(keylet::mptIssuance(ctx.tx[sfMPTokenIssuanceID])); if (!sleMptIssuance) @@ -272,6 +278,7 @@ MPTokenIssuanceSet::preclaim(PreclaimContext const& ctx) TER MPTokenIssuanceSet::doApply() { + TRACE_FUNC(); auto const mptIssuanceID = ctx_.tx[sfMPTokenIssuanceID]; auto const txFlags = ctx_.tx.getFlags(); auto const holderID = ctx_.tx[~sfHolder]; @@ -394,6 +401,7 @@ MPTokenIssuanceSet::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/token/TrustSet.cpp b/src/libxrpl/tx/transactors/token/TrustSet.cpp index 27252aef46..57d023ba39 100644 --- a/src/libxrpl/tx/transactors/token/TrustSet.cpp +++ b/src/libxrpl/tx/transactors/token/TrustSet.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -42,6 +43,7 @@ computeFreezeFlags( bool bSetDeepFreeze, bool bClearDeepFreeze) { + TRACE_FUNC(); if (bSetFreeze && !bClearFreeze && !bNoFreeze) { uFlags |= (bHigh ? xrpl::lsfHighFreeze : xrpl::lsfLowFreeze); @@ -69,12 +71,14 @@ namespace xrpl { std::uint32_t TrustSet::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfTrustSetMask; } NotTEC TrustSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); auto& tx = ctx.tx; auto& j = ctx.j; @@ -129,6 +133,7 @@ TrustSet::preflight(PreflightContext const& ctx) NotTEC TrustSet::checkPermission(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); auto const delegate = tx[~sfDelegate]; if (!delegate) return tesSUCCESS; @@ -191,6 +196,7 @@ TrustSet::checkPermission(ReadView const& view, STTx const& tx) TER TrustSet::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const id = ctx.tx[sfAccount]; auto const sle = ctx.view.read(keylet::account(id)); @@ -332,6 +338,7 @@ TrustSet::preclaim(PreclaimContext const& ctx) TER TrustSet::doApply() { + TRACE_FUNC(); TER terResult = tesSUCCESS; STAmount const saLimitAmount(ctx_.tx.getFieldAmount(sfLimitAmount)); @@ -687,6 +694,7 @@ TrustSet::visitInvariantEntry( bool TrustSet::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/vault/VaultClawback.cpp b/src/libxrpl/tx/transactors/vault/VaultClawback.cpp index 8743227e5c..925834ff4c 100644 --- a/src/libxrpl/tx/transactors/vault/VaultClawback.cpp +++ b/src/libxrpl/tx/transactors/vault/VaultClawback.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -36,6 +37,7 @@ namespace xrpl { NotTEC VaultClawback::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfVaultID] == beast::kZERO) { JLOG(ctx.j.debug()) << "VaultClawback: zero/empty vault ID."; @@ -66,6 +68,7 @@ clawbackAmount( std::optional const& maybeAmount, AccountID const& account) { + TRACE_FUNC(); if (maybeAmount) return *maybeAmount; @@ -79,6 +82,7 @@ clawbackAmount( TER VaultClawback::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const vault = ctx.view.read(keylet::vault(ctx.tx[sfVaultID])); if (!vault) return tecNO_ENTRY; @@ -230,6 +234,7 @@ VaultClawback::assetsToClawback( AccountID const& holder, STAmount const& clawbackAmount) { + TRACE_FUNC(); if (clawbackAmount.asset() != vault->at(sfAsset)) { // preclaim should have blocked this , now it's an internal error @@ -336,6 +341,7 @@ VaultClawback::assetsToClawback( TER VaultClawback::doApply() { + TRACE_FUNC(); auto const& tx = ctx_.tx; auto const vault = view().peek(keylet::vault(tx[sfVaultID])); if (!vault) @@ -471,6 +477,7 @@ VaultClawback::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/vault/VaultCreate.cpp b/src/libxrpl/tx/transactors/vault/VaultCreate.cpp index 0346503ae7..a2e8e756bc 100644 --- a/src/libxrpl/tx/transactors/vault/VaultCreate.cpp +++ b/src/libxrpl/tx/transactors/vault/VaultCreate.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -34,6 +35,7 @@ namespace xrpl { bool VaultCreate::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); if (!ctx.rules.enabled(featureMPTokensV1)) return false; @@ -46,12 +48,14 @@ VaultCreate::checkExtraFeatures(PreflightContext const& ctx) std::uint32_t VaultCreate::getFlagsMask(PreflightContext const& ctx) { + TRACE_FUNC(); return tfVaultCreateMask; } NotTEC VaultCreate::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (!validDataLength(ctx.tx[~sfData], kMAX_DATA_PAYLOAD_LENGTH)) return temMALFORMED; @@ -102,6 +106,7 @@ VaultCreate::preflight(PreflightContext const& ctx) TER VaultCreate::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const vaultAsset = ctx.tx[sfAsset]; auto const account = ctx.tx[sfAccount]; @@ -139,6 +144,7 @@ VaultCreate::preclaim(PreclaimContext const& ctx) TER VaultCreate::doApply() { + TRACE_FUNC(); // All return codes in `doApply` must be `tec`, `ter`, or `tes`. // As we move checks into `preflight` and `preclaim`, // we can consider downgrading them to `tef` or `tem`. @@ -260,6 +266,7 @@ VaultCreate::visitInvariantEntry( bool VaultCreate::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/vault/VaultDelete.cpp b/src/libxrpl/tx/transactors/vault/VaultDelete.cpp index 58b0fdee82..850788c1b2 100644 --- a/src/libxrpl/tx/transactors/vault/VaultDelete.cpp +++ b/src/libxrpl/tx/transactors/vault/VaultDelete.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -24,6 +25,7 @@ namespace xrpl { NotTEC VaultDelete::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfVaultID] == beast::kZERO) { JLOG(ctx.j.debug()) << "VaultDelete: zero/empty vault ID."; @@ -36,6 +38,7 @@ VaultDelete::preflight(PreflightContext const& ctx) TER VaultDelete::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const vault = ctx.view.read(keylet::vault(ctx.tx[sfVaultID])); if (!vault) return tecNO_ENTRY; @@ -89,6 +92,7 @@ VaultDelete::preclaim(PreclaimContext const& ctx) TER VaultDelete::doApply() { + TRACE_FUNC(); auto const vault = view().peek(keylet::vault(ctx_.tx[sfVaultID])); if (!vault) return tefINTERNAL; // LCOV_EXCL_LINE @@ -223,6 +227,7 @@ VaultDelete::visitInvariantEntry( bool VaultDelete::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/vault/VaultDeposit.cpp b/src/libxrpl/tx/transactors/vault/VaultDeposit.cpp index 501ba58ca5..aed1367124 100644 --- a/src/libxrpl/tx/transactors/vault/VaultDeposit.cpp +++ b/src/libxrpl/tx/transactors/vault/VaultDeposit.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,7 @@ namespace xrpl { NotTEC VaultDeposit::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfVaultID] == beast::kZERO) { JLOG(ctx.j.debug()) << "VaultDeposit: zero/empty vault ID."; @@ -43,6 +45,7 @@ VaultDeposit::preflight(PreflightContext const& ctx) TER VaultDeposit::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const vault = ctx.view.read(keylet::vault(ctx.tx[sfVaultID])); if (!vault) return tecNO_ENTRY; @@ -137,6 +140,7 @@ VaultDeposit::preclaim(PreclaimContext const& ctx) TER VaultDeposit::doApply() { + TRACE_FUNC(); auto const vault = view().peek(keylet::vault(ctx_.tx[sfVaultID])); if (!vault) return tefINTERNAL; // LCOV_EXCL_LINE @@ -294,6 +298,7 @@ VaultDeposit::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/vault/VaultSet.cpp b/src/libxrpl/tx/transactors/vault/VaultSet.cpp index 92dbb198f3..04d54c2715 100644 --- a/src/libxrpl/tx/transactors/vault/VaultSet.cpp +++ b/src/libxrpl/tx/transactors/vault/VaultSet.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -22,12 +23,14 @@ namespace xrpl { bool VaultSet::checkExtraFeatures(PreflightContext const& ctx) { + TRACE_FUNC(); return !ctx.tx.isFieldPresent(sfDomainID) || ctx.rules.enabled(featurePermissionedDomains); } NotTEC VaultSet::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfVaultID] == beast::kZERO) { JLOG(ctx.j.debug()) << "VaultSet: zero/empty vault ID."; @@ -65,6 +68,7 @@ VaultSet::preflight(PreflightContext const& ctx) TER VaultSet::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const vault = ctx.view.read(keylet::vault(ctx.tx[sfVaultID])); if (!vault) return tecNO_ENTRY; @@ -118,6 +122,7 @@ VaultSet::preclaim(PreclaimContext const& ctx) TER VaultSet::doApply() { + TRACE_FUNC(); // All return codes in `doApply` must be `tec`, `ter`, or `tes`. // As we move checks into `preflight` and `preclaim`, // we can consider downgrading them to `tef` or `tem`. @@ -190,6 +195,7 @@ VaultSet::visitInvariantEntry( bool VaultSet::finalizeInvariants(STTx const&, TER, XRPAmount, ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/libxrpl/tx/transactors/vault/VaultWithdraw.cpp b/src/libxrpl/tx/transactors/vault/VaultWithdraw.cpp index 6932dc21f2..6282c45c76 100644 --- a/src/libxrpl/tx/transactors/vault/VaultWithdraw.cpp +++ b/src/libxrpl/tx/transactors/vault/VaultWithdraw.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ namespace xrpl { NotTEC VaultWithdraw::preflight(PreflightContext const& ctx) { + TRACE_FUNC(); if (ctx.tx[sfVaultID] == beast::kZERO) { JLOG(ctx.j.debug()) << "VaultWithdraw: zero/empty vault ID."; @@ -52,6 +54,7 @@ VaultWithdraw::preflight(PreflightContext const& ctx) TER VaultWithdraw::preclaim(PreclaimContext const& ctx) { + TRACE_FUNC(); auto const vault = ctx.view.read(keylet::vault(ctx.tx[sfVaultID])); if (!vault) return tecNO_ENTRY; @@ -150,6 +153,7 @@ VaultWithdraw::preclaim(PreclaimContext const& ctx) TER VaultWithdraw::doApply() { + TRACE_FUNC(); auto const vault = view().peek(keylet::vault(ctx_.tx[sfVaultID])); if (!vault) return tefINTERNAL; // LCOV_EXCL_LINE @@ -307,6 +311,7 @@ VaultWithdraw::finalizeInvariants( ReadView const&, beast::Journal const&) { + TRACE_FUNC(); return true; } diff --git a/src/xrpld/app/consensus/RCLCensorshipDetector.h b/src/xrpld/app/consensus/RCLCensorshipDetector.h index 48df7368d9..b9b917d0fc 100644 --- a/src/xrpld/app/consensus/RCLCensorshipDetector.h +++ b/src/xrpld/app/consensus/RCLCensorshipDetector.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -26,6 +27,7 @@ public: friend bool operator<(TxIDSeq const& lhs, TxIDSeq const& rhs) { + TRACE_FUNC(); if (lhs.txid != rhs.txid) return lhs.txid < rhs.txid; return lhs.seq < rhs.seq; @@ -34,12 +36,14 @@ public: friend bool operator<(TxIDSeq const& lhs, TxID const& rhs) { + TRACE_FUNC(); return lhs.txid < rhs; } friend bool operator<(TxID const& lhs, TxIDSeq const& rhs) { + TRACE_FUNC(); return lhs < rhs.txid; } @@ -59,6 +63,7 @@ public: void propose(TxIDSeqVec proposed) { + TRACE_FUNC(); // We want to remove any entries that we proposed in a previous round // that did not make it in yet if we are no longer proposing them. // And we also want to preserve the Sequence of entries that we proposed @@ -91,6 +96,7 @@ public: void check(std::vector accepted, Predicate&& pred) { + TRACE_FUNC(); auto acceptTxid = accepted.begin(); auto const ae = accepted.end(); std::sort(acceptTxid, ae); @@ -116,6 +122,7 @@ public: void reset() { + TRACE_FUNC(); tracker_.clear(); } }; diff --git a/src/xrpld/app/consensus/RCLConsensus.cpp b/src/xrpld/app/consensus/RCLConsensus.cpp index b5a643568b..d8b80d8d90 100644 --- a/src/xrpld/app/consensus/RCLConsensus.cpp +++ b/src/xrpld/app/consensus/RCLConsensus.cpp @@ -62,6 +62,7 @@ #include #include #include +#include #include @@ -126,6 +127,7 @@ RCLConsensus::Adaptor::Adaptor( , valCookie_(1 + randInt(cryptoPrng(), std::numeric_limits::max() - 1)) , nUnlVote_(validatorKeys_.nodeID, j_) { + TRACE_FUNC(); XRPL_ASSERT(valCookie_, "xrpl::RCLConsensus::Adaptor::Adaptor : nonzero cookie"); JLOG(j_.info()) << "Consensus engine started (cookie: " + std::to_string(valCookie_) + ")"; @@ -147,6 +149,7 @@ RCLConsensus::Adaptor::Adaptor( std::optional RCLConsensus::Adaptor::acquireLedger(LedgerHash const& hash) { + TRACE_FUNC(); // we need to switch the ledger we're working from auto built = ledgerMaster_.getLedgerByHash(hash); if (!built) @@ -183,6 +186,7 @@ RCLConsensus::Adaptor::acquireLedger(LedgerHash const& hash) void RCLConsensus::Adaptor::share(RCLCxPeerPos const& peerPos) { + TRACE_FUNC(); protocol::TMProposeSet prop; auto const& proposal = peerPos.proposal(); @@ -205,6 +209,7 @@ RCLConsensus::Adaptor::share(RCLCxPeerPos const& peerPos) void RCLConsensus::Adaptor::share(RCLCxTx const& tx) { + TRACE_FUNC(); // If we didn't relay this transaction recently, relay it to all peers if (app_.getHashRouter().shouldRelay(tx.id())) { @@ -225,6 +230,7 @@ RCLConsensus::Adaptor::share(RCLCxTx const& tx) void RCLConsensus::Adaptor::propose(RCLCxPeerPos::Proposal const& proposal) { + TRACE_FUNC(); JLOG(j_.trace()) << (proposal.isBowOut() ? "We bow out: " : "We propose: ") << xrpl::to_string(proposal.prevLedger()) << " -> " << xrpl::to_string(proposal.position()); @@ -267,12 +273,14 @@ RCLConsensus::Adaptor::propose(RCLCxPeerPos::Proposal const& proposal) void RCLConsensus::Adaptor::share(RCLTxSet const& txns) { + TRACE_FUNC(); inboundTransactions_.giveSet(txns.id(), txns.map, false); } std::optional RCLConsensus::Adaptor::acquireTxSet(RCLTxSet::ID const& setId) { + TRACE_FUNC(); if (auto txns = inboundTransactions_.getSet(setId, true)) { return RCLTxSet{std::move(txns)}; @@ -283,18 +291,21 @@ RCLConsensus::Adaptor::acquireTxSet(RCLTxSet::ID const& setId) bool RCLConsensus::Adaptor::hasOpenTransactions() const { + TRACE_FUNC(); return !app_.getOpenLedger().empty(); } std::size_t RCLConsensus::Adaptor::proposersValidated(LedgerHash const& h) const { + TRACE_FUNC(); return app_.getValidations().numTrustedForLedger(h); } std::size_t RCLConsensus::Adaptor::proposersFinished(RCLCxLedger const& ledger, LedgerHash const& h) const { + TRACE_FUNC(); RCLValidations& vals = app_.getValidations(); return vals.getNodesAfter(RCLValidatedLedger(ledger.ledger, vals.adaptor().journal()), h); } @@ -305,6 +316,7 @@ RCLConsensus::Adaptor::getPrevLedger( RCLCxLedger const& ledger, ConsensusMode mode) { + TRACE_FUNC(); RCLValidations& vals = app_.getValidations(); uint256 netLgr = vals.getPreferred( RCLValidatedLedger{ledger.ledger, vals.adaptor().journal()}, @@ -327,6 +339,7 @@ RCLConsensus::Adaptor::onClose( NetClock::time_point const& closeTime, ConsensusMode mode) -> Result { + TRACE_FUNC(); bool const wrongLCL = mode == ConsensusMode::WrongLedger; bool const proposing = mode == ConsensusMode::Proposing; @@ -422,6 +435,7 @@ RCLConsensus::Adaptor::onForceAccept( ConsensusMode const& mode, json::Value&& consensusJson) { + TRACE_FUNC(); doAccept(result, prevLedger, closeResolution, rawCloseTimes, mode, std::move(consensusJson)); } @@ -435,6 +449,7 @@ RCLConsensus::Adaptor::onAccept( json::Value&& consensusJson, bool const validating) { + TRACE_FUNC(); app_.getJobQueue().addJob( JtAccept, "AcceptLedger", @@ -460,6 +475,7 @@ RCLConsensus::Adaptor::doAccept( ConsensusMode const& mode, json::Value&& consensusJson) { + TRACE_FUNC(); prevProposers_ = result.proposers; prevRoundTime_ = result.roundTime.read(); @@ -719,6 +735,7 @@ RCLConsensus::Adaptor::notify( RCLCxLedger const& ledger, bool haveCorrectLCL) { + TRACE_FUNC(); protocol::TMStatusChange s; if (!haveCorrectLCL) @@ -763,6 +780,7 @@ RCLConsensus::Adaptor::buildLCL( std::chrono::milliseconds roundTime, std::set& failedTxs) { + TRACE_FUNC(); std::shared_ptr built = [&]() { if (auto const replayData = ledgerMaster_.releaseReplay()) { @@ -803,6 +821,7 @@ RCLConsensus::Adaptor::buildLCL( void RCLConsensus::Adaptor::validate(RCLCxLedger const& ledger, RCLTxSet const& txns, bool proposing) { + TRACE_FUNC(); using namespace std::chrono_literals; auto validationTime = app_.getTimeKeeper().closeTime(); @@ -890,6 +909,7 @@ RCLConsensus::Adaptor::validate(RCLCxLedger const& ledger, RCLTxSet const& txns, void RCLConsensus::Adaptor::onModeChange(ConsensusMode before, ConsensusMode after) { + TRACE_FUNC(); JLOG(j_.info()) << "Consensus mode change before=" << to_string(before) << ", after=" << to_string(after); @@ -905,6 +925,7 @@ RCLConsensus::Adaptor::onModeChange(ConsensusMode before, ConsensusMode after) json::Value RCLConsensus::getJson(bool full) const { + TRACE_FUNC(); json::Value ret; { std::scoped_lock const _{mutex_}; @@ -919,6 +940,7 @@ RCLConsensus::timerEntry( NetClock::time_point const& now, std::unique_ptr const& clog) { + TRACE_FUNC(); try { std::scoped_lock const _{mutex_}; @@ -938,6 +960,7 @@ RCLConsensus::timerEntry( void RCLConsensus::gotTxSet(NetClock::time_point const& now, RCLTxSet const& txSet) { + TRACE_FUNC(); try { std::scoped_lock const _{mutex_}; @@ -958,6 +981,7 @@ RCLConsensus::simulate( NetClock::time_point const& now, std::optional consensusDelay) { + TRACE_FUNC(); std::scoped_lock const _{mutex_}; consensus_.simulate(now, consensusDelay); } @@ -965,6 +989,7 @@ RCLConsensus::simulate( bool RCLConsensus::peerProposal(NetClock::time_point const& now, RCLCxPeerPos const& newProposal) { + TRACE_FUNC(); std::scoped_lock const _{mutex_}; return consensus_.peerProposal(now, newProposal); } @@ -972,6 +997,7 @@ RCLConsensus::peerProposal(NetClock::time_point const& now, RCLCxPeerPos const& bool RCLConsensus::Adaptor::preStartRound(RCLCxLedger const& prevLgr, hash_set const& nowTrusted) { + TRACE_FUNC(); // We have a key, we do not want out of sync validations after a restart // and are not amendment blocked. validating_ = validatorKeys_.keys && prevLgr.seq() >= app_.getMaxDisallowedLedger() && @@ -1019,18 +1045,21 @@ RCLConsensus::Adaptor::preStartRound(RCLCxLedger const& prevLgr, hash_set> RCLConsensus::Adaptor::getQuorumKeys() const { + TRACE_FUNC(); return app_.getValidators().getQuorumKeys(); } @@ -1039,18 +1068,21 @@ RCLConsensus::Adaptor::laggards( Ledger_t::Seq const seq, hash_set& trustedKeys) const { + TRACE_FUNC(); return app_.getValidations().laggards(seq, trustedKeys); } bool RCLConsensus::Adaptor::validator() const { + TRACE_FUNC(); return validatorKeys_.keys.has_value(); } void RCLConsensus::Adaptor::updateOperatingMode(std::size_t const positions) const { + TRACE_FUNC(); if ((positions == 0u) && app_.getOPs().isFull()) app_.getOPs().setMode(OperatingMode::CONNECTED); } @@ -1064,6 +1096,7 @@ RCLConsensus::startRound( hash_set const& nowTrusted, std::unique_ptr const& clog) { + TRACE_FUNC(); std::scoped_lock const _{mutex_}; consensus_.startRound( now, prevLgrId, prevLgr, nowUntrusted, adaptor_.preStartRound(prevLgr, nowTrusted), clog); @@ -1072,6 +1105,7 @@ RCLConsensus::startRound( RclConsensusLogger::RclConsensusLogger(char const* label, bool const validating, beast::Journal j) : j_(j) { + TRACE_FUNC(); if (!validating && !j.info()) return; start_ = std::chrono::steady_clock::now(); @@ -1083,6 +1117,7 @@ RclConsensusLogger::RclConsensusLogger(char const* label, bool const validating, RclConsensusLogger::~RclConsensusLogger() { + TRACE_FUNC(); if (!ss_) return; auto const duration = std::chrono::duration_cast( diff --git a/src/xrpld/app/consensus/RCLConsensus.h b/src/xrpld/app/consensus/RCLConsensus.h index 62a83d107e..4f2fe2f040 100644 --- a/src/xrpld/app/consensus/RCLConsensus.h +++ b/src/xrpld/app/consensus/RCLConsensus.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -89,24 +90,28 @@ class RCLConsensus bool validating() const { + TRACE_FUNC(); return validating_; } std::size_t prevProposers() const { + TRACE_FUNC(); return prevProposers_; } std::chrono::milliseconds prevRoundTime() const { + TRACE_FUNC(); return prevRoundTime_; } ConsensusMode mode() const { + TRACE_FUNC(); return mode_; } @@ -153,6 +158,7 @@ class RCLConsensus ConsensusParms const& parms() const { + TRACE_FUNC(); return parms_; } @@ -405,6 +411,7 @@ public: bool validating() const { + TRACE_FUNC(); return adaptor_.validating(); } @@ -413,6 +420,7 @@ public: std::size_t prevProposers() const { + TRACE_FUNC(); return adaptor_.prevProposers(); } @@ -426,6 +434,7 @@ public: std::chrono::milliseconds prevRoundTime() const { + TRACE_FUNC(); return adaptor_.prevRoundTime(); } @@ -433,12 +442,14 @@ public: ConsensusMode mode() const { + TRACE_FUNC(); return adaptor_.mode(); } ConsensusPhase phase() const { + TRACE_FUNC(); return consensus_.phase(); } @@ -472,6 +483,7 @@ public: RCLCxLedger::ID prevLedgerID() const { + TRACE_FUNC(); std::scoped_lock const _{mutex_}; return consensus_.prevLedgerID(); } @@ -489,6 +501,7 @@ public: ConsensusParms const& parms() const { + TRACE_FUNC(); return adaptor_.parms(); } @@ -526,6 +539,7 @@ public: std::unique_ptr const& ss() { + TRACE_FUNC(); return ss_; } }; diff --git a/src/xrpld/app/consensus/RCLCxLedger.h b/src/xrpld/app/consensus/RCLCxLedger.h index 3d6ed4912b..02a865cbc9 100644 --- a/src/xrpld/app/consensus/RCLCxLedger.h +++ b/src/xrpld/app/consensus/RCLCxLedger.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace xrpl { @@ -40,6 +41,7 @@ public: [[nodiscard]] Seq const& seq() const { + TRACE_FUNC(); return ledger->header().seq; } @@ -47,6 +49,7 @@ public: [[nodiscard]] ID const& id() const { + TRACE_FUNC(); return ledger->header().hash; } @@ -54,6 +57,7 @@ public: [[nodiscard]] ID const& parentID() const { + TRACE_FUNC(); return ledger->header().parentHash; } @@ -61,6 +65,7 @@ public: [[nodiscard]] NetClock::duration closeTimeResolution() const { + TRACE_FUNC(); return ledger->header().closeTimeResolution; } @@ -68,6 +73,7 @@ public: [[nodiscard]] bool closeAgree() const { + TRACE_FUNC(); return xrpl::getCloseAgree(ledger->header()); } @@ -75,6 +81,7 @@ public: [[nodiscard]] NetClock::time_point closeTime() const { + TRACE_FUNC(); return ledger->header().closeTime; } @@ -82,6 +89,7 @@ public: [[nodiscard]] NetClock::time_point parentCloseTime() const { + TRACE_FUNC(); return ledger->header().parentCloseTime; } @@ -89,6 +97,7 @@ public: [[nodiscard]] json::Value getJson() const { + TRACE_FUNC(); return xrpl::getJson({*ledger, {}}); } diff --git a/src/xrpld/app/consensus/RCLCxPeerPos.cpp b/src/xrpld/app/consensus/RCLCxPeerPos.cpp index 781582c925..63f0219936 100644 --- a/src/xrpld/app/consensus/RCLCxPeerPos.cpp +++ b/src/xrpld/app/consensus/RCLCxPeerPos.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -22,6 +23,7 @@ RCLCxPeerPos::RCLCxPeerPos( Proposal const& proposal) // trivially copyable : publicKey_(publicKey), suppression_(suppression), proposal_(proposal) { + TRACE_FUNC(); // The maximum allowed size of a signature is 72 bytes; we verify // this elsewhere, but we want to be extra careful here: XRPL_ASSERT( @@ -35,12 +37,14 @@ RCLCxPeerPos::RCLCxPeerPos( bool RCLCxPeerPos::checkSign() const { + TRACE_FUNC(); return verifyDigest(publicKey(), proposal_.signingHash(), signature(), false); } json::Value RCLCxPeerPos::getJson() const { + TRACE_FUNC(); auto ret = proposal().getJson(); if (publicKey().size() != 0u) @@ -58,6 +62,7 @@ proposalUniqueId( Slice const& publicKey, Slice const& signature) { + TRACE_FUNC(); Serializer s(512); s.addBitString(proposeHash); s.addBitString(previousLedger); diff --git a/src/xrpld/app/consensus/RCLCxPeerPos.h b/src/xrpld/app/consensus/RCLCxPeerPos.h index 4618bdb746..9820d1db3f 100644 --- a/src/xrpld/app/consensus/RCLCxPeerPos.h +++ b/src/xrpld/app/consensus/RCLCxPeerPos.h @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -50,6 +51,7 @@ public: Slice signature() const { + TRACE_FUNC(); return {signature_.data(), signature_.size()}; } @@ -57,6 +59,7 @@ public: PublicKey const& publicKey() const { + TRACE_FUNC(); return publicKey_; } @@ -64,12 +67,14 @@ public: uint256 const& suppressionID() const { + TRACE_FUNC(); return suppression_; } Proposal const& proposal() const { + TRACE_FUNC(); return proposal_; } @@ -80,6 +85,7 @@ public: std::string render() const { + TRACE_FUNC(); return proposal_.render(); } @@ -93,6 +99,7 @@ private: void hash_append(Hasher& h) const // NOLINT(readability-identifier-naming) { + TRACE_FUNC(); using beast::hash_append; hash_append(h, HashPrefix::Proposal); hash_append(h, proposal().proposeSeq()); diff --git a/src/xrpld/app/consensus/RCLCxTx.h b/src/xrpld/app/consensus/RCLCxTx.h index 634b8ca915..20252eb88e 100644 --- a/src/xrpld/app/consensus/RCLCxTx.h +++ b/src/xrpld/app/consensus/RCLCxTx.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace xrpl { @@ -27,6 +28,7 @@ public: [[nodiscard]] ID const& id() const { + TRACE_FUNC(); return tx->key(); } @@ -67,6 +69,7 @@ public: bool insert(Tx const& t) { + TRACE_FUNC(); return map_->addItem(SHAMapNodeType::TnTransactionNm, t.tx); } @@ -78,6 +81,7 @@ public: bool erase(Tx::ID const& entry) { + TRACE_FUNC(); return map_->delItem(entry); } }; @@ -107,6 +111,7 @@ public: [[nodiscard]] bool exists(Tx::ID const& entry) const { + TRACE_FUNC(); return map->hasItem(entry); } @@ -124,6 +129,7 @@ public: [[nodiscard]] boost::intrusive_ptr const& find(Tx::ID const& entry) const { + TRACE_FUNC(); return map->peekItem(entry); } @@ -131,6 +137,7 @@ public: [[nodiscard]] ID id() const { + TRACE_FUNC(); return map->getHash().asUint256(); } @@ -145,6 +152,7 @@ public: [[nodiscard]] std::map compare(RCLTxSet const& j) const { + TRACE_FUNC(); SHAMap::Delta delta; // Bound the work we do in case of a malicious diff --git a/src/xrpld/app/consensus/RCLValidations.cpp b/src/xrpld/app/consensus/RCLValidations.cpp index 02ff86b23d..a40245945e 100644 --- a/src/xrpld/app/consensus/RCLValidations.cpp +++ b/src/xrpld/app/consensus/RCLValidations.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -36,6 +37,7 @@ RCLValidatedLedger::RCLValidatedLedger( beast::Journal j) : ledgerID_{ledger->header().hash}, ledgerSeq_{ledger->seq()}, j_{j} { + TRACE_FUNC(); auto const hashIndex = ledger->read(keylet::skip()); if (hashIndex) { @@ -53,23 +55,27 @@ RCLValidatedLedger::RCLValidatedLedger( auto RCLValidatedLedger::minSeq() const -> Seq { + TRACE_FUNC(); return seq() - std::min(seq(), static_cast(ancestors_.size())); } auto RCLValidatedLedger::seq() const -> Seq { + TRACE_FUNC(); return ledgerSeq_; } auto RCLValidatedLedger::id() const -> ID { + TRACE_FUNC(); return ledgerID_; } auto RCLValidatedLedger::operator[](Seq const& s) const -> ID { + TRACE_FUNC(); if (s >= minSeq() && s <= seq()) { if (s == seq()) @@ -89,6 +95,7 @@ RCLValidatedLedger::operator[](Seq const& s) const -> ID RCLValidatedLedger::Seq mismatch(RCLValidatedLedger const& a, RCLValidatedLedger const& b) { + TRACE_FUNC(); using Seq = RCLValidatedLedger::Seq; // Find overlapping interval for known sequence for the ledgers @@ -111,12 +118,14 @@ RCLValidationsAdaptor::RCLValidationsAdaptor(Application& app, beast::Journal j) NetClock::time_point RCLValidationsAdaptor::now() const { + TRACE_FUNC(); return app_.getTimeKeeper().closeTime(); } std::optional RCLValidationsAdaptor::acquire(LedgerHash const& hash) { + TRACE_FUNC(); using namespace std::chrono_literals; auto ledger = perf::measureDurationAndLog( [&]() { return app_.getLedgerMaster().getLedgerByHash(hash); }, @@ -154,6 +163,7 @@ handleNewValidation( BypassAccept const bypassAccept, std::optional j) { + TRACE_FUNC(); auto const& signingKey = val->getSignerPublic(); auto const& hash = val->getLedgerHash(); auto const seq = val->getFieldU32(sfLedgerSequence); diff --git a/src/xrpld/app/consensus/RCLValidations.h b/src/xrpld/app/consensus/RCLValidations.h index 16f6e15d4d..f64928da36 100644 --- a/src/xrpld/app/consensus/RCLValidations.h +++ b/src/xrpld/app/consensus/RCLValidations.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,7 @@ public: [[nodiscard]] uint256 ledgerID() const { + TRACE_FUNC(); return val_->getLedgerHash(); } @@ -47,6 +49,7 @@ public: [[nodiscard]] std::uint32_t seq() const { + TRACE_FUNC(); return val_->getFieldU32(sfLedgerSequence); } @@ -54,6 +57,7 @@ public: [[nodiscard]] NetClock::time_point signTime() const { + TRACE_FUNC(); return val_->getSignTime(); } @@ -61,6 +65,7 @@ public: [[nodiscard]] NetClock::time_point seenTime() const { + TRACE_FUNC(); return val_->getSeenTime(); } @@ -68,6 +73,7 @@ public: [[nodiscard]] PublicKey key() const { + TRACE_FUNC(); return val_->getSignerPublic(); } @@ -75,6 +81,7 @@ public: [[nodiscard]] NodeID nodeID() const { + TRACE_FUNC(); return val_->getNodeID(); } @@ -82,18 +89,21 @@ public: [[nodiscard]] bool trusted() const { + TRACE_FUNC(); return val_->isTrusted(); } void setTrusted() { + TRACE_FUNC(); val_->setTrusted(); } void setUntrusted() { + TRACE_FUNC(); val_->setUntrusted(); } @@ -101,6 +111,7 @@ public: [[nodiscard]] bool full() const { + TRACE_FUNC(); return val_->isFull(); } @@ -108,6 +119,7 @@ public: [[nodiscard]] std::optional loadFee() const { + TRACE_FUNC(); return ~(*val_)[~sfLoadFee]; } @@ -115,6 +127,7 @@ public: [[nodiscard]] std::uint64_t cookie() const { + TRACE_FUNC(); return (*val_)[sfCookie]; } @@ -122,6 +135,7 @@ public: [[nodiscard]] std::shared_ptr unwrap() const { + TRACE_FUNC(); return val_; } }; @@ -207,6 +221,7 @@ public: [[nodiscard]] beast::Journal journal() const { + TRACE_FUNC(); return j_; } diff --git a/src/xrpld/app/ledger/AcceptedLedger.cpp b/src/xrpld/app/ledger/AcceptedLedger.cpp index ea594308bd..9c8f431e0f 100644 --- a/src/xrpld/app/ledger/AcceptedLedger.cpp +++ b/src/xrpld/app/ledger/AcceptedLedger.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -10,6 +11,7 @@ namespace xrpl { AcceptedLedger::AcceptedLedger(std::shared_ptr const& ledger) : ledger_(ledger) { + TRACE_FUNC(); transactions_.reserve(256); auto insertAll = [&](auto const& txns) { diff --git a/src/xrpld/app/ledger/AcceptedLedger.h b/src/xrpld/app/ledger/AcceptedLedger.h index 621bea9e0d..8690775e2b 100644 --- a/src/xrpld/app/ledger/AcceptedLedger.h +++ b/src/xrpld/app/ledger/AcceptedLedger.h @@ -3,6 +3,7 @@ #include #include #include +#include namespace xrpl { @@ -30,24 +31,28 @@ public: [[nodiscard]] std::shared_ptr const& getLedger() const { + TRACE_FUNC(); return ledger_; } [[nodiscard]] std::size_t size() const { + TRACE_FUNC(); return transactions_.size(); } [[nodiscard]] auto begin() const { + TRACE_FUNC(); return transactions_.begin(); } [[nodiscard]] auto end() const { + TRACE_FUNC(); return transactions_.end(); } diff --git a/src/xrpld/app/ledger/AccountStateSF.cpp b/src/xrpld/app/ledger/AccountStateSF.cpp index c12c2864ec..1e60c2a244 100644 --- a/src/xrpld/app/ledger/AccountStateSF.cpp +++ b/src/xrpld/app/ledger/AccountStateSF.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -19,12 +20,14 @@ AccountStateSF::gotNode( Blob&& nodeData, SHAMapNodeType) const { + TRACE_FUNC(); db_.store(NodeObjectType::AccountNode, std::move(nodeData), nodeHash.asUint256(), ledgerSeq); } std::optional AccountStateSF::getNode(SHAMapHash const& nodeHash) const { + TRACE_FUNC(); return fp_.getFetchPack(nodeHash.asUint256()); } diff --git a/src/xrpld/app/ledger/ConsensusTransSetSF.cpp b/src/xrpld/app/ledger/ConsensusTransSetSF.cpp index 029c16e7e4..a0690f5486 100644 --- a/src/xrpld/app/ledger/ConsensusTransSetSF.cpp +++ b/src/xrpld/app/ledger/ConsensusTransSetSF.cpp @@ -14,6 +14,7 @@ #include // IWYU pragma: keep #include #include +#include #include #include @@ -36,6 +37,7 @@ ConsensusTransSetSF::gotNode( Blob&& nodeData, // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved) SHAMapNodeType type) const { + TRACE_FUNC(); if (fromFilter) return; @@ -71,6 +73,7 @@ ConsensusTransSetSF::gotNode( std::optional ConsensusTransSetSF::getNode(SHAMapHash const& nodeHash) const { + TRACE_FUNC(); Blob nodeData; if (nodeCache_.retrieve(nodeHash, nodeData)) return nodeData; diff --git a/src/xrpld/app/ledger/InboundLedger.h b/src/xrpld/app/ledger/InboundLedger.h index 5f27c0c2c4..32a3dbbafd 100644 --- a/src/xrpld/app/ledger/InboundLedger.h +++ b/src/xrpld/app/ledger/InboundLedger.h @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -46,6 +47,7 @@ public: bool isComplete() const { + TRACE_FUNC(); return complete_; } @@ -53,18 +55,21 @@ public: bool isFailed() const { + TRACE_FUNC(); return failed_; } std::shared_ptr getLedger() const { + TRACE_FUNC(); return ledger_; } std::uint32_t getSeq() const { + TRACE_FUNC(); return seq_; } @@ -88,12 +93,14 @@ public: void touch() { + TRACE_FUNC(); lastAction_ = clock_.now(); } clock_type::time_point getLastAction() const { + TRACE_FUNC(); return lastAction_; } diff --git a/src/xrpld/app/ledger/LedgerHistory.cpp b/src/xrpld/app/ledger/LedgerHistory.cpp index 76bf4122e1..62ff7fe89f 100644 --- a/src/xrpld/app/ledger/LedgerHistory.cpp +++ b/src/xrpld/app/ledger/LedgerHistory.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -56,6 +57,7 @@ LedgerHistory::LedgerHistory(beast::insight::Collector::ptr const& collector, Ap bool LedgerHistory::insert(std::shared_ptr const& ledger, bool validated) { + TRACE_FUNC(); if (!ledger->isImmutable()) logicError("mutable Ledger in insert"); @@ -75,6 +77,7 @@ LedgerHistory::insert(std::shared_ptr const& ledger, bool validate LedgerHash LedgerHistory::getLedgerHash(LedgerIndex index) { + TRACE_FUNC(); std::unique_lock const sl(ledgers_by_hash_.peekMutex()); if (auto it = ledgersByIndex_.find(index); it != ledgersByIndex_.end()) return it->second; @@ -84,6 +87,7 @@ LedgerHistory::getLedgerHash(LedgerIndex index) std::shared_ptr LedgerHistory::getLedgerBySeq(LedgerIndex index) { + TRACE_FUNC(); { std::unique_lock sl(ledgers_by_hash_.peekMutex()); auto it = ledgersByIndex_.find(index); @@ -121,6 +125,7 @@ LedgerHistory::getLedgerBySeq(LedgerIndex index) std::shared_ptr LedgerHistory::getLedgerByHash(LedgerHash const& hash) { + TRACE_FUNC(); auto ret = ledgers_by_hash_.fetch(hash); if (ret) @@ -158,6 +163,7 @@ LedgerHistory::getLedgerByHash(LedgerHash const& hash) static void logOne(ReadView const& ledger, uint256 const& tx, char const* msg, beast::Journal& j) { + TRACE_FUNC(); auto metaData = ledger.txRead(tx).second; if (metaData != nullptr) @@ -180,6 +186,7 @@ logMetadataDifference( uint256 const& tx, beast::Journal j) { + TRACE_FUNC(); auto getMeta = [](ReadView const& ledger, uint256 const& txID) { std::optional ret; if (auto meta = ledger.txRead(txID).second) @@ -302,6 +309,7 @@ logMetadataDifference( static std::vector leaves(SHAMap const& sm) { + TRACE_FUNC(); std::vector v; for (auto const& item : sm) v.push_back(&item); @@ -318,6 +326,7 @@ LedgerHistory::handleMismatch( std::optional const& validatedConsensusHash, json::Value const& consensus) { + TRACE_FUNC(); XRPL_ASSERT(built != valid, "xrpl::LedgerHistory::handleMismatch : unequal hashes"); ++mismatch_counter_; @@ -426,6 +435,7 @@ LedgerHistory::builtLedger( uint256 const& consensusHash, json::Value consensus) { + TRACE_FUNC(); LedgerIndex const index = ledger->header().seq; LedgerHash const hash = ledger->header().hash; XRPL_ASSERT(!hash.isZero(), "xrpl::LedgerHistory::builtLedger : nonzero hash"); @@ -465,6 +475,7 @@ LedgerHistory::validatedLedger( std::shared_ptr const& ledger, std::optional const& consensusHash) { + TRACE_FUNC(); LedgerIndex const index = ledger->header().seq; LedgerHash const hash = ledger->header().hash; XRPL_ASSERT(!hash.isZero(), "xrpl::LedgerHistory::validatedLedger : nonzero hash"); @@ -504,6 +515,7 @@ LedgerHistory::validatedLedger( bool LedgerHistory::fixIndex(LedgerIndex ledgerIndex, LedgerHash const& ledgerHash) { + TRACE_FUNC(); std::unique_lock const sl(ledgers_by_hash_.peekMutex()); auto it = ledgersByIndex_.find(ledgerIndex); @@ -518,6 +530,7 @@ LedgerHistory::fixIndex(LedgerIndex ledgerIndex, LedgerHash const& ledgerHash) void LedgerHistory::clearLedgerCachePrior(LedgerIndex seq) { + TRACE_FUNC(); for (LedgerHash const it : ledgers_by_hash_.getKeys()) { auto const ledger = getLedgerByHash(it); diff --git a/src/xrpld/app/ledger/LedgerHistory.h b/src/xrpld/app/ledger/LedgerHistory.h index 01c88b1517..40546a38dc 100644 --- a/src/xrpld/app/ledger/LedgerHistory.h +++ b/src/xrpld/app/ledger/LedgerHistory.h @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -30,6 +31,7 @@ public: float getCacheHitRate() { + TRACE_FUNC(); return ledgers_by_hash_.getHitRate(); } @@ -53,6 +55,7 @@ public: void sweep() { + TRACE_FUNC(); ledgers_by_hash_.sweep(); consensus_validated_.sweep(); } diff --git a/src/xrpld/app/ledger/LedgerHolder.h b/src/xrpld/app/ledger/LedgerHolder.h index 69fe00b439..deb494d9f7 100644 --- a/src/xrpld/app/ledger/LedgerHolder.h +++ b/src/xrpld/app/ledger/LedgerHolder.h @@ -2,6 +2,7 @@ #include #include +#include #include @@ -24,6 +25,7 @@ public: void set(std::shared_ptr ledger) { + TRACE_FUNC(); if (!ledger) logicError("LedgerHolder::set with nullptr"); if (!ledger->isImmutable()) @@ -36,6 +38,7 @@ public: std::shared_ptr get() { + TRACE_FUNC(); std::scoped_lock const sl(lock_); return heldLedger_; } @@ -43,6 +46,7 @@ public: bool empty() { + TRACE_FUNC(); std::scoped_lock const sl(lock_); return heldLedger_ == nullptr; } diff --git a/src/xrpld/app/ledger/LedgerMaster.h b/src/xrpld/app/ledger/LedgerMaster.h index 0b3310ea79..23ca2d6e90 100644 --- a/src/xrpld/app/ledger/LedgerMaster.h +++ b/src/xrpld/app/ledger/LedgerMaster.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,7 @@ public: std::shared_ptr getClosedLedger() { + TRACE_FUNC(); return closedLedger_.get(); } @@ -242,6 +244,7 @@ public: bool haveValidated() { + TRACE_FUNC(); return !validLedger_.empty(); } @@ -387,6 +390,7 @@ private: void collectMetrics() { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); stats_.validatedLedgerAge.set(getValidatedLedgerAge().count()); stats_.publishedLedgerAge.set(getPublishedLedgerAge().count()); diff --git a/src/xrpld/app/ledger/LedgerReplay.h b/src/xrpld/app/ledger/LedgerReplay.h index 2dc4911ade..70bfd5a394 100644 --- a/src/xrpld/app/ledger/LedgerReplay.h +++ b/src/xrpld/app/ledger/LedgerReplay.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -30,6 +31,7 @@ public: [[nodiscard]] std::shared_ptr const& parent() const { + TRACE_FUNC(); return parent_; } @@ -38,6 +40,7 @@ public: [[nodiscard]] std::shared_ptr const& replay() const { + TRACE_FUNC(); return replay_; } @@ -46,6 +49,7 @@ public: [[nodiscard]] std::map> const& orderedTxns() const { + TRACE_FUNC(); return orderedTxns_; } }; diff --git a/src/xrpld/app/ledger/LedgerReplayTask.h b/src/xrpld/app/ledger/LedgerReplayTask.h index 7bb75253f2..2682014f6b 100644 --- a/src/xrpld/app/ledger/LedgerReplayTask.h +++ b/src/xrpld/app/ledger/LedgerReplayTask.h @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -97,6 +98,7 @@ public: TaskParameter const& getTaskParameter() const { + TRACE_FUNC(); return parameter_; } diff --git a/src/xrpld/app/ledger/LedgerReplayer.h b/src/xrpld/app/ledger/LedgerReplayer.h index 5d537bfd24..55cad9ad90 100644 --- a/src/xrpld/app/ledger/LedgerReplayer.h +++ b/src/xrpld/app/ledger/LedgerReplayer.h @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -103,6 +104,7 @@ public: std::size_t tasksSize() const { + TRACE_FUNC(); std::scoped_lock const lock(mtx_); return tasks_.size(); } @@ -110,6 +112,7 @@ public: std::size_t deltasSize() const { + TRACE_FUNC(); std::scoped_lock const lock(mtx_); return deltas_.size(); } @@ -117,6 +120,7 @@ public: std::size_t skipListsSize() const { + TRACE_FUNC(); std::scoped_lock const lock(mtx_); return skipLists_.size(); } diff --git a/src/xrpld/app/ledger/LedgerToJson.h b/src/xrpld/app/ledger/LedgerToJson.h index 981af07a0e..c57fba4785 100644 --- a/src/xrpld/app/ledger/LedgerToJson.h +++ b/src/xrpld/app/ledger/LedgerToJson.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace xrpl { @@ -19,6 +20,7 @@ struct LedgerFill std::vector q = {}) : ledger(l), options(o), txQueue(std::move(q)), context(ctx) { + TRACE_FUNC(); if (context != nullptr) closeTime = context->ledgerMaster.getCloseTimeBySeq(ledger.seq()); } diff --git a/src/xrpld/app/ledger/OpenLedger.h b/src/xrpld/app/ledger/OpenLedger.h index 884b6b02db..c1288573ac 100644 --- a/src/xrpld/app/ledger/OpenLedger.h +++ b/src/xrpld/app/ledger/OpenLedger.h @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -197,6 +198,7 @@ OpenLedger::apply( ApplyFlags flags, beast::Journal j) { + TRACE_FUNC(); for (auto iter = txs.begin(); iter != txs.end(); ++iter) { try diff --git a/src/xrpld/app/ledger/OrderBookDBImpl.cpp b/src/xrpld/app/ledger/OrderBookDBImpl.cpp index 658ec4ea7a..50e186db03 100644 --- a/src/xrpld/app/ledger/OrderBookDBImpl.cpp +++ b/src/xrpld/app/ledger/OrderBookDBImpl.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -44,12 +45,14 @@ OrderBookDBImpl::OrderBookDBImpl(ServiceRegistry& registry, OrderBookDBConfig co std::unique_ptr makeOrderBookDb(ServiceRegistry& registry, OrderBookDBConfig const& config) { + TRACE_FUNC(); return std::make_unique(registry, config); } void OrderBookDBImpl::setup(std::shared_ptr const& ledger) { + TRACE_FUNC(); if (!standalone_ && registry_.get().getOPs().isNeedNetworkLedger()) { JLOG(j_.warn()) << "Eliding full order book update: no ledger"; @@ -93,6 +96,7 @@ OrderBookDBImpl::setup(std::shared_ptr const& ledger) void OrderBookDBImpl::update(std::shared_ptr const& ledger) { + TRACE_FUNC(); if (pathSearchMax_ == 0) return; // pathfinding has been disabled @@ -223,6 +227,7 @@ OrderBookDBImpl::update(std::shared_ptr const& ledger) void OrderBookDBImpl::addOrderBook(Book const& book) { + TRACE_FUNC(); bool const toXRP = isXRP(book.out); std::scoped_lock const sl(lock_); @@ -250,6 +255,7 @@ OrderBookDBImpl::addOrderBook(Book const& book) std::vector OrderBookDBImpl::getBooksByTakerPays(Asset const& asset, std::optional const& domain) { + TRACE_FUNC(); std::vector ret; { @@ -282,6 +288,7 @@ OrderBookDBImpl::getBooksByTakerPays(Asset const& asset, std::optional int OrderBookDBImpl::getBookSize(Asset const& asset, std::optional const& domain) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); if (!domain) @@ -301,6 +308,7 @@ OrderBookDBImpl::getBookSize(Asset const& asset, std::optional const& d bool OrderBookDBImpl::isBookToXRP(Asset const& asset, std::optional const& domain) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); if (domain) return xrpDomainBooks_.contains({asset, *domain}); @@ -310,6 +318,7 @@ OrderBookDBImpl::isBookToXRP(Asset const& asset, std::optional const& do BookListeners::pointer OrderBookDBImpl::makeBookListeners(Book const& book) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); auto ret = getBookListeners(book); @@ -330,6 +339,7 @@ OrderBookDBImpl::makeBookListeners(Book const& book) BookListeners::pointer OrderBookDBImpl::getBookListeners(Book const& book) { + TRACE_FUNC(); BookListeners::pointer ret; std::scoped_lock const sl(lock_); @@ -348,6 +358,7 @@ OrderBookDBImpl::processTxn( AcceptedLedgerTx const& alTx, MultiApiJson const& jvObj) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); // For this particular transaction, maintain the set of unique diff --git a/src/xrpld/app/ledger/TransactionStateSF.cpp b/src/xrpld/app/ledger/TransactionStateSF.cpp index fc57c567eb..594be90796 100644 --- a/src/xrpld/app/ledger/TransactionStateSF.cpp +++ b/src/xrpld/app/ledger/TransactionStateSF.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -21,6 +22,7 @@ TransactionStateSF::gotNode( SHAMapNodeType type) const { + TRACE_FUNC(); XRPL_ASSERT( type != SHAMapNodeType::TnTransactionNm, "xrpl::TransactionStateSF::gotNode : valid input"); db_.store( @@ -30,6 +32,7 @@ TransactionStateSF::gotNode( std::optional TransactionStateSF::getNode(SHAMapHash const& nodeHash) const { + TRACE_FUNC(); return fp_.getFetchPack(nodeHash.asUint256()); } diff --git a/src/xrpld/app/ledger/detail/BuildLedger.cpp b/src/xrpld/app/ledger/detail/BuildLedger.cpp index 5143769178..89654651e8 100644 --- a/src/xrpld/app/ledger/detail/BuildLedger.cpp +++ b/src/xrpld/app/ledger/detail/BuildLedger.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -43,6 +44,7 @@ buildLedgerImpl( beast::Journal j, ApplyTxs&& applyTxs) { + TRACE_FUNC(); auto built = std::make_shared(*parent, closeTime); if (built->isFlagLedger()) @@ -99,6 +101,7 @@ applyTransactions( OpenView& view, beast::Journal j) { + TRACE_FUNC(); bool certainRetry = true; std::size_t count = 0; @@ -180,6 +183,7 @@ buildLedger( std::set& failedTxns, beast::Journal j) { + TRACE_FUNC(); JLOG(j.debug()) << "Report: Transaction Set = " << txns.key() << ", close " << closeTime.time_since_epoch().count() << (closeTimeCorrect ? "" : " (incorrect)"); @@ -218,6 +222,7 @@ buildLedger( Application& app, beast::Journal j) { + TRACE_FUNC(); auto const& replayLedger = replayData.replay(); JLOG(j.debug()) << "Report: Replay Ledger " << replayLedger->header().hash; diff --git a/src/xrpld/app/ledger/detail/InboundLedger.cpp b/src/xrpld/app/ledger/detail/InboundLedger.cpp index b4082485d3..864da51cd4 100644 --- a/src/xrpld/app/ledger/detail/InboundLedger.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedger.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include @@ -107,6 +108,7 @@ InboundLedger::InboundLedger( , reason_(reason) , peerSet_(std::move(peerSet)) { + TRACE_FUNC(); JLOG(journal_.trace()) << "Acquiring ledger " << hash_; touch(); } @@ -114,6 +116,7 @@ InboundLedger::InboundLedger( void InboundLedger::init(ScopedLockType& collectionLock) { + TRACE_FUNC(); ScopedLockType sl(mtx_); collectionLock.unlock(); @@ -148,6 +151,7 @@ InboundLedger::init(ScopedLockType& collectionLock) std::size_t InboundLedger::getPeerCount() const { + TRACE_FUNC(); auto const& peerIds = peerSet_->getPeerIds(); return std::count_if(peerIds.begin(), peerIds.end(), [this](auto id) { return (app_.getOverlay().findPeerByShortID(id) != nullptr); @@ -157,6 +161,7 @@ InboundLedger::getPeerCount() const void InboundLedger::update(std::uint32_t seq) { + TRACE_FUNC(); ScopedLockType const sl(mtx_); // If we didn't know the sequence number, but now do, save it @@ -170,6 +175,7 @@ InboundLedger::update(std::uint32_t seq) bool InboundLedger::checkLocal() { + TRACE_FUNC(); ScopedLockType const sl(mtx_); if (!isDone()) { @@ -192,6 +198,7 @@ InboundLedger::checkLocal() InboundLedger::~InboundLedger() { + TRACE_FUNC(); // Save any received AS data not processed. It could be useful // for populating a different ledger for (auto& entry : receivedData_) @@ -212,6 +219,7 @@ InboundLedger::~InboundLedger() static std::vector neededHashes(uint256 const& root, SHAMap& map, int max, SHAMapSyncFilter* filter) { + TRACE_FUNC(); std::vector ret; if (!root.isZero()) @@ -235,12 +243,14 @@ neededHashes(uint256 const& root, SHAMap& map, int max, SHAMapSyncFilter* filter std::vector InboundLedger::neededTxHashes(int max, SHAMapSyncFilter* filter) const { + TRACE_FUNC(); return neededHashes(ledger_->header().txHash, ledger_->txMap(), max, filter); } std::vector InboundLedger::neededStateHashes(int max, SHAMapSyncFilter* filter) const { + TRACE_FUNC(); return neededHashes(ledger_->header().accountHash, ledger_->stateMap(), max, filter); } @@ -249,6 +259,7 @@ InboundLedger::neededStateHashes(int max, SHAMapSyncFilter* filter) const void InboundLedger::tryDB(NodeStore::Database& srcDB) { + TRACE_FUNC(); if (!haveHeader_) { auto makeLedger = [&, this](Blob const& data) { @@ -364,6 +375,7 @@ InboundLedger::tryDB(NodeStore::Database& srcDB) void InboundLedger::onTimer(bool wasProgress, ScopedLockType&) { + TRACE_FUNC(); recentNodes_.clear(); if (isDone()) @@ -412,6 +424,7 @@ InboundLedger::onTimer(bool wasProgress, ScopedLockType&) void InboundLedger::addPeers() { + TRACE_FUNC(); peerSet_->addPeers( (getPeerCount() == 0) ? PeerCountStart : PeerCountAdd, [this](auto peer) { return peer->hasLedger(hash_, seq_); }, @@ -426,12 +439,14 @@ InboundLedger::addPeers() std::weak_ptr InboundLedger::pmDowncast() { + TRACE_FUNC(); return shared_from_this(); } void InboundLedger::done() { + TRACE_FUNC(); if (signaled_) return; @@ -482,6 +497,7 @@ InboundLedger::done() void InboundLedger::trigger(std::shared_ptr const& peer, TriggerReason reason) { + TRACE_FUNC(); ScopedLockType sl(mtx_); if (isDone()) @@ -758,6 +774,7 @@ InboundLedger::filterNodes( std::vector>& nodes, TriggerReason reason) { + TRACE_FUNC(); // Sort nodes so that the ones we haven't recently // requested come before the ones we have. auto dup = std::ranges::stable_partition( @@ -799,6 +816,7 @@ InboundLedger::filterNodes( bool InboundLedger::takeHeader(std::string const& data) { + TRACE_FUNC(); // Return value: true=normal, false=bad data JLOG(journal_.trace()) << "got header acquiring ledger " << hash_; @@ -844,6 +862,7 @@ InboundLedger::takeHeader(std::string const& data) void InboundLedger::receiveNode(protocol::TMLedgerData& packet, SHAMapAddNode& san) { + TRACE_FUNC(); if (!haveHeader_) { JLOG(journal_.warn()) << "Missing ledger header"; @@ -940,6 +959,7 @@ InboundLedger::receiveNode(protocol::TMLedgerData& packet, SHAMapAddNode& san) bool InboundLedger::takeAsRootNode(Slice const& data, SHAMapAddNode& san) { + TRACE_FUNC(); if (failed_ || haveState_) { san.incDuplicate(); @@ -966,6 +986,7 @@ InboundLedger::takeAsRootNode(Slice const& data, SHAMapAddNode& san) bool InboundLedger::takeTxRootNode(Slice const& data, SHAMapAddNode& san) { + TRACE_FUNC(); if (failed_ || haveTransactions_) { san.incDuplicate(); @@ -988,6 +1009,7 @@ InboundLedger::takeTxRootNode(Slice const& data, SHAMapAddNode& san) std::vector InboundLedger::getNeededHashes() { + TRACE_FUNC(); std::vector ret; if (!haveHeader_) @@ -1025,6 +1047,7 @@ InboundLedger::gotData( std::weak_ptr peer, std::shared_ptr const& data) { + TRACE_FUNC(); std::scoped_lock const sl(receivedDataLock_); if (isDone()) @@ -1050,6 +1073,7 @@ InboundLedger::gotData( int InboundLedger::processData(std::shared_ptr peer, protocol::TMLedgerData& packet) { + TRACE_FUNC(); if (packet.type() == protocol::liBASE) { if (packet.nodes().empty()) @@ -1156,6 +1180,7 @@ struct PeerDataCounts void update(std::shared_ptr&& peer, int dataCount) { + TRACE_FUNC(); if (dataCount <= 0) return; maxCount = std::max(maxCount, dataCount); @@ -1172,6 +1197,7 @@ struct PeerDataCounts void prune() { + TRACE_FUNC(); // Remove all the peers that didn't return at least half as much data as // the best peer auto const thresh = maxCount / 2; @@ -1195,6 +1221,7 @@ struct PeerDataCounts void sampleN(std::size_t n, F&& f) { + TRACE_FUNC(); if (counts.empty()) return; @@ -1222,6 +1249,7 @@ struct PeerDataCounts void InboundLedger::runData() { + TRACE_FUNC(); // Maximum number of peers to request data from constexpr std::size_t kMAX_USEFUL_PEERS = 6; @@ -1269,6 +1297,7 @@ InboundLedger::runData() json::Value InboundLedger::getJson(int) { + TRACE_FUNC(); json::Value ret(json::ObjectValue); ScopedLockType const sl(mtx_); diff --git a/src/xrpld/app/ledger/detail/InboundLedgers.cpp b/src/xrpld/app/ledger/detail/InboundLedgers.cpp index a175528978..477e914ffb 100644 --- a/src/xrpld/app/ledger/detail/InboundLedgers.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedgers.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -74,6 +75,7 @@ public: std::shared_ptr acquire(uint256 const& hash, std::uint32_t seq, InboundLedger::Reason reason) override { + TRACE_FUNC(); auto doAcquire = [&, seq, reason]() -> std::shared_ptr { XRPL_ASSERT( hash.isNonZero(), "xrpl::InboundLedgersImp::acquire::doAcquire : nonzero hash"); @@ -129,6 +131,7 @@ public: void acquireAsync(uint256 const& hash, std::uint32_t seq, InboundLedger::Reason reason) override { + TRACE_FUNC(); std::unique_lock lock(acquiresMutex_); try { @@ -153,6 +156,7 @@ public: std::shared_ptr find(uint256 const& hash) override { + TRACE_FUNC(); XRPL_ASSERT(hash.isNonZero(), "xrpl::InboundLedgersImp::find : nonzero input"); std::shared_ptr ret; @@ -190,6 +194,7 @@ public: std::shared_ptr peer, std::shared_ptr packet) override { + TRACE_FUNC(); if (auto ledger = find(hash)) { JLOG(j_.trace()) << "Got data (" << packet->nodes().size() @@ -222,6 +227,7 @@ public: void logFailure(uint256 const& h, std::uint32_t seq) override { + TRACE_FUNC(); ScopedLockType const sl(lock_); recentFailures_.emplace(h, seq); @@ -230,6 +236,7 @@ public: bool isFailure(uint256 const& h) override { + TRACE_FUNC(); ScopedLockType const sl(lock_); beast::expire(recentFailures_, kREACQUIRE_INTERVAL); @@ -245,6 +252,7 @@ public: void gotStaleData(std::shared_ptr packetPtr) override { + TRACE_FUNC(); Serializer s; try { @@ -275,6 +283,7 @@ public: void clearFailures() override { + TRACE_FUNC(); ScopedLockType const sl(lock_); recentFailures_.clear(); @@ -284,6 +293,7 @@ public: std::size_t fetchRate() override { + TRACE_FUNC(); std::scoped_lock const lock(fetchRateMutex_); return 60 * fetchRate_.value(clock_.now()); } @@ -293,6 +303,7 @@ public: void onLedgerFetched() override { + TRACE_FUNC(); std::scoped_lock const lock(fetchRateMutex_); fetchRate_.add(1, clock_.now()); } @@ -300,6 +311,7 @@ public: json::Value getInfo() override { + TRACE_FUNC(); json::Value ret(json::ObjectValue); std::vector>> acqs; @@ -346,6 +358,7 @@ public: void gotFetchPack() override { + TRACE_FUNC(); std::vector> acquires; { ScopedLockType const sl(lock_); @@ -370,6 +383,7 @@ public: void sweep() override { + TRACE_FUNC(); auto const start = clock_.now(); // Make a list of things to sweep, while holding the lock @@ -418,6 +432,7 @@ public: void stop() override { + TRACE_FUNC(); ScopedLockType const lock(lock_); stopping_ = true; ledgers_.clear(); @@ -427,6 +442,7 @@ public: std::size_t cacheSize() override { + TRACE_FUNC(); ScopedLockType const lock(lock_); return ledgers_.size(); } @@ -459,6 +475,7 @@ makeInboundLedgers( InboundLedgers::clock_type& clock, beast::insight::Collector::ptr const& collector) { + TRACE_FUNC(); return std::make_unique(app, clock, collector, makePeerSetBuilder(app)); } diff --git a/src/xrpld/app/ledger/detail/InboundTransactions.cpp b/src/xrpld/app/ledger/detail/InboundTransactions.cpp index 598a8b5c4c..f5ca29eeef 100644 --- a/src/xrpld/app/ledger/detail/InboundTransactions.cpp +++ b/src/xrpld/app/ledger/detail/InboundTransactions.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -48,10 +49,12 @@ public: InboundTransactionSet(std::uint32_t seq, std::shared_ptr const& set) : seq(seq), set(set) { + TRACE_FUNC(); ; } InboundTransactionSet() : seq(0) { + TRACE_FUNC(); ; } }; @@ -70,6 +73,7 @@ public: , peerSetBuilder_(std::move(peerSetBuilder)) , j_(app_.getJournal("InboundTransactions")) { + TRACE_FUNC(); zeroSet_.set = std::make_shared(SHAMapType::TRANSACTION, uint256(), app_.getNodeFamily()); zeroSet_.set->setUnbacked(); @@ -78,6 +82,7 @@ public: TransactionAcquire::pointer getAcquire(uint256 const& hash) { + TRACE_FUNC(); { std::scoped_lock const sl(lock_); @@ -92,6 +97,7 @@ public: std::shared_ptr getSet(uint256 const& hash, bool acquire) override { + TRACE_FUNC(); TransactionAcquire::pointer ta; { @@ -133,6 +139,7 @@ public: std::shared_ptr peer, std::shared_ptr packetPtr) override { + TRACE_FUNC(); protocol::TMLedgerData const& packet = *packetPtr; JLOG(j_.trace()) << "Got data (" << packet.nodes().size() @@ -175,6 +182,7 @@ public: void giveSet(uint256 const& hash, std::shared_ptr const& set, bool fromAcquire) override { + TRACE_FUNC(); bool isNew = true; { @@ -203,6 +211,7 @@ public: void newRound(std::uint32_t seq) override { + TRACE_FUNC(); std::scoped_lock const lock(lock_); // Protect zero set from expiration @@ -234,6 +243,7 @@ public: void stop() override { + TRACE_FUNC(); std::scoped_lock const lock(lock_); stopping_ = true; map_.clear(); @@ -270,6 +280,7 @@ makeInboundTransactions( beast::insight::Collector::ptr const& collector, std::function const&, bool)> gotSet) { + TRACE_FUNC(); return std::make_unique( app, collector, std::move(gotSet), makePeerSetBuilder(app)); } diff --git a/src/xrpld/app/ledger/detail/LedgerCleaner.cpp b/src/xrpld/app/ledger/detail/LedgerCleaner.cpp index 86201ca627..b9447b4f16 100644 --- a/src/xrpld/app/ledger/detail/LedgerCleaner.cpp +++ b/src/xrpld/app/ledger/detail/LedgerCleaner.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -83,6 +84,7 @@ public: ~LedgerCleanerImp() override { + TRACE_FUNC(); if (thread_.joinable()) logicError("LedgerCleanerImp::stop not called."); } @@ -90,12 +92,14 @@ public: void start() override { + TRACE_FUNC(); thread_ = std::thread{&LedgerCleanerImp::run, this}; } void stop() override { + TRACE_FUNC(); JLOG(j_.info()) << "Stopping"; { std::scoped_lock const lock(mutex_); @@ -114,6 +118,7 @@ public: void onWrite(beast::PropertyStream::Map& map) override { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); if (maxRange_ == 0) @@ -141,6 +146,7 @@ public: void clean(json::Value const& params) override { + TRACE_FUNC(); LedgerIndex minRange = 0; LedgerIndex maxRange = 0; app_.getLedgerMaster().getFullValidatedRange(minRange, maxRange); @@ -225,6 +231,7 @@ private: void run() { + TRACE_FUNC(); beast::setCurrentThreadName("LedgerCleaner"); JLOG(j_.debug()) << "Started"; @@ -246,6 +253,7 @@ private: LedgerHash getLedgerHash(std::shared_ptr& ledger, LedgerIndex index) { + TRACE_FUNC(); std::optional hash; try { @@ -274,6 +282,7 @@ private: bool doNodes, bool doTxns) { + TRACE_FUNC(); auto nodeLedger = app_.getInboundLedgers().acquire( ledgerHash, ledgerIndex, InboundLedger::Reason::GENERIC); if (!nodeLedger) @@ -328,6 +337,7 @@ private: LedgerHash getHash(LedgerIndex const& ledgerIndex, std::shared_ptr& referenceLedger) { + TRACE_FUNC(); LedgerHash ledgerHash; if (!referenceLedger || (referenceLedger->header().seq < ledgerIndex)) @@ -375,6 +385,7 @@ private: void doLedgerCleaner() { + TRACE_FUNC(); auto shouldExit = [this] { std::scoped_lock const lock(mutex_); return shouldExit_; @@ -451,6 +462,7 @@ private: std::unique_ptr makeLedgerCleaner(Application& app, beast::Journal journal) { + TRACE_FUNC(); return std::make_unique(app, journal); } diff --git a/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.cpp b/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.cpp index 9ebe890ae1..939bd776c3 100644 --- a/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.cpp +++ b/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include @@ -50,17 +51,20 @@ LedgerDeltaAcquire::LedgerDeltaAcquire( , ledgerSeq_(ledgerSeq) , peerSet_(std::move(peerSet)) { + TRACE_FUNC(); JLOG(journal_.trace()) << "Create " << hash_ << " Seq " << ledgerSeq; } LedgerDeltaAcquire::~LedgerDeltaAcquire() { + TRACE_FUNC(); JLOG(journal_.trace()) << "Destroy " << hash_; } void LedgerDeltaAcquire::init(int numPeers) { + TRACE_FUNC(); ScopedLockType sl(mtx_); if (!isDone()) { @@ -72,6 +76,7 @@ LedgerDeltaAcquire::init(int numPeers) void LedgerDeltaAcquire::trigger(std::size_t limit, ScopedLockType& sl) { + TRACE_FUNC(); fullLedger_ = app_.getLedgerMaster().getLedgerByHash(hash_); if (fullLedger_) { @@ -116,6 +121,7 @@ LedgerDeltaAcquire::trigger(std::size_t limit, ScopedLockType& sl) void LedgerDeltaAcquire::onTimer(bool progress, ScopedLockType& sl) { + TRACE_FUNC(); JLOG(journal_.trace()) << "timeouts_=" << timeouts_ << " for " << hash_; if (timeouts_ > LedgerReplayParameters::kSUB_TASK_MAX_TIMEOUTS) { @@ -132,6 +138,7 @@ LedgerDeltaAcquire::onTimer(bool progress, ScopedLockType& sl) std::weak_ptr LedgerDeltaAcquire::pmDowncast() { + TRACE_FUNC(); return shared_from_this(); } @@ -140,6 +147,7 @@ LedgerDeltaAcquire::processData( LedgerHeader const& info, std::map>&& orderedTxns) { + TRACE_FUNC(); ScopedLockType sl(mtx_); JLOG(journal_.trace()) << "got data for " << hash_; if (isDone()) @@ -168,6 +176,7 @@ LedgerDeltaAcquire::processData( void LedgerDeltaAcquire::addDataCallback(InboundLedger::Reason reason, OnDeltaDataCB&& cb) { + TRACE_FUNC(); ScopedLockType sl(mtx_); dataReadyCallbacks_.emplace_back(std::move(cb)); if (!reasons_.contains(reason)) @@ -187,6 +196,7 @@ LedgerDeltaAcquire::addDataCallback(InboundLedger::Reason reason, OnDeltaDataCB& std::shared_ptr LedgerDeltaAcquire::tryBuild(std::shared_ptr const& parent) { + TRACE_FUNC(); ScopedLockType sl(mtx_); if (fullLedger_) @@ -221,6 +231,7 @@ LedgerDeltaAcquire::tryBuild(std::shared_ptr const& parent) void LedgerDeltaAcquire::onLedgerBuilt(ScopedLockType& sl, std::optional reason) { + TRACE_FUNC(); JLOG(journal_.debug()) << "onLedgerBuilt " << hash_ << (reason ? " for a new reason" : ""); std::vector reasons(reasons_.begin(), reasons_.end()); @@ -254,6 +265,7 @@ LedgerDeltaAcquire::onLedgerBuilt(ScopedLockType& sl, std::optional toCall; std::swap(toCall, dataReadyCallbacks_); diff --git a/src/xrpld/app/ledger/detail/LedgerMaster.cpp b/src/xrpld/app/ledger/detail/LedgerMaster.cpp index 34ded1d14f..ab1e47354e 100644 --- a/src/xrpld/app/ledger/detail/LedgerMaster.cpp +++ b/src/xrpld/app/ledger/detail/LedgerMaster.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include @@ -99,6 +100,7 @@ shouldAcquire( std::uint32_t const candidateLedger, beast::Journal j) { + TRACE_FUNC(); bool const ret = [&]() { // Fetch ledger if it may be the current ledger if (candidateLedger >= currentLedger) @@ -143,18 +145,21 @@ LedgerMaster::LedgerMaster( LedgerIndex LedgerMaster::getCurrentLedgerIndex() { + TRACE_FUNC(); return app_.getOpenLedger().current()->header().seq; } LedgerIndex LedgerMaster::getValidLedgerIndex() { + TRACE_FUNC(); return validLedgerSeq_; } bool LedgerMaster::isCompatible(ReadView const& view, beast::Journal::Stream s, char const* reason) { + TRACE_FUNC(); auto validLedger = getValidatedLedger(); if (validLedger && !areCompatible(*validLedger, view, s, reason)) @@ -178,6 +183,7 @@ LedgerMaster::isCompatible(ReadView const& view, beast::Journal::Stream s, char std::chrono::seconds LedgerMaster::getPublishedLedgerAge() { + TRACE_FUNC(); using namespace std::chrono_literals; std::chrono::seconds const pubClose{pubLedgerClose_.load()}; if (pubClose == 0s) @@ -202,6 +208,7 @@ LedgerMaster::getPublishedLedgerAge() std::chrono::seconds LedgerMaster::getValidatedLedgerAge() { + TRACE_FUNC(); using namespace std::chrono_literals; std::chrono::seconds const valClose{validLedgerSign_.load()}; @@ -227,6 +234,7 @@ LedgerMaster::getValidatedLedgerAge() bool LedgerMaster::isCaughtUp(std::string& reason) { + TRACE_FUNC(); using namespace std::chrono_literals; if (getPublishedLedgerAge() > 3min) @@ -252,6 +260,7 @@ LedgerMaster::isCaughtUp(std::string& reason) void LedgerMaster::setValidLedger(std::shared_ptr const& l) { + TRACE_FUNC(); std::vector times; std::optional consensusHash; @@ -334,6 +343,7 @@ LedgerMaster::setValidLedger(std::shared_ptr const& l) void LedgerMaster::setPubLedger(std::shared_ptr const& l) { + TRACE_FUNC(); pubLedger_ = l; pubLedgerClose_ = l->header().closeTime.time_since_epoch().count(); pubLedgerSeq_ = l->header().seq; @@ -342,6 +352,7 @@ LedgerMaster::setPubLedger(std::shared_ptr const& l) void LedgerMaster::addHeldTransaction(std::shared_ptr const& transaction) { + TRACE_FUNC(); std::scoped_lock const ml(mutex_); heldTransactions_.insert(transaction->getSTransaction()); } @@ -352,6 +363,7 @@ LedgerMaster::addHeldTransaction(std::shared_ptr const& transaction bool LedgerMaster::canBeCurrent(std::shared_ptr const& ledger) { + TRACE_FUNC(); XRPL_ASSERT(ledger, "xrpl::LedgerMaster::canBeCurrent : non-null input"); // Never jump to a candidate ledger that precedes our @@ -417,6 +429,7 @@ LedgerMaster::canBeCurrent(std::shared_ptr const& ledger) void LedgerMaster::switchLCL(std::shared_ptr const& lastClosed) { + TRACE_FUNC(); XRPL_ASSERT(lastClosed, "xrpl::LedgerMaster::switchLCL : non-null input"); if (!lastClosed->isImmutable()) logicError("mutable ledger in switchLCL"); @@ -443,12 +456,14 @@ LedgerMaster::switchLCL(std::shared_ptr const& lastClosed) bool LedgerMaster::fixIndex(LedgerIndex ledgerIndex, LedgerHash const& ledgerHash) { + TRACE_FUNC(); return ledgerHistory_.fixIndex(ledgerIndex, ledgerHash); } bool LedgerMaster::storeLedger(std::shared_ptr ledger) { + TRACE_FUNC(); bool const validated = ledger->header().validated; // Returns true if we already had the ledger return ledgerHistory_.insert(ledger, validated); @@ -462,6 +477,7 @@ LedgerMaster::storeLedger(std::shared_ptr ledger) void LedgerMaster::applyHeldTransactions() { + TRACE_FUNC(); CanonicalTXSet const set = [this]() { std::scoped_lock const sl(mutex_); // VFALCO NOTE The hash for an open ledger is undefined so we use @@ -478,6 +494,7 @@ LedgerMaster::applyHeldTransactions() std::shared_ptr LedgerMaster::popAcctTransaction(std::shared_ptr const& tx) { + TRACE_FUNC(); std::scoped_lock const sl(mutex_); return heldTransactions_.popAcctTransaction(tx); @@ -486,12 +503,14 @@ LedgerMaster::popAcctTransaction(std::shared_ptr const& tx) void LedgerMaster::setBuildingLedger(LedgerIndex i) { + TRACE_FUNC(); buildingLedgerSeq_.store(i); } bool LedgerMaster::haveLedger(std::uint32_t seq) { + TRACE_FUNC(); std::scoped_lock const sl(completeLock_); return boost::icl::contains(completeLedgers_, seq); } @@ -499,6 +518,7 @@ LedgerMaster::haveLedger(std::uint32_t seq) void LedgerMaster::clearLedger(std::uint32_t seq) { + TRACE_FUNC(); std::scoped_lock const sl(completeLock_); completeLedgers_.erase(seq); } @@ -506,6 +526,7 @@ LedgerMaster::clearLedger(std::uint32_t seq) bool LedgerMaster::isValidated(ReadView const& ledger) { + TRACE_FUNC(); if (ledger.open()) return false; @@ -551,6 +572,7 @@ LedgerMaster::isValidated(ReadView const& ledger) bool LedgerMaster::getFullValidatedRange(std::uint32_t& minVal, std::uint32_t& maxVal) { + TRACE_FUNC(); // Validated ledger is likely not stored in the DB yet so we use the // published ledger which is. maxVal = pubLedgerSeq_.load(); @@ -580,6 +602,7 @@ LedgerMaster::getFullValidatedRange(std::uint32_t& minVal, std::uint32_t& maxVal bool LedgerMaster::getValidatedRange(std::uint32_t& minVal, std::uint32_t& maxVal) { + TRACE_FUNC(); if (!getFullValidatedRange(minVal, maxVal)) return false; @@ -625,6 +648,7 @@ LedgerMaster::getValidatedRange(std::uint32_t& minVal, std::uint32_t& maxVal) std::uint32_t LedgerMaster::getEarliestFetch() { + TRACE_FUNC(); // The earliest ledger we will let people fetch is ledger zero, // unless that creates a larger range than allowed std::uint32_t e = getClosedLedger()->header().seq; @@ -643,6 +667,7 @@ LedgerMaster::getEarliestFetch() void LedgerMaster::tryFill(std::shared_ptr ledger) { + TRACE_FUNC(); std::uint32_t seq = ledger->header().seq; uint256 prevHash = ledger->header().parentHash; @@ -714,6 +739,7 @@ LedgerMaster::tryFill(std::shared_ptr ledger) void LedgerMaster::getFetchPack(LedgerIndex missing, InboundLedger::Reason reason) { + TRACE_FUNC(); LedgerIndex const ledgerIndex = missing + 1; auto const haveHash{getLedgerHashForHistory(ledgerIndex, reason)}; @@ -761,6 +787,7 @@ LedgerMaster::getFetchPack(LedgerIndex missing, InboundLedger::Reason reason) void LedgerMaster::fixMismatch(ReadView const& ledger) { + TRACE_FUNC(); int invalidate = 0; std::optional hash; @@ -816,6 +843,7 @@ LedgerMaster::setFullLedger( bool isSynchronous, bool isCurrent) { + TRACE_FUNC(); // A new ledger has been accepted as part of the trusted chain JLOG(journal_.debug()) << "Ledger " << ledger->header().seq << " accepted :" << ledger->header().hash; @@ -874,6 +902,7 @@ LedgerMaster::setFullLedger( void LedgerMaster::failedSave(std::uint32_t seq, uint256 const& hash) { + TRACE_FUNC(); clearLedger(seq); app_.getInboundLedgers().acquire(hash, seq, InboundLedger::Reason::GENERIC); } @@ -883,6 +912,7 @@ LedgerMaster::failedSave(std::uint32_t seq, uint256 const& hash) void LedgerMaster::checkAccept(uint256 const& hash, std::uint32_t seq) { + TRACE_FUNC(); std::size_t valCount = 0; if (seq != 0) @@ -937,12 +967,14 @@ LedgerMaster::checkAccept(uint256 const& hash, std::uint32_t seq) std::size_t LedgerMaster::getNeededValidations() { + TRACE_FUNC(); return standalone_ ? 0 : app_.getValidators().quorum(); } void LedgerMaster::checkAccept(std::shared_ptr const& ledger) { + TRACE_FUNC(); // Can we accept this ledger as our new last fully-validated ledger if (!canBeCurrent(ledger)) @@ -1085,6 +1117,7 @@ LedgerMaster::consensusBuilt( uint256 const& consensusHash, json::Value consensus) { + TRACE_FUNC(); // Because we just built a ledger, we are no longer building one setBuildingLedger(0); @@ -1182,6 +1215,7 @@ LedgerMaster::consensusBuilt( std::optional LedgerMaster::getLedgerHashForHistory(LedgerIndex index, InboundLedger::Reason reason) { + TRACE_FUNC(); // Try to get the hash of a ledger we need to fetch for history std::optional ret; auto const& l{histLedger_}; @@ -1202,6 +1236,7 @@ LedgerMaster::getLedgerHashForHistory(LedgerIndex index, InboundLedger::Reason r std::vector> LedgerMaster::findNewLedgersToPublish(std::unique_lock& sl) { + TRACE_FUNC(); std::vector> ret; JLOG(journal_.trace()) << "findNewLedgersToPublish<"; @@ -1343,6 +1378,7 @@ LedgerMaster::findNewLedgersToPublish(std::unique_lock& sl void LedgerMaster::tryAdvance() { + TRACE_FUNC(); std::scoped_lock const ml(mutex_); // Can't advance without at least one fully-valid ledger @@ -1377,6 +1413,7 @@ LedgerMaster::tryAdvance() void LedgerMaster::updatePaths() { + TRACE_FUNC(); { std::scoped_lock const ml(mutex_); if (app_.getOPs().isNeedNetworkLedger()) @@ -1483,6 +1520,7 @@ LedgerMaster::updatePaths() bool LedgerMaster::newPathRequest() { + TRACE_FUNC(); std::unique_lock ml(mutex_); pathFindNewRequest_ = newPFWork("PthFindNewReq", ml); return pathFindNewRequest_; @@ -1491,6 +1529,7 @@ LedgerMaster::newPathRequest() bool LedgerMaster::isNewPathRequest() { + TRACE_FUNC(); std::scoped_lock const ml(mutex_); bool const ret = pathFindNewRequest_; pathFindNewRequest_ = false; @@ -1502,6 +1541,7 @@ LedgerMaster::isNewPathRequest() bool LedgerMaster::newOrderBookDB() { + TRACE_FUNC(); std::unique_lock ml(mutex_); pathLedger_.reset(); @@ -1513,6 +1553,7 @@ LedgerMaster::newOrderBookDB() bool LedgerMaster::newPFWork(char const* name, std::unique_lock&) { + TRACE_FUNC(); if (!app_.isStopping() && pathFindThread_ < 2 && app_.getPathRequestManager().requestsPending()) { JLOG(journal_.debug()) << "newPFWork: Creating job. path find threads: " << pathFindThread_; @@ -1529,6 +1570,7 @@ LedgerMaster::newPFWork(char const* name, std::unique_lock std::recursive_mutex& LedgerMaster::peekMutex() { + TRACE_FUNC(); return mutex_; } @@ -1536,18 +1578,21 @@ LedgerMaster::peekMutex() std::shared_ptr LedgerMaster::getCurrentLedger() { + TRACE_FUNC(); return app_.getOpenLedger().current(); } std::shared_ptr LedgerMaster::getValidatedLedger() { + TRACE_FUNC(); return validLedger_.get(); } Rules LedgerMaster::getValidatedRules() { + TRACE_FUNC(); // Once we have a guarantee that there's always a last validated // ledger then we can dispense with the if. @@ -1563,6 +1608,7 @@ LedgerMaster::getValidatedRules() std::shared_ptr LedgerMaster::getPublishedLedger() { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); return pubLedger_; } @@ -1570,6 +1616,7 @@ LedgerMaster::getPublishedLedger() std::string LedgerMaster::getCompleteLedgers() { + TRACE_FUNC(); std::scoped_lock const sl(completeLock_); return to_string(completeLedgers_); } @@ -1577,6 +1624,7 @@ LedgerMaster::getCompleteLedgers() std::optional LedgerMaster::getCloseTimeBySeq(LedgerIndex ledgerIndex) { + TRACE_FUNC(); uint256 const hash = getHashBySeq(ledgerIndex); return hash.isNonZero() ? getCloseTimeByHash(hash, ledgerIndex) : std::nullopt; } @@ -1584,6 +1632,7 @@ LedgerMaster::getCloseTimeBySeq(LedgerIndex ledgerIndex) std::optional LedgerMaster::getCloseTimeByHash(LedgerHash const& ledgerHash, std::uint32_t index) { + TRACE_FUNC(); auto nodeObject = app_.getNodeStore().fetchNodeObject(ledgerHash, index); if (nodeObject && (nodeObject->getData().size() >= 120)) { @@ -1603,6 +1652,7 @@ LedgerMaster::getCloseTimeByHash(LedgerHash const& ledgerHash, std::uint32_t ind uint256 LedgerMaster::getHashBySeq(std::uint32_t index) { + TRACE_FUNC(); uint256 hash = ledgerHistory_.getLedgerHash(index); if (hash.isNonZero()) @@ -1614,6 +1664,7 @@ LedgerMaster::getHashBySeq(std::uint32_t index) std::optional LedgerMaster::walkHashBySeq(std::uint32_t index, InboundLedger::Reason reason) { + TRACE_FUNC(); std::optional ledgerHash; if (auto referenceLedger = validLedger_.get()) @@ -1628,6 +1679,7 @@ LedgerMaster::walkHashBySeq( std::shared_ptr const& referenceLedger, InboundLedger::Reason reason) { + TRACE_FUNC(); if (!referenceLedger || (referenceLedger->header().seq < index)) { // Nothing we can do. No validated ledger. @@ -1680,6 +1732,7 @@ LedgerMaster::walkHashBySeq( std::shared_ptr LedgerMaster::getLedgerBySeq(std::uint32_t index) { + TRACE_FUNC(); if (index <= validLedgerSeq_) { // Always prefer a validated ledger @@ -1716,6 +1769,7 @@ LedgerMaster::getLedgerBySeq(std::uint32_t index) std::shared_ptr LedgerMaster::getLedgerByHash(uint256 const& hash) { + TRACE_FUNC(); if (auto ret = ledgerHistory_.getLedgerByHash(hash)) return ret; @@ -1729,6 +1783,7 @@ LedgerMaster::getLedgerByHash(uint256 const& hash) void LedgerMaster::setLedgerRangePresent(std::uint32_t minV, std::uint32_t maxV) { + TRACE_FUNC(); std::scoped_lock const sl(completeLock_); completeLedgers_.insert(range(minV, maxV)); } @@ -1736,6 +1791,7 @@ LedgerMaster::setLedgerRangePresent(std::uint32_t minV, std::uint32_t maxV) void LedgerMaster::sweep() { + TRACE_FUNC(); ledgerHistory_.sweep(); fetch_packs_.sweep(); } @@ -1743,12 +1799,14 @@ LedgerMaster::sweep() float LedgerMaster::getCacheHitRate() { + TRACE_FUNC(); return ledgerHistory_.getCacheHitRate(); } void LedgerMaster::clearPriorLedgers(LedgerIndex seq) { + TRACE_FUNC(); std::scoped_lock const sl(completeLock_); if (seq > 0) completeLedgers_.erase(range(0u, seq - 1)); @@ -1757,18 +1815,21 @@ LedgerMaster::clearPriorLedgers(LedgerIndex seq) void LedgerMaster::clearLedgerCachePrior(LedgerIndex seq) { + TRACE_FUNC(); ledgerHistory_.clearLedgerCachePrior(seq); } void LedgerMaster::takeReplay(std::unique_ptr replay) { + TRACE_FUNC(); replayData_ = std::move(replay); } std::unique_ptr LedgerMaster::releaseReplay() { + TRACE_FUNC(); return std::move(replayData_); } @@ -1779,6 +1840,7 @@ LedgerMaster::fetchForHistory( InboundLedger::Reason reason, std::unique_lock& sl) { + TRACE_FUNC(); ScopeUnlock const sul{sl}; if (auto hash = getLedgerHashForHistory(missing, reason)) { @@ -1873,6 +1935,7 @@ LedgerMaster::fetchForHistory( void LedgerMaster::doAdvance(std::unique_lock& sl) { + TRACE_FUNC(); do { advanceWork_ = false; // If there's work to do, we'll make progress @@ -1962,12 +2025,14 @@ LedgerMaster::doAdvance(std::unique_lock& sl) void LedgerMaster::addFetchPack(uint256 const& hash, std::shared_ptr data) { + TRACE_FUNC(); fetch_packs_.canonicalizeReplaceClient(hash, data); } std::optional LedgerMaster::getFetchPack(uint256 const& hash) { + TRACE_FUNC(); Blob data; if (fetch_packs_.retrieve(hash, data)) { @@ -1981,6 +2046,7 @@ LedgerMaster::getFetchPack(uint256 const& hash) void LedgerMaster::gotFetchPack(bool progress, std::uint32_t seq) { + TRACE_FUNC(); if (!gotFetchPackThread_.test_and_set(std::memory_order_acquire)) { app_.getJobQueue().addJob(JtLedgerData, "GotFetchPack", [&]() { @@ -2024,6 +2090,7 @@ populateFetchPack( std::uint32_t seq, bool withLeaves = true) { + TRACE_FUNC(); XRPL_ASSERT(cnt, "xrpl::populateFetchPack : nonzero count input"); Serializer s(1024); @@ -2053,6 +2120,7 @@ LedgerMaster::makeFetchPack( uint256 haveLedgerHash, UptimeClock::time_point uptime) { + TRACE_FUNC(); using namespace std::chrono_literals; if (UptimeClock::now() > uptime + 1s) { @@ -2170,6 +2238,7 @@ LedgerMaster::makeFetchPack( std::size_t LedgerMaster::getFetchPackCacheSize() const { + TRACE_FUNC(); return fetch_packs_.getCacheSize(); } @@ -2177,12 +2246,14 @@ LedgerMaster::getFetchPackCacheSize() const std::optional LedgerMaster::minSqlSeq() { + TRACE_FUNC(); return app_.getRelationalDatabase().getMinLedgerSeq(); } std::optional LedgerMaster::txnIdFromIndex(uint32_t ledgerSeq, uint32_t txnIndex) { + TRACE_FUNC(); uint32_t first = 0, last = 0; if (!getValidatedRange(first, last) || last < ledgerSeq) diff --git a/src/xrpld/app/ledger/detail/LedgerPersistence.cpp b/src/xrpld/app/ledger/detail/LedgerPersistence.cpp index 70e2684e1c..426acfeef4 100644 --- a/src/xrpld/app/ledger/detail/LedgerPersistence.cpp +++ b/src/xrpld/app/ledger/detail/LedgerPersistence.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -27,6 +28,7 @@ saveValidatedLedger( std::shared_ptr const& ledger, bool current) { + TRACE_FUNC(); auto j = registry.getJournal("Ledger"); auto seq = ledger->header().seq; if (!registry.getPendingSaves().startWork(seq)) @@ -53,6 +55,7 @@ pendSaveValidated( bool isSynchronous, bool isCurrent) { + TRACE_FUNC(); if (!registry.getHashRouter().setFlags(ledger->header().hash, HashRouterFlags::SAVED)) { // We have tried to save this ledger recently @@ -99,6 +102,7 @@ loadLedgerHelper( ServiceRegistry& registry, bool acquire) { + TRACE_FUNC(); bool loaded = false; auto ledger = std::make_shared( info, @@ -118,6 +122,7 @@ loadLedgerHelper( static void finishLoadByIndexOrHash(std::shared_ptr const& ledger, beast::Journal j) { + TRACE_FUNC(); if (!ledger) return; @@ -134,6 +139,7 @@ finishLoadByIndexOrHash(std::shared_ptr const& ledger, beast::Journal j) std::tuple, std::uint32_t, uint256> getLatestLedger(Rules const& rules, Fees const& fees, ServiceRegistry& registry) { + TRACE_FUNC(); std::optional const info = registry.getRelationalDatabase().getNewestLedgerInfo(); if (!info) return {std::shared_ptr(), {}, {}}; @@ -148,6 +154,7 @@ loadByIndex( ServiceRegistry& registry, bool acquire) { + TRACE_FUNC(); if (std::optional info = registry.getRelationalDatabase().getLedgerInfoByIndex(ledgerIndex)) { @@ -166,6 +173,7 @@ loadByHash( ServiceRegistry& registry, bool acquire) { + TRACE_FUNC(); if (std::optional info = registry.getRelationalDatabase().getLedgerInfoByHash(ledgerHash)) { diff --git a/src/xrpld/app/ledger/detail/LedgerReplay.cpp b/src/xrpld/app/ledger/detail/LedgerReplay.cpp index 925ede6d27..43b321e94a 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplay.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplay.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -15,6 +16,7 @@ LedgerReplay::LedgerReplay( std::shared_ptr replay) : parent_{std::move(parent)}, replay_{std::move(replay)} { + TRACE_FUNC(); for (auto const& item : replay_->txMap()) { auto txPair = replay_->txRead(item.key()); // non-const so can be moved diff --git a/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp b/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp index 3df1e99cae..940f5562af 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include @@ -41,6 +42,7 @@ protocol::TMProofPathResponse LedgerReplayMsgHandler::processProofPathRequest( std::shared_ptr const& msg) { + TRACE_FUNC(); protocol::TMProofPathRequest& packet = *msg; protocol::TMProofPathResponse reply; @@ -105,6 +107,7 @@ bool LedgerReplayMsgHandler::processProofPathResponse( std::shared_ptr const& msg) { + TRACE_FUNC(); protocol::TMProofPathResponse const& reply = *msg; if (reply.has_error() || !reply.has_key() || !reply.has_ledgerhash() || !reply.has_type() || !reply.has_ledgerheader() || reply.path_size() == 0) @@ -174,6 +177,7 @@ protocol::TMReplayDeltaResponse LedgerReplayMsgHandler::processReplayDeltaRequest( std::shared_ptr const& msg) { + TRACE_FUNC(); protocol::TMReplayDeltaRequest const& packet = *msg; protocol::TMReplayDeltaResponse reply; @@ -213,6 +217,7 @@ bool LedgerReplayMsgHandler::processReplayDeltaResponse( std::shared_ptr const& msg) { + TRACE_FUNC(); protocol::TMReplayDeltaResponse const& reply = *msg; if (reply.has_error() || !reply.has_ledgerheader()) { diff --git a/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp b/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp index dcc09faa13..587f43b885 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -27,6 +28,7 @@ LedgerReplayTask::TaskParameter::TaskParameter( std::uint32_t totalNumLedgers) : reason(r), finishHash(finishLedgerHash), totalLedgers(totalNumLedgers) { + TRACE_FUNC(); XRPL_ASSERT( finishLedgerHash.isNonZero() && totalNumLedgers > 0, "xrpl::LedgerReplayTask::TaskParameter::TaskParameter : valid " @@ -39,6 +41,7 @@ LedgerReplayTask::TaskParameter::update( std::uint32_t seq, std::vector const& sList) { + TRACE_FUNC(); if (finishHash != hash || sList.size() + 1 < totalLedgers || full) return false; @@ -57,6 +60,7 @@ LedgerReplayTask::TaskParameter::update( bool LedgerReplayTask::TaskParameter::canMergeInto(TaskParameter const& existingTask) const { + TRACE_FUNC(); if (reason == existingTask.reason) { if (finishHash == existingTask.finishHash && totalLedgers <= existingTask.totalLedgers) @@ -100,17 +104,20 @@ LedgerReplayTask::LedgerReplayTask( parameter.totalLedgers * LedgerReplayParameters::kTASK_MAX_TIMEOUTS_MULTIPLIER)) , skipListAcquirer_(skipListAcquirer) { + TRACE_FUNC(); JLOG(journal_.trace()) << "Create " << hash_; } LedgerReplayTask::~LedgerReplayTask() { + TRACE_FUNC(); JLOG(journal_.trace()) << "Destroy " << hash_; } void LedgerReplayTask::init() { + TRACE_FUNC(); JLOG(journal_.debug()) << "Task start " << hash_; std::weak_ptr const wptr = shared_from_this(); @@ -140,6 +147,7 @@ LedgerReplayTask::init() void LedgerReplayTask::trigger(ScopedLockType& sl) { + TRACE_FUNC(); JLOG(journal_.trace()) << "trigger " << hash_; if (!parameter_.full) return; @@ -165,6 +173,7 @@ LedgerReplayTask::trigger(ScopedLockType& sl) void LedgerReplayTask::deltaReady(uint256 const& deltaHash) { + TRACE_FUNC(); JLOG(journal_.trace()) << "Delta " << deltaHash << " ready for task " << hash_; ScopedLockType sl(mtx_); if (!isDone()) @@ -174,6 +183,7 @@ LedgerReplayTask::deltaReady(uint256 const& deltaHash) void LedgerReplayTask::tryAdvance(ScopedLockType& sl) { + TRACE_FUNC(); JLOG(journal_.trace()) << "tryAdvance task " << hash_ << (parameter_.full ? ", full parameter" : ", waiting to fill parameter") << ", deltaIndex=" << deltaToBuild_ << ", totalDeltas=" << deltas_.size() @@ -220,6 +230,7 @@ LedgerReplayTask::updateSkipList( std::uint32_t seq, std::vector const& sList) { + TRACE_FUNC(); { ScopedLockType const sl(mtx_); if (isDone()) @@ -241,6 +252,7 @@ LedgerReplayTask::updateSkipList( void LedgerReplayTask::onTimer(bool progress, ScopedLockType& sl) { + TRACE_FUNC(); JLOG(journal_.trace()) << "timeouts_=" << timeouts_ << " for " << hash_; if (timeouts_ > maxTimeouts_) { @@ -256,12 +268,14 @@ LedgerReplayTask::onTimer(bool progress, ScopedLockType& sl) std::weak_ptr LedgerReplayTask::pmDowncast() { + TRACE_FUNC(); return shared_from_this(); } void LedgerReplayTask::addDelta(std::shared_ptr const& delta) { + TRACE_FUNC(); std::weak_ptr const wptr = shared_from_this(); delta->addDataCallback(parameter_.reason, [wptr](bool good, uint256 const& hash) { if (auto sptr = wptr.lock(); sptr) @@ -293,6 +307,7 @@ LedgerReplayTask::addDelta(std::shared_ptr const& delta) bool LedgerReplayTask::finished() const { + TRACE_FUNC(); ScopedLockType const sl(mtx_); return isDone(); } diff --git a/src/xrpld/app/ledger/detail/LedgerReplayer.cpp b/src/xrpld/app/ledger/detail/LedgerReplayer.cpp index 132bf9ccaa..7d156e7973 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayer.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayer.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -39,6 +40,7 @@ LedgerReplayer::LedgerReplayer( LedgerReplayer::~LedgerReplayer() { + TRACE_FUNC(); std::scoped_lock const lock(mtx_); tasks_.clear(); } @@ -49,6 +51,7 @@ LedgerReplayer::replay( uint256 const& finishLedgerHash, std::uint32_t totalNumLedgers) { + TRACE_FUNC(); XRPL_ASSERT( finishLedgerHash.isNonZero() && totalNumLedgers > 0 && totalNumLedgers <= LedgerReplayParameters::kMAX_TASK_SIZE, @@ -108,6 +111,7 @@ LedgerReplayer::replay( void LedgerReplayer::createDeltas(std::shared_ptr task) { + TRACE_FUNC(); { // TODO for use cases like Consensus (i.e. totalLedgers = 1 or small): // check if the last closed or validated ledger l the local node has @@ -167,6 +171,7 @@ LedgerReplayer::gotSkipList( LedgerHeader const& info, boost::intrusive_ptr const& item) { + TRACE_FUNC(); std::shared_ptr skipList = {}; { std::scoped_lock const lock(mtx_); @@ -190,6 +195,7 @@ LedgerReplayer::gotReplayDelta( LedgerHeader const& info, std::map>&& txns) { + TRACE_FUNC(); std::shared_ptr delta = {}; { std::scoped_lock const lock(mtx_); @@ -211,6 +217,7 @@ LedgerReplayer::gotReplayDelta( void LedgerReplayer::sweep() { + TRACE_FUNC(); auto const start = std::chrono::steady_clock::now(); { std::scoped_lock const lock(mtx_); @@ -258,6 +265,7 @@ LedgerReplayer::sweep() void LedgerReplayer::stop() { + TRACE_FUNC(); JLOG(j_.info()) << "Stopping..."; { std::scoped_lock const lock(mtx_); diff --git a/src/xrpld/app/ledger/detail/LedgerToJson.cpp b/src/xrpld/app/ledger/detail/LedgerToJson.cpp index 5248c3621a..c92858e870 100644 --- a/src/xrpld/app/ledger/detail/LedgerToJson.cpp +++ b/src/xrpld/app/ledger/detail/LedgerToJson.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -38,24 +39,28 @@ namespace { bool isFull(LedgerFill const& fill) { + TRACE_FUNC(); return (fill.options & LedgerFill::Full) != 0; } bool isExpanded(LedgerFill const& fill) { + TRACE_FUNC(); return isFull(fill) || ((fill.options & LedgerFill::Expand) != 0); } bool isBinary(LedgerFill const& fill) { + TRACE_FUNC(); return (fill.options & LedgerFill::Binary) != 0; } void fillJson(json::Value& json, bool closed, LedgerHeader const& info, bool bFull, unsigned apiVersion) { + TRACE_FUNC(); json[jss::parent_hash] = to_string(info.parentHash); json[jss::ledger_index] = (apiVersion > 1) ? json::Value(info.seq) : json::Value(std::to_string(info.seq)); @@ -94,6 +99,7 @@ fillJson(json::Value& json, bool closed, LedgerHeader const& info, bool bFull, u void fillJsonBinary(json::Value& json, bool closed, LedgerHeader const& info) { + TRACE_FUNC(); if (!closed) { json[jss::closed] = false; @@ -116,6 +122,7 @@ fillJsonTx( std::shared_ptr const& txn, std::shared_ptr const& stMeta) { + TRACE_FUNC(); if (!bExpanded) return to_string(txn->getTransactionID()); @@ -218,6 +225,7 @@ fillJsonTx( void fillJsonTx(json::Value& json, LedgerFill const& fill) { + TRACE_FUNC(); auto& txns = json[jss::transactions] = json::ArrayValue; auto bBinary = isBinary(fill); auto bExpanded = isExpanded(fill); @@ -246,6 +254,7 @@ fillJsonTx(json::Value& json, LedgerFill const& fill) void fillJsonState(json::Value& json, LedgerFill const& fill) { + TRACE_FUNC(); auto& ledger = fill.ledger; auto& array = json[jss::accountState] = json::ArrayValue; auto expanded = isExpanded(fill); @@ -273,6 +282,7 @@ fillJsonState(json::Value& json, LedgerFill const& fill) void fillJsonQueue(json::Value& json, LedgerFill const& fill) { + TRACE_FUNC(); auto& queueData = json[jss::queue_data] = json::ArrayValue; auto bBinary = isBinary(fill); auto bExpanded = isExpanded(fill); @@ -310,6 +320,7 @@ fillJsonQueue(json::Value& json, LedgerFill const& fill) void fillJson(json::Value& json, LedgerFill const& fill) { + TRACE_FUNC(); // TODO: what happens if bBinary and bExtracted are both set? // Is there a way to report this back? auto bFull = isFull(fill); @@ -340,6 +351,7 @@ fillJson(json::Value& json, LedgerFill const& fill) void addJson(json::Value& json, LedgerFill const& fill) { + TRACE_FUNC(); auto& object = json[jss::ledger] = json::ObjectValue; fillJson(object, fill); @@ -350,6 +362,7 @@ addJson(json::Value& json, LedgerFill const& fill) json::Value getJson(LedgerFill const& fill) { + TRACE_FUNC(); json::Value json; fillJson(json, fill); return json; @@ -358,6 +371,7 @@ getJson(LedgerFill const& fill) void copyFrom(json::Value& to, json::Value const& from) { + TRACE_FUNC(); if (!to) { // Short circuit this very common case. to = from; diff --git a/src/xrpld/app/ledger/detail/LocalTxs.cpp b/src/xrpld/app/ledger/detail/LocalTxs.cpp index 0f355367e5..77356cfba8 100644 --- a/src/xrpld/app/ledger/detail/LocalTxs.cpp +++ b/src/xrpld/app/ledger/detail/LocalTxs.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -53,6 +54,7 @@ public: , account_(txn->getAccountID(sfAccount)) , seqProxy_(txn->getSeqProxy()) { + TRACE_FUNC(); if (txn->isFieldPresent(sfLastLedgerSequence)) expire_ = std::min(expire_, txn->getFieldU32(sfLastLedgerSequence) + 1); } @@ -60,30 +62,35 @@ public: [[nodiscard]] uint256 const& getID() const { + TRACE_FUNC(); return id_; } [[nodiscard]] SeqProxy getSeqProxy() const { + TRACE_FUNC(); return seqProxy_; } [[nodiscard]] bool isExpired(LedgerIndex i) const { + TRACE_FUNC(); return i > expire_; } [[nodiscard]] std::shared_ptr const& getTX() const { + TRACE_FUNC(); return txn_; } [[nodiscard]] AccountID const& getAccount() const { + TRACE_FUNC(); return account_; } @@ -106,6 +113,7 @@ public: void pushBack(LedgerIndex index, std::shared_ptr const& txn) override { + TRACE_FUNC(); std::scoped_lock const lock(lock_); txns_.emplace_back(index, txn); @@ -114,6 +122,7 @@ public: CanonicalTXSet getTxSet() override { + TRACE_FUNC(); CanonicalTXSet tset(uint256{}); // Get the set of local transactions as a canonical @@ -133,6 +142,7 @@ public: void sweep(ReadView const& view) override { + TRACE_FUNC(); std::scoped_lock const lock(lock_); txns_.remove_if([&view](auto const& txn) { @@ -170,6 +180,7 @@ public: std::size_t size() override { + TRACE_FUNC(); std::scoped_lock const lock(lock_); return txns_.size(); @@ -183,6 +194,7 @@ private: std::unique_ptr makeLocalTxs() { + TRACE_FUNC(); return std::make_unique(); } diff --git a/src/xrpld/app/ledger/detail/OpenLedger.cpp b/src/xrpld/app/ledger/detail/OpenLedger.cpp index 5774dd8863..9a1cbf18fb 100644 --- a/src/xrpld/app/ledger/detail/OpenLedger.cpp +++ b/src/xrpld/app/ledger/detail/OpenLedger.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -48,6 +49,7 @@ OpenLedger::OpenLedger( bool OpenLedger::empty() const { + TRACE_FUNC(); std::scoped_lock const lock(modify_mutex_); return current_->txCount() == 0; } @@ -55,6 +57,7 @@ OpenLedger::empty() const std::shared_ptr OpenLedger::current() const { + TRACE_FUNC(); std::scoped_lock const lock(current_mutex_); return current_; } @@ -62,6 +65,7 @@ OpenLedger::current() const bool OpenLedger::modify(modify_type const& f) { + TRACE_FUNC(); std::scoped_lock const lock1(modify_mutex_); auto next = std::make_shared(*current_); auto const changed = f(*next, j_); @@ -85,6 +89,7 @@ OpenLedger::accept( std::string const& suffix, modify_type const& f) { + TRACE_FUNC(); JLOG(j_.trace()) << "accept ledger " << ledger->seq() << " " << suffix; auto next = create(rules, ledger); if (retriesFirst) @@ -163,6 +168,7 @@ OpenLedger::accept( std::shared_ptr OpenLedger::create(Rules const& rules, std::shared_ptr const& ledger) { + TRACE_FUNC(); return std::make_shared( kOPEN_LEDGER, rules, std::make_shared(ledger, cache_)); } @@ -176,6 +182,7 @@ OpenLedger::applyOne( ApplyFlags flags, beast::Journal j) -> Result { + TRACE_FUNC(); if (retry) flags = flags | TapRetry; // If it's in anybody's proposed set, try to keep it in the ledger @@ -192,6 +199,7 @@ OpenLedger::applyOne( std::string debugTxstr(std::shared_ptr const& tx) { + TRACE_FUNC(); std::stringstream ss; ss << tx->getTransactionID(); return ss.str().substr(0, 4); @@ -200,6 +208,7 @@ debugTxstr(std::shared_ptr const& tx) std::string debugTostr(OrderedTxs const& set) { + TRACE_FUNC(); std::stringstream ss; for (auto const& item : set) ss << debugTxstr(item.second) << ", "; @@ -209,6 +218,7 @@ debugTostr(OrderedTxs const& set) std::string debugTostr(SHAMap const& set) { + TRACE_FUNC(); std::stringstream ss; for (auto const& item : set) { @@ -229,6 +239,7 @@ debugTostr(SHAMap const& set) std::string debugTostr(std::shared_ptr const& view) { + TRACE_FUNC(); std::stringstream ss; for (auto const& item : view->txs) ss << debugTxstr(item.first) << ", "; diff --git a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp index e6b41198bb..8c3c135b9e 100644 --- a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp +++ b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -43,17 +44,20 @@ SkipListAcquire::SkipListAcquire( , inboundLedgers_(inboundLedgers) , peerSet_(std::move(peerSet)) { + TRACE_FUNC(); JLOG(journal_.trace()) << "Create " << hash_; } SkipListAcquire::~SkipListAcquire() { + TRACE_FUNC(); JLOG(journal_.trace()) << "Destroy " << hash_; } void SkipListAcquire::init(int numPeers) { + TRACE_FUNC(); ScopedLockType sl(mtx_); if (!isDone()) { @@ -65,6 +69,7 @@ SkipListAcquire::init(int numPeers) void SkipListAcquire::trigger(std::size_t limit, ScopedLockType& sl) { + TRACE_FUNC(); if (auto const l = app_.getLedgerMaster().getLedgerByHash(hash_); l) { JLOG(journal_.trace()) << "existing ledger " << hash_; @@ -111,6 +116,7 @@ SkipListAcquire::trigger(std::size_t limit, ScopedLockType& sl) void SkipListAcquire::onTimer(bool progress, ScopedLockType& sl) { + TRACE_FUNC(); JLOG(journal_.trace()) << "timeouts_=" << timeouts_ << " for " << hash_; if (timeouts_ > LedgerReplayParameters::kSUB_TASK_MAX_TIMEOUTS) { @@ -127,6 +133,7 @@ SkipListAcquire::onTimer(bool progress, ScopedLockType& sl) std::weak_ptr SkipListAcquire::pmDowncast() { + TRACE_FUNC(); return shared_from_this(); } @@ -135,6 +142,7 @@ SkipListAcquire::processData( std::uint32_t ledgerSeq, boost::intrusive_ptr const& item) { + TRACE_FUNC(); XRPL_ASSERT(ledgerSeq != 0 && item, "xrpl::SkipListAcquire::processData : valid inputs"); ScopedLockType sl(mtx_); if (isDone()) @@ -162,6 +170,7 @@ SkipListAcquire::processData( void SkipListAcquire::addDataCallback(OnSkipListDataCB&& cb) { + TRACE_FUNC(); ScopedLockType sl(mtx_); dataReadyCallbacks_.emplace_back(std::move(cb)); if (isDone()) @@ -174,6 +183,7 @@ SkipListAcquire::addDataCallback(OnSkipListDataCB&& cb) std::shared_ptr SkipListAcquire::getData() const { + TRACE_FUNC(); ScopedLockType const sl(mtx_); return data_; } @@ -181,6 +191,7 @@ SkipListAcquire::getData() const void SkipListAcquire::retrieveSkipList(std::shared_ptr const& ledger, ScopedLockType& sl) { + TRACE_FUNC(); if (auto const hashIndex = ledger->read(keylet::skip()); hashIndex && hashIndex->isFieldPresent(sfHashes)) { @@ -203,6 +214,7 @@ SkipListAcquire::onSkipListAcquired( std::uint32_t ledgerSeq, ScopedLockType& sl) { + TRACE_FUNC(); complete_ = true; data_ = std::make_shared(ledgerSeq, skipList); JLOG(journal_.debug()) << "Skip list acquired " << hash_; @@ -212,6 +224,7 @@ SkipListAcquire::onSkipListAcquired( void SkipListAcquire::notify(ScopedLockType& sl) { + TRACE_FUNC(); XRPL_ASSERT(isDone(), "xrpl::SkipListAcquire::notify : is done"); std::vector toCall; std::swap(toCall, dataReadyCallbacks_); diff --git a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp index 9cf58bee47..fd21d11068 100644 --- a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp +++ b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ TimeoutCounter::TimeoutCounter( , queueJobParameter_(std::move(jobParameter)) , timer_(app_.getIOContext()) { + TRACE_FUNC(); XRPL_ASSERT( (timerInterval_ > 10ms) && (timerInterval_ < 30s), "xrpl::TimeoutCounter::TimeoutCounter : interval input inside range"); @@ -39,6 +41,7 @@ TimeoutCounter::TimeoutCounter( void TimeoutCounter::setTimer(ScopedLockType& sl) { + TRACE_FUNC(); if (isDone()) return; timer_.expires_after(timerInterval_); @@ -57,6 +60,7 @@ TimeoutCounter::setTimer(ScopedLockType& sl) void TimeoutCounter::queueJob(ScopedLockType& sl) { + TRACE_FUNC(); if (isDone()) return; if (queueJobParameter_.jobLimit && @@ -79,6 +83,7 @@ TimeoutCounter::queueJob(ScopedLockType& sl) void TimeoutCounter::invokeOnTimer() { + TRACE_FUNC(); ScopedLockType sl(mtx_); if (isDone()) @@ -104,6 +109,7 @@ TimeoutCounter::invokeOnTimer() void TimeoutCounter::cancel() { + TRACE_FUNC(); ScopedLockType const sl(mtx_); if (!isDone()) { diff --git a/src/xrpld/app/ledger/detail/TimeoutCounter.h b/src/xrpld/app/ledger/detail/TimeoutCounter.h index 18b443c67d..bdb40cf49d 100644 --- a/src/xrpld/app/ledger/detail/TimeoutCounter.h +++ b/src/xrpld/app/ledger/detail/TimeoutCounter.h @@ -4,6 +4,7 @@ #include #include +#include #include @@ -97,6 +98,7 @@ protected: bool isDone() const { + TRACE_FUNC(); return complete_ || failed_; } diff --git a/src/xrpld/app/ledger/detail/TransactionAcquire.cpp b/src/xrpld/app/ledger/detail/TransactionAcquire.cpp index f79620f99d..87ffb036d9 100644 --- a/src/xrpld/app/ledger/detail/TransactionAcquire.cpp +++ b/src/xrpld/app/ledger/detail/TransactionAcquire.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -50,6 +51,7 @@ TransactionAcquire::TransactionAcquire( app.getJournal("TransactionAcquire")) , peerSet_(std::move(peerSet)) { + TRACE_FUNC(); map_ = std::make_shared(SHAMapType::TRANSACTION, hash, app_.getNodeFamily()); map_->setUnbacked(); } @@ -57,6 +59,7 @@ TransactionAcquire::TransactionAcquire( void TransactionAcquire::done() { + TRACE_FUNC(); // We hold a PeerSet lock and so cannot do real work here if (failed_) @@ -85,6 +88,7 @@ TransactionAcquire::done() void TransactionAcquire::onTimer(bool progress, ScopedLockType& psl) { + TRACE_FUNC(); if (timeouts_ > MaxTimeouts) { failed_ = true; @@ -101,12 +105,14 @@ TransactionAcquire::onTimer(bool progress, ScopedLockType& psl) std::weak_ptr TransactionAcquire::pmDowncast() { + TRACE_FUNC(); return shared_from_this(); } void TransactionAcquire::trigger(std::shared_ptr const& peer) { + TRACE_FUNC(); if (complete_) { JLOG(journal_.info()) << "trigger after complete"; @@ -178,6 +184,7 @@ TransactionAcquire::takeNodes( std::vector> const& data, std::shared_ptr const& peer) { + TRACE_FUNC(); ScopedLockType const sl(mtx_); if (complete_) @@ -238,6 +245,7 @@ TransactionAcquire::takeNodes( void TransactionAcquire::addPeers(std::size_t limit) { + TRACE_FUNC(); peerSet_->addPeers( limit, [this](auto peer) { return peer->hasTxSet(hash_); }, @@ -247,6 +255,7 @@ TransactionAcquire::addPeers(std::size_t limit) void TransactionAcquire::init(int numPeers) { + TRACE_FUNC(); ScopedLockType sl(mtx_); addPeers(numPeers); @@ -257,6 +266,7 @@ TransactionAcquire::init(int numPeers) void TransactionAcquire::stillNeed() { + TRACE_FUNC(); ScopedLockType const sl(mtx_); timeouts_ = std::min(timeouts_, NormTimeouts); diff --git a/src/xrpld/app/ledger/detail/TransactionMaster.cpp b/src/xrpld/app/ledger/detail/TransactionMaster.cpp index 71a1ca629f..60f84c87f3 100644 --- a/src/xrpld/app/ledger/detail/TransactionMaster.cpp +++ b/src/xrpld/app/ledger/detail/TransactionMaster.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include @@ -45,6 +46,7 @@ TransactionMaster::inLedger( std::optional tseq, std::optional netID) { + TRACE_FUNC(); auto txn = cache_.fetch(hash); if (!txn) @@ -57,12 +59,14 @@ TransactionMaster::inLedger( std::shared_ptr TransactionMaster::fetchFromCache(uint256 const& txnID) { + TRACE_FUNC(); return cache_.fetch(txnID); } std::variant, std::shared_ptr>, TxSearched> TransactionMaster::fetch(uint256 const& txnID, ErrorCodeI& ec) { + TRACE_FUNC(); using TxPair = std::pair, std::shared_ptr>; if (auto txn = fetchFromCache(txnID); txn && !txn->isValidated()) @@ -87,6 +91,7 @@ TransactionMaster::fetch( ClosedInterval const& range, ErrorCodeI& ec) { + TRACE_FUNC(); using TxPair = std::pair, std::shared_ptr>; if (auto txn = fetchFromCache(txnID); txn && !txn->isValidated()) @@ -111,6 +116,7 @@ TransactionMaster::fetch( SHAMapNodeType type, std::uint32_t uCommitLedger) { + TRACE_FUNC(); std::shared_ptr txn; auto iTx = fetchFromCache(item->key()); @@ -141,6 +147,7 @@ TransactionMaster::fetch( void TransactionMaster::canonicalize(std::shared_ptr* pTransaction) { + TRACE_FUNC(); uint256 const tid = (*pTransaction)->getID(); if (tid != beast::kZERO) { @@ -154,12 +161,14 @@ TransactionMaster::canonicalize(std::shared_ptr* pTransaction) void TransactionMaster::sweep(void) { + TRACE_FUNC(); cache_.sweep(); } TaggedCache& TransactionMaster::getCache() { + TRACE_FUNC(); return cache_; } diff --git a/src/xrpld/app/main/Application.cpp b/src/xrpld/app/main/Application.cpp index 800d398eca..71059c91c7 100644 --- a/src/xrpld/app/main/Application.cpp +++ b/src/xrpld/app/main/Application.cpp @@ -98,6 +98,7 @@ #include #include #include +#include #include #include @@ -162,6 +163,7 @@ private: void start() { + TRACE_FUNC(); probe_.sample(std::ref(*this)); } @@ -169,6 +171,7 @@ private: void operator()(Duration const& elapsed) { + TRACE_FUNC(); using namespace std::chrono; auto const lastSample = ceil(elapsed); @@ -185,18 +188,21 @@ private: [[nodiscard]] std::chrono::milliseconds get() const { + TRACE_FUNC(); return lastSample_.load(); } void cancel() { + TRACE_FUNC(); probe_.cancel(); } void cancelAsync() { + TRACE_FUNC(); probe_.cancelAsync(); } }; @@ -282,6 +288,7 @@ public: static std::size_t numberOfThreads(Config const& config) { + TRACE_FUNC(); #if XRPL_SINGLE_IO_SERVICE_THREAD return 1; #else @@ -461,6 +468,7 @@ public: getIoContext()) , grpcServer_(std::make_unique(*this)) { + TRACE_FUNC(); initAccountIdCache(config_->getValueFor(SizedItem::AccountIdCacheSize)); add(resourceManager_.get()); @@ -507,48 +515,56 @@ public: std::uint64_t instanceID() const override { + TRACE_FUNC(); return instanceCookie_; } Logs& getLogs() override { + TRACE_FUNC(); return *logs_; } Config& config() override { + TRACE_FUNC(); return *config_; } CollectorManager& getCollectorManager() override { + TRACE_FUNC(); return *collectorManager_; } Family& getNodeFamily() override { + TRACE_FUNC(); return nodeFamily_; } TimeKeeper& getTimeKeeper() override { + TRACE_FUNC(); return *timeKeeper_; } JobQueue& getJobQueue() override { + TRACE_FUNC(); return *jobQueue_; } std::pair const& nodeIdentity() override { + TRACE_FUNC(); if (nodeIdentity_) return *nodeIdentity_; @@ -558,6 +574,7 @@ public: std::optional getValidationPublicKey() const override { + TRACE_FUNC(); if (!validatorKeys_.keys) return {}; @@ -567,12 +584,14 @@ public: NetworkOPs& getOPs() override { + TRACE_FUNC(); return *networkOPs_; } ServerHandler& getServerHandler() override { + TRACE_FUNC(); XRPL_ASSERT( serverHandler_, "xrpl::ApplicationImp::getServerHandler : non-null server " @@ -583,54 +602,63 @@ public: boost::asio::io_context& getIOContext() override { + TRACE_FUNC(); return getIoContext(); } std::chrono::milliseconds getIOLatency() override { + TRACE_FUNC(); return io_latency_sampler_.get(); } LedgerMaster& getLedgerMaster() override { + TRACE_FUNC(); return *ledgerMaster_; } LedgerCleaner& getLedgerCleaner() override { + TRACE_FUNC(); return *ledgerCleaner_; } LedgerReplayer& getLedgerReplayer() override { + TRACE_FUNC(); return *ledgerReplayer_; } InboundLedgers& getInboundLedgers() override { + TRACE_FUNC(); return *inboundLedgers_; } InboundTransactions& getInboundTransactions() override { + TRACE_FUNC(); return *inboundTransactions_; } TaggedCache& getAcceptedLedgerCache() override { + TRACE_FUNC(); return acceptedLedgerCache_; } void gotTXSet(std::shared_ptr const& set, bool fromAcquire) const { + TRACE_FUNC(); if (set) networkOPs_->mapComplete(set, fromAcquire); } @@ -638,144 +666,168 @@ public: TransactionMaster& getMasterTransaction() override { + TRACE_FUNC(); return txMaster_; } perf::PerfLog& getPerfLog() override { + TRACE_FUNC(); return *perfLog_; } NodeCache& getTempNodeCache() override { + TRACE_FUNC(); return tempNodeCache_; } NodeStore::Database& getNodeStore() override { + TRACE_FUNC(); return *nodeStore_; } Application::MutexType& getMasterMutex() override { + TRACE_FUNC(); return masterMutex_; } LoadManager& getLoadManager() override { + TRACE_FUNC(); return *loadManager_; } Resource::Manager& getResourceManager() override { + TRACE_FUNC(); return *resourceManager_; } OrderBookDB& getOrderBookDB() override { + TRACE_FUNC(); return *orderBookDB_; } PathRequestManager& getPathRequestManager() override { + TRACE_FUNC(); return *pathRequestManager_; } CachedSLEs& getCachedSLEs() override { + TRACE_FUNC(); return cachedSLEs_; } NetworkIDService& getNetworkIDService() override { + TRACE_FUNC(); return *networkIDService_; } AmendmentTable& getAmendmentTable() override { + TRACE_FUNC(); return *amendmentTable_; } LoadFeeTrack& getFeeTrack() override { + TRACE_FUNC(); return *feeTrack_; } HashRouter& getHashRouter() override { + TRACE_FUNC(); return *hashRouter_; } RCLValidations& getValidations() override { + TRACE_FUNC(); return validations_; } ValidatorList& getValidators() override { + TRACE_FUNC(); return *validators_; } ValidatorSite& getValidatorSites() override { + TRACE_FUNC(); return *validatorSites_; } ManifestCache& getValidatorManifests() override { + TRACE_FUNC(); return *validatorManifests_; } ManifestCache& getPublisherManifests() override { + TRACE_FUNC(); return *publisherManifests_; } Cluster& getCluster() override { + TRACE_FUNC(); return *cluster_; } PeerReservationTable& getPeerReservations() override { + TRACE_FUNC(); return *peerReservations_; } SHAMapStore& getSHAMapStore() override { + TRACE_FUNC(); return *shaMapStore_; } PendingSaves& getPendingSaves() override { + TRACE_FUNC(); return pendingSaves_; } OpenLedger& getOpenLedger() override { + TRACE_FUNC(); return *openLedger_; // NOLINT(bugprone-unchecked-optional-access) emplaced during // initialization before any caller } @@ -783,6 +835,7 @@ public: OpenLedger const& getOpenLedger() const override { + TRACE_FUNC(); return *openLedger_; // NOLINT(bugprone-unchecked-optional-access) emplaced during // initialization before any caller } @@ -790,6 +843,7 @@ public: Overlay& getOverlay() override { + TRACE_FUNC(); XRPL_ASSERT(overlay_, "xrpl::ApplicationImp::overlay : non-null overlay"); return *overlay_; // NOLINT(bugprone-unchecked-optional-access) assert above } @@ -797,6 +851,7 @@ public: TxQ& getTxQ() override { + TRACE_FUNC(); XRPL_ASSERT(txQ_, "xrpl::ApplicationImp::getTxQ : non-null transaction queue"); return *txQ_; // NOLINT(bugprone-unchecked-optional-access) assert above } @@ -804,6 +859,7 @@ public: RelationalDatabase& getRelationalDatabase() override { + TRACE_FUNC(); XRPL_ASSERT( relationalDatabase_, "xrpl::ApplicationImp::getRelationalDatabase : non-null relational database"); @@ -813,6 +869,7 @@ public: DatabaseCon& getWalletDB() override { + TRACE_FUNC(); XRPL_ASSERT(walletDB_, "xrpl::ApplicationImp::getWalletDB : non-null wallet database"); return *walletDB_; } @@ -828,6 +885,7 @@ public: bool initRelationalDatabase() { + TRACE_FUNC(); XRPL_ASSERT( walletDB_.get() == nullptr, "xrpl::ApplicationImp::initRelationalDatabase : null wallet " @@ -855,6 +913,7 @@ public: bool initNodeStore() const { + TRACE_FUNC(); if (config_->doImport) { auto j = logs_->journal("NodeObject"); @@ -898,6 +957,7 @@ public: void setSweepTimer() { + TRACE_FUNC(); // Only start the timer if waitHandlerCounter_ is not yet joined. if (auto optionalCountedHandler = waitHandlerCounter_.wrap([this](boost::system::error_code const& e) { @@ -927,6 +987,7 @@ public: void setEntropyTimer() { + TRACE_FUNC(); // Only start the timer if waitHandlerCounter_ is not yet joined. if (auto optionalCountedHandler = waitHandlerCounter_.wrap([this](boost::system::error_code const& e) { @@ -955,6 +1016,7 @@ public: void doSweep() { + TRACE_FUNC(); XRPL_ASSERT( relationalDatabase_, "xrpl::ApplicationImp::doSweep : non-null relational database"); // NOLINTNEXTLINE(bugprone-unchecked-optional-access) assert above @@ -1093,18 +1155,21 @@ public: LedgerIndex getMaxDisallowedLedger() override { + TRACE_FUNC(); return maxDisallowedLedger_; } std::optional const& getTrapTxID() const override { + TRACE_FUNC(); return trapTxID_; } size_t getNumberOfThreads() const override { + TRACE_FUNC(); return BasicApp::getNumberOfThreads(); } @@ -1135,6 +1200,7 @@ private: Application& getApp() override { + TRACE_FUNC(); return *this; } }; @@ -1145,6 +1211,7 @@ private: bool ApplicationImp::setup(boost::program_options::variables_map const& cmdline) { + TRACE_FUNC(); // We want to intercept CTRL-C and the standard termination signal SIGTERM // and terminate the process. This handler will NEVER be invoked twice. // @@ -1483,6 +1550,7 @@ ApplicationImp::setup(boost::program_options::variables_map const& cmdline) void ApplicationImp::start(bool withTimers) { + TRACE_FUNC(); JLOG(journal_.info()) << "Application starting. Version is " << BuildInfo::getVersionString(); if (withTimers) @@ -1508,6 +1576,7 @@ ApplicationImp::start(bool withTimers) void ApplicationImp::run() { + TRACE_FUNC(); if (!config_->standalone()) { // VFALCO NOTE This seems unnecessary. If we properly refactor the load @@ -1600,6 +1669,7 @@ ApplicationImp::run() void ApplicationImp::signalStop(std::string msg) { + TRACE_FUNC(); if (!isTimeToStop.test_and_set(std::memory_order_acquire)) { if (msg.empty()) @@ -1616,24 +1686,28 @@ ApplicationImp::signalStop(std::string msg) bool ApplicationImp::checkSigs() const { + TRACE_FUNC(); return checkSigs_; } void ApplicationImp::checkSigs(bool check) { + TRACE_FUNC(); checkSigs_ = check; } bool ApplicationImp::isStopping() const { + TRACE_FUNC(); return isTimeToStop.test(std::memory_order_relaxed); } int ApplicationImp::fdRequired() const { + TRACE_FUNC(); // Standard handles, config file, misc I/O etc: int needed = 128; @@ -1659,6 +1733,7 @@ ApplicationImp::fdRequired() const void ApplicationImp::startGenesisLedger() { + TRACE_FUNC(); std::vector const initialAmendments = (config_->START_UP == StartUpType::Fresh) ? amendmentTable_->getDesired() : std::vector{}; @@ -1685,6 +1760,7 @@ ApplicationImp::startGenesisLedger() std::shared_ptr ApplicationImp::getLastFullLedger() { + TRACE_FUNC(); auto j = getJournal("Ledger"); try @@ -1729,6 +1805,7 @@ ApplicationImp::getLastFullLedger() std::shared_ptr ApplicationImp::loadLedgerFromFile(std::string const& name) { + TRACE_FUNC(); try { std::ifstream ledgerFile(name, std::ios::in); @@ -1868,6 +1945,7 @@ ApplicationImp::loadOldLedger( bool isFileName, std::optional trapTxID) { + TRACE_FUNC(); try { std::shared_ptr loadLedger, replayLedger; @@ -2079,6 +2157,7 @@ ApplicationImp::loadOldLedger( bool ApplicationImp::serverOkay(std::string& reason) { + TRACE_FUNC(); if (!config().ELB_SUPPORT) return true; @@ -2127,12 +2206,14 @@ ApplicationImp::serverOkay(std::string& reason) beast::Journal ApplicationImp::getJournal(std::string const& name) { + TRACE_FUNC(); return logs_->journal(name); } void ApplicationImp::setMaxDisallowedLedger() { + TRACE_FUNC(); auto seq = getRelationalDatabase().getMaxLedgerSeq(); if (seq) maxDisallowedLedger_ = *seq; @@ -2154,6 +2235,7 @@ makeApplication( std::unique_ptr logs, std::unique_ptr timeKeeper) { + TRACE_FUNC(); return std::make_unique( std::move(config), std::move(logs), std::move(timeKeeper)); } @@ -2161,6 +2243,7 @@ makeApplication( void fixConfigPorts(Config& config, Endpoints const& endpoints) { + TRACE_FUNC(); for (auto const& [name, ep] : endpoints) { if (!config.exists(name)) diff --git a/src/xrpld/app/main/BasicApp.cpp b/src/xrpld/app/main/BasicApp.cpp index 71138c6517..35e87c7a1d 100644 --- a/src/xrpld/app/main/BasicApp.cpp +++ b/src/xrpld/app/main/BasicApp.cpp @@ -1,6 +1,7 @@ #include #include +#include #include @@ -9,6 +10,7 @@ BasicApp::BasicApp(std::size_t numberOfThreads) { + TRACE_FUNC(); work_.emplace(boost::asio::make_work_guard(io_context_)); threads_.reserve(numberOfThreads); @@ -23,6 +25,7 @@ BasicApp::BasicApp(std::size_t numberOfThreads) BasicApp::~BasicApp() { + TRACE_FUNC(); work_.reset(); for (auto& t : threads_) diff --git a/src/xrpld/app/main/BasicApp.h b/src/xrpld/app/main/BasicApp.h index d55ab858db..a5f776f24b 100644 --- a/src/xrpld/app/main/BasicApp.h +++ b/src/xrpld/app/main/BasicApp.h @@ -5,6 +5,7 @@ #include #include #include +#include // This is so that the io_context can outlive all the children class BasicApp @@ -21,12 +22,14 @@ public: boost::asio::io_context& getIoContext() { + TRACE_FUNC(); return io_context_; } [[nodiscard]] size_t getNumberOfThreads() const { + TRACE_FUNC(); return threads_.size(); } }; diff --git a/src/xrpld/app/main/CollectorManager.cpp b/src/xrpld/app/main/CollectorManager.cpp index 6cdbca8d8a..cc2827c391 100644 --- a/src/xrpld/app/main/CollectorManager.cpp +++ b/src/xrpld/app/main/CollectorManager.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,7 @@ public: CollectorManagerImp(Section const& params, beast::Journal journal) : journal_(journal) { + TRACE_FUNC(); std::string const& server = get(params, "server"); if (server == "statsd") @@ -48,12 +50,14 @@ public: beast::insight::Collector::ptr const& collector() override { + TRACE_FUNC(); return collector_; } beast::insight::Group::ptr const& group(std::string const& name) override { + TRACE_FUNC(); return groups_->get(name); } }; @@ -63,6 +67,7 @@ public: std::unique_ptr makeCollectorManager(Section const& params, beast::Journal journal) { + TRACE_FUNC(); return std::make_unique(params, journal); } diff --git a/src/xrpld/app/main/GRPCServer.cpp b/src/xrpld/app/main/GRPCServer.cpp index e0f0798dbc..b37e298808 100644 --- a/src/xrpld/app/main/GRPCServer.cpp +++ b/src/xrpld/app/main/GRPCServer.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -60,6 +61,7 @@ namespace { std::optional getEndpoint(std::string const& peer) { + TRACE_FUNC(); try { std::size_t const first = peer.find_first_of(':'); @@ -106,6 +108,7 @@ GRPCServerImpl::CallData::CallData( , loadType_(std::move(loadType)) , secureGatewayIPs_(secureGatewayIPs) { + TRACE_FUNC(); // Bind a listener. When a request is received, "this" will be returned // from CompletionQueue::Next bindListener_(service_, &ctx_, &request_, &responder_, &cq_, &cq_, this); @@ -115,6 +118,7 @@ template std::shared_ptr GRPCServerImpl::CallData::clone() { + TRACE_FUNC(); return std::make_shared>( service_, cq_, @@ -131,6 +135,7 @@ template void GRPCServerImpl::CallData::process() { + TRACE_FUNC(); // sanity check BOOST_ASSERT(!finished_); @@ -162,6 +167,7 @@ template void GRPCServerImpl::CallData::process(std::shared_ptr coro) { + TRACE_FUNC(); try { auto usage = getUsage(); @@ -236,6 +242,7 @@ template bool GRPCServerImpl::CallData::isFinished() { + TRACE_FUNC(); return finished_; } @@ -243,6 +250,7 @@ template Resource::Charge GRPCServerImpl::CallData::getLoadType() { + TRACE_FUNC(); return loadType_; } @@ -250,6 +258,7 @@ template Role GRPCServerImpl::CallData::getRole(bool isUnlimited) { + TRACE_FUNC(); if (isUnlimited) { return Role::IDENTIFIED; @@ -262,6 +271,7 @@ template std::optional GRPCServerImpl::CallData::getUser() { + TRACE_FUNC(); if (auto descriptor = Request::GetDescriptor()->FindFieldByName("user")) { std::string user = Request::GetReflection()->GetString(request_, descriptor); @@ -277,6 +287,7 @@ template std::optional GRPCServerImpl::CallData::getClientIpAddress() { + TRACE_FUNC(); auto endpoint = getClientEndpoint(); if (endpoint) return endpoint->address(); @@ -287,6 +298,7 @@ template std::optional GRPCServerImpl::CallData::getClientEndpoint() { + TRACE_FUNC(); return xrpl::getEndpoint(ctx_.peer()); } @@ -294,6 +306,7 @@ template bool GRPCServerImpl::CallData::clientIsUnlimited() { + TRACE_FUNC(); if (!getUser()) return false; auto clientIp = getClientIpAddress(); @@ -312,6 +325,7 @@ template void GRPCServerImpl::CallData::setIsUnlimited(Response& response, bool isUnlimited) { + TRACE_FUNC(); if (isUnlimited) { if (auto descriptor = Response::GetDescriptor()->FindFieldByName("is_unlimited")) @@ -325,6 +339,7 @@ template Resource::Consumer GRPCServerImpl::CallData::getUsage() { + TRACE_FUNC(); auto endpoint = getClientEndpoint(); if (endpoint) return app_.getResourceManager().newInboundEndpoint(beast::IP::fromAsio(endpoint.value())); @@ -334,6 +349,7 @@ GRPCServerImpl::CallData::getUsage() GRPCServerImpl::GRPCServerImpl(Application& app) : app_(app), journal_(app_.getJournal("gRPC Server")) { + TRACE_FUNC(); // if present, get endpoint from config if (app_.config().exists(SECTION_PORT_GRPC)) { @@ -437,6 +453,7 @@ GRPCServerImpl::GRPCServerImpl(Application& app) void GRPCServerImpl::shutdown() { + TRACE_FUNC(); JLOG(journal_.debug()) << "Shutting down"; // The below call cancels all "listeners" (CallData objects that are waiting @@ -459,6 +476,7 @@ GRPCServerImpl::shutdown() void GRPCServerImpl::handleRpcs() { + TRACE_FUNC(); // This collection should really be an unordered_set. However, to delete // from the unordered_set, we need a shared_ptr, but cq_.Next() (see below // while loop) sets the tag to a raw pointer. @@ -526,6 +544,7 @@ GRPCServerImpl::handleRpcs() std::vector> GRPCServerImpl::setupListeners() { + TRACE_FUNC(); std::vector> requests; auto addToRequests = [&requests](auto callData) { requests.push_back(std::move(callData)); }; @@ -603,6 +622,7 @@ GRPCServerImpl::setupListeners() std::shared_ptr GRPCServerImpl::createServerCredentials() { + TRACE_FUNC(); if (not sslCertPath_.has_value() or not sslKeyPath_.has_value()) { JLOG(journal_.info()) << "Configuring gRPC server without TLS"; @@ -701,6 +721,7 @@ GRPCServerImpl::createServerCredentials() bool GRPCServerImpl::start() { + TRACE_FUNC(); // if config does not specify a grpc server address, don't start if (serverAddress_.empty()) return false; @@ -768,6 +789,7 @@ GRPCServerImpl::start() boost::asio::ip::tcp::endpoint GRPCServerImpl::getEndpoint() const { + TRACE_FUNC(); std::string const addr = serverAddress_.substr(0, serverAddress_.find_last_of(':')); return boost::asio::ip::tcp::endpoint(boost::asio::ip::make_address(addr), serverPort_); } @@ -775,6 +797,7 @@ GRPCServerImpl::getEndpoint() const bool GRPCServer::start() { + TRACE_FUNC(); // Start the server and setup listeners if (running_ = impl_.start(); running_) { @@ -790,6 +813,7 @@ GRPCServer::start() void GRPCServer::stop() { + TRACE_FUNC(); if (running_) { impl_.shutdown(); @@ -800,12 +824,14 @@ GRPCServer::stop() GRPCServer::~GRPCServer() { + TRACE_FUNC(); XRPL_ASSERT(!running_, "xrpl::GRPCServer::~GRPCServer : is not running"); } boost::asio::ip::tcp::endpoint GRPCServer::getEndpoint() const { + TRACE_FUNC(); return impl_.getEndpoint(); } diff --git a/src/xrpld/app/main/LoadManager.cpp b/src/xrpld/app/main/LoadManager.cpp index 2b7bc27cd3..0d3bb85477 100644 --- a/src/xrpld/app/main/LoadManager.cpp +++ b/src/xrpld/app/main/LoadManager.cpp @@ -10,6 +10,7 @@ #include // IWYU pragma: keep #include #include +#include #include #include @@ -26,6 +27,7 @@ LoadManager::LoadManager(Application& app, beast::Journal journal) LoadManager::~LoadManager() { + TRACE_FUNC(); try { stop(); @@ -42,6 +44,7 @@ LoadManager::~LoadManager() void LoadManager::activateStallDetector() { + TRACE_FUNC(); std::scoped_lock const sl(mutex_); armed_ = true; lastHeartbeat_ = std::chrono::steady_clock::now(); @@ -50,6 +53,7 @@ LoadManager::activateStallDetector() void LoadManager::heartbeat() { + TRACE_FUNC(); auto const heartbeat = std::chrono::steady_clock::now(); std::scoped_lock const sl(mutex_); lastHeartbeat_ = heartbeat; @@ -60,6 +64,7 @@ LoadManager::heartbeat() void LoadManager::start() { + TRACE_FUNC(); JLOG(journal_.debug()) << "Starting"; XRPL_ASSERT(!thread_.joinable(), "xrpl::LoadManager::start : thread not joinable"); @@ -69,6 +74,7 @@ LoadManager::start() void LoadManager::stop() { + TRACE_FUNC(); { std::scoped_lock const lock(mutex_); stop_ = true; @@ -87,6 +93,7 @@ LoadManager::stop() void LoadManager::run() { + TRACE_FUNC(); beast::setCurrentThreadName("LoadManager"); using namespace std::chrono_literals; @@ -176,6 +183,7 @@ LoadManager::run() std::unique_ptr makeLoadManager(Application& app, beast::Journal journal) { + TRACE_FUNC(); return std::unique_ptr{new LoadManager{app, journal}}; } diff --git a/src/xrpld/app/main/Main.cpp b/src/xrpld/app/main/Main.cpp index 167cd2b023..cb7740b277 100644 --- a/src/xrpld/app/main/Main.cpp +++ b/src/xrpld/app/main/Main.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -81,6 +82,7 @@ namespace xrpl { bool adjustDescriptorLimit(int needed, beast::Journal j) { + TRACE_FUNC(); #ifdef RLIMIT_NOFILE // Get the current limit, then adjust it to what we need. struct rlimit rl{}; @@ -129,6 +131,7 @@ adjustDescriptorLimit(int needed, beast::Journal j) void printHelp(po::options_description const& desc) { + TRACE_FUNC(); std::cerr << systemName() << " [options] \n" << desc << std::endl << "Commands: \n" @@ -207,6 +210,7 @@ private: public: explicit MultiSelector(std::string const& patterns = "") { + TRACE_FUNC(); std::vector v; boost::split(v, patterns, boost::algorithm::is_any_of(",")); selectors_.reserve(v.size()); @@ -220,6 +224,7 @@ public: bool operator()(beast::unit_test::SuiteInfo const& s) { + TRACE_FUNC(); for (auto& sel : selectors_) { if (sel(s)) @@ -231,6 +236,7 @@ public: [[nodiscard]] std::size_t size() const { + TRACE_FUNC(); return selectors_.size(); } }; @@ -243,6 +249,7 @@ template static bool anyMissing(Runner& runner, MultiSelector const& pred) { + TRACE_FUNC(); if (runner.tests() == 0) { runner.addFailures(1); @@ -272,6 +279,7 @@ runUnitTests( int argc, char** argv) { + TRACE_FUNC(); using namespace beast::unit_test; using namespace xrpl::test; @@ -353,6 +361,7 @@ runUnitTests( int run(int argc, char** argv) { + TRACE_FUNC(); using namespace std; beast::setCurrentThreadName("xrpld-main"); @@ -804,6 +813,17 @@ run(int argc, char** argv) if (vm.contains("debug")) setDebugLogSink(logs->makeSink("Debug", beast::severities::KTrace)); + if (config->exists("tracing")) + { + auto const& sec = config->section("tracing"); + auto path = sec.get("output"); + double rate = sec.valueOr("sampling_rate", 1.0); + auto maxSizeMB = sec.valueOr("max_file_size_mb", 500); + auto maxFiles = sec.valueOr("max_files", 10); + if (path && !path->empty()) + tracing::init(path->c_str(), rate, maxSizeMB, maxFiles); + } + auto app = makeApplication(std::move(config), std::move(logs), std::make_unique()); @@ -821,6 +841,7 @@ run(int argc, char** argv) // Block until we get a stop RPC. app->run(); + tracing::shutdown(); return 0; } @@ -836,6 +857,7 @@ run(int argc, char** argv) int main(int argc, char** argv) { + TRACE_FUNC(); #if BOOST_OS_WINDOWS { // Work around for https://svn.boost.org/trac/boost/ticket/10657 diff --git a/src/xrpld/app/main/NodeIdentity.cpp b/src/xrpld/app/main/NodeIdentity.cpp index 656e2b91a2..d447767385 100644 --- a/src/xrpld/app/main/NodeIdentity.cpp +++ b/src/xrpld/app/main/NodeIdentity.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -22,6 +23,7 @@ namespace xrpl { std::pair getNodeIdentity(Application& app, boost::program_options::variables_map const& cmdline) { + TRACE_FUNC(); std::optional seed; if (cmdline.contains("nodeid")) diff --git a/src/xrpld/app/main/NodeStoreScheduler.cpp b/src/xrpld/app/main/NodeStoreScheduler.cpp index 7892503f90..c659b8b041 100644 --- a/src/xrpld/app/main/NodeStoreScheduler.cpp +++ b/src/xrpld/app/main/NodeStoreScheduler.cpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace xrpl { @@ -14,6 +15,7 @@ NodeStoreScheduler::NodeStoreScheduler(JobQueue& jobQueue) : jobQueue_(jobQueue) void NodeStoreScheduler::scheduleTask(NodeStore::Task& task) { + TRACE_FUNC(); if (jobQueue_.isStopped()) return; @@ -28,6 +30,7 @@ NodeStoreScheduler::scheduleTask(NodeStore::Task& task) void NodeStoreScheduler::onFetch(NodeStore::FetchReport const& report) { + TRACE_FUNC(); if (jobQueue_.isStopped()) return; @@ -40,6 +43,7 @@ NodeStoreScheduler::onFetch(NodeStore::FetchReport const& report) void NodeStoreScheduler::onBatchWrite(NodeStore::BatchWriteReport const& report) { + TRACE_FUNC(); if (jobQueue_.isStopped()) return; diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index 4369a4642d..e919c128e6 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -43,6 +44,7 @@ private: public: VotableValue(value_type current, value_type target) : current_(current), target_(target) { + TRACE_FUNC(); // Add our vote ++voteMap_[target_]; } @@ -50,18 +52,21 @@ public: void addVote(value_type vote) { + TRACE_FUNC(); ++voteMap_[vote]; } void noVote() { + TRACE_FUNC(); addVote(current_); } [[nodiscard]] value_type current() const { + TRACE_FUNC(); return current_; } @@ -72,6 +77,7 @@ public: auto VotableValue::getVotes() const -> std::pair { + TRACE_FUNC(); value_type ourVote = current_; int weight = 0; for (auto const& [key, val] : voteMap_) @@ -121,6 +127,7 @@ FeeVoteImpl::FeeVoteImpl(FeeSetup const& setup, beast::Journal journal) void FeeVoteImpl::doValidation(Fees const& lastFees, Rules const& rules, STValidation& v) { + TRACE_FUNC(); // Values should always be in a valid range (because the voting process // will ignore out-of-range values) but if we detect such a case, we do // not send a value. @@ -179,6 +186,7 @@ FeeVoteImpl::doVoting( std::vector> const& set, std::shared_ptr const& initialPosition) { + TRACE_FUNC(); // LCL must be flag ledger XRPL_ASSERT( lastClosedLedger && isFlagLedger(lastClosedLedger->seq()), @@ -319,6 +327,7 @@ FeeVoteImpl::doVoting( std::unique_ptr makeFeeVote(FeeSetup const& setup, beast::Journal journal) { + TRACE_FUNC(); return std::make_unique(setup, journal); } diff --git a/src/xrpld/app/misc/NegativeUNLVote.cpp b/src/xrpld/app/misc/NegativeUNLVote.cpp index 0da94ad75f..5243c5cac3 100644 --- a/src/xrpld/app/misc/NegativeUNLVote.cpp +++ b/src/xrpld/app/misc/NegativeUNLVote.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,7 @@ NegativeUNLVote::doVoting( RCLValidations& validations, std::shared_ptr const& initialSet) { + TRACE_FUNC(); // Voting steps: // -- build a reliability score table of validators // -- process the table and find all candidates to disable or to re-enable @@ -113,6 +115,7 @@ NegativeUNLVote::addTx( NegativeUNLModify modify, std::shared_ptr const& initialSet) { + TRACE_FUNC(); STTx const negUnlTx(ttUNL_MODIFY, [&](auto& obj) { obj.setFieldU8(sfUNLModifyDisabling, modify == NegativeUNLModify::ToDisable ? 1 : 0); obj.setFieldU32(sfLedgerSequence, seq); @@ -140,6 +143,7 @@ NegativeUNLVote::addTx( NodeID NegativeUNLVote::choose(uint256 const& randomPadData, std::vector const& candidates) { + TRACE_FUNC(); XRPL_ASSERT(!candidates.empty(), "xrpl::NegativeUNLVote::choose : non-empty input"); static_assert(NodeID::kBYTES <= uint256::kBYTES); NodeID const randomPad = NodeID::fromVoid(randomPadData.data()); @@ -160,6 +164,7 @@ NegativeUNLVote::buildScoreTable( hash_set const& unl, RCLValidations& validations) { + TRACE_FUNC(); // Find agreed validation messages received for // the last FLAG_LEDGER_INTERVAL (i.e. 256) ledgers, // for every validator, and fill the score table. @@ -238,6 +243,7 @@ NegativeUNLVote::findAllCandidates( hash_set const& negUnl, hash_map const& scoreTable) { + TRACE_FUNC(); // Compute if need to find more validators to disable auto const canAdd = [&]() -> bool { auto const maxNegativeListed = @@ -310,6 +316,7 @@ NegativeUNLVote::findAllCandidates( void NegativeUNLVote::newValidators(LedgerIndex seq, hash_set const& nowTrusted) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); for (auto const& n : nowTrusted) { @@ -324,6 +331,7 @@ NegativeUNLVote::newValidators(LedgerIndex seq, hash_set const& nowTrust void NegativeUNLVote::purgeNewValidators(LedgerIndex seq) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); auto i = newValidators_.begin(); while (i != newValidators_.end()) diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index 638489a9fa..f15b2087c2 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -115,6 +115,7 @@ #include #include #include +#include #include #include @@ -173,6 +174,7 @@ class NetworkOPsImp final : public NetworkOPs TransactionStatus(std::shared_ptr t, bool a, bool l, FailHard f) : transaction(std::move(t)), admin(a), local(l), failType(f) { + TRACE_FUNC(); XRPL_ASSERT( local || failType == FailHard::No, "xrpl::NetworkOPsImp::TransactionStatus::TransactionStatus : " @@ -226,6 +228,7 @@ class NetworkOPsImp final : public NetworkOPs public: explicit StateAccounting() { + TRACE_FUNC(); counters_[static_cast(OperatingMode::DISCONNECTED)].transitions = 1; } @@ -257,6 +260,7 @@ class NetworkOPsImp final : public NetworkOPs CounterData getCounterData() const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); return { .counters = counters_, @@ -281,6 +285,7 @@ class NetworkOPsImp final : public NetworkOPs bool operator==(ServerFeeSummary const& b) const { + TRACE_FUNC(); return !(*this != b); } @@ -336,6 +341,7 @@ public: ~NetworkOPsImp() override { + TRACE_FUNC(); // This clear() is necessary to ensure the shared_ptrs in this map get // destroyed NOW because the objects in this map invoke methods on this // class when they are destroyed @@ -632,6 +638,7 @@ public: void stop() override { + TRACE_FUNC(); { try { @@ -912,48 +919,56 @@ static auto const kGENESIS_ACCOUNT_ID = inline OperatingMode NetworkOPsImp::getOperatingMode() const { + TRACE_FUNC(); return mode_; } inline std::string NetworkOPsImp::strOperatingMode(bool const admin /* = false */) const { + TRACE_FUNC(); return strOperatingMode(mode_, admin); } inline void NetworkOPsImp::setStandAlone() { + TRACE_FUNC(); setMode(OperatingMode::FULL); } inline void NetworkOPsImp::setNeedNetworkLedger() { + TRACE_FUNC(); needNetworkLedger_ = true; } inline void NetworkOPsImp::clearNeedNetworkLedger() { + TRACE_FUNC(); needNetworkLedger_ = false; } inline bool NetworkOPsImp::isNeedNetworkLedger() { + TRACE_FUNC(); return needNetworkLedger_; } inline bool NetworkOPsImp::isFull() { + TRACE_FUNC(); return !needNetworkLedger_ && (mode_ == OperatingMode::FULL); } std::string NetworkOPsImp::getHostId(bool forAdmin) { + TRACE_FUNC(); static std::string const kHOSTNAME = boost::asio::ip::host_name(); if (forAdmin) @@ -973,6 +988,7 @@ NetworkOPsImp::getHostId(bool forAdmin) void NetworkOPsImp::setStateTimer() { + TRACE_FUNC(); setHeartbeatTimer(); // Only do this work if a cluster is configured @@ -987,6 +1003,7 @@ NetworkOPsImp::setTimer( std::function onExpire, std::function onError) { + TRACE_FUNC(); // Only start the timer if waitHandlerCounter_ is not yet joined. if (auto optionalCountedHandler = waitHandlerCounter_.wrap([this, onExpire, onError](boost::system::error_code const& e) { @@ -1013,6 +1030,7 @@ NetworkOPsImp::setTimer( void NetworkOPsImp::setHeartbeatTimer() { + TRACE_FUNC(); setTimer( heartbeatTimer_, consensus_.parms().ledgerGRANULARITY, @@ -1025,6 +1043,7 @@ NetworkOPsImp::setHeartbeatTimer() void NetworkOPsImp::setClusterTimer() { + TRACE_FUNC(); using namespace std::chrono_literals; setTimer( @@ -1039,6 +1058,7 @@ NetworkOPsImp::setClusterTimer() void NetworkOPsImp::setAccountHistoryJobTimer(SubAccountHistoryInfoWeak subInfo) { + TRACE_FUNC(); JLOG(journal_.debug()) << "Scheduling AccountHistory job for account " << toBase58(subInfo.index->accountId); using namespace std::chrono_literals; @@ -1052,6 +1072,7 @@ NetworkOPsImp::setAccountHistoryJobTimer(SubAccountHistoryInfoWeak subInfo) void NetworkOPsImp::processHeartbeatTimer() { + TRACE_FUNC(); RclConsensusLogger clog("Heartbeat Timer", consensus_.validating(), journal_); { std::unique_lock lock{registry_.get().getApp().getMasterMutex()}; @@ -1134,6 +1155,7 @@ NetworkOPsImp::processHeartbeatTimer() void NetworkOPsImp::processClusterTimer() { + TRACE_FUNC(); if (registry_.get().getCluster().size() == 0) return; @@ -1181,6 +1203,7 @@ NetworkOPsImp::processClusterTimer() std::string NetworkOPsImp::strOperatingMode(OperatingMode const mode, bool const admin) const { + TRACE_FUNC(); if (mode == OperatingMode::FULL && admin) { auto const consensusMode = consensus_.mode(); @@ -1200,6 +1223,7 @@ NetworkOPsImp::strOperatingMode(OperatingMode const mode, bool const admin) cons void NetworkOPsImp::submitTransaction(std::shared_ptr const& iTrans) { + TRACE_FUNC(); if (isNeedNetworkLedger()) { // Nothing we can do if we've never been in sync @@ -1256,6 +1280,7 @@ NetworkOPsImp::submitTransaction(std::shared_ptr const& iTrans) bool NetworkOPsImp::preProcessTransaction(std::shared_ptr& transaction) { + TRACE_FUNC(); auto const newFlags = registry_.get().getHashRouter().getFlags(transaction->getID()); if ((newFlags & HashRouterFlags::BAD) != HashRouterFlags::UNDEFINED) @@ -1312,6 +1337,7 @@ NetworkOPsImp::processTransaction( bool bLocal, FailHard failType) { + TRACE_FUNC(); auto ev = job_queue_.makeLoadEvent(JtTxnProc, "ProcessTXN"); // preProcessTransaction can change our pointer @@ -1334,6 +1360,7 @@ NetworkOPsImp::doTransactionAsync( bool bUnlimited, FailHard failType) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); if (transaction->getApplying()) @@ -1357,6 +1384,7 @@ NetworkOPsImp::doTransactionSync( bool bUnlimited, FailHard failType) { + TRACE_FUNC(); std::unique_lock lock(mutex_); if (!transaction->getApplying()) @@ -1375,6 +1403,7 @@ NetworkOPsImp::doTransactionSyncBatch( std::unique_lock& lock, std::function const&)> retryCallback) { + TRACE_FUNC(); do { if (dispatchState_ == DispatchState::Running) @@ -1401,6 +1430,7 @@ NetworkOPsImp::doTransactionSyncBatch( void NetworkOPsImp::processTransactionSet(CanonicalTXSet const& set) { + TRACE_FUNC(); auto ev = job_queue_.makeLoadEvent(JtTxnProc, "ProcessTXNSet"); std::vector> candidates; candidates.reserve(set.size()); @@ -1466,6 +1496,7 @@ NetworkOPsImp::processTransactionSet(CanonicalTXSet const& set) void NetworkOPsImp::transactionBatch() { + TRACE_FUNC(); std::unique_lock lock(mutex_); if (dispatchState_ == DispatchState::Running) @@ -1480,6 +1511,7 @@ NetworkOPsImp::transactionBatch() void NetworkOPsImp::apply(std::unique_lock& batchLock) { + TRACE_FUNC(); std::vector submitHeld; std::vector transactions; transactions_.swap(transactions); @@ -1733,6 +1765,7 @@ NetworkOPsImp::apply(std::unique_lock& batchLock) json::Value NetworkOPsImp::getOwnerInfo(std::shared_ptr lpLedger, AccountID const& account) { + TRACE_FUNC(); json::Value jvObjects(json::ObjectValue); auto root = keylet::ownerDir(account); auto sleNode = lpLedger->read(keylet::page(root)); @@ -1797,18 +1830,21 @@ NetworkOPsImp::getOwnerInfo(std::shared_ptr lpLedger, AccountID inline bool NetworkOPsImp::isBlocked() { + TRACE_FUNC(); return isAmendmentBlocked() || isUNLBlocked(); } inline bool NetworkOPsImp::isAmendmentBlocked() { + TRACE_FUNC(); return amendmentBlocked_; } void NetworkOPsImp::setAmendmentBlocked() { + TRACE_FUNC(); amendmentBlocked_ = true; setMode(OperatingMode::CONNECTED); } @@ -1816,30 +1852,35 @@ NetworkOPsImp::setAmendmentBlocked() inline bool NetworkOPsImp::isAmendmentWarned() { + TRACE_FUNC(); return !amendmentBlocked_ && amendmentWarned_; } inline void NetworkOPsImp::setAmendmentWarned() { + TRACE_FUNC(); amendmentWarned_ = true; } inline void NetworkOPsImp::clearAmendmentWarned() { + TRACE_FUNC(); amendmentWarned_ = false; } inline bool NetworkOPsImp::isUNLBlocked() { + TRACE_FUNC(); return unlBlocked_; } void NetworkOPsImp::setUNLBlocked() { + TRACE_FUNC(); unlBlocked_ = true; setMode(OperatingMode::CONNECTED); } @@ -1847,12 +1888,14 @@ NetworkOPsImp::setUNLBlocked() inline void NetworkOPsImp::clearUNLBlocked() { + TRACE_FUNC(); unlBlocked_ = false; } bool NetworkOPsImp::checkLastClosedLedger(Overlay::PeerSequence const& peerList, uint256& networkClosed) { + TRACE_FUNC(); // Returns true if there's an *abnormal* ledger issue, normal changing in // TRACKING mode should return false. Do we have sufficient validations for // our last closed ledger? Or do sufficient nodes agree? And do we have no @@ -1958,6 +2001,7 @@ NetworkOPsImp::checkLastClosedLedger(Overlay::PeerSequence const& peerList, uint void NetworkOPsImp::switchLastClosedLedger(std::shared_ptr const& newLCL) { + TRACE_FUNC(); // set the newLCL as our last closed ledger -- this is abnormal code JLOG(journal_.error()) << "JUMP last closed ledger to " << newLCL->header().hash; @@ -2015,6 +2059,7 @@ NetworkOPsImp::beginConsensus( uint256 const& networkClosed, std::unique_ptr const& clog) { + TRACE_FUNC(); XRPL_ASSERT(networkClosed.isNonZero(), "xrpl::NetworkOPsImp::beginConsensus : nonzero input"); auto closingInfo = ledgerMaster_.getCurrentLedger()->header(); @@ -2085,6 +2130,7 @@ NetworkOPsImp::beginConsensus( bool NetworkOPsImp::processTrustedProposal(RCLCxPeerPos peerPos) { + TRACE_FUNC(); auto const& peerKey = peerPos.publicKey(); if (validatorPK_ == peerKey || validatorMasterPK_ == peerKey) { @@ -2110,6 +2156,7 @@ NetworkOPsImp::processTrustedProposal(RCLCxPeerPos peerPos) void NetworkOPsImp::mapComplete(std::shared_ptr const& map, bool fromAcquire) { + TRACE_FUNC(); // We now have an additional transaction set // Inform peers we have this set protocol::TMHaveTransactionSet msg; @@ -2126,6 +2173,7 @@ NetworkOPsImp::mapComplete(std::shared_ptr const& map, bool fromAcquire) void NetworkOPsImp::endConsensus(std::unique_ptr const& clog) { + TRACE_FUNC(); uint256 const deadLedger = ledgerMaster_.getClosedLedger()->header().parentHash; for (auto const& it : registry_.get().getOverlay().getActivePeers()) { @@ -2181,6 +2229,7 @@ NetworkOPsImp::endConsensus(std::unique_ptr const& clog) void NetworkOPsImp::consensusViewChange() { + TRACE_FUNC(); if ((mode_ == OperatingMode::FULL) || (mode_ == OperatingMode::TRACKING)) { setMode(OperatingMode::CONNECTED); @@ -2190,6 +2239,7 @@ NetworkOPsImp::consensusViewChange() void NetworkOPsImp::pubManifest(Manifest const& mo) { + TRACE_FUNC(); // VFALCO consider std::shared_mutex std::scoped_lock const sl(subLock_); @@ -2238,6 +2288,7 @@ NetworkOPsImp::ServerFeeSummary::ServerFeeSummary( bool NetworkOPsImp::ServerFeeSummary::operator!=(NetworkOPsImp::ServerFeeSummary const& b) const { + TRACE_FUNC(); if (loadFactorServer != b.loadFactorServer || loadBaseServer != b.loadBaseServer || baseFee != b.baseFee || em.has_value() != b.em.has_value()) return true; @@ -2257,6 +2308,7 @@ NetworkOPsImp::ServerFeeSummary::operator!=(NetworkOPsImp::ServerFeeSummary cons static std::uint32_t trunc32(std::uint64_t v) { + TRACE_FUNC(); constexpr std::uint64_t kMAX32 = std::numeric_limits::max(); return std::min(kMAX32, v); @@ -2265,6 +2317,7 @@ trunc32(std::uint64_t v) void NetworkOPsImp::pubServer() { + TRACE_FUNC(); // VFALCO TODO Don't hold the lock across calls to send...make a copy of the // list into a local array while holding the lock then release // the lock and call send on everyone. @@ -2328,6 +2381,7 @@ NetworkOPsImp::pubServer() void NetworkOPsImp::pubConsensus(ConsensusPhase phase) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); auto& streamMap = streamMaps_[SConsensusPhase]; @@ -2355,6 +2409,7 @@ NetworkOPsImp::pubConsensus(ConsensusPhase phase) void NetworkOPsImp::pubValidation(std::shared_ptr const& val) { + TRACE_FUNC(); // VFALCO consider std::shared_mutex std::scoped_lock const sl(subLock_); @@ -2461,6 +2516,7 @@ NetworkOPsImp::pubValidation(std::shared_ptr const& val) void NetworkOPsImp::pubPeerStatus(std::function const& func) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); if (!streamMaps_[SPeerStatus].empty()) @@ -2489,6 +2545,7 @@ NetworkOPsImp::pubPeerStatus(std::function const& func) void NetworkOPsImp::setMode(OperatingMode om) { + TRACE_FUNC(); using namespace std::chrono_literals; if (om == OperatingMode::CONNECTED) { @@ -2518,6 +2575,7 @@ NetworkOPsImp::setMode(OperatingMode om) bool NetworkOPsImp::recvValidation(std::shared_ptr const& val, std::string const& source) { + TRACE_FUNC(); JLOG(journal_.trace()) << "recvValidation " << val->getLedgerHash() << " from " << source; std::unique_lock lock(validationsMutex_); @@ -2576,12 +2634,14 @@ NetworkOPsImp::recvValidation(std::shared_ptr const& val, std::str json::Value NetworkOPsImp::getConsensusInfo() { + TRACE_FUNC(); return consensus_.getJson(true); } json::Value NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) { + TRACE_FUNC(); json::Value info = json::ObjectValue; // System-level warnings @@ -2993,12 +3053,14 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) void NetworkOPsImp::clearLedgerFetch() { + TRACE_FUNC(); registry_.get().getInboundLedgers().clearFailures(); } json::Value NetworkOPsImp::getLedgerFetchInfo() { + TRACE_FUNC(); return registry_.get().getInboundLedgers().getInfo(); } @@ -3008,6 +3070,7 @@ NetworkOPsImp::pubProposedTransaction( std::shared_ptr const& transaction, TER result) { + TRACE_FUNC(); // never publish an inner txn inside a batch txn. The flag should // only be set if the Batch feature is enabled. If Batch is not // enabled, the flag is always invalid, so don't publish it @@ -3045,6 +3108,7 @@ NetworkOPsImp::pubProposedTransaction( void NetworkOPsImp::pubLedger(std::shared_ptr const& lpAccepted) { + TRACE_FUNC(); // Ledgers are published only when they acquire sufficient validations // Holes are filled across connection loss or other catastrophe @@ -3161,6 +3225,7 @@ NetworkOPsImp::pubLedger(std::shared_ptr const& lpAccepted) void NetworkOPsImp::reportFeeChange() { + TRACE_FUNC(); ServerFeeSummary const f{ registry_.get().getOpenLedger().current()->fees().base, registry_.get().getTxQ().getMetrics(*registry_.get().getOpenLedger().current()), @@ -3176,17 +3241,20 @@ NetworkOPsImp::reportFeeChange() void NetworkOPsImp::reportConsensusStateChange(ConsensusPhase phase) { + TRACE_FUNC(); job_queue_.addJob(JtClientConsensus, "PubCons", [this, phase]() { pubConsensus(phase); }); } inline void NetworkOPsImp::updateLocalTx(ReadView const& view) { + TRACE_FUNC(); localTX_->sweep(view); } inline std::size_t NetworkOPsImp::getLocalTxCount() { + TRACE_FUNC(); return localTX_->size(); } @@ -3200,6 +3268,7 @@ NetworkOPsImp::transJson( std::shared_ptr const& ledger, std::optional> meta) { + TRACE_FUNC(); json::Value jvObj(json::ObjectValue); std::string sToken; std::string sHuman; @@ -3302,6 +3371,7 @@ NetworkOPsImp::pubValidatedTransaction( AcceptedLedgerTx const& transaction, bool last) { + TRACE_FUNC(); auto const& stTxn = transaction.getTxn(); // Create two different Json objects, for different API versions @@ -3362,6 +3432,7 @@ NetworkOPsImp::pubAccountTransaction( AcceptedLedgerTx const& transaction, bool last) { + TRACE_FUNC(); hash_set notify; int iProposed = 0; int iAccepted = 0; @@ -3496,6 +3567,7 @@ NetworkOPsImp::pubProposedAccountTransaction( std::shared_ptr const& tx, TER result) { + TRACE_FUNC(); hash_set notify; int iProposed = 0; @@ -3577,6 +3649,7 @@ NetworkOPsImp::subAccount( hash_set const& vnaAccountIDs, bool rt) { + TRACE_FUNC(); SubInfoMapType& subMap = rt ? subRTAccount_ : subAccount_; for (auto const& naAccountID : vnaAccountIDs) @@ -3613,6 +3686,7 @@ NetworkOPsImp::unsubAccount( hash_set const& vnaAccountIDs, bool rt) { + TRACE_FUNC(); for (auto const& naAccountID : vnaAccountIDs) { // Remove from the InfoSub @@ -3629,6 +3703,7 @@ NetworkOPsImp::unsubAccountInternal( hash_set const& vnaAccountIDs, bool rt) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); SubInfoMapType& subMap = rt ? subRTAccount_ : subAccount_; @@ -3654,6 +3729,7 @@ NetworkOPsImp::unsubAccountInternal( void NetworkOPsImp::addAccountHistoryJob(SubAccountHistoryInfoWeak subInfo) { + TRACE_FUNC(); registry_.get().getJobQueue().addJob(JtClientAcctHist, "HistTxStream", [this, subInfo]() { auto const& accountId = subInfo.index->accountId; auto& lastLedgerSeq = subInfo.index->historyLastLedgerSeq; @@ -3884,6 +3960,7 @@ NetworkOPsImp::subAccountHistoryStart( std::shared_ptr const& ledger, SubAccountHistoryInfoWeak& subInfo) { + TRACE_FUNC(); subInfo.index->separationLedgerSeq = ledger->seq(); auto const& accountId = subInfo.index->accountId; auto const accountKeylet = keylet::account(accountId); @@ -3927,6 +4004,7 @@ NetworkOPsImp::subAccountHistoryStart( ErrorCodeI NetworkOPsImp::subAccountHistory(InfoSub::ref isrListener, AccountID const& accountId) { + TRACE_FUNC(); if (!isrListener->insertSubAccountHistory(accountId)) { JLOG(journal_.debug()) << "subAccountHistory, already subscribed to account " @@ -3971,6 +4049,7 @@ NetworkOPsImp::unsubAccountHistory( AccountID const& account, bool historyOnly) { + TRACE_FUNC(); if (!historyOnly) isrListener->deleteSubAccountHistory(account); unsubAccountHistoryInternal(isrListener->getSeq(), account, historyOnly); @@ -3982,6 +4061,7 @@ NetworkOPsImp::unsubAccountHistoryInternal( AccountID const& account, bool historyOnly) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); auto simIterator = subAccountHistory_.find(account); if (simIterator != subAccountHistory_.end()) @@ -4009,6 +4089,7 @@ NetworkOPsImp::unsubAccountHistoryInternal( bool NetworkOPsImp::subBook(InfoSub::ref isrListener, Book const& book) { + TRACE_FUNC(); if (auto listeners = registry_.get().getOrderBookDB().makeBookListeners(book)) { listeners->addSubscriber(isrListener); @@ -4025,6 +4106,7 @@ NetworkOPsImp::subBook(InfoSub::ref isrListener, Book const& book) bool NetworkOPsImp::unsubBook(std::uint64_t uSeq, Book const& book) { + TRACE_FUNC(); if (auto listeners = registry_.get().getOrderBookDB().getBookListeners(book)) listeners->removeSubscriber(uSeq); @@ -4034,6 +4116,7 @@ NetworkOPsImp::unsubBook(std::uint64_t uSeq, Book const& book) std::uint32_t NetworkOPsImp::acceptLedger(std::optional consensusDelay) { + TRACE_FUNC(); // This code-path is exclusively used when the server is in standalone // mode via `ledger_accept` XRPL_ASSERT(standalone_, "xrpl::NetworkOPsImp::acceptLedger : is standalone"); @@ -4052,6 +4135,7 @@ NetworkOPsImp::acceptLedger(std::optional consensusDe bool NetworkOPsImp::subLedger(InfoSub::ref isrListener, json::Value& jvResult) { + TRACE_FUNC(); if (auto lpClosed = ledgerMaster_.getValidatedLedger()) { jvResult[jss::ledger_index] = lpClosed->header().seq; @@ -4079,6 +4163,7 @@ NetworkOPsImp::subLedger(InfoSub::ref isrListener, json::Value& jvResult) bool NetworkOPsImp::subBookChanges(InfoSub::ref isrListener) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SBookChanges].emplace(isrListener->getSeq(), isrListener).second; } @@ -4087,6 +4172,7 @@ NetworkOPsImp::subBookChanges(InfoSub::ref isrListener) bool NetworkOPsImp::unsubLedger(std::uint64_t uSeq) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SLedger].erase(uSeq) != 0u; } @@ -4095,6 +4181,7 @@ NetworkOPsImp::unsubLedger(std::uint64_t uSeq) bool NetworkOPsImp::unsubBookChanges(std::uint64_t uSeq) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SBookChanges].erase(uSeq) != 0u; } @@ -4103,6 +4190,7 @@ NetworkOPsImp::unsubBookChanges(std::uint64_t uSeq) bool NetworkOPsImp::subManifests(InfoSub::ref isrListener) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SManifests].emplace(isrListener->getSeq(), isrListener).second; } @@ -4111,6 +4199,7 @@ NetworkOPsImp::subManifests(InfoSub::ref isrListener) bool NetworkOPsImp::unsubManifests(std::uint64_t uSeq) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SManifests].erase(uSeq) != 0u; } @@ -4119,6 +4208,7 @@ NetworkOPsImp::unsubManifests(std::uint64_t uSeq) bool NetworkOPsImp::subServer(InfoSub::ref isrListener, json::Value& jvResult, bool admin) { + TRACE_FUNC(); uint256 uRandom; if (standalone_) @@ -4144,6 +4234,7 @@ NetworkOPsImp::subServer(InfoSub::ref isrListener, json::Value& jvResult, bool a bool NetworkOPsImp::unsubServer(std::uint64_t uSeq) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SServer].erase(uSeq) != 0u; } @@ -4152,6 +4243,7 @@ NetworkOPsImp::unsubServer(std::uint64_t uSeq) bool NetworkOPsImp::subTransactions(InfoSub::ref isrListener) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[STransactions].emplace(isrListener->getSeq(), isrListener).second; } @@ -4160,6 +4252,7 @@ NetworkOPsImp::subTransactions(InfoSub::ref isrListener) bool NetworkOPsImp::unsubTransactions(std::uint64_t uSeq) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[STransactions].erase(uSeq) != 0u; } @@ -4168,6 +4261,7 @@ NetworkOPsImp::unsubTransactions(std::uint64_t uSeq) bool NetworkOPsImp::subRTTransactions(InfoSub::ref isrListener) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SRtTransactions].emplace(isrListener->getSeq(), isrListener).second; } @@ -4176,6 +4270,7 @@ NetworkOPsImp::subRTTransactions(InfoSub::ref isrListener) bool NetworkOPsImp::unsubRTTransactions(std::uint64_t uSeq) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SRtTransactions].erase(uSeq) != 0u; } @@ -4184,6 +4279,7 @@ NetworkOPsImp::unsubRTTransactions(std::uint64_t uSeq) bool NetworkOPsImp::subValidations(InfoSub::ref isrListener) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SValidations].emplace(isrListener->getSeq(), isrListener).second; } @@ -4191,6 +4287,7 @@ NetworkOPsImp::subValidations(InfoSub::ref isrListener) void NetworkOPsImp::stateAccounting(json::Value& obj) { + TRACE_FUNC(); accounting_.json(obj); } @@ -4198,6 +4295,7 @@ NetworkOPsImp::stateAccounting(json::Value& obj) bool NetworkOPsImp::unsubValidations(std::uint64_t uSeq) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SValidations].erase(uSeq) != 0u; } @@ -4206,6 +4304,7 @@ NetworkOPsImp::unsubValidations(std::uint64_t uSeq) bool NetworkOPsImp::subPeerStatus(InfoSub::ref isrListener) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SPeerStatus].emplace(isrListener->getSeq(), isrListener).second; } @@ -4214,6 +4313,7 @@ NetworkOPsImp::subPeerStatus(InfoSub::ref isrListener) bool NetworkOPsImp::unsubPeerStatus(std::uint64_t uSeq) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SPeerStatus].erase(uSeq) != 0u; } @@ -4222,6 +4322,7 @@ NetworkOPsImp::unsubPeerStatus(std::uint64_t uSeq) bool NetworkOPsImp::subConsensus(InfoSub::ref isrListener) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SConsensusPhase].emplace(isrListener->getSeq(), isrListener).second; } @@ -4230,6 +4331,7 @@ NetworkOPsImp::subConsensus(InfoSub::ref isrListener) bool NetworkOPsImp::unsubConsensus(std::uint64_t uSeq) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); return streamMaps_[SConsensusPhase].erase(uSeq) != 0u; } @@ -4237,6 +4339,7 @@ NetworkOPsImp::unsubConsensus(std::uint64_t uSeq) InfoSub::pointer NetworkOPsImp::findRpcSub(std::string const& strUrl) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); subRpcMapType::iterator const it = rpcSubMap_.find(strUrl); @@ -4250,6 +4353,7 @@ NetworkOPsImp::findRpcSub(std::string const& strUrl) InfoSub::pointer NetworkOPsImp::addRpcSub(std::string const& strUrl, InfoSub::ref rspEntry) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); rpcSubMap_.emplace(strUrl, rspEntry); @@ -4260,6 +4364,7 @@ NetworkOPsImp::addRpcSub(std::string const& strUrl, InfoSub::ref rspEntry) bool NetworkOPsImp::tryRemoveRpcSub(std::string const& strUrl) { + TRACE_FUNC(); std::scoped_lock const sl(subLock_); auto pInfo = findRpcSub(strUrl); @@ -4496,6 +4601,7 @@ NetworkOPsImp::getBookPage( json::Value const& jvMarker, json::Value& jvResult) { + TRACE_FUNC(); auto& jvOffers = (jvResult[jss::offers] = json::Value(json::arrayValue)); std::map umBalance; @@ -4619,6 +4725,7 @@ NetworkOPsImp::getBookPage( inline void NetworkOPsImp::collectMetrics() { + TRACE_FUNC(); auto [counters, mode, start, initialSync] = accounting_.getCounterData(); auto const current = std::chrono::duration_cast( std::chrono::steady_clock::now() - start); @@ -4650,6 +4757,7 @@ NetworkOPsImp::collectMetrics() void NetworkOPsImp::StateAccounting::mode(OperatingMode om) { + TRACE_FUNC(); auto now = std::chrono::steady_clock::now(); std::scoped_lock const lock(mutex_); @@ -4669,6 +4777,7 @@ NetworkOPsImp::StateAccounting::mode(OperatingMode om) void NetworkOPsImp::StateAccounting::json(json::Value& obj) const { + TRACE_FUNC(); auto [counters, mode, start, initialSync] = getCounterData(); auto const current = std::chrono::duration_cast( std::chrono::steady_clock::now() - start); @@ -4705,6 +4814,7 @@ makeNetworkOPs( beast::Journal journal, beast::insight::Collector::ptr const& collector) { + TRACE_FUNC(); return std::make_unique( registry, clock, diff --git a/src/xrpld/app/misc/SHAMapStoreImp.cpp b/src/xrpld/app/misc/SHAMapStoreImp.cpp index 6fa1fbda61..a1ee63b531 100644 --- a/src/xrpld/app/misc/SHAMapStoreImp.cpp +++ b/src/xrpld/app/misc/SHAMapStoreImp.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,7 @@ namespace xrpl { void SHAMapStoreImp::SavedStateDB::init(BasicConfig const& config, std::string const& dbName) { + TRACE_FUNC(); std::scoped_lock const lock(mutex); initStateDB(sqlDb, config, dbName); } @@ -52,6 +54,7 @@ SHAMapStoreImp::SavedStateDB::init(BasicConfig const& config, std::string const& LedgerIndex SHAMapStoreImp::SavedStateDB::getCanDelete() { + TRACE_FUNC(); std::scoped_lock const lock(mutex); return xrpl::getCanDelete(sqlDb); @@ -60,6 +63,7 @@ SHAMapStoreImp::SavedStateDB::getCanDelete() LedgerIndex SHAMapStoreImp::SavedStateDB::setCanDelete(LedgerIndex canDelete) { + TRACE_FUNC(); std::scoped_lock const lock(mutex); return xrpl::setCanDelete(sqlDb, canDelete); @@ -68,6 +72,7 @@ SHAMapStoreImp::SavedStateDB::setCanDelete(LedgerIndex canDelete) SavedState SHAMapStoreImp::SavedStateDB::getState() { + TRACE_FUNC(); std::scoped_lock const lock(mutex); return xrpl::getSavedState(sqlDb); @@ -76,6 +81,7 @@ SHAMapStoreImp::SavedStateDB::getState() void SHAMapStoreImp::SavedStateDB::setState(SavedState const& state) { + TRACE_FUNC(); std::scoped_lock const lock(mutex); xrpl::setSavedState(sqlDb, state); } @@ -83,6 +89,7 @@ SHAMapStoreImp::SavedStateDB::setState(SavedState const& state) void SHAMapStoreImp::SavedStateDB::setLastRotated(LedgerIndex seq) { + TRACE_FUNC(); std::scoped_lock const lock(mutex); xrpl::setLastRotated(sqlDb, seq); } @@ -99,6 +106,7 @@ SHAMapStoreImp::SHAMapStoreImp( , working_(true) , canDelete_(std::numeric_limits::max()) { + TRACE_FUNC(); Config& config{app.config()}; Section& section{config.section(ConfigSection::nodeDatabase())}; @@ -164,6 +172,7 @@ SHAMapStoreImp::SHAMapStoreImp( std::unique_ptr SHAMapStoreImp::makeNodeStore(int readThreads) { + TRACE_FUNC(); auto nscfg = app_.config().section(ConfigSection::nodeDatabase()); std::unique_ptr db; @@ -208,6 +217,7 @@ SHAMapStoreImp::makeNodeStore(int readThreads) void SHAMapStoreImp::onLedgerClosed(std::shared_ptr const& ledger) { + TRACE_FUNC(); { std::scoped_lock const lock(mutex_); newLedger_ = ledger; @@ -219,6 +229,7 @@ SHAMapStoreImp::onLedgerClosed(std::shared_ptr const& ledger) void SHAMapStoreImp::rendezvous() const { + TRACE_FUNC(); if (!working_) return; @@ -229,12 +240,14 @@ SHAMapStoreImp::rendezvous() const int SHAMapStoreImp::fdRequired() const { + TRACE_FUNC(); return fdRequired_; } bool SHAMapStoreImp::copyNode(std::uint64_t& nodeCount, SHAMapTreeNode const& node) { + TRACE_FUNC(); // Copy a single record from node to dbRotating_ dbRotating_->fetchNodeObject( node.getHash().asUint256(), 0, NodeStore::FetchType::Synchronous, true); @@ -250,6 +263,7 @@ SHAMapStoreImp::copyNode(std::uint64_t& nodeCount, SHAMapTreeNode const& node) void SHAMapStoreImp::run() { + TRACE_FUNC(); beast::setCurrentThreadName("SHAMapStore"); LedgerIndex lastRotated = state_db_.getState().lastRotated; netOPs_ = &app_.getOPs(); @@ -367,6 +381,7 @@ SHAMapStoreImp::run() void SHAMapStoreImp::dbPaths() { + TRACE_FUNC(); Section const section{app_.config().section(ConfigSection::nodeDatabase())}; boost::filesystem::path dbPath = get(section, "path"); @@ -462,6 +477,7 @@ SHAMapStoreImp::dbPaths() std::unique_ptr SHAMapStoreImp::makeBackendRotating(std::string path) { + TRACE_FUNC(); Section section{app_.config().section(ConfigSection::nodeDatabase())}; boost::filesystem::path newPath; @@ -494,6 +510,7 @@ SHAMapStoreImp::clearSql( std::function()> const& getMinSeq, std::function const& deleteBeforeSeq) { + TRACE_FUNC(); XRPL_ASSERT(deleteInterval_, "xrpl::SHAMapStoreImp::clearSql : nonzero delete interval"); LedgerIndex min = std::numeric_limits::max(); @@ -538,6 +555,7 @@ SHAMapStoreImp::clearSql( void SHAMapStoreImp::clearCaches(LedgerIndex validatedSeq) { + TRACE_FUNC(); ledgerMaster_->clearLedgerCachePrior(validatedSeq); // Also clear the FullBelowCache so its generation counter is bumped. // This prevents stale "full below" markers from persisting across @@ -548,6 +566,7 @@ SHAMapStoreImp::clearCaches(LedgerIndex validatedSeq) void SHAMapStoreImp::freshenCaches() { + TRACE_FUNC(); if (freshenCache(*app_.getNodeFamily().getTreeNodeCache())) return; @@ -557,6 +576,7 @@ SHAMapStoreImp::freshenCaches() void SHAMapStoreImp::clearPrior(LedgerIndex lastRotated) { + TRACE_FUNC(); // Do not allow ledgers to be acquired from the network // that are about to be deleted. minimumOnline_ = lastRotated + 1; @@ -599,6 +619,7 @@ SHAMapStoreImp::clearPrior(LedgerIndex lastRotated) SHAMapStoreImp::HealthResult SHAMapStoreImp::healthWait() { + TRACE_FUNC(); auto age = ledgerMaster_->getValidatedLedgerAge(); OperatingMode mode = netOPs_->getOperatingMode(); std::unique_lock lock(mutex_); @@ -621,6 +642,7 @@ SHAMapStoreImp::healthWait() void SHAMapStoreImp::stop() { + TRACE_FUNC(); if (thread_.joinable()) { { @@ -635,6 +657,7 @@ SHAMapStoreImp::stop() std::optional SHAMapStoreImp::minimumOnline() const { + TRACE_FUNC(); // minimumOnline_ with 0 value is equivalent to unknown/not set. // Don't attempt to acquire ledgers if that value is unknown. if ((deleteInterval_ != 0u) && (minimumOnline_ != 0u)) @@ -647,6 +670,7 @@ SHAMapStoreImp::minimumOnline() const std::unique_ptr makeSHAMapStore(Application& app, NodeStore::Scheduler& scheduler, beast::Journal journal) { + TRACE_FUNC(); return std::make_unique(app, scheduler, journal); } diff --git a/src/xrpld/app/misc/SHAMapStoreImp.h b/src/xrpld/app/misc/SHAMapStoreImp.h index c205d2dd90..01ebd92cfa 100644 --- a/src/xrpld/app/misc/SHAMapStoreImp.h +++ b/src/xrpld/app/misc/SHAMapStoreImp.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -102,6 +103,7 @@ public: std::uint32_t clampFetchDepth(std::uint32_t fetchDepth) const override { + TRACE_FUNC(); return (deleteInterval_ != 0u) ? std::min(fetchDepth, deleteInterval_) : fetchDepth; } @@ -111,6 +113,7 @@ public: LedgerIndex setCanDelete(LedgerIndex seq) override { + TRACE_FUNC(); if (advisoryDelete_) canDelete_ = seq; return state_db_.setCanDelete(seq); @@ -119,6 +122,7 @@ public: bool advisoryDelete() const override { + TRACE_FUNC(); return advisoryDelete_; } @@ -127,6 +131,7 @@ public: LedgerIndex getLastRotated() override { + TRACE_FUNC(); return state_db_.getState().lastRotated; } @@ -135,6 +140,7 @@ public: LedgerIndex getCanDelete() override { + TRACE_FUNC(); return canDelete_; } @@ -165,6 +171,7 @@ private: bool freshenCache(CacheInstance& cache) { + TRACE_FUNC(); std::uint64_t check = 0; for (auto const& key : cache.getKeys()) @@ -209,6 +216,7 @@ public: void start() override { + TRACE_FUNC(); if (deleteInterval_ != 0u) thread_ = std::thread(&SHAMapStoreImp::run, this); } diff --git a/src/xrpld/app/misc/Transaction.h b/src/xrpld/app/misc/Transaction.h index 80e041f5b7..e46034a0e9 100644 --- a/src/xrpld/app/misc/Transaction.h +++ b/src/xrpld/app/misc/Transaction.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -63,42 +64,49 @@ public: std::shared_ptr const& getSTransaction() { + TRACE_FUNC(); return transaction_; } uint256 const& getID() const { + TRACE_FUNC(); return transactionID_; } LedgerIndex getLedger() const { + TRACE_FUNC(); return ledgerIndex_; } bool isValidated() const { + TRACE_FUNC(); return ledgerIndex_ != 0; } TransStatus getStatus() const { + TRACE_FUNC(); return status_; } TER getResult() { + TRACE_FUNC(); return result_; } void setResult(TER terResult) { + TRACE_FUNC(); result_ = terResult; } @@ -112,12 +120,14 @@ public: void setStatus(TransStatus status) { + TRACE_FUNC(); status_ = status; } void setLedger(LedgerIndex ledger) { + TRACE_FUNC(); ledgerIndex_ = ledger; } @@ -127,6 +137,7 @@ public: void setApplying() { + TRACE_FUNC(); // Note that all access to applying_ are made by NetworkOPsImp, and must // be done under that class's lock. applying_ = true; @@ -140,6 +151,7 @@ public: bool getApplying() const { + TRACE_FUNC(); // Note that all access to applying_ are made by NetworkOPsImp, and must // be done under that class's lock. return applying_; @@ -151,6 +163,7 @@ public: void clearApplying() { + TRACE_FUNC(); // Note that all access to applying_ are made by NetworkOPsImp, and must // be done under that class's lock. applying_ = false; @@ -164,6 +177,7 @@ public: void clear() { + TRACE_FUNC(); applied = false; broadcast = false; queued = false; @@ -177,6 +191,7 @@ public: [[nodiscard]] bool any() const { + TRACE_FUNC(); return applied || broadcast || queued || kept; } @@ -193,6 +208,7 @@ public: SubmitResult getSubmitResult() const { + TRACE_FUNC(); return submitResult_; } @@ -202,6 +218,7 @@ public: void clearSubmitResult() { + TRACE_FUNC(); submitResult_.clear(); } @@ -211,6 +228,7 @@ public: void setApplied() { + TRACE_FUNC(); submitResult_.applied = true; } @@ -220,6 +238,7 @@ public: void setQueued() { + TRACE_FUNC(); submitResult_.queued = true; } @@ -229,6 +248,7 @@ public: void setBroadcast() { + TRACE_FUNC(); submitResult_.broadcast = true; } @@ -238,6 +258,7 @@ public: void setKept() { + TRACE_FUNC(); submitResult_.kept = true; } @@ -270,6 +291,7 @@ public: std::optional getCurrentLedgerState() const { + TRACE_FUNC(); return currentLedgerState_; } @@ -287,6 +309,7 @@ public: std::uint32_t accountSeq, std::uint32_t availableSeq) { + TRACE_FUNC(); currentLedgerState_.emplace(validatedLedger, fee, accountSeq, availableSeq); } @@ -309,6 +332,7 @@ public: [[nodiscard]] bool isFound() const { + TRACE_FUNC(); return std::holds_alternative>(locator); } @@ -318,6 +342,7 @@ public: uint256 const& getNodestoreHash() { + TRACE_FUNC(); return std::get>(locator).first; } @@ -327,6 +352,7 @@ public: uint32_t getLedgerSequence() { + TRACE_FUNC(); return std::get>(locator).second; } @@ -336,6 +362,7 @@ public: ClosedInterval const& getLedgerRangeSearched() { + TRACE_FUNC(); return std::get>(locator); } }; diff --git a/src/xrpld/app/misc/TxQ.h b/src/xrpld/app/misc/TxQ.h index 4cd73acaec..5e1c1c71e5 100644 --- a/src/xrpld/app/misc/TxQ.h +++ b/src/xrpld/app/misc/TxQ.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -425,6 +426,7 @@ private: [[nodiscard]] Snapshot getSnapshot() const { + TRACE_FUNC(); return {.txnsExpected = txnsExpected_, .escalationMultiplier = escalationMultiplier_}; } @@ -578,6 +580,7 @@ private: [[nodiscard]] TxConsequences const& consequences() const { + TRACE_FUNC(); return pfResult->consequences; // NOLINT(bugprone-unchecked-optional-access) invariant: // pfResult is never empty } @@ -586,6 +589,7 @@ private: [[nodiscard]] TxDetails getTxDetails() const { + TRACE_FUNC(); return { feeLevel, lastValid, @@ -625,6 +629,7 @@ private: bool operator()(MaybeTx const& lhs, MaybeTx const& rhs) const { + TRACE_FUNC(); if (lhs.feeLevel == rhs.feeLevel) return (lhs.txID ^ MaybeTx::parentHashComp) < (rhs.txID ^ MaybeTx::parentHashComp); return lhs.feeLevel > rhs.feeLevel; @@ -668,6 +673,7 @@ private: [[nodiscard]] std::size_t getTxnCount() const { + TRACE_FUNC(); return transactions.size(); } @@ -675,6 +681,7 @@ private: [[nodiscard]] bool empty() const { + TRACE_FUNC(); return getTxnCount() == 0u; } @@ -831,12 +838,14 @@ template XRPAmount toDrops(FeeLevel const& level, XRPAmount baseFee) { + TRACE_FUNC(); return mulDiv(level, baseFee, TxQ::kBASE_LEVEL).value_or(XRPAmount(STAmount::kMAX_NATIVE_N)); } inline FeeLevel64 toFeeLevel(XRPAmount const& drops, XRPAmount const& baseFee) { + TRACE_FUNC(); return mulDiv(drops, TxQ::kBASE_LEVEL, baseFee) .value_or(FeeLevel64(std::numeric_limits::max())); } diff --git a/src/xrpld/app/misc/ValidatorKeys.h b/src/xrpld/app/misc/ValidatorKeys.h index 1f96815681..e521768e55 100644 --- a/src/xrpld/app/misc/ValidatorKeys.h +++ b/src/xrpld/app/misc/ValidatorKeys.h @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -46,6 +47,7 @@ public: [[nodiscard]] bool configInvalid() const { + TRACE_FUNC(); return configInvalid_; } diff --git a/src/xrpld/app/misc/ValidatorList.h b/src/xrpld/app/misc/ValidatorList.h index 5f051fe527..f3a957c01e 100644 --- a/src/xrpld/app/misc/ValidatorList.h +++ b/src/xrpld/app/misc/ValidatorList.h @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -481,6 +482,7 @@ public: std::size_t quorum() const { + TRACE_FUNC(); return quorum_; } @@ -646,6 +648,7 @@ public: QuorumKeys getQuorumKeys() const { + TRACE_FUNC(); shared_lock const readLock{mutex_}; return {quorum_, trustedSigningKeys_}; } @@ -829,6 +832,7 @@ private: friend void hash_append(Hasher& h, PublisherListCollection pl) { + TRACE_FUNC(); using beast::hash_append; hash_append(h, pl.rawManifest, buildBlobInfos(pl), pl.rawVersion); } @@ -886,6 +890,7 @@ template void hash_append(Hasher& h, ValidatorBlobInfo const& blobInfo) { + TRACE_FUNC(); using beast::hash_append; hash_append(h, blobInfo.blob, blobInfo.signature); if (blobInfo.manifest) @@ -898,6 +903,7 @@ template void hash_append(Hasher& h, std::vector const& blobs) { + TRACE_FUNC(); for (auto const& item : blobs) hash_append(h, item); } @@ -906,6 +912,7 @@ template void hash_append(Hasher& h, std::map const& blobs) { + TRACE_FUNC(); for (auto const& [_, item] : blobs) { (void)_; @@ -921,6 +928,7 @@ template void hash_append(Hasher& h, TMValidatorList const& msg) { + TRACE_FUNC(); using beast::hash_append; hash_append(h, msg.manifest(), msg.blob(), msg.signature(), msg.version()); } @@ -929,6 +937,7 @@ template void hash_append(Hasher& h, TMValidatorListCollection const& msg) { + TRACE_FUNC(); using beast::hash_append; hash_append(h, msg.manifest(), xrpl::ValidatorList::parseBlobs(msg), msg.version()); } diff --git a/src/xrpld/app/misc/detail/AccountTxPaging.cpp b/src/xrpld/app/misc/detail/AccountTxPaging.cpp index 183d1568e8..f065328aeb 100644 --- a/src/xrpld/app/misc/detail/AccountTxPaging.cpp +++ b/src/xrpld/app/misc/detail/AccountTxPaging.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ convertBlobsToTxResult( Blob const& rawMeta, Application& app) { + TRACE_FUNC(); SerialIter it(makeSlice(rawTxn)); auto txn = std::make_shared(it); std::string reason; @@ -57,6 +59,7 @@ convertBlobsToTxResult( void saveLedgerAsync(Application& app, std::uint32_t seq) { + TRACE_FUNC(); if (auto l = app.getLedgerMaster().getLedgerBySeq(seq)) pendSaveValidated(app, l, false, false); } diff --git a/src/xrpld/app/misc/detail/AmendmentTable.cpp b/src/xrpld/app/misc/detail/AmendmentTable.cpp index 56b97d3f7e..dd9beedb14 100644 --- a/src/xrpld/app/misc/detail/AmendmentTable.cpp +++ b/src/xrpld/app/misc/detail/AmendmentTable.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -49,6 +50,7 @@ namespace xrpl { static std::vector> parseSection(Section const& section) { + TRACE_FUNC(); static boost::regex const kRE1( "^" // start of line "(?:\\s*)" // whitespace (optional) @@ -128,6 +130,7 @@ public: void trustChanged(hash_set const& allTrusted, std::scoped_lock const& lock) { + TRACE_FUNC(); decltype(recordedVotes_) newRecordedVotes; newRecordedVotes.reserve(allTrusted.size()); @@ -164,6 +167,7 @@ public: beast::Journal j, std::scoped_lock const& lock) { + TRACE_FUNC(); // When we get an STValidation we save the upVotes it contains, but // we also set an expiration for those upVotes. The following constant // controls the timeout. @@ -261,6 +265,7 @@ public: [[nodiscard]] std::pair> getVotes(Rules const& rules, std::scoped_lock const& lock) const { + TRACE_FUNC(); hash_map ret; int available = 0; for (auto& validatorVotes : recordedVotes_) @@ -321,6 +326,7 @@ public: TrustedVotes const& trustedVotes, std::scoped_lock const& lock) { + TRACE_FUNC(); // process validations for ledger before flag ledger. auto [trustedCount, newVotes] = trustedVotes.getVotes(rules, lock); @@ -337,6 +343,7 @@ public: [[nodiscard]] bool passes(uint256 const& amendment) const { + TRACE_FUNC(); auto const& it = votes_.find(amendment); if (it == votes_.end()) @@ -353,6 +360,7 @@ public: [[nodiscard]] int votes(uint256 const& amendment) const { + TRACE_FUNC(); auto const& it = votes_.find(amendment); if (it == votes_.end()) @@ -364,12 +372,14 @@ public: [[nodiscard]] int trustedValidations() const { + TRACE_FUNC(); return trustedValidations_; } [[nodiscard]] int threshold() const { + TRACE_FUNC(); return threshold_; } }; @@ -510,6 +520,7 @@ AmendmentTableImpl::AmendmentTableImpl( beast::Journal journal) : majorityTime_(majorityTime), j_(journal), db_(registry.getWalletDB()) { + TRACE_FUNC(); std::scoped_lock lock(mutex_); // Find out if the FeatureVotes table exists in WalletDB @@ -635,6 +646,7 @@ AmendmentTableImpl::AmendmentTableImpl( AmendmentState& AmendmentTableImpl::add(uint256 const& amendmentHash, std::scoped_lock const&) { + TRACE_FUNC(); // call with the mutex held return amendmentMap_[amendmentHash]; } @@ -642,6 +654,7 @@ AmendmentTableImpl::add(uint256 const& amendmentHash, std::scoped_lock const& lock) { + TRACE_FUNC(); // Forward to the const version of get. return const_cast(std::as_const(*this).get(amendmentHash, lock)); } @@ -649,6 +662,7 @@ AmendmentTableImpl::get(uint256 const& amendmentHash, std::scoped_lock const&) const { + TRACE_FUNC(); // call with the mutex held auto ret = amendmentMap_.find(amendmentHash); @@ -661,6 +675,7 @@ AmendmentTableImpl::get(uint256 const& amendmentHash, std::scoped_lockenabled; @@ -742,6 +762,7 @@ AmendmentTableImpl::isEnabled(uint256 const& amendment) const bool AmendmentTableImpl::isSupported(uint256 const& amendment) const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); AmendmentState const* s = get(amendment, lock); return (s != nullptr) && s->supported; @@ -750,6 +771,7 @@ AmendmentTableImpl::isSupported(uint256 const& amendment) const bool AmendmentTableImpl::hasUnsupportedEnabled() const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); return unsupportedEnabled_; } @@ -757,6 +779,7 @@ AmendmentTableImpl::hasUnsupportedEnabled() const std::optional AmendmentTableImpl::firstUnsupportedExpected() const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); return firstUnsupportedExpected_; } @@ -764,6 +787,7 @@ AmendmentTableImpl::firstUnsupportedExpected() const std::vector AmendmentTableImpl::doValidation(std::set const& enabled) const { + TRACE_FUNC(); // Get the list of amendments we support and do not // veto, but that are not already enabled std::vector amendments; @@ -791,6 +815,7 @@ AmendmentTableImpl::doValidation(std::set const& enabled) const std::vector AmendmentTableImpl::getDesired() const { + TRACE_FUNC(); // Get the list of amendments we support and do not veto return doValidation({}); } @@ -803,6 +828,7 @@ AmendmentTableImpl::doVoting( majorityAmendments_t const& majorityAmendments, std::vector> const& valSet) { + TRACE_FUNC(); JLOG(j_.trace()) << "voting at " << closeTime.time_since_epoch().count() << ": " << enabledAmendments.size() << ", " << majorityAmendments.size() << ", " << valSet.size(); @@ -889,6 +915,7 @@ AmendmentTableImpl::doVoting( bool AmendmentTableImpl::needValidatedLedger(LedgerIndex ledgerSeq) const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); // Is there a ledger in which an amendment could have been enabled @@ -903,6 +930,7 @@ AmendmentTableImpl::doValidatedLedger( std::set const& enabled, majorityAmendments_t const& majority) { + TRACE_FUNC(); for (auto& e : enabled) enable(e); @@ -937,6 +965,7 @@ AmendmentTableImpl::doValidatedLedger( void AmendmentTableImpl::trustChanged(hash_set const& allTrusted) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); previousTrustedVotes_.trustChanged(allTrusted, lock); } @@ -949,6 +978,7 @@ AmendmentTableImpl::injectJson( bool isAdmin, std::scoped_lock const&) const { + TRACE_FUNC(); if (!fs.name.empty()) v[jss::name] = fs.name; @@ -983,6 +1013,7 @@ AmendmentTableImpl::injectJson( json::Value AmendmentTableImpl::getJson(bool isAdmin) const { + TRACE_FUNC(); json::Value ret(json::ObjectValue); { std::scoped_lock const lock(mutex_); @@ -998,6 +1029,7 @@ AmendmentTableImpl::getJson(bool isAdmin) const json::Value AmendmentTableImpl::getJson(uint256 const& amendmentID, bool isAdmin) const { + TRACE_FUNC(); json::Value ret = json::ObjectValue; { @@ -1022,6 +1054,7 @@ makeAmendmentTable( Section const& vetoed, beast::Journal journal) { + TRACE_FUNC(); return std::make_unique( registry, majorityTime, supported, enabled, vetoed, journal); } diff --git a/src/xrpld/app/misc/detail/DeliverMax.cpp b/src/xrpld/app/misc/detail/DeliverMax.cpp index add3cf89ee..d8432b080a 100644 --- a/src/xrpld/app/misc/detail/DeliverMax.cpp +++ b/src/xrpld/app/misc/detail/DeliverMax.cpp @@ -2,12 +2,14 @@ #include #include +#include namespace xrpl::RPC { void insertDeliverMax(json::Value& txJson, TxType txnType, unsigned int apiVersion) { + TRACE_FUNC(); if (txJson.isMember(jss::Amount)) { if (txnType == ttPAYMENT) diff --git a/src/xrpld/app/misc/detail/Transaction.cpp b/src/xrpld/app/misc/detail/Transaction.cpp index 2975a5f622..b03af235b0 100644 --- a/src/xrpld/app/misc/detail/Transaction.cpp +++ b/src/xrpld/app/misc/detail/Transaction.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -38,6 +39,7 @@ Transaction::Transaction( Application& app) noexcept : transaction_(stx), app_(app), j_(app.getJournal("Ledger")) { + TRACE_FUNC(); try { transactionID_ = transaction_->getTransactionID(); @@ -62,6 +64,7 @@ Transaction::setStatus( std::optional tseq, std::optional netID) { + TRACE_FUNC(); status_ = ts; ledgerIndex_ = lseq; if (tseq) @@ -73,6 +76,7 @@ Transaction::setStatus( TransStatus Transaction::sqlTransactionStatus(boost::optional const& status) { + TRACE_FUNC(); auto const c = (status) ? safeCast((*status)[0]) : TxnSql::Unknown; switch (static_cast(c)) @@ -103,6 +107,7 @@ Transaction::transactionFromSQL( Blob const& rawTxn, Application& app) { + TRACE_FUNC(); std::uint32_t const inLedger = rangeCheckedCast(ledgerSeq.value_or(0)); SerialIter it(makeSlice(rawTxn)); @@ -118,6 +123,7 @@ Transaction::transactionFromSQL( std::variant, std::shared_ptr>, TxSearched> Transaction::load(uint256 const& id, Application& app, ErrorCodeI& ec) { + TRACE_FUNC(); return load(id, app, std::nullopt, ec); } @@ -128,6 +134,7 @@ Transaction::load( ClosedInterval const& range, ErrorCodeI& ec) { + TRACE_FUNC(); using op = std::optional>; return load(id, app, op{range}, ec); @@ -140,6 +147,7 @@ Transaction::load( std::optional> const& range, ErrorCodeI& ec) { + TRACE_FUNC(); auto& db = app.getRelationalDatabase(); return db.getTransaction(id, range, ec); @@ -149,6 +157,7 @@ Transaction::load( json::Value Transaction::getJson(JsonOptions options, bool binary) const { + TRACE_FUNC(); // Note, we explicitly suppress `include_date` option here json::Value ret(transaction_->getJson(options & ~JsonOptions::KIncludeDate, binary)); diff --git a/src/xrpld/app/misc/detail/TxQ.cpp b/src/xrpld/app/misc/detail/TxQ.cpp index 8b478f964e..03b30f21fb 100644 --- a/src/xrpld/app/misc/detail/TxQ.cpp +++ b/src/xrpld/app/misc/detail/TxQ.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -56,6 +57,7 @@ namespace xrpl { static FeeLevel64 getFeeLevelPaid(ReadView const& view, STTx const& tx) { + TRACE_FUNC(); auto const [baseFee, effectiveFeePaid] = [&view, &tx]() { XRPAmount const baseFee = calculateBaseFee(view, tx); XRPAmount const feePaid = tx[sfFee].xrp(); @@ -84,6 +86,7 @@ getFeeLevelPaid(ReadView const& view, STTx const& tx) static std::optional getLastLedgerSequence(STTx const& tx) { + TRACE_FUNC(); if (!tx.isFieldPresent(sfLastLedgerSequence)) return std::nullopt; return tx.getFieldU32(sfLastLedgerSequence); @@ -92,6 +95,7 @@ getLastLedgerSequence(STTx const& tx) static FeeLevel64 increase(FeeLevel64 level, std::uint32_t increasePercent) { + TRACE_FUNC(); return mulDiv(level, 100 + increasePercent, 100) .value_or(static_cast(xrpl::kMULDIV_MAX)); } @@ -105,6 +109,7 @@ TxQ::FeeMetrics::update( bool timeLeap, TxQ::Setup const& setup) { + TRACE_FUNC(); std::vector feeLevels; auto const txBegin = view.txs.begin(); auto const txEnd = view.txs.end(); @@ -181,6 +186,7 @@ TxQ::FeeMetrics::update( FeeLevel64 TxQ::FeeMetrics::scaleFeeLevel(Snapshot const& snapshot, OpenView const& view) { + TRACE_FUNC(); // Transactions in the open ledger so far auto const current = view.txCount(); @@ -243,6 +249,7 @@ TxQ::FeeMetrics::escalatedSeriesFeeLevel( std::size_t extraCount, std::size_t seriesSize) { + TRACE_FUNC(); /* Transactions in the open ledger so far. AKA Transactions that will be in the open ledger when the first tx in the series is attempted. @@ -303,6 +310,7 @@ TxQ::MaybeTx::MaybeTx( ApplyResult TxQ::MaybeTx::apply(Application& app, OpenView& view, beast::Journal j) { + TRACE_FUNC(); // If the rules or flags change, preflight again XRPL_ASSERT(pfResult, "xrpl::TxQ::MaybeTx::apply : preflight result is set"); NumberSO const stNumberSO{view.rules().enabled(fixUniversalNumber)}; @@ -335,6 +343,7 @@ TxQ::TxQAccount::TxQAccount(AccountID const& account) : account(account) TxQ::TxQAccount::TxMap::const_iterator TxQ::TxQAccount::getPrevTx(SeqProxy seqProx) const { + TRACE_FUNC(); // Find the entry that is greater than or equal to the new transaction, // then decrement the iterator. auto sameOrPrevIter = transactions.lower_bound(seqProx); @@ -346,6 +355,7 @@ TxQ::TxQAccount::getPrevTx(SeqProxy seqProx) const TxQ::MaybeTx& TxQ::TxQAccount::add(MaybeTx&& txn) { + TRACE_FUNC(); auto const seqProx = txn.seqProxy; [[maybe_unused]] auto const* txnPtr = &txn; @@ -359,6 +369,7 @@ TxQ::TxQAccount::add(MaybeTx&& txn) bool TxQ::TxQAccount::remove(SeqProxy seqProx) { + TRACE_FUNC(); return transactions.erase(seqProx) != 0; } @@ -371,6 +382,7 @@ TxQ::TxQ(Setup const& setup, beast::Journal j) TxQ::~TxQ() { + TRACE_FUNC(); byFee_.clear(); } @@ -378,6 +390,7 @@ template bool TxQ::isFull() const { + TRACE_FUNC(); static_assert(FillPercentage > 0 && FillPercentage <= 100, "Invalid fill percentage"); return maxSize_ && byFee_.size() >= (*maxSize_ * FillPercentage / 100); } @@ -392,6 +405,7 @@ TxQ::canBeHeld( std::optional const& replacementIter, std::scoped_lock const& lock) { + TRACE_FUNC(); // PreviousTxnID is deprecated and should never be used. // AccountTxnID is not supported by the transaction // queue yet, but should be added in the future. @@ -456,6 +470,7 @@ TxQ::canBeHeld( auto TxQ::erase(TxQ::FeeMultiSet::const_iterator_type candidateIter) -> FeeMultiSet::iterator_type { + TRACE_FUNC(); auto& txQAccount = byAccount_.at(candidateIter->account); auto const seqProx = candidateIter->seqProxy; auto const newCandidateIter = byFee_.erase(candidateIter); @@ -472,6 +487,7 @@ auto TxQ::eraseAndAdvance(TxQ::FeeMultiSet::const_iterator_type candidateIter) -> FeeMultiSet::iterator_type { + TRACE_FUNC(); auto& txQAccount = byAccount_.at(candidateIter->account); auto const accountIter = txQAccount.transactions.find(candidateIter->seqProxy); XRPL_ASSERT( @@ -507,6 +523,7 @@ TxQ::erase( TxQ::TxQAccount::TxMap::const_iterator begin, TxQ::TxQAccount::TxMap::const_iterator end) -> TxQAccount::TxMap::iterator { + TRACE_FUNC(); for (auto it = begin; it != end; ++it) { byFee_.erase(byFee_.iterator_to(it->second)); @@ -528,6 +545,7 @@ TxQ::tryClearAccountQueueUpThruTx( FeeMetrics::Snapshot const& metricsSnapshot, beast::Journal j) { + TRACE_FUNC(); SeqProxy const tSeqProx{tx.getSeqProxy()}; XRPL_ASSERT( beginTxIter != accountIter->second.transactions.end(), @@ -730,6 +748,7 @@ TxQ::apply( ApplyFlags flags, beast::Journal j) { + TRACE_FUNC(); NumberSO const stNumberSO{view.rules().enabled(fixUniversalNumber)}; // See if the transaction is valid, properly formed, @@ -1332,6 +1351,7 @@ TxQ::apply( void TxQ::processClosedLedger(Application& app, ReadView const& view, bool timeLeap) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); feeMetrics_.update(app, view, timeLeap, setup_); @@ -1403,6 +1423,7 @@ TxQ::processClosedLedger(Application& app, ReadView const& view, bool timeLeap) bool TxQ::accept(Application& app, OpenView& view) { + TRACE_FUNC(); /* Move transactions from the queue from largest fee level to smallest. As we add more transactions, the required fee level will increase. Stop when the transaction fee level gets lower than the required fee @@ -1575,6 +1596,7 @@ TxQ::accept(Application& app, OpenView& view) SeqProxy TxQ::nextQueuableSeq(std::shared_ptr const& sleAccount) const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); return nextQueuableSeqImpl(sleAccount, lock); } @@ -1590,6 +1612,7 @@ TxQ::nextQueuableSeqImpl( std::shared_ptr const& sleAccount, std::scoped_lock const&) const { + TRACE_FUNC(); // If the account is not in the ledger or a non-account was passed // then return zero. We have no idea. if (!sleAccount || sleAccount->getType() != ltACCOUNT_ROOT) @@ -1639,6 +1662,7 @@ TxQ::getRequiredFeeLevel( FeeMetrics::Snapshot const& metricsSnapshot, std::scoped_lock const& lock) { + TRACE_FUNC(); return FeeMetrics::scaleFeeLevel(metricsSnapshot, view); } @@ -1650,6 +1674,7 @@ TxQ::tryDirectApply( ApplyFlags flags, beast::Journal j) { + TRACE_FUNC(); auto const account = (*tx)[sfAccount]; auto const sleAccount = view.read(keylet::account(account)); @@ -1713,6 +1738,7 @@ TxQ::removeFromByFee( std::optional const& replacedTxIter, std::shared_ptr const& tx) { + TRACE_FUNC(); if (replacedTxIter && tx) { // If the transaction we're holding replaces a transaction in the @@ -1737,6 +1763,7 @@ TxQ::removeFromByFee( TxQ::Metrics TxQ::getMetrics(OpenView const& view) const { + TRACE_FUNC(); Metrics result; std::scoped_lock const lock(mutex_); @@ -1759,6 +1786,7 @@ TxQ::getMetrics(OpenView const& view) const TxQ::FeeAndSeq TxQ::getTxRequiredFeeAndSeq(OpenView const& view, std::shared_ptr const& tx) const { + TRACE_FUNC(); auto const account = (*tx)[sfAccount]; std::scoped_lock const lock(mutex_); @@ -1781,6 +1809,7 @@ TxQ::getTxRequiredFeeAndSeq(OpenView const& view, std::shared_ptr co std::vector TxQ::getAccountTxs(AccountID const& account) const { + TRACE_FUNC(); std::vector result; std::scoped_lock const lock(mutex_); @@ -1801,6 +1830,7 @@ TxQ::getAccountTxs(AccountID const& account) const std::vector TxQ::getTxs() const { + TRACE_FUNC(); std::vector result; std::scoped_lock const lock(mutex_); @@ -1816,6 +1846,7 @@ TxQ::getTxs() const json::Value TxQ::doRPC(Application& app) const { + TRACE_FUNC(); auto const view = app.getOpenLedger().current(); if (!view) { @@ -1870,6 +1901,7 @@ TxQ::doRPC(Application& app) const TxQ::Setup setupTxQ(Config const& config) { + TRACE_FUNC(); TxQ::Setup setup; auto const& section = config.section("transaction_queue"); set(setup.ledgersInQueue, "ledgers_in_queue", section); diff --git a/src/xrpld/app/misc/detail/ValidatorKeys.cpp b/src/xrpld/app/misc/detail/ValidatorKeys.cpp index 0380e2e294..a07fc4d491 100644 --- a/src/xrpld/app/misc/detail/ValidatorKeys.cpp +++ b/src/xrpld/app/misc/detail/ValidatorKeys.cpp @@ -11,12 +11,14 @@ #include #include #include +#include #include namespace xrpl { ValidatorKeys::ValidatorKeys(Config const& config, beast::Journal j) { + TRACE_FUNC(); if (config.exists(SECTION_VALIDATOR_TOKEN) && config.exists(SECTION_VALIDATION_SEED)) { configInvalid_ = true; diff --git a/src/xrpld/app/misc/detail/ValidatorList.cpp b/src/xrpld/app/misc/detail/ValidatorList.cpp index 1576d398f8..e907806e8d 100644 --- a/src/xrpld/app/misc/detail/ValidatorList.cpp +++ b/src/xrpld/app/misc/detail/ValidatorList.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -62,6 +63,7 @@ namespace xrpl { std::string to_string(ListDisposition disposition) { + TRACE_FUNC(); switch (disposition) { case ListDisposition::Accepted: @@ -88,6 +90,7 @@ to_string(ListDisposition disposition) ValidatorList::PublisherListStats::PublisherListStats(ListDisposition d) { + TRACE_FUNC(); ++dispositions[d]; } @@ -98,24 +101,28 @@ ValidatorList::PublisherListStats::PublisherListStats( std::size_t seq) : publisherKey(key), status(stat), sequence(seq) { + TRACE_FUNC(); ++dispositions[d]; } ListDisposition ValidatorList::PublisherListStats::bestDisposition() const { + TRACE_FUNC(); return dispositions.empty() ? ListDisposition::Invalid : dispositions.begin()->first; } ListDisposition ValidatorList::PublisherListStats::worstDisposition() const { + TRACE_FUNC(); return dispositions.empty() ? ListDisposition::Invalid : dispositions.rbegin()->first; } void ValidatorList::PublisherListStats::mergeDispositions(PublisherListStats const& src) { + TRACE_FUNC(); for (auto const& [disp, count] : src.dispositions) { dispositions[disp] += count; @@ -157,6 +164,7 @@ ValidatorList::load( std::vector const& publisherKeys, std::optional listThreshold) { + TRACE_FUNC(); static boost::regex const kRE( "[[:space:]]*" // skip leading whitespace "([[:alnum:]]+)" // node identity @@ -291,6 +299,7 @@ ValidatorList::load( boost::filesystem::path ValidatorList::getCacheFileName(ValidatorList::scoped_lock const&, PublicKey const& pubKey) const { + TRACE_FUNC(); return dataPath_ / (kFILE_PREFIX + strHex(pubKey)); } @@ -301,6 +310,7 @@ ValidatorList::buildFileData( ValidatorList::PublisherListCollection const& pubCollection, beast::Journal j) { + TRACE_FUNC(); return buildFileData(pubKey, pubCollection, {}, j); } @@ -312,6 +322,7 @@ ValidatorList::buildFileData( std::optional forceVersion, beast::Journal j) { + TRACE_FUNC(); json::Value value(json::ObjectValue); XRPL_ASSERT( @@ -369,6 +380,7 @@ void ValidatorList::cacheValidatorFile(ValidatorList::scoped_lock const& lock, PublicKey const& pubKey) const { + TRACE_FUNC(); if (dataPath_.empty()) return; @@ -397,6 +409,7 @@ ValidatorList::cacheValidatorFile(ValidatorList::scoped_lock const& lock, Public std::vector ValidatorList::parseBlobs(std::uint32_t version, json::Value const& body) { + TRACE_FUNC(); std::vector result; switch (version) { @@ -455,6 +468,7 @@ ValidatorList::parseBlobs(std::uint32_t version, json::Value const& body) std::vector ValidatorList::parseBlobs(protocol::TMValidatorList const& body) { + TRACE_FUNC(); return {{body.blob(), body.signature(), {}}}; } @@ -462,6 +476,7 @@ ValidatorList::parseBlobs(protocol::TMValidatorList const& body) std::vector ValidatorList::parseBlobs(protocol::TMValidatorListCollection const& body) { + TRACE_FUNC(); if (body.blobs_size() > kMAX_SUPPORTED_BLOBS) return {}; std::vector result; @@ -499,6 +514,7 @@ splitMessage( std::size_t begin = 0, std::size_t end = 0) { + TRACE_FUNC(); if (begin == 0 && end == 0) end = largeMsg.blobs_size(); XRPL_ASSERT(begin < end, "xrpl::splitMessage : valid inputs"); @@ -520,6 +536,7 @@ splitMessageParts( std::size_t begin, std::size_t end) { + TRACE_FUNC(); if (end <= begin) return 0; if (end - begin == 1) @@ -579,6 +596,7 @@ buildValidatorListMessage( ValidatorBlobInfo const& currentBlob, std::size_t maxSize) { + TRACE_FUNC(); XRPL_ASSERT( messages.empty(), "xrpl::buildValidatorListMessage(ValidatorBlobInfo) : empty messages " @@ -612,6 +630,7 @@ buildValidatorListMessage( std::map const& blobInfos, std::size_t maxSize) { + TRACE_FUNC(); XRPL_ASSERT( messages.empty(), "xrpl::buildValidatorListMessage(std::map& messages, std::size_t maxSize /*= kMAXIMUM_MESSAGE_SIZE*/) { + TRACE_FUNC(); XRPL_ASSERT( !blobInfos.empty(), "xrpl::ValidatorList::buildValidatorListMessages : empty messages " @@ -727,6 +747,7 @@ ValidatorList::sendValidatorList( HashRouter& hashRouter, beast::Journal j) { + TRACE_FUNC(); std::size_t messageVersion = 0; if (peer.supportsFeature(ProtocolFeature::ValidatorList2Propagation)) { @@ -801,6 +822,7 @@ ValidatorList::sendValidatorList( HashRouter& hashRouter, beast::Journal j) { + TRACE_FUNC(); std::vector messages; sendValidatorList( peer, @@ -821,6 +843,7 @@ ValidatorList::buildBlobInfos( std::map& blobInfos, ValidatorList::PublisherListCollection const& lists) { + TRACE_FUNC(); auto const& current = lists.current; auto const& remaining = lists.remaining; blobInfos[current.sequence] = { @@ -838,6 +861,7 @@ ValidatorList::buildBlobInfos( std::map ValidatorList::buildBlobInfos(ValidatorList::PublisherListCollection const& lists) { + TRACE_FUNC(); std::map result; buildBlobInfos(result, lists); return result; @@ -854,6 +878,7 @@ ValidatorList::broadcastBlobs( HashRouter& hashRouter, beast::Journal j) { + TRACE_FUNC(); auto const toSkip = hashRouter.shouldRelay(hash); if (toSkip) @@ -920,6 +945,7 @@ ValidatorList::applyListsAndBroadcast( HashRouter& hashRouter, NetworkOPs& networkOPs) { + TRACE_FUNC(); auto const result = applyLists(manifest, version, blobs, std::move(siteUri), hash); auto const disposition = result.bestDisposition(); @@ -978,6 +1004,7 @@ ValidatorList::applyLists( std::string siteUri, std::optional const& hash /* = {} */) { + TRACE_FUNC(); if (std::count( std::begin(kSUPPORTED_LIST_VERSIONS), std::end(kSUPPORTED_LIST_VERSIONS), version) != 1) return PublisherListStats{ListDisposition::UnsupportedVersion}; @@ -1054,6 +1081,7 @@ ValidatorList::updatePublisherList( std::vector const& oldList, ValidatorList::scoped_lock const&) { + TRACE_FUNC(); // Update keyListings_ for added and removed keys std::vector const& publisherList = current.list; std::vector const& manifests = current.manifests; @@ -1123,6 +1151,7 @@ ValidatorList::applyList( std::optional const& hash, ValidatorList::scoped_lock const& lock) { + TRACE_FUNC(); using namespace std::string_literals; json::Value list; @@ -1282,6 +1311,7 @@ ValidatorList::applyList( std::vector ValidatorList::loadLists() { + TRACE_FUNC(); using namespace std::string_literals; using namespace boost::filesystem; using namespace boost::system::errc; @@ -1342,6 +1372,7 @@ ValidatorList::verify( std::string const& blob, std::string const& signature) { + TRACE_FUNC(); if (!publisherLists_.contains(manifest.masterKey)) return {ListDisposition::Untrusted, {}}; @@ -1429,6 +1460,7 @@ ValidatorList::verify( bool ValidatorList::listed(PublicKey const& identity) const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; auto const pubKey = validatorManifests_.getMasterKey(identity); @@ -1438,6 +1470,7 @@ ValidatorList::listed(PublicKey const& identity) const bool ValidatorList::trusted(ValidatorList::shared_lock const&, PublicKey const& identity) const { + TRACE_FUNC(); auto const pubKey = validatorManifests_.getMasterKey(identity); return trustedMasterKeys_.contains(pubKey); } @@ -1445,6 +1478,7 @@ ValidatorList::trusted(ValidatorList::shared_lock const&, PublicKey const& ident bool ValidatorList::trusted(PublicKey const& identity) const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; return trusted(readLock, identity); } @@ -1452,6 +1486,7 @@ ValidatorList::trusted(PublicKey const& identity) const std::optional ValidatorList::getListedKey(PublicKey const& identity) const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; auto pubKey = validatorManifests_.getMasterKey(identity); @@ -1463,6 +1498,7 @@ ValidatorList::getListedKey(PublicKey const& identity) const std::optional ValidatorList::getTrustedKey(ValidatorList::shared_lock const&, PublicKey const& identity) const { + TRACE_FUNC(); auto pubKey = validatorManifests_.getMasterKey(identity); if (trustedMasterKeys_.contains(pubKey)) return pubKey; @@ -1472,6 +1508,7 @@ ValidatorList::getTrustedKey(ValidatorList::shared_lock const&, PublicKey const& std::optional ValidatorList::getTrustedKey(PublicKey const& identity) const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; return getTrustedKey(readLock, identity); @@ -1480,6 +1517,7 @@ ValidatorList::getTrustedKey(PublicKey const& identity) const bool ValidatorList::trustedPublisher(PublicKey const& identity) const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; return (identity.size() != 0u) && publisherLists_.contains(identity) && publisherLists_.at(identity).status < PublisherStatus::Revoked; @@ -1488,6 +1526,7 @@ ValidatorList::trustedPublisher(PublicKey const& identity) const std::optional ValidatorList::localPublicKey() const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; return localPubKey_; } @@ -1498,6 +1537,7 @@ ValidatorList::removePublisherList( PublicKey const& publisherKey, PublisherStatus reason) { + TRACE_FUNC(); XRPL_ASSERT( reason != PublisherStatus::Available && reason != PublisherStatus::Unavailable, "xrpl::ValidatorList::removePublisherList : valid reason input"); @@ -1532,12 +1572,14 @@ ValidatorList::removePublisherList( std::size_t ValidatorList::count(ValidatorList::shared_lock const&) const { + TRACE_FUNC(); return publisherLists_.size() + static_cast(!localPublisherList_.list.empty()); } std::size_t ValidatorList::count() const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; return count(readLock); } @@ -1545,6 +1587,7 @@ ValidatorList::count() const std::optional ValidatorList::expires(ValidatorList::shared_lock const&) const { + TRACE_FUNC(); std::optional res{}; for (auto const& [_, collection] : publisherLists_) { @@ -1598,6 +1641,7 @@ ValidatorList::expires(ValidatorList::shared_lock const&) const std::optional ValidatorList::expires() const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; return expires(readLock); } @@ -1605,6 +1649,7 @@ ValidatorList::expires() const json::Value ValidatorList::getJson() const { + TRACE_FUNC(); json::Value res(json::ObjectValue); std::shared_lock const readLock{mutex_}; @@ -1735,6 +1780,7 @@ ValidatorList::getJson() const void ValidatorList::forEachListed(std::function func) const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; for (auto const& v : keyListings_) @@ -1751,6 +1797,7 @@ ValidatorList::forEachAvailable( std::size_t maxSequence, uint256 const& hash)> func) const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; for (auto const& [key, plCollection] : publisherLists_) @@ -1775,6 +1822,7 @@ ValidatorList::getAvailable( std::string_view pubKey, std::optional forceVersion /* = {} */) { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; auto const keyBlob = strViewUnHex(pubKey); @@ -1803,6 +1851,7 @@ ValidatorList::calculateQuorum( std::size_t effectiveUnlSize, std::size_t seenSize) { + TRACE_FUNC(); // Use quorum if specified via command line. if (minimumQuorum_ > 0) { @@ -1897,6 +1946,7 @@ ValidatorList::updateTrusted( Overlay& overlay, HashRouter& hashRouter) { + TRACE_FUNC(); using namespace std::chrono_literals; if (timeKeeper_.now() > closeTime + 30s) closeTime = timeKeeper_.now(); @@ -2074,6 +2124,7 @@ ValidatorList::updateTrusted( hash_set ValidatorList::getTrustedMasterKeys() const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; return trustedMasterKeys_; } @@ -2081,6 +2132,7 @@ ValidatorList::getTrustedMasterKeys() const std::size_t ValidatorList::getListThreshold() const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; return listThreshold_; } @@ -2088,6 +2140,7 @@ ValidatorList::getListThreshold() const hash_set ValidatorList::getNegativeUNL() const { + TRACE_FUNC(); std::shared_lock const readLock{mutex_}; return negativeUNL_; } @@ -2095,6 +2148,7 @@ ValidatorList::getNegativeUNL() const void ValidatorList::setNegativeUNL(hash_set const& negUnl) { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; negativeUNL_ = negUnl; } @@ -2102,6 +2156,7 @@ ValidatorList::setNegativeUNL(hash_set const& negUnl) std::vector> ValidatorList::negativeUNLFilter(std::vector>&& validations) const { + TRACE_FUNC(); // Remove validations that are from validators on the negative UNL. auto ret = std::move(validations); diff --git a/src/xrpld/app/misc/detail/ValidatorSite.cpp b/src/xrpld/app/misc/detail/ValidatorSite.cpp index 57734ef956..2c31014dcc 100644 --- a/src/xrpld/app/misc/detail/ValidatorSite.cpp +++ b/src/xrpld/app/misc/detail/ValidatorSite.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -114,6 +115,7 @@ ValidatorSite::ValidatorSite( ValidatorSite::~ValidatorSite() { + TRACE_FUNC(); std::unique_lock lock{state_mutex_}; if (timer_.expiry() > clock_type::time_point{}) { @@ -132,6 +134,7 @@ ValidatorSite::~ValidatorSite() bool ValidatorSite::missingSite(std::scoped_lock const& lockSites) { + TRACE_FUNC(); auto const sites = app_.getValidators().loadLists(); return sites.empty() || load(sites, lockSites); } @@ -139,6 +142,7 @@ ValidatorSite::missingSite(std::scoped_lock const& lockSites) bool ValidatorSite::load(std::vector const& siteURIs) { + TRACE_FUNC(); JLOG(j_.debug()) << "Loading configured validator list sites"; std::scoped_lock const lock{sites_mutex_}; @@ -151,6 +155,7 @@ ValidatorSite::load( std::vector const& siteURIs, std::scoped_lock const& lockSites) { + TRACE_FUNC(); // If no sites are provided, act as if a site failed to load. if (siteURIs.empty()) { @@ -178,6 +183,7 @@ ValidatorSite::load( void ValidatorSite::start() { + TRACE_FUNC(); std::scoped_lock const l0{sites_mutex_}; std::scoped_lock const l1{state_mutex_}; if (timer_.expiry() == clock_type::time_point{}) @@ -187,6 +193,7 @@ ValidatorSite::start() void ValidatorSite::join() { + TRACE_FUNC(); std::unique_lock lock{state_mutex_}; cv_.wait(lock, [&] { return !pending_; }); } @@ -194,6 +201,7 @@ ValidatorSite::join() void ValidatorSite::stop() { + TRACE_FUNC(); std::unique_lock lock{state_mutex_}; stopping_ = true; // work::cancel() must be called before the @@ -222,6 +230,7 @@ ValidatorSite::setTimer( std::scoped_lock const& siteLock, std::scoped_lock const& stateLock) { + TRACE_FUNC(); auto next = std::ranges::min_element( sites_, [](Site const& a, Site const& b) { return a.nextRefresh < b.nextRefresh; }); @@ -242,6 +251,7 @@ ValidatorSite::makeRequest( std::size_t siteIdx, std::scoped_lock const& sitesLock) { + TRACE_FUNC(); fetching_ = true; sites_[siteIdx].activeResource = resource; std::shared_ptr sp; @@ -322,6 +332,7 @@ ValidatorSite::makeRequest( void ValidatorSite::onRequestTimeout(std::size_t siteIdx, error_code const& ec) { + TRACE_FUNC(); if (ec) return; @@ -351,6 +362,7 @@ ValidatorSite::onRequestTimeout(std::size_t siteIdx, error_code const& ec) void ValidatorSite::onTimer(std::size_t siteIdx, error_code const& ec) { + TRACE_FUNC(); if (ec) { // Restart the timer if any errors are encountered, unless the error @@ -385,6 +397,7 @@ ValidatorSite::parseJsonResponse( std::size_t siteIdx, std::scoped_lock const& sitesLock) { + TRACE_FUNC(); json::Value const body = [&res, siteIdx, this]() { json::Reader r; json::Value body; @@ -503,6 +516,7 @@ ValidatorSite::processRedirect( std::size_t siteIdx, std::scoped_lock const& sitesLock) { + TRACE_FUNC(); using namespace boost::beast::http; std::shared_ptr newLocation; if (!res.contains(field::location) || res[field::location].empty()) @@ -545,6 +559,7 @@ ValidatorSite::onSiteFetch( detail::response_type const& res, std::size_t siteIdx) { + TRACE_FUNC(); std::scoped_lock lockSites{sites_mutex_}; { if (endpoint != endpoint_type{}) @@ -630,6 +645,7 @@ ValidatorSite::onTextFetch( std::string const& res, std::size_t siteIdx) { + TRACE_FUNC(); std::scoped_lock const lockSites{sites_mutex_}; { try @@ -667,6 +683,7 @@ ValidatorSite::onTextFetch( json::Value ValidatorSite::getJson() const { + TRACE_FUNC(); using namespace std::chrono; using Int = json::Value::Int; diff --git a/src/xrpld/app/misc/detail/WorkBase.h b/src/xrpld/app/misc/detail/WorkBase.h index 56b227613f..be0ffe5603 100644 --- a/src/xrpld/app/misc/detail/WorkBase.h +++ b/src/xrpld/app/misc/detail/WorkBase.h @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -63,6 +64,7 @@ public: Impl& impl() { + TRACE_FUNC(); return *static_cast(this); } @@ -124,6 +126,7 @@ WorkBase::WorkBase( template WorkBase::~WorkBase() { + TRACE_FUNC(); if (cb_) cb_(make_error_code(boost::system::errc::not_a_socket), lastEndpoint_, std::move(res_)); close(); @@ -133,6 +136,7 @@ template void WorkBase::run() { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { return boost::asio::post( @@ -157,6 +161,7 @@ template void WorkBase::cancel() { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { return boost::asio::post( @@ -175,6 +180,7 @@ template void WorkBase::fail(error_code const& ec) { + TRACE_FUNC(); if (cb_) { cb_(ec, lastEndpoint_, std::move(res_)); @@ -186,6 +192,7 @@ template void WorkBase::onResolve(error_code const& ec, results_type results) { + TRACE_FUNC(); if (ec) return fail(ec); @@ -205,6 +212,7 @@ template void WorkBase::onConnect(error_code const& ec, endpoint_type const& endpoint) { + TRACE_FUNC(); lastEndpoint_ = endpoint; if (ec) @@ -217,6 +225,7 @@ template void WorkBase::onStart() { + TRACE_FUNC(); req_.method(boost::beast::http::verb::get); req_.target(path_.empty() ? "/" : path_); req_.version(11); @@ -235,6 +244,7 @@ template void WorkBase::onRequest(error_code const& ec) { + TRACE_FUNC(); if (ec) return fail(ec); @@ -251,6 +261,7 @@ template void WorkBase::onResponse(error_code const& ec) { + TRACE_FUNC(); if (ec) return fail(ec); @@ -264,6 +275,7 @@ template void WorkBase::close() { + TRACE_FUNC(); if (socket_.is_open()) { error_code ec; diff --git a/src/xrpld/app/misc/detail/WorkFile.h b/src/xrpld/app/misc/detail/WorkFile.h index 067dc4c38b..265d29122d 100644 --- a/src/xrpld/app/misc/detail/WorkFile.h +++ b/src/xrpld/app/misc/detail/WorkFile.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -51,6 +52,7 @@ inline WorkFile::WorkFile(std::string path, boost::asio::io_context& ios, callba inline WorkFile::~WorkFile() { + TRACE_FUNC(); if (cb_) cb_(make_error_code(boost::system::errc::interrupted), {}); } @@ -58,6 +60,7 @@ inline WorkFile::~WorkFile() inline void WorkFile::run() { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { boost::asio::post( @@ -77,6 +80,7 @@ WorkFile::run() inline void WorkFile::cancel() { + TRACE_FUNC(); // Nothing to do. Either it finished in run, or it didn't start. } diff --git a/src/xrpld/app/misc/detail/WorkPlain.h b/src/xrpld/app/misc/detail/WorkPlain.h index d3c0309e77..3c21eb6b2c 100644 --- a/src/xrpld/app/misc/detail/WorkPlain.h +++ b/src/xrpld/app/misc/detail/WorkPlain.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace xrpl::detail { @@ -27,6 +28,7 @@ private: socket_type& stream() { + TRACE_FUNC(); return socket_; } }; @@ -48,6 +50,7 @@ inline WorkPlain::WorkPlain( inline void WorkPlain::onConnect(error_code const& ec) { + TRACE_FUNC(); if (ec) { fail(ec); diff --git a/src/xrpld/app/misc/detail/WorkSSL.cpp b/src/xrpld/app/misc/detail/WorkSSL.cpp index 0a8d53b1a2..93d5f4b500 100644 --- a/src/xrpld/app/misc/detail/WorkSSL.cpp +++ b/src/xrpld/app/misc/detail/WorkSSL.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -37,6 +38,7 @@ WorkSSL::WorkSSL( boost::asio::ssl::context::tlsv12_client) , stream_(socket_, context_.context()) { + TRACE_FUNC(); auto ec = context_.preConnectVerify(stream_, host_); if (ec) Throw(boost::str(boost::format("preConnectVerify: %s") % ec.message())); @@ -45,6 +47,7 @@ WorkSSL::WorkSSL( void WorkSSL::onConnect(error_code const& ec) { + TRACE_FUNC(); auto err = ec ? ec : context_.postConnectVerify(stream_, host_); if (err) { @@ -61,6 +64,7 @@ WorkSSL::onConnect(error_code const& ec) void WorkSSL::onHandshake(error_code const& ec) { + TRACE_FUNC(); if (ec) { fail(ec); diff --git a/src/xrpld/app/misc/detail/WorkSSL.h b/src/xrpld/app/misc/detail/WorkSSL.h index 74676bb7c1..c356249d59 100644 --- a/src/xrpld/app/misc/detail/WorkSSL.h +++ b/src/xrpld/app/misc/detail/WorkSSL.h @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -41,6 +42,7 @@ private: stream_type& stream() { + TRACE_FUNC(); return stream_; } diff --git a/src/xrpld/app/misc/detail/setup_HashRouter.cpp b/src/xrpld/app/misc/detail/setup_HashRouter.cpp index 9727f5d733..421a539688 100644 --- a/src/xrpld/app/misc/detail/setup_HashRouter.cpp +++ b/src/xrpld/app/misc/detail/setup_HashRouter.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -15,6 +16,7 @@ namespace xrpl { HashRouter::Setup setupHashRouter(Config const& config) { + TRACE_FUNC(); using namespace std::chrono; HashRouter::Setup setup; diff --git a/src/xrpld/app/rdb/backend/detail/Node.cpp b/src/xrpld/app/rdb/backend/detail/Node.cpp index 8530fb2e65..80d2d60eb0 100644 --- a/src/xrpld/app/rdb/backend/detail/Node.cpp +++ b/src/xrpld/app/rdb/backend/detail/Node.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -75,6 +76,7 @@ namespace xrpl::detail { static std::string toString(TableType type) { + TRACE_FUNC(); static_assert(kTABLE_TYPE_COUNT == 3, "Need to modify switch statement if enum is modified"); switch (type) @@ -100,6 +102,7 @@ makeLedgerDBs( DatabaseCon::CheckpointerSetup const& checkpointerSetup, beast::Journal j) { + TRACE_FUNC(); // ledger database auto lgr{std::make_unique( setup, kLGR_DB_NAME, setup.lgrPragma, kLGR_DB_INIT, checkpointerSetup, j)}; @@ -152,6 +155,7 @@ makeLedgerDBs( std::optional getMinLedgerSeq(soci::session& session, TableType type) { + TRACE_FUNC(); std::string const query = "SELECT MIN(LedgerSeq) FROM " + toString(type) + ";"; // SOCI requires boost::optional (not std::optional) as the parameter. boost::optional m; @@ -162,6 +166,7 @@ getMinLedgerSeq(soci::session& session, TableType type) std::optional getMaxLedgerSeq(soci::session& session, TableType type) { + TRACE_FUNC(); std::string const query = "SELECT MAX(LedgerSeq) FROM " + toString(type) + ";"; // SOCI requires boost::optional (not std::optional) as the parameter. boost::optional m; @@ -172,18 +177,21 @@ getMaxLedgerSeq(soci::session& session, TableType type) void deleteByLedgerSeq(soci::session& session, TableType type, LedgerIndex ledgerSeq) { + TRACE_FUNC(); session << "DELETE FROM " << toString(type) << " WHERE LedgerSeq == " << ledgerSeq << ";"; } void deleteBeforeLedgerSeq(soci::session& session, TableType type, LedgerIndex ledgerSeq) { + TRACE_FUNC(); session << "DELETE FROM " << toString(type) << " WHERE LedgerSeq < " << ledgerSeq << ";"; } std::size_t getRows(soci::session& session, TableType type) { + TRACE_FUNC(); std::size_t rows = 0; session << "SELECT COUNT(*) AS rows " "FROM " @@ -196,6 +204,7 @@ getRows(soci::session& session, TableType type) RelationalDatabase::CountMinMax getRowsMinMax(soci::session& session, TableType type) { + TRACE_FUNC(); RelationalDatabase::CountMinMax res{}; session << "SELECT COUNT(*) AS rows, " "MIN(LedgerSeq) AS first, " @@ -216,6 +225,7 @@ saveValidatedLedger( std::shared_ptr const& ledger, bool current) { + TRACE_FUNC(); auto j = app.getJournal("Ledger"); auto seq = ledger->header().seq; @@ -424,6 +434,7 @@ saveValidatedLedger( static std::optional getLedgerInfo(soci::session& session, std::string const& sqlSuffix, beast::Journal j) { + TRACE_FUNC(); // SOCI requires boost::optional (not std::optional) as parameters. boost::optional hash, parentHash, accountHash, txHash; boost::optional seq, drops, closeTime, parentCloseTime, closeTimeResolution, @@ -489,6 +500,7 @@ getLedgerInfo(soci::session& session, std::string const& sqlSuffix, beast::Journ std::optional getLedgerInfoByIndex(soci::session& session, LedgerIndex ledgerSeq, beast::Journal j) { + TRACE_FUNC(); std::ostringstream s; s << "WHERE LedgerSeq = " << ledgerSeq; return getLedgerInfo(session, s.str(), j); @@ -497,6 +509,7 @@ getLedgerInfoByIndex(soci::session& session, LedgerIndex ledgerSeq, beast::Journ std::optional getNewestLedgerInfo(soci::session& session, beast::Journal j) { + TRACE_FUNC(); std::ostringstream s; s << "ORDER BY LedgerSeq DESC LIMIT 1"; return getLedgerInfo(session, s.str(), j); @@ -505,6 +518,7 @@ getNewestLedgerInfo(soci::session& session, beast::Journal j) std::optional getLimitedOldestLedgerInfo(soci::session& session, LedgerIndex ledgerFirstIndex, beast::Journal j) { + TRACE_FUNC(); std::ostringstream s; s << "WHERE LedgerSeq >= " + std::to_string(ledgerFirstIndex) + " ORDER BY LedgerSeq ASC LIMIT 1"; @@ -514,6 +528,7 @@ getLimitedOldestLedgerInfo(soci::session& session, LedgerIndex ledgerFirstIndex, std::optional getLimitedNewestLedgerInfo(soci::session& session, LedgerIndex ledgerFirstIndex, beast::Journal j) { + TRACE_FUNC(); std::ostringstream s; s << "WHERE LedgerSeq >= " + std::to_string(ledgerFirstIndex) + " ORDER BY LedgerSeq DESC LIMIT 1"; @@ -523,6 +538,7 @@ getLimitedNewestLedgerInfo(soci::session& session, LedgerIndex ledgerFirstIndex, std::optional getLedgerInfoByHash(soci::session& session, uint256 const& ledgerHash, beast::Journal j) { + TRACE_FUNC(); std::ostringstream s; s << "WHERE LedgerHash = '" << ledgerHash << "'"; return getLedgerInfo(session, s.str(), j); @@ -531,6 +547,7 @@ getLedgerInfoByHash(soci::session& session, uint256 const& ledgerHash, beast::Jo uint256 getHashByIndex(soci::session& session, LedgerIndex ledgerIndex) { + TRACE_FUNC(); uint256 ret; std::string sql = "SELECT LedgerHash FROM Ledgers INDEXED BY SeqLedger WHERE LedgerSeq='"; @@ -560,6 +577,7 @@ getHashByIndex(soci::session& session, LedgerIndex ledgerIndex) std::optional getHashesByIndex(soci::session& session, LedgerIndex ledgerIndex, beast::Journal j) { + TRACE_FUNC(); // SOCI requires boost::optional (not std::optional) as the parameter. boost::optional lhO, phO; @@ -588,6 +606,7 @@ getHashesByIndex(soci::session& session, LedgerIndex ledgerIndex, beast::Journal std::map getHashesByIndex(soci::session& session, LedgerIndex minSeq, LedgerIndex maxSeq, beast::Journal j) { + TRACE_FUNC(); std::string sql = "SELECT LedgerSeq,LedgerHash,PrevHash FROM Ledgers WHERE LedgerSeq >= "; sql.append(std::to_string(minSeq)); sql.append(" AND LedgerSeq <= "); @@ -624,6 +643,7 @@ getHashesByIndex(soci::session& session, LedgerIndex minSeq, LedgerIndex maxSeq, std::pair>, int> getTxHistory(soci::session& session, Application& app, LedgerIndex startIndex, int quantity) { + TRACE_FUNC(); std::string const sql = boost::str( boost::format( "SELECT LedgerSeq, Status, RawTxn " @@ -697,6 +717,7 @@ transactionsSQL( bool count, beast::Journal j) { + TRACE_FUNC(); constexpr std::uint32_t kNONBINARY_PAGE_LENGTH = 200; constexpr std::uint32_t kBINARY_PAGE_LENGTH = 500; @@ -795,6 +816,7 @@ getAccountTxs( bool descending, beast::Journal j) { + TRACE_FUNC(); RelationalDatabase::AccountTxs ret; std::string const sql = transactionsSQL( @@ -877,6 +899,7 @@ getOldestAccountTxs( RelationalDatabase::AccountTxOptions const& options, beast::Journal j) { + TRACE_FUNC(); return getAccountTxs(session, app, ledgerMaster, options, false, j); } @@ -888,6 +911,7 @@ getNewestAccountTxs( RelationalDatabase::AccountTxOptions const& options, beast::Journal j) { + TRACE_FUNC(); return getAccountTxs(session, app, ledgerMaster, options, true, j); } @@ -919,6 +943,7 @@ getAccountTxsB( bool descending, beast::Journal j) { + TRACE_FUNC(); std::vector ret; std::string const sql = transactionsSQL( @@ -975,6 +1000,7 @@ getOldestAccountTxsB( RelationalDatabase::AccountTxOptions const& options, beast::Journal j) { + TRACE_FUNC(); return getAccountTxsB(session, app, options, false, j); } @@ -985,6 +1011,7 @@ getNewestAccountTxsB( RelationalDatabase::AccountTxOptions const& options, beast::Journal j) { + TRACE_FUNC(); return getAccountTxsB(session, app, options, true, j); } @@ -1016,6 +1043,7 @@ accountTxPage( std::uint32_t pageLength, bool forward) { + TRACE_FUNC(); int total = 0; bool lookingForMarker = options.marker.has_value(); @@ -1198,6 +1226,7 @@ oldestAccountTxPage( RelationalDatabase::AccountTxPageOptions const& options, std::uint32_t pageLength) { + TRACE_FUNC(); return accountTxPage(session, onUnsavedLedger, onTransaction, options, pageLength, true); } @@ -1209,6 +1238,7 @@ newestAccountTxPage( RelationalDatabase::AccountTxPageOptions const& options, std::uint32_t pageLength) { + TRACE_FUNC(); return accountTxPage(session, onUnsavedLedger, onTransaction, options, pageLength, false); } @@ -1220,6 +1250,7 @@ getTransaction( std::optional> const& range, ErrorCodeI& ec) { + TRACE_FUNC(); std::string sql = "SELECT LedgerSeq,Status,RawTxn,TxnMeta " "FROM Transactions WHERE TransID='"; @@ -1291,6 +1322,7 @@ getTransaction( bool dbHasSpace(soci::session& session, Config const& config, beast::Journal j) { + TRACE_FUNC(); boost::filesystem::space_info const space = boost::filesystem::space(config.legacy("database_path")); diff --git a/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp b/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp index a50d17bf2b..6035f7d2ef 100644 --- a/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp +++ b/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,7 @@ SQLiteDatabase::makeLedgerDBs( DatabaseCon::Setup const& setup, DatabaseCon::CheckpointerSetup const& checkpointerSetup) { + TRACE_FUNC(); auto [lgr, tx, res] = detail::makeLedgerDBs(config, setup, checkpointerSetup, j_); txdb_ = std::move(tx); ledgerDb_ = std::move(lgr); @@ -49,6 +51,7 @@ SQLiteDatabase::makeLedgerDBs( std::optional SQLiteDatabase::getMinLedgerSeq() { + TRACE_FUNC(); /* if databases exists, use it */ if (existsLedger()) { @@ -63,6 +66,7 @@ SQLiteDatabase::getMinLedgerSeq() std::optional SQLiteDatabase::getTransactionsMinLedgerSeq() { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -78,6 +82,7 @@ SQLiteDatabase::getTransactionsMinLedgerSeq() std::optional SQLiteDatabase::getAccountTransactionsMinLedgerSeq() { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -93,6 +98,7 @@ SQLiteDatabase::getAccountTransactionsMinLedgerSeq() std::optional SQLiteDatabase::getMaxLedgerSeq() { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -105,6 +111,7 @@ SQLiteDatabase::getMaxLedgerSeq() void SQLiteDatabase::deleteTransactionByLedgerSeq(LedgerIndex ledgerSeq) { + TRACE_FUNC(); if (!useTxTables_) return; @@ -119,6 +126,7 @@ SQLiteDatabase::deleteTransactionByLedgerSeq(LedgerIndex ledgerSeq) void SQLiteDatabase::deleteBeforeLedgerSeq(LedgerIndex ledgerSeq) { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -130,6 +138,7 @@ SQLiteDatabase::deleteBeforeLedgerSeq(LedgerIndex ledgerSeq) void SQLiteDatabase::deleteTransactionsBeforeLedgerSeq(LedgerIndex ledgerSeq) { + TRACE_FUNC(); if (!useTxTables_) return; @@ -144,6 +153,7 @@ SQLiteDatabase::deleteTransactionsBeforeLedgerSeq(LedgerIndex ledgerSeq) void SQLiteDatabase::deleteAccountTransactionsBeforeLedgerSeq(LedgerIndex ledgerSeq) { + TRACE_FUNC(); if (!useTxTables_) return; @@ -158,6 +168,7 @@ SQLiteDatabase::deleteAccountTransactionsBeforeLedgerSeq(LedgerIndex ledgerSeq) std::size_t SQLiteDatabase::getTransactionCount() { + TRACE_FUNC(); if (!useTxTables_) return 0; @@ -173,6 +184,7 @@ SQLiteDatabase::getTransactionCount() std::size_t SQLiteDatabase::getAccountTransactionCount() { + TRACE_FUNC(); if (!useTxTables_) return 0; @@ -188,6 +200,7 @@ SQLiteDatabase::getAccountTransactionCount() RelationalDatabase::CountMinMax SQLiteDatabase::getLedgerCountMinMax() { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -200,6 +213,7 @@ SQLiteDatabase::getLedgerCountMinMax() bool SQLiteDatabase::saveValidatedLedger(std::shared_ptr const& ledger, bool current) { + TRACE_FUNC(); if (existsLedger()) { if (!detail::saveValidatedLedger( @@ -213,6 +227,7 @@ SQLiteDatabase::saveValidatedLedger(std::shared_ptr const& ledger, std::optional SQLiteDatabase::getLedgerInfoByIndex(LedgerIndex ledgerSeq) { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -228,6 +243,7 @@ SQLiteDatabase::getLedgerInfoByIndex(LedgerIndex ledgerSeq) std::optional SQLiteDatabase::getNewestLedgerInfo() { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -243,6 +259,7 @@ SQLiteDatabase::getNewestLedgerInfo() std::optional SQLiteDatabase::getLimitedOldestLedgerInfo(LedgerIndex ledgerFirstIndex) { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -258,6 +275,7 @@ SQLiteDatabase::getLimitedOldestLedgerInfo(LedgerIndex ledgerFirstIndex) std::optional SQLiteDatabase::getLimitedNewestLedgerInfo(LedgerIndex ledgerFirstIndex) { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -273,6 +291,7 @@ SQLiteDatabase::getLimitedNewestLedgerInfo(LedgerIndex ledgerFirstIndex) std::optional SQLiteDatabase::getLedgerInfoByHash(uint256 const& ledgerHash) { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -288,6 +307,7 @@ SQLiteDatabase::getLedgerInfoByHash(uint256 const& ledgerHash) uint256 SQLiteDatabase::getHashByIndex(LedgerIndex ledgerIndex) { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -303,6 +323,7 @@ SQLiteDatabase::getHashByIndex(LedgerIndex ledgerIndex) std::optional SQLiteDatabase::getHashesByIndex(LedgerIndex ledgerIndex) { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -318,6 +339,7 @@ SQLiteDatabase::getHashesByIndex(LedgerIndex ledgerIndex) std::map SQLiteDatabase::getHashesByIndex(LedgerIndex minSeq, LedgerIndex maxSeq) { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -333,6 +355,7 @@ SQLiteDatabase::getHashesByIndex(LedgerIndex minSeq, LedgerIndex maxSeq) std::vector> SQLiteDatabase::getTxHistory(LedgerIndex startIndex) { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -351,6 +374,7 @@ SQLiteDatabase::getTxHistory(LedgerIndex startIndex) RelationalDatabase::AccountTxs SQLiteDatabase::getOldestAccountTxs(AccountTxOptions const& options) { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -369,6 +393,7 @@ SQLiteDatabase::getOldestAccountTxs(AccountTxOptions const& options) RelationalDatabase::AccountTxs SQLiteDatabase::getNewestAccountTxs(AccountTxOptions const& options) { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -387,6 +412,7 @@ SQLiteDatabase::getNewestAccountTxs(AccountTxOptions const& options) RelationalDatabase::MetaTxsList SQLiteDatabase::getOldestAccountTxsB(AccountTxOptions const& options) { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -402,6 +428,7 @@ SQLiteDatabase::getOldestAccountTxsB(AccountTxOptions const& options) RelationalDatabase::MetaTxsList SQLiteDatabase::getNewestAccountTxsB(AccountTxOptions const& options) { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -417,6 +444,7 @@ SQLiteDatabase::getNewestAccountTxsB(AccountTxOptions const& options) std::pair> SQLiteDatabase::oldestAccountTxPage(AccountTxPageOptions const& options) { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -447,6 +475,7 @@ SQLiteDatabase::oldestAccountTxPage(AccountTxPageOptions const& options) std::pair> SQLiteDatabase::newestAccountTxPage(AccountTxPageOptions const& options) { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -477,6 +506,7 @@ SQLiteDatabase::newestAccountTxPage(AccountTxPageOptions const& options) std::pair> SQLiteDatabase::oldestAccountTxPageB(AccountTxPageOptions const& options) { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -505,6 +535,7 @@ SQLiteDatabase::oldestAccountTxPageB(AccountTxPageOptions const& options) std::pair> SQLiteDatabase::newestAccountTxPageB(AccountTxPageOptions const& options) { + TRACE_FUNC(); if (!useTxTables_) return {}; @@ -536,6 +567,7 @@ SQLiteDatabase::getTransaction( std::optional> const& range, ErrorCodeI& ec) { + TRACE_FUNC(); if (!useTxTables_) return TxSearched::Unknown; @@ -551,6 +583,7 @@ SQLiteDatabase::getTransaction( SQLiteDatabase::SQLiteDatabase(SQLiteDatabase&& rhs) noexcept : registry_(rhs.registry_), useTxTables_(rhs.useTxTables_), j_(rhs.j_) { + TRACE_FUNC(); std::exchange(ledgerDb_, std::move(rhs.ledgerDb_)); std::exchange(txdb_, std::move(rhs.txdb_)); } @@ -558,6 +591,7 @@ SQLiteDatabase::SQLiteDatabase(SQLiteDatabase&& rhs) noexcept bool SQLiteDatabase::ledgerDbHasSpace(Config const& config) { + TRACE_FUNC(); if (existsLedger()) { auto db = checkoutLedger(); @@ -570,6 +604,7 @@ SQLiteDatabase::ledgerDbHasSpace(Config const& config) bool SQLiteDatabase::transactionDbHasSpace(Config const& config) { + TRACE_FUNC(); if (!useTxTables_) return true; @@ -585,6 +620,7 @@ SQLiteDatabase::transactionDbHasSpace(Config const& config) std::uint32_t SQLiteDatabase::getKBUsedAll() { + TRACE_FUNC(); if (existsLedger()) { return xrpl::getKBUsedAll(ledgerDb_->getSession()); @@ -596,6 +632,7 @@ SQLiteDatabase::getKBUsedAll() std::uint32_t SQLiteDatabase::getKBUsedLedger() { + TRACE_FUNC(); if (existsLedger()) { return xrpl::getKBUsedDB(ledgerDb_->getSession()); @@ -607,6 +644,7 @@ SQLiteDatabase::getKBUsedLedger() std::uint32_t SQLiteDatabase::getKBUsedTransaction() { + TRACE_FUNC(); if (!useTxTables_) return 0; @@ -621,12 +659,14 @@ SQLiteDatabase::getKBUsedTransaction() void SQLiteDatabase::closeLedgerDB() { + TRACE_FUNC(); ledgerDb_.reset(); } void SQLiteDatabase::closeTransactionDB() { + TRACE_FUNC(); txdb_.reset(); } @@ -635,6 +675,7 @@ SQLiteDatabase::SQLiteDatabase(ServiceRegistry& registry, Config const& config, , useTxTables_(config.useTxTables()) , j_(registry.getJournal("SQLiteDatabase")) { + TRACE_FUNC(); DatabaseCon::Setup const setup = setupDatabaseCon(config, j_); if (!makeLedgerDBs( config, @@ -651,6 +692,7 @@ SQLiteDatabase::SQLiteDatabase(ServiceRegistry& registry, Config const& config, SQLiteDatabase setupRelationalDatabase(ServiceRegistry& registry, Config const& config, JobQueue& jobQueue) { + TRACE_FUNC(); return {registry, config, jobQueue}; } diff --git a/src/xrpld/app/rdb/detail/PeerFinder.cpp b/src/xrpld/app/rdb/detail/PeerFinder.cpp index 7227c65663..4992542e1d 100644 --- a/src/xrpld/app/rdb/detail/PeerFinder.cpp +++ b/src/xrpld/app/rdb/detail/PeerFinder.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -27,6 +28,7 @@ namespace xrpl { void initPeerFinderDB(soci::session& session, BasicConfig const& config, beast::Journal j) { + TRACE_FUNC(); DBConfig const sociConfig(config, "peerfinder"); sociConfig.open(session); @@ -59,6 +61,7 @@ initPeerFinderDB(soci::session& session, BasicConfig const& config, beast::Journ void updatePeerFinderDB(soci::session& session, int currentSchemaVersion, beast::Journal j) { + TRACE_FUNC(); soci::transaction tr(session); // get version int version(0); @@ -208,6 +211,7 @@ updatePeerFinderDB(soci::session& session, int currentSchemaVersion, beast::Jour void readPeerFinderDB(soci::session& session, std::function const& func) { + TRACE_FUNC(); std::string s; int valence = 0; soci::statement st = @@ -228,6 +232,7 @@ readPeerFinderDB(soci::session& session, std::function const& v) { + TRACE_FUNC(); soci::transaction tr(session); session << "DELETE FROM PeerFinder_BootstrapCache;"; diff --git a/src/xrpld/consensus/Consensus.cpp b/src/xrpld/consensus/Consensus.cpp index 5498f7cf79..a02e51a896 100644 --- a/src/xrpld/consensus/Consensus.cpp +++ b/src/xrpld/consensus/Consensus.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -28,6 +29,7 @@ shouldCloseLedger( beast::Journal j, std::unique_ptr const& clog) { + TRACE_FUNC(); CLOG(clog) << "shouldCloseLedger params anyTransactions: " << anyTransactions << ", prevProposers: " << prevProposers << ", proposersClosed: " << proposersClosed << ", proposersValidated: " << proposersValidated @@ -99,6 +101,7 @@ checkConsensusReached( bool stalled, std::unique_ptr const& clog) { + TRACE_FUNC(); CLOG(clog) << "checkConsensusReached params: agreeing: " << agreeing << ", total: " << total << ", count_self: " << countSelf << ", minConsensusPct: " << minConsensusPct << ", reachedMax: " << reachedMax << ". "; @@ -171,6 +174,7 @@ checkConsensus( beast::Journal j, std::unique_ptr const& clog) { + TRACE_FUNC(); CLOG(clog) << "checkConsensus: prop=" << currentProposers << "/" << prevProposers << " agree=" << currentAgree << " validated=" << currentFinished << " time=" << currentAgreeTime.count() << "/" << previousAgreeTime.count() diff --git a/src/xrpld/consensus/Consensus.h b/src/xrpld/consensus/Consensus.h index e5c06bd1c8..d4346021f9 100644 --- a/src/xrpld/consensus/Consensus.h +++ b/src/xrpld/consensus/Consensus.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -298,12 +299,14 @@ class Consensus [[nodiscard]] ConsensusMode get() const { + TRACE_FUNC(); return mode_; } void set(ConsensusMode mode, Adaptor& a) { + TRACE_FUNC(); a.onModeChange(mode_, mode); mode_ = mode; } @@ -405,12 +408,14 @@ public: typename Ledger_t::ID prevLedgerID() const { + TRACE_FUNC(); return prevLedgerID_; } [[nodiscard]] ConsensusPhase phase() const { + TRACE_FUNC(); return phase_; } @@ -609,6 +614,7 @@ template Consensus::Consensus(clock_type const& clock, Adaptor& adaptor, beast::Journal journal) : adaptor_(adaptor), clock_(clock), j_{journal} { + TRACE_FUNC(); JLOG(j_.debug()) << "Creating consensus object"; } @@ -622,6 +628,7 @@ Consensus::startRound( bool proposing, std::unique_ptr const& clog) { + TRACE_FUNC(); if (firstRound_) { // take our initial view of closeTime_ from the seed ledger @@ -666,6 +673,7 @@ Consensus::startRoundInternal( ConsensusMode mode, std::unique_ptr const& clog) { + TRACE_FUNC(); phase_ = ConsensusPhase::Open; JLOG(j_.debug()) << "transitioned to ConsensusPhase::Open "; CLOG(clog) << "startRoundInternal transitioned to ConsensusPhase::Open, " @@ -707,6 +715,7 @@ template bool Consensus::peerProposal(NetClock::time_point const& now, PeerPosition_t const& newPeerPos) { + TRACE_FUNC(); JLOG(j_.debug()) << "PROPOSAL " << newPeerPos.render(); auto const& peerID = newPeerPos.proposal().nodeID(); @@ -728,6 +737,7 @@ Consensus::peerProposalInternal( NetClock::time_point const& now, PeerPosition_t const& newPeerPos) { + TRACE_FUNC(); // Nothing to do for now if we are currently working on a ledger if (phase_ == ConsensusPhase::Accepted) return false; @@ -828,6 +838,7 @@ Consensus::timerEntry( NetClock::time_point const& now, std::unique_ptr const& clog) { + TRACE_FUNC(); CLOG(clog) << "Consensus::timerEntry. "; // Nothing to do if we are currently working on a ledger if (phase_ == ConsensusPhase::Accepted) @@ -863,6 +874,7 @@ template void Consensus::gotTxSet(NetClock::time_point const& now, TxSet_t const& txSet) { + TRACE_FUNC(); // Nothing to do if we've finished work on a ledger if (phase_ == ConsensusPhase::Accepted) return; @@ -910,6 +922,7 @@ Consensus::simulate( NetClock::time_point const& now, std::optional consensusDelay) { + TRACE_FUNC(); using namespace std::chrono_literals; JLOG(j_.info()) << "Simulating consensus"; now_ = now; @@ -929,6 +942,7 @@ template json::Value Consensus::getJson(bool full) const { + TRACE_FUNC(); using std::to_string; using Int = json::Value::Int; @@ -1028,6 +1042,7 @@ Consensus::handleWrongLedger( typename Ledger_t::ID const& lgrId, std::unique_ptr const& clog) { + TRACE_FUNC(); CLOG(clog) << "handleWrongLedger. "; XRPL_ASSERT( lgrId != prevLedgerID_ || previousLedger_.id() != lgrId, @@ -1080,6 +1095,7 @@ template void Consensus::checkLedger(std::unique_ptr const& clog) { + TRACE_FUNC(); CLOG(clog) << "checkLedger. "; auto netLgr = adaptor_.getPrevLedger(prevLedgerID_, previousLedger_, mode_.get()); @@ -1109,6 +1125,7 @@ template void Consensus::playbackProposals() { + TRACE_FUNC(); for (auto const& it : recentPeerPositions_) { for (auto const& pos : it.second) @@ -1126,6 +1143,7 @@ template void Consensus::phaseOpen(std::unique_ptr const& clog) { + TRACE_FUNC(); CLOG(clog) << "phaseOpen. "; using namespace std::chrono; @@ -1198,6 +1216,7 @@ template bool Consensus::shouldPause(std::unique_ptr const& clog) const { + TRACE_FUNC(); CLOG(clog) << "shouldPause? "; auto const& parms = adaptor_.parms(); std::uint32_t const ahead( @@ -1322,6 +1341,7 @@ template void Consensus::phaseEstablish(std::unique_ptr const& clog) { + TRACE_FUNC(); CLOG(clog) << "phaseEstablish. "; // can only establish consensus if we already took a stance XRPL_ASSERT(result_, "xrpl::Consensus::phaseEstablish : result is set"); @@ -1388,6 +1408,7 @@ template void Consensus::closeLedger(std::unique_ptr const& clog) { + TRACE_FUNC(); // We should not be closing if we already have a position XRPL_ASSERT(!result_, "xrpl::Consensus::closeLedger : result is not set"); @@ -1435,6 +1456,7 @@ this. inline int participantsNeeded(int participants, int percent) { + TRACE_FUNC(); int const result = ((participants * percent) + (percent / 2)) / 100; return (result == 0) ? 1 : result; @@ -1444,6 +1466,7 @@ template void Consensus::updateOurPositions(std::unique_ptr const& clog) { + TRACE_FUNC(); // We must have a position if we are updating it XRPL_ASSERT(result_, "xrpl::Consensus::updateOurPositions : result is set"); // NOLINTBEGIN(bugprone-unchecked-optional-access) assert above @@ -1626,6 +1649,7 @@ template bool Consensus::haveConsensus(std::unique_ptr const& clog) { + TRACE_FUNC(); // Must have a stance if we are checking for consensus XRPL_ASSERT(result_, "xrpl::Consensus::haveConsensus : has result"); // NOLINTBEGIN(bugprone-unchecked-optional-access) assert above @@ -1737,6 +1761,7 @@ template void Consensus::leaveConsensus(std::unique_ptr const& clog) { + TRACE_FUNC(); if (mode_.get() == ConsensusMode::Proposing) { if (result_ && !result_->position.isBowOut()) @@ -1755,6 +1780,7 @@ template void Consensus::createDisputes(TxSet_t const& o, std::unique_ptr const& clog) { + TRACE_FUNC(); // Cannot create disputes without our stance XRPL_ASSERT(result_, "xrpl::Consensus::createDisputes : result is set"); // NOLINTBEGIN(bugprone-unchecked-optional-access) assert above @@ -1824,6 +1850,7 @@ template void Consensus::updateDisputes(NodeID_t const& node, TxSet_t const& other) { + TRACE_FUNC(); // Cannot updateDisputes without our stance XRPL_ASSERT(result_, "xrpl::Consensus::updateDisputes : result is set"); // NOLINTBEGIN(bugprone-unchecked-optional-access) assert above @@ -1846,6 +1873,7 @@ template NetClock::time_point Consensus::asCloseTime(NetClock::time_point raw) const { + TRACE_FUNC(); return roundCloseTime(raw, closeResolution_); } diff --git a/src/xrpld/consensus/ConsensusParms.h b/src/xrpld/consensus/ConsensusParms.h index 88a6318b3c..1fc042ffdd 100644 --- a/src/xrpld/consensus/ConsensusParms.h +++ b/src/xrpld/consensus/ConsensusParms.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -156,6 +157,7 @@ getNeededWeight( std::size_t currentRounds, std::size_t minimumRounds) { + TRACE_FUNC(); // at() can throw, but the map is built by hand to ensure all valid // values are available. auto const& currentCutoff = p.avalancheCutoffs.at(currentState); diff --git a/src/xrpld/consensus/ConsensusProposal.h b/src/xrpld/consensus/ConsensusProposal.h index ebfe61711a..cb275f78c8 100644 --- a/src/xrpld/consensus/ConsensusProposal.h +++ b/src/xrpld/consensus/ConsensusProposal.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -76,6 +77,7 @@ public: NodeId const& nodeID() const { + TRACE_FUNC(); return nodeID_; } @@ -83,6 +85,7 @@ public: Position const& position() const { + TRACE_FUNC(); return position_; } @@ -90,6 +93,7 @@ public: LedgerId const& prevLedger() const { + TRACE_FUNC(); return previousLedger_; } @@ -103,6 +107,7 @@ public: std::uint32_t proposeSeq() const { + TRACE_FUNC(); return proposeSeq_; } @@ -110,6 +115,7 @@ public: NetClock::time_point const& closeTime() const { + TRACE_FUNC(); return closeTime_; } @@ -117,6 +123,7 @@ public: NetClock::time_point const& seenTime() const { + TRACE_FUNC(); return time_; } @@ -126,6 +133,7 @@ public: bool isInitial() const { + TRACE_FUNC(); return proposeSeq_ == kSEQ_JOIN; } @@ -133,6 +141,7 @@ public: bool isBowOut() const { + TRACE_FUNC(); return proposeSeq_ == kSEQ_LEAVE; } @@ -140,6 +149,7 @@ public: bool isStale(NetClock::time_point cutoff) const { + TRACE_FUNC(); return time_ <= cutoff; } @@ -156,6 +166,7 @@ public: NetClock::time_point newCloseTime, NetClock::time_point now) { + TRACE_FUNC(); signingHash_.reset(); position_ = newPosition; closeTime_ = newCloseTime; @@ -173,6 +184,7 @@ public: void bowOut(NetClock::time_point now) { + TRACE_FUNC(); signingHash_.reset(); time_ = now; proposeSeq_ = kSEQ_LEAVE; @@ -181,6 +193,7 @@ public: std::string render() const { + TRACE_FUNC(); std::stringstream ss; ss << "proposal: previous_ledger: " << previousLedger_ << " proposal_seq: " << proposeSeq_ << " position: " << position_ << " close_time: " << to_string(closeTime_) @@ -193,6 +206,7 @@ public: json::Value getJson() const { + TRACE_FUNC(); using std::to_string; json::Value ret = json::ObjectValue; @@ -213,6 +227,7 @@ public: uint256 const& signingHash() const { + TRACE_FUNC(); if (!signingHash_) { signingHash_ = sha512Half( @@ -255,6 +270,7 @@ operator==( ConsensusProposal const& a, ConsensusProposal const& b) { + TRACE_FUNC(); return a.nodeID() == b.nodeID() && a.proposeSeq() == b.proposeSeq() && a.prevLedger() == b.prevLedger() && a.position() == b.position() && a.closeTime() == b.closeTime() && a.seenTime() == b.seenTime(); diff --git a/src/xrpld/consensus/ConsensusTypes.h b/src/xrpld/consensus/ConsensusTypes.h index 64a7f5fdea..cda64770ca 100644 --- a/src/xrpld/consensus/ConsensusTypes.h +++ b/src/xrpld/consensus/ConsensusTypes.h @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -51,6 +52,7 @@ enum class ConsensusMode { inline std::string to_string(ConsensusMode m) { + TRACE_FUNC(); switch (m) { case ConsensusMode::Proposing: @@ -98,6 +100,7 @@ enum class ConsensusPhase { inline std::string to_string(ConsensusPhase p) { + TRACE_FUNC(); switch (p) { case ConsensusPhase::Open: @@ -123,18 +126,21 @@ public: [[nodiscard]] std::chrono::milliseconds read() const { + TRACE_FUNC(); return dur_; } void tick(std::chrono::milliseconds fixed) { + TRACE_FUNC(); dur_ += fixed; } void reset(time_point tp) { + TRACE_FUNC(); start_ = tp; dur_ = std::chrono::milliseconds{0}; } @@ -142,6 +148,7 @@ public: void tick(time_point tp) { + TRACE_FUNC(); using namespace std::chrono; dur_ = duration_cast(tp - start_); } diff --git a/src/xrpld/consensus/DisputedTx.h b/src/xrpld/consensus/DisputedTx.h index 795f399d1f..b42ef8fc15 100644 --- a/src/xrpld/consensus/DisputedTx.h +++ b/src/xrpld/consensus/DisputedTx.h @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -43,6 +44,7 @@ public: DisputedTx(Tx tx, bool ourVote, std::size_t numPeers, beast::Journal j) : ourVote_(ourVote), tx_(std::move(tx)), j_(j) { + TRACE_FUNC(); votes_.reserve(numPeers); } @@ -50,6 +52,7 @@ public: [[nodiscard]] TxID_t const& id() const { + TRACE_FUNC(); return tx_.id(); } @@ -57,6 +60,7 @@ public: [[nodiscard]] bool getOurVote() const { + TRACE_FUNC(); return ourVote_; } @@ -70,6 +74,7 @@ public: beast::Journal j, std::unique_ptr const& clog) const { + TRACE_FUNC(); // at() can throw, but the map is built by hand to ensure all valid // values are available. auto const& currentCutoff = p.avalancheCutoffs.at(avalancheState_); @@ -130,6 +135,7 @@ public: [[nodiscard]] Tx const& tx() const { + TRACE_FUNC(); return tx_; } @@ -137,6 +143,7 @@ public: void setOurVote(bool o) { + TRACE_FUNC(); ourVote_ = o; } @@ -196,6 +203,7 @@ template bool DisputedTx::setVote(NodeId const& peer, bool votesYes) { + TRACE_FUNC(); auto const [it, inserted] = votes_.insert(std::make_pair(peer, votesYes)); // new vote @@ -239,6 +247,7 @@ template void DisputedTx::unVote(NodeId const& peer) { + TRACE_FUNC(); auto it = votes_.find(peer); if (it != votes_.end()) @@ -260,6 +269,7 @@ template bool DisputedTx::updateVote(int percentTime, bool proposing, ConsensusParms const& p) { + TRACE_FUNC(); if (ourVote_ && (nays_ == 0)) return false; @@ -318,6 +328,7 @@ template json::Value DisputedTx::getJson() const { + TRACE_FUNC(); using std::to_string; json::Value ret(json::ObjectValue); diff --git a/src/xrpld/consensus/LedgerTrie.h b/src/xrpld/consensus/LedgerTrie.h index 022219f822..bc32ee662d 100644 --- a/src/xrpld/consensus/LedgerTrie.h +++ b/src/xrpld/consensus/LedgerTrie.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -44,6 +45,7 @@ public: [[nodiscard]] ID ancestor(Seq const& s) const { + TRACE_FUNC(); XRPL_ASSERT(s <= seq, "xrpl::SpanTip::ancestor : valid input"); return ledger_[s]; } @@ -87,12 +89,14 @@ public: [[nodiscard]] Seq start() const { + TRACE_FUNC(); return start_; } [[nodiscard]] Seq end() const { + TRACE_FUNC(); return end_; } @@ -100,6 +104,7 @@ public: [[nodiscard]] std::optional from(Seq spot) const { + TRACE_FUNC(); return sub(spot, end_); } @@ -107,6 +112,7 @@ public: [[nodiscard]] std::optional before(Seq spot) const { + TRACE_FUNC(); return sub(start_, spot); } @@ -114,6 +120,7 @@ public: [[nodiscard]] ID startID() const { + TRACE_FUNC(); return ledger_[start_]; } @@ -122,6 +129,7 @@ public: [[nodiscard]] Seq diff(Ledger const& o) const { + TRACE_FUNC(); return clamp(mismatch(ledger_, o)); } @@ -129,6 +137,7 @@ public: [[nodiscard]] SpanTip tip() const { + TRACE_FUNC(); Seq const tipSeq{end_ - Seq{1}}; return SpanTip{tipSeq, ledger_[tipSeq], ledger_}; } @@ -143,6 +152,7 @@ private: [[nodiscard]] Seq clamp(Seq val) const { + TRACE_FUNC(); return std::min(std::max(start_, val), end_); } @@ -150,6 +160,7 @@ private: [[nodiscard]] std::optional sub(Seq from, Seq to) const { + TRACE_FUNC(); Seq const newFrom = clamp(from); Seq const newTo = clamp(to); if (newFrom < newTo) @@ -160,12 +171,14 @@ private: friend std::ostream& operator<<(std::ostream& o, Span const& s) { + TRACE_FUNC(); return o << s.tip().id << "[" << s.start_ << "," << s.end_ << ")"; } friend Span merge(Span const& a, Span const& b) { + TRACE_FUNC(); // Return combined span, using ledger_ from higher sequence span if (a.end_ < b.end_) return Span(std::min(a.start_, b.start_), b.end_, b.ledger_); @@ -204,6 +217,7 @@ struct Node void erase(Node const* child) { + TRACE_FUNC(); auto it = std::find_if( children.begin(), children.end(), [child](std::unique_ptr const& curr) { return curr.get() == child; @@ -216,12 +230,14 @@ struct Node friend std::ostream& operator<<(std::ostream& o, Node const& s) { + TRACE_FUNC(); return o << s.span << "(T:" << s.tipSupport << ",B:" << s.branchSupport << ")"; } [[nodiscard]] json::Value getJson() const { + TRACE_FUNC(); json::Value res; std::stringstream sps; sps << span; @@ -345,6 +361,7 @@ class LedgerTrie [[nodiscard]] std::pair find(Ledger const& ledger) const { + TRACE_FUNC(); // NOLINTNEXTLINE(misc-const-correctness) Node* curr = root_.get(); @@ -384,6 +401,7 @@ class LedgerTrie Node* findByLedgerID(Ledger const& ledger, Node* parent = nullptr) const { + TRACE_FUNC(); if (parent == nullptr) parent = root_.get(); if (ledger.id() == parent->span.tip().id) @@ -400,6 +418,7 @@ class LedgerTrie void dumpImpl(std::ostream& o, std::unique_ptr const& curr, int offset) const { + TRACE_FUNC(); if (curr) { if (offset > 0) @@ -426,6 +445,7 @@ public: void insert(Ledger const& ledger, std::uint32_t count = 1) { + TRACE_FUNC(); auto const [loc, diffSeq] = find(ledger); // There is always a place to insert @@ -512,6 +532,7 @@ public: bool remove(Ledger const& ledger, std::uint32_t count = 1) { + TRACE_FUNC(); Node* loc = findByLedgerID(ledger); // Must be exact match with tip support if ((loc == nullptr) || loc->tipSupport == 0) @@ -570,6 +591,7 @@ public: [[nodiscard]] std::uint32_t tipSupport(Ledger const& ledger) const { + TRACE_FUNC(); if (auto const* loc = findByLedgerID(ledger)) return loc->tipSupport; return 0; @@ -584,6 +606,7 @@ public: [[nodiscard]] std::uint32_t branchSupport(Ledger const& ledger) const { + TRACE_FUNC(); Node const* loc = findByLedgerID(ledger); if (loc == nullptr) { @@ -658,6 +681,7 @@ public: [[nodiscard]] std::optional> getPreferred(Seq const largestIssued) const { + TRACE_FUNC(); if (empty()) return std::nullopt; @@ -761,6 +785,7 @@ public: [[nodiscard]] bool empty() const { + TRACE_FUNC(); return !root_ || root_->branchSupport == 0; } @@ -769,6 +794,7 @@ public: void dump(std::ostream& o) const { + TRACE_FUNC(); dumpImpl(o, root_, 0); } @@ -777,6 +803,7 @@ public: [[nodiscard]] json::Value getJson() const { + TRACE_FUNC(); json::Value res; res["trie"] = root_->getJson(); res["seq_support"] = json::ObjectValue; @@ -790,6 +817,7 @@ public: [[nodiscard]] bool checkInvariants() const { + TRACE_FUNC(); std::map expectedSeqSupport; std::stack nodes; diff --git a/src/xrpld/consensus/Validations.h b/src/xrpld/consensus/Validations.h index 825d0f6076..e440a22a30 100644 --- a/src/xrpld/consensus/Validations.h +++ b/src/xrpld/consensus/Validations.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -98,6 +99,7 @@ public: bool operator()(time_point now, Seq s, ValidationParms const& p) { + TRACE_FUNC(); if (now > (when_ + p.validationSET_EXPIRES)) seq_ = Seq{0}; if (s <= seq_) @@ -110,6 +112,7 @@ public: [[nodiscard]] Seq largest() const { + TRACE_FUNC(); return seq_; } }; @@ -132,6 +135,7 @@ isCurrent( NetClock::time_point signTime, NetClock::time_point seenTime) { + TRACE_FUNC(); // Because this can be called on untrusted, possibly // malicious validations, we do our math in a way // that avoids any chance of overflowing or underflowing @@ -161,6 +165,7 @@ enum class ValStatus { inline std::string to_string(ValStatus m) { + TRACE_FUNC(); switch (m) { case ValStatus::Current: @@ -336,6 +341,7 @@ private: void removeTrie(std::scoped_lock const&, NodeID const& nodeID, Validation const& val) { + TRACE_FUNC(); { auto it = acquiring_.find(std::make_pair(val.seq(), val.ledgerID())); if (it != acquiring_.end()) @@ -359,6 +365,7 @@ private: void checkAcquired(std::scoped_lock const& lock) { + TRACE_FUNC(); for (auto it = acquiring_.begin(); it != acquiring_.end();) { if (std::optional ledger = adaptor_.acquire(it->first.second)) @@ -379,6 +386,7 @@ private: void updateTrie(std::scoped_lock const&, NodeID const& nodeID, Ledger ledger) { + TRACE_FUNC(); auto const [it, inserted] = lastLedger_.emplace(nodeID, ledger); if (!inserted) { @@ -408,6 +416,7 @@ private: Validation const& val, std::optional> prior) { + TRACE_FUNC(); XRPL_ASSERT(val.trusted(), "xrpl::Validations::updateTrie : trusted input validation"); // Clear any prior acquiring ledger for this node @@ -459,6 +468,7 @@ private: auto withTrie(std::scoped_lock const& lock, F&& f) { + TRACE_FUNC(); // Call current to flush any stale validations current(lock, [](auto) {}, [](auto, auto) {}); checkAcquired(lock); @@ -485,6 +495,7 @@ private: void current(std::scoped_lock const& lock, Pre&& pre, F&& f) { + TRACE_FUNC(); NetClock::time_point const t = adaptor_.now(); pre(current_.size()); auto it = current_.begin(); @@ -522,6 +533,7 @@ private: void byLedger(std::scoped_lock const&, ID const& ledgerID, Pre&& pre, F&& f) { + TRACE_FUNC(); auto it = byLedger_.find(ledgerID); if (it != byLedger_.end()) { @@ -554,6 +566,7 @@ public: Adaptor const& adaptor() const { + TRACE_FUNC(); return adaptor_; } @@ -562,6 +575,7 @@ public: ValidationParms const& parms() const { + TRACE_FUNC(); return parms_; } @@ -575,6 +589,7 @@ public: bool canValidateSeq(Seq const s) { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; return localSeqEnforcer_(byLedger_.clock().now(), s, parms_); } @@ -590,6 +605,7 @@ public: ValStatus add(NodeID const& nodeID, Validation const& val) { + TRACE_FUNC(); if (!isCurrent(parms_, adaptor_.now(), val.signTime(), val.seenTime())) return ValStatus::Stale; @@ -682,6 +698,7 @@ public: void setSeqToKeep(Seq const& low, Seq const& high) { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; XRPL_ASSERT(low < high, "xrpl::Validations::setSeqToKeep : valid inputs"); toKeep_ = {low, high}; @@ -695,6 +712,7 @@ public: void expire(beast::Journal& j) { + TRACE_FUNC(); auto const start = std::chrono::steady_clock::now(); { std::scoped_lock const lock{mutex_}; @@ -754,6 +772,7 @@ public: void trustChanged(hash_set const& added, hash_set const& removed) { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; for (auto& [nodeId, validation] : current_) @@ -790,6 +809,7 @@ public: json::Value getJsonTrie() const { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; return trie_.getJson(); } @@ -809,6 +829,7 @@ public: std::optional> getPreferred(Ledger const& curr) { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; std::optional> preferred = withTrie(lock, [this](LedgerTrie& trie) { return trie.getPreferred(localSeqEnforcer_.largest()); @@ -863,6 +884,7 @@ public: ID getPreferred(Ledger const& curr, Seq minValidSeq) { + TRACE_FUNC(); std::optional> preferred = getPreferred(curr); if (preferred && preferred->first >= minValidSeq) return preferred->second; @@ -888,6 +910,7 @@ public: ID getPreferredLCL(Ledger const& lcl, Seq minSeq, hash_map const& peerCounts) { + TRACE_FUNC(); std::optional> preferred = getPreferred(lcl); // Trusted validations exist, but stick with local preferred ledger if @@ -921,6 +944,7 @@ public: std::size_t getNodesAfter(Ledger const& ledger, ID const& ledgerID) { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; // Use trie if ledger is the right one @@ -945,6 +969,7 @@ public: std::vector currentTrusted() { + TRACE_FUNC(); std::vector ret; std::scoped_lock const lock{mutex_}; current( @@ -964,6 +989,7 @@ public: auto getCurrentNodeIDs() -> hash_set { + TRACE_FUNC(); hash_set ret; std::scoped_lock const lock{mutex_}; current( @@ -982,6 +1008,7 @@ public: std::size_t numTrustedForLedger(ID const& ledgerID) { + TRACE_FUNC(); std::size_t count = 0; std::scoped_lock const lock{mutex_}; byLedger( @@ -1004,6 +1031,7 @@ public: std::vector getTrustedForLedger(ID const& ledgerID, Seq const& seq) { + TRACE_FUNC(); std::vector res; std::scoped_lock const lock{mutex_}; byLedger( @@ -1027,6 +1055,7 @@ public: std::vector fees(ID const& ledgerID, std::uint32_t baseFee) { + TRACE_FUNC(); std::vector res; std::scoped_lock const lock{mutex_}; byLedger( @@ -1055,6 +1084,7 @@ public: void flush() { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; current_.clear(); } @@ -1077,6 +1107,7 @@ public: std::size_t laggards(Seq const seq, hash_set& trustedKeys) { + TRACE_FUNC(); std::size_t laggards = 0; current( @@ -1098,6 +1129,7 @@ public: std::size_t sizeOfCurrentCache() const { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; return current_.size(); } @@ -1105,6 +1137,7 @@ public: std::size_t sizeOfSeqEnforcersCache() const { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; return seqEnforcers_.size(); } @@ -1112,6 +1145,7 @@ public: std::size_t sizeOfByLedgerCache() const { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; return byLedger_.size(); } @@ -1119,6 +1153,7 @@ public: std::size_t sizeOfBySequenceCache() const { + TRACE_FUNC(); std::scoped_lock const lock{mutex_}; return bySequence_.size(); } diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 10fbadaae7..a3e32b7a06 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -8,6 +8,7 @@ #include #include // VFALCO Breaks levelization #include +#include #include // VFALCO FIX: This include should not be here @@ -63,6 +64,7 @@ struct FeeSetup [[nodiscard]] Fees toFees() const { + TRACE_FUNC(); return Fees{reference_fee, account_reserve, owner_reserve}; } }; @@ -305,28 +307,33 @@ public: [[nodiscard]] bool quiet() const { + TRACE_FUNC(); return QUIET_; } [[nodiscard]] bool silent() const { + TRACE_FUNC(); return SILENT_; } [[nodiscard]] bool standalone() const { + TRACE_FUNC(); return RUN_STANDALONE_; } [[nodiscard]] bool useTxTables() const { + TRACE_FUNC(); return USE_TX_TABLES_; } [[nodiscard]] bool canSign() const { + TRACE_FUNC(); return signingEnabled_; } @@ -353,6 +360,7 @@ public: [[nodiscard]] beast::Journal journal() const { + TRACE_FUNC(); return j_; } }; diff --git a/src/xrpld/core/ConfigSections.h b/src/xrpld/core/ConfigSections.h index 7f22dd59c1..40bea21af0 100644 --- a/src/xrpld/core/ConfigSections.h +++ b/src/xrpld/core/ConfigSections.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace xrpl { @@ -12,11 +13,13 @@ struct ConfigSection static std::string nodeDatabase() { + TRACE_FUNC(); return "node_db"; } static std::string importNodeDatabase() { + TRACE_FUNC(); return "import_db"; } }; diff --git a/src/xrpld/core/TimeKeeper.h b/src/xrpld/core/TimeKeeper.h index a21f5aa6e8..fc95e39256 100644 --- a/src/xrpld/core/TimeKeeper.h +++ b/src/xrpld/core/TimeKeeper.h @@ -2,6 +2,7 @@ #include #include +#include #include @@ -43,6 +44,7 @@ public: [[nodiscard]] time_point now() const override { + TRACE_FUNC(); return adjust(std::chrono::system_clock::now()); } @@ -55,6 +57,7 @@ public: [[nodiscard]] time_point closeTime() const { + TRACE_FUNC(); return now() + closeOffset_.load(); } @@ -62,6 +65,7 @@ public: [[nodiscard]] std::chrono::seconds closeOffset() const { + TRACE_FUNC(); return closeOffset_.load(); } @@ -69,6 +73,7 @@ public: std::chrono::seconds adjustCloseTime(std::chrono::seconds by) { + TRACE_FUNC(); using namespace std::chrono_literals; auto offset = closeOffset_.load(); diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index 11ee43e9cc..4bc8ff01d9 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,7 @@ namespace xrpl::detail { [[nodiscard]] std::uint64_t getMemorySize() { + TRACE_FUNC(); if (MEMORYSTATUSEX msx{sizeof(MEMORYSTATUSEX)}; GlobalMemoryStatusEx(&msx)) return static_cast(msx.ullTotalPhys); @@ -77,6 +79,7 @@ namespace xrpl::detail { [[nodiscard]] std::uint64_t getMemorySize() { + TRACE_FUNC(); if (struct sysinfo si{}; sysinfo(&si) == 0) return static_cast(si.totalram) * si.mem_unit; @@ -95,6 +98,7 @@ namespace xrpl::detail { [[nodiscard]] std::uint64_t getMemorySize() { + TRACE_FUNC(); int mib[] = {CTL_HW, HW_MEMSIZE}; std::int64_t ram = 0; size_t size = sizeof(ram); @@ -164,6 +168,7 @@ static_assert( IniFileSections parseIniFile(std::string const& strInput, bool const bTrim) { + TRACE_FUNC(); std::string strData(strInput); std::vector vLines; IniFileSections secResult; @@ -212,6 +217,7 @@ parseIniFile(std::string const& strInput, bool const bTrim) IniFileSections::mapped_type* getIniFileSection(IniFileSections& secSource, std::string const& strSection) { + TRACE_FUNC(); if (auto it = secSource.find(strSection); it != secSource.end()) return &(it->second); @@ -225,6 +231,7 @@ getSingleSection( std::string& strValue, beast::Journal j) { + TRACE_FUNC(); auto const pmtEntries = getIniFileSection(secSource, strSection); if ((pmtEntries != nullptr) && pmtEntries->size() == 1) @@ -256,6 +263,7 @@ char const* const Config::kVALIDATORS_FILE_NAME = "validators.txt"; [[nodiscard]] static std::string getEnvVar(char const* name) { + TRACE_FUNC(); std::string value; if (auto const v = std::getenv(name); v != nullptr) @@ -272,6 +280,7 @@ Config::Config() void Config::setupControl(bool bQuiet, bool bSilent, bool bStandalone) { + TRACE_FUNC(); XRPL_ASSERT(NODE_SIZE == 0, "xrpl::Config::setupControl : node size not set"); QUIET_ = bQuiet || bSilent; @@ -307,6 +316,7 @@ Config::setupControl(bool bQuiet, bool bSilent, bool bStandalone) void Config::setup(std::string const& strConf, bool bQuiet, bool bSilent, bool bStandalone) { + TRACE_FUNC(); setupControl(bQuiet, bSilent, bStandalone); // Determine the config and data directories. @@ -425,6 +435,7 @@ Config::setup(std::string const& strConf, bool bQuiet, bool bSilent, bool bStand static void checkZeroPorts(Config const& config) { + TRACE_FUNC(); if (!config.exists("server")) return; @@ -451,6 +462,7 @@ checkZeroPorts(Config const& config) void Config::load() { + TRACE_FUNC(); // NOTE: this writes to cerr because we want cout to be reserved // for the writing of the json response (so that stdout can be part of a // pipeline, for instance) @@ -474,6 +486,7 @@ Config::load() void Config::loadFromString(std::string const& fileContents) { + TRACE_FUNC(); IniFileSections secConfig = parseIniFile(fileContents, true); build(secConfig); @@ -1138,6 +1151,7 @@ Config::loadFromString(std::string const& fileContents) boost::filesystem::path Config::getDebugLogFile() const { + TRACE_FUNC(); auto logFile = DEBUG_LOGFILE_; if (!logFile.empty() && !logFile.is_absolute()) @@ -1172,6 +1186,7 @@ Config::getDebugLogFile() const int Config::getValueFor(SizedItem item, std::optional node) const { + TRACE_FUNC(); auto const index = static_cast>(item); XRPL_ASSERT(index < kSIZED_ITEMS.size(), "xrpl::Config::getValueFor : valid index input"); XRPL_ASSERT(!node || *node <= 4, "xrpl::Config::getValueFor : unset or valid node"); @@ -1181,6 +1196,7 @@ Config::getValueFor(SizedItem item, std::optional node) const FeeSetup setupFeeVote(Section const& section) { + TRACE_FUNC(); FeeSetup setup; { std::uint64_t temp = 0; @@ -1201,6 +1217,7 @@ setupFeeVote(Section const& section) DatabaseCon::Setup setupDatabaseCon(Config const& c, std::optional j) { + TRACE_FUNC(); DatabaseCon::Setup setup; setup.startUp = c.START_UP; diff --git a/src/xrpld/core/detail/NetworkIDServiceImpl.cpp b/src/xrpld/core/detail/NetworkIDServiceImpl.cpp index 38e72a4db6..01a7e0aa4b 100644 --- a/src/xrpld/core/detail/NetworkIDServiceImpl.cpp +++ b/src/xrpld/core/detail/NetworkIDServiceImpl.cpp @@ -1,4 +1,5 @@ #include +#include #include @@ -11,6 +12,7 @@ NetworkIDServiceImpl::NetworkIDServiceImpl(std::uint32_t networkID) : networkID_ std::uint32_t NetworkIDServiceImpl::getNetworkID() const noexcept { + TRACE_FUNC(); return networkID_; } diff --git a/src/xrpld/overlay/Cluster.h b/src/xrpld/overlay/Cluster.h index 982f11aaae..3229df4e36 100644 --- a/src/xrpld/overlay/Cluster.h +++ b/src/xrpld/overlay/Cluster.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -25,18 +26,21 @@ private: bool operator()(ClusterNode const& lhs, ClusterNode const& rhs) const { + TRACE_FUNC(); return lhs.identity() < rhs.identity(); } bool operator()(ClusterNode const& lhs, PublicKey const& rhs) const { + TRACE_FUNC(); return lhs.identity() < rhs; } bool operator()(PublicKey const& lhs, ClusterNode const& rhs) const { + TRACE_FUNC(); return lhs < rhs.identity(); } }; diff --git a/src/xrpld/overlay/ClusterNode.h b/src/xrpld/overlay/ClusterNode.h index 16c8062840..881159ac51 100644 --- a/src/xrpld/overlay/ClusterNode.h +++ b/src/xrpld/overlay/ClusterNode.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -26,24 +27,28 @@ public: [[nodiscard]] std::string const& name() const { + TRACE_FUNC(); return name_; } [[nodiscard]] std::uint32_t getLoadFee() const { + TRACE_FUNC(); return loadFee_; } [[nodiscard]] NetClock::time_point getReportTime() const { + TRACE_FUNC(); return reportTime_; } [[nodiscard]] PublicKey const& identity() const { + TRACE_FUNC(); return identity_; } diff --git a/src/xrpld/overlay/Compression.h b/src/xrpld/overlay/Compression.h index 91417913e3..cdbebb0f04 100644 --- a/src/xrpld/overlay/Compression.h +++ b/src/xrpld/overlay/Compression.h @@ -2,6 +2,7 @@ #include #include +#include namespace xrpl::compression { @@ -31,6 +32,7 @@ decompress( std::size_t decompressedSize, Algorithm algorithm = Algorithm::LZ4) { + TRACE_FUNC(); try { if (algorithm == Algorithm::LZ4) @@ -70,6 +72,7 @@ compress( BufferFactory&& bf, Algorithm algorithm = Algorithm::LZ4) { + TRACE_FUNC(); try { if (algorithm == Algorithm::LZ4) diff --git a/src/xrpld/overlay/Message.h b/src/xrpld/overlay/Message.h index 7c2701d443..4404661ea0 100644 --- a/src/xrpld/overlay/Message.h +++ b/src/xrpld/overlay/Message.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -66,6 +67,7 @@ public: std::size_t getCategory() const { + TRACE_FUNC(); return category_; } @@ -73,6 +75,7 @@ public: std::optional const& getValidatorKey() const { + TRACE_FUNC(); return validatorKey_; } diff --git a/src/xrpld/overlay/Overlay.h b/src/xrpld/overlay/Overlay.h index 80430293d8..568e08086a 100644 --- a/src/xrpld/overlay/Overlay.h +++ b/src/xrpld/overlay/Overlay.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -164,6 +165,7 @@ public: void foreach(Function f) const { + TRACE_FUNC(); for (auto const& p : getActivePeers()) f(p); } diff --git a/src/xrpld/overlay/PeerSet.h b/src/xrpld/overlay/PeerSet.h index f50b7130f4..569c1c5322 100644 --- a/src/xrpld/overlay/PeerSet.h +++ b/src/xrpld/overlay/PeerSet.h @@ -3,6 +3,7 @@ #include #include #include +#include namespace xrpl { @@ -38,6 +39,7 @@ public: void sendRequest(MessageType const& message, std::shared_ptr const& peer) { + TRACE_FUNC(); this->sendRequest(message, protocolMessageType(message), peer); } diff --git a/src/xrpld/overlay/Slot.h b/src/xrpld/overlay/Slot.h index 26be3946c1..fe967693a6 100644 --- a/src/xrpld/overlay/Slot.h +++ b/src/xrpld/overlay/Slot.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,7 @@ template Unit epoch(TP const& t) { + TRACE_FUNC(); return std::chrono::duration_cast(t.time_since_epoch()); } @@ -144,6 +146,7 @@ private: [[nodiscard]] time_point const& getLastSelected() const { + TRACE_FUNC(); return lastSelected_; } @@ -159,6 +162,7 @@ private: [[nodiscard]] SlotState getState() const { + TRACE_FUNC(); return state_; } @@ -232,6 +236,7 @@ template void Slot::deleteIdlePeer(PublicKey const& validator) { + TRACE_FUNC(); using namespace std::chrono; auto now = ClockType::now(); for (auto it = peers_.begin(); it != peers_.end();) @@ -258,6 +263,7 @@ Slot::update( protocol::MessageType type, ignored_squelch_callback callback) { + TRACE_FUNC(); using namespace std::chrono; auto now = ClockType::now(); auto it = peers_.find(id); @@ -388,6 +394,7 @@ template std::chrono::seconds Slot::getSquelchDuration(std::size_t npeers) { + TRACE_FUNC(); using namespace std::chrono; auto m = std::max(kMAX_UNSQUELCH_EXPIRE_DEFAULT, seconds{kSQUELCH_PER_PEER * npeers}); if (m > kMAX_UNSQUELCH_EXPIRE_PEERS) @@ -402,6 +409,7 @@ template void Slot::deletePeer(PublicKey const& validator, id_t id, bool erase) { + TRACE_FUNC(); auto it = peers_.find(id); if (it != peers_.end()) { @@ -449,6 +457,7 @@ template void Slot::resetCounts() { + TRACE_FUNC(); for (auto& [_, peer] : peers_) { (void)_; @@ -460,6 +469,7 @@ template void Slot::initCounting() { + TRACE_FUNC(); state_ = SlotState::Counting; considered_.clear(); reachedThreshold_ = 0; @@ -470,6 +480,7 @@ template std::uint16_t Slot::inState(PeerState state) const { + TRACE_FUNC(); return std::count_if( peers_.begin(), peers_.end(), [&](auto const& it) { return (it.second.state == state); }); } @@ -478,6 +489,7 @@ template std::uint16_t Slot::notInState(PeerState state) const { + TRACE_FUNC(); return std::count_if( peers_.begin(), peers_.end(), [&](auto const& it) { return (it.second.state != state); }); } @@ -486,6 +498,7 @@ template std::set Slot::getSelected() const { + TRACE_FUNC(); std::set r; for (auto const& [id, info] : peers_) { @@ -499,6 +512,7 @@ template std::unordered_map> Slot::getPeers() const { + TRACE_FUNC(); using namespace std::chrono; auto r = std:: unordered_map>(); @@ -554,6 +568,7 @@ public: bool baseSquelchReady() { + TRACE_FUNC(); return baseSquelchEnabled_ && reduceRelayReady(); } @@ -561,6 +576,7 @@ public: bool reduceRelayReady() { + TRACE_FUNC(); if (!reduceRelayReady_) { reduceRelayReady_ = reduce_relay::epoch(ClockType::now()) > @@ -584,6 +600,7 @@ public: id_t id, protocol::MessageType type) { + TRACE_FUNC(); updateSlotAndSquelch(key, validator, id, type, []() {}); } @@ -612,6 +629,7 @@ public: [[nodiscard]] std::optional inState(PublicKey const& validator, PeerState state) const { + TRACE_FUNC(); auto const& it = slots_.find(validator); if (it != slots_.end()) return it->second.inState(state); @@ -622,6 +640,7 @@ public: [[nodiscard]] std::optional notInState(PublicKey const& validator, PeerState state) const { + TRACE_FUNC(); auto const& it = slots_.find(validator); if (it != slots_.end()) return it->second.notInState(state); @@ -632,6 +651,7 @@ public: [[nodiscard]] bool inState(PublicKey const& validator, SlotState state) const { + TRACE_FUNC(); auto const& it = slots_.find(validator); if (it != slots_.end()) return it->second.state_ == state; @@ -642,6 +662,7 @@ public: std::set getSelected(PublicKey const& validator) { + TRACE_FUNC(); auto const& it = slots_.find(validator); if (it != slots_.end()) return it->second.getSelected(); @@ -655,6 +676,7 @@ public: unordered_map> getPeers(PublicKey const& validator) { + TRACE_FUNC(); auto const& it = slots_.find(validator); if (it != slots_.end()) return it->second.getPeers(); @@ -665,6 +687,7 @@ public: std::optional getState(PublicKey const& validator) { + TRACE_FUNC(); auto const& it = slots_.find(validator); if (it != slots_.end()) return it->second.getState(); @@ -708,6 +731,7 @@ template bool Slots::addPeerMessage(uint256 const& key, id_t id) { + TRACE_FUNC(); beast::expire(peersWithMessage, reduce_relay::kIDLED); if (key.isNonZero()) @@ -744,6 +768,7 @@ Slots::updateSlotAndSquelch( protocol::MessageType type, typename Slot::ignored_squelch_callback callback) { + TRACE_FUNC(); if (!addPeerMessage(key, id)) return; @@ -769,6 +794,7 @@ template void Slots::deletePeer(id_t id, bool erase) { + TRACE_FUNC(); for (auto& [validator, slot] : slots_) slot.deletePeer(validator, id, erase); } @@ -777,6 +803,7 @@ template void Slots::deleteIdlePeers() { + TRACE_FUNC(); auto now = ClockType::now(); for (auto it = slots_.begin(); it != slots_.end();) diff --git a/src/xrpld/overlay/Squelch.h b/src/xrpld/overlay/Squelch.h index 21a1b228a1..7b0e0f0a6c 100644 --- a/src/xrpld/overlay/Squelch.h +++ b/src/xrpld/overlay/Squelch.h @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -56,6 +57,7 @@ Squelch::addSquelch( PublicKey const& validator, std::chrono::seconds const& squelchDuration) { + TRACE_FUNC(); if (squelchDuration >= kMIN_UNSQUELCH_EXPIRE && squelchDuration <= kMAX_UNSQUELCH_EXPIRE_PEERS) { squelched_[validator] = ClockType::now() + squelchDuration; @@ -74,6 +76,7 @@ template void Squelch::removeSquelch(PublicKey const& validator) { + TRACE_FUNC(); squelched_.erase(validator); } @@ -81,6 +84,7 @@ template bool Squelch::expireSquelch(PublicKey const& validator) { + TRACE_FUNC(); auto now = ClockType::now(); auto const& it = squelched_.find(validator); diff --git a/src/xrpld/overlay/detail/Cluster.cpp b/src/xrpld/overlay/detail/Cluster.cpp index dcb40a54f5..0117ed4eb4 100644 --- a/src/xrpld/overlay/detail/Cluster.cpp +++ b/src/xrpld/overlay/detail/Cluster.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ Cluster::Cluster(beast::Journal j) : j_(j) std::optional Cluster::member(PublicKey const& identity) const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); auto iter = nodes_.find(identity); @@ -40,6 +42,7 @@ Cluster::member(PublicKey const& identity) const std::size_t Cluster::size() const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); return nodes_.size(); @@ -52,6 +55,7 @@ Cluster::update( std::uint32_t loadFee, NetClock::time_point reportTime) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); auto iter = nodes_.find(identity); @@ -74,6 +78,7 @@ Cluster::update( void Cluster::forEach(std::function func) const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); for (auto const& ni : nodes_) func(ni); @@ -82,6 +87,7 @@ Cluster::forEach(std::function func) const bool Cluster::load(Section const& nodes) { + TRACE_FUNC(); static boost::regex const kRE( "[[:space:]]*" // skip leading whitespace "([[:alnum:]]+)" // node identity diff --git a/src/xrpld/overlay/detail/ConnectAttempt.cpp b/src/xrpld/overlay/detail/ConnectAttempt.cpp index c83478ce1e..26060c79e0 100644 --- a/src/xrpld/overlay/detail/ConnectAttempt.cpp +++ b/src/xrpld/overlay/detail/ConnectAttempt.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -78,6 +79,7 @@ ConnectAttempt::ConnectAttempt( ConnectAttempt::~ConnectAttempt() { + TRACE_FUNC(); // slot_ will be null if we successfully connected // and transferred ownership to a PeerImp if (slot_ != nullptr) @@ -87,6 +89,7 @@ ConnectAttempt::~ConnectAttempt() void ConnectAttempt::stop() { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { boost::asio::post(strand_, std::bind(&ConnectAttempt::stop, shared_from_this())); @@ -104,6 +107,7 @@ ConnectAttempt::stop() void ConnectAttempt::run() { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { boost::asio::post(strand_, std::bind(&ConnectAttempt::run, shared_from_this())); @@ -129,6 +133,7 @@ ConnectAttempt::run() void ConnectAttempt::shutdown() { + TRACE_FUNC(); XRPL_ASSERT( strand_.running_in_this_thread(), "xrpl::ConnectAttempt::shutdown: strand in this thread"); @@ -144,6 +149,7 @@ ConnectAttempt::shutdown() void ConnectAttempt::tryAsyncShutdown() { + TRACE_FUNC(); XRPL_ASSERT( strand_.running_in_this_thread(), "xrpl::ConnectAttempt::tryAsyncShutdown : strand in this thread"); @@ -170,6 +176,7 @@ ConnectAttempt::tryAsyncShutdown() void ConnectAttempt::onShutdown(error_code ec) { + TRACE_FUNC(); cancelTimer(); if (ec) @@ -196,6 +203,7 @@ ConnectAttempt::onShutdown(error_code ec) void ConnectAttempt::close() { + TRACE_FUNC(); XRPL_ASSERT( strand_.running_in_this_thread(), "xrpl::ConnectAttempt::close : strand in this thread"); if (!socket_.is_open()) @@ -210,6 +218,7 @@ ConnectAttempt::close() void ConnectAttempt::fail(std::string const& reason) { + TRACE_FUNC(); JLOG(journal_.debug()) << reason; shutdown(); } @@ -217,6 +226,7 @@ ConnectAttempt::fail(std::string const& reason) void ConnectAttempt::fail(std::string const& name, error_code ec) { + TRACE_FUNC(); JLOG(journal_.debug()) << name << ": " << ec.message(); shutdown(); } @@ -224,6 +234,7 @@ ConnectAttempt::fail(std::string const& name, error_code ec) void ConnectAttempt::setTimer(ConnectionStep step) { + TRACE_FUNC(); currentStep_ = step; // Set global timer (only if not already set) @@ -293,6 +304,7 @@ ConnectAttempt::setTimer(ConnectionStep step) void ConnectAttempt::cancelTimer() { + TRACE_FUNC(); try { timer_.cancel(); @@ -307,6 +319,7 @@ ConnectAttempt::cancelTimer() void ConnectAttempt::onTimer(error_code ec) { + TRACE_FUNC(); if (!socket_.is_open()) return; @@ -346,6 +359,7 @@ ConnectAttempt::onTimer(error_code ec) void ConnectAttempt::onConnect(error_code ec) { + TRACE_FUNC(); ioPending_ = false; if (ec) @@ -392,6 +406,7 @@ ConnectAttempt::onConnect(error_code ec) void ConnectAttempt::onHandshake(error_code ec) { + TRACE_FUNC(); ioPending_ = false; if (ec) @@ -464,6 +479,7 @@ ConnectAttempt::onHandshake(error_code ec) void ConnectAttempt::onWrite(error_code ec) { + TRACE_FUNC(); ioPending_ = false; if (ec) @@ -500,6 +516,7 @@ ConnectAttempt::onWrite(error_code ec) void ConnectAttempt::onRead(error_code ec) { + TRACE_FUNC(); cancelTimer(); ioPending_ = false; currentStep_ = ConnectionStep::Complete; @@ -537,6 +554,7 @@ ConnectAttempt::onRead(error_code ec) void ConnectAttempt::processResponse() { + TRACE_FUNC(); if (!OverlayImpl::isPeerUpgrade(response_)) { // A peer may respond with service_unavailable and a list of alternative diff --git a/src/xrpld/overlay/detail/ConnectAttempt.h b/src/xrpld/overlay/detail/ConnectAttempt.h index 70ce7912ba..26d82c6d0b 100644 --- a/src/xrpld/overlay/detail/ConnectAttempt.h +++ b/src/xrpld/overlay/detail/ConnectAttempt.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include @@ -232,6 +233,7 @@ private: static std::string stepToString(ConnectionStep step) { + TRACE_FUNC(); switch (step) { case ConnectionStep::Init: @@ -256,6 +258,7 @@ private: static boost::asio::ip::tcp::endpoint parseEndpoint(std::string const& s, boost::system::error_code& ec) { + TRACE_FUNC(); beast::IP::Endpoint bep; std::istringstream is(s); is >> bep; diff --git a/src/xrpld/overlay/detail/Handshake.cpp b/src/xrpld/overlay/detail/Handshake.cpp index af0585f8ad..8f5102796c 100644 --- a/src/xrpld/overlay/detail/Handshake.cpp +++ b/src/xrpld/overlay/detail/Handshake.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -50,6 +51,7 @@ namespace xrpl { std::optional getFeatureValue(boost::beast::http::fields const& headers, std::string const& feature) { + TRACE_FUNC(); auto const header = headers.find("X-Protocol-Ctl"); if (header == headers.end()) return {}; @@ -67,6 +69,7 @@ isFeatureValue( std::string const& feature, std::string const& value) { + TRACE_FUNC(); if (auto const fvalue = getFeatureValue(headers, feature)) return beast::rfc2616::tokenInList(fvalue.value(), value); @@ -76,6 +79,7 @@ isFeatureValue( bool featureEnabled(boost::beast::http::fields const& headers, std::string const& feature) { + TRACE_FUNC(); return isFeatureValue(headers, feature, "1"); } @@ -86,6 +90,7 @@ makeFeaturesRequestHeader( bool txReduceRelayEnabled, bool vpReduceRelayEnabled) { + TRACE_FUNC(); std::stringstream str; if (comprEnabled) str << kFEATURE_COMPR << "=lz4" << kDELIM_FEATURE; @@ -106,6 +111,7 @@ makeFeaturesResponseHeader( bool txReduceRelayEnabled, bool vpReduceRelayEnabled) { + TRACE_FUNC(); std::stringstream str; if (comprEnabled && isFeatureValue(headers, kFEATURE_COMPR, "lz4")) str << kFEATURE_COMPR << "=lz4" << kDELIM_FEATURE; @@ -135,6 +141,7 @@ makeFeaturesResponseHeader( static std::optional> hashLastMessage(SSL const* ssl, size_t (*get)(const SSL*, void*, size_t)) { + TRACE_FUNC(); constexpr std::size_t kSSL_MINIMUM_FINISHED_LENGTH = 12; unsigned char buf[1024]; @@ -153,6 +160,7 @@ hashLastMessage(SSL const* ssl, size_t (*get)(const SSL*, void*, size_t)) std::optional makeSharedValue(stream_type& ssl, beast::Journal journal) { + TRACE_FUNC(); auto const cookie1 = hashLastMessage(ssl.native_handle(), SSL_get_finished); if (!cookie1) { @@ -189,6 +197,7 @@ buildHandshake( beast::IP::Address remoteIp, Application& app) { + TRACE_FUNC(); if (networkID) { // The network identifier, if configured, can be used to specify @@ -234,6 +243,7 @@ verifyHandshake( beast::IP::Address remote, Application& app) { + TRACE_FUNC(); if (auto const iter = headers.find("Server-Domain"); iter != headers.end()) { if (!isProperlyFormedTomlDomain(iter->value())) @@ -369,6 +379,7 @@ makeRequest( bool txReduceRelayEnabled, bool vpReduceRelayEnabled) -> request_type { + TRACE_FUNC(); request_type m; m.method(boost::beast::http::verb::get); m.target("/"); @@ -396,6 +407,7 @@ makeResponse( ProtocolVersion protocol, Application& app) { + TRACE_FUNC(); http_response_type resp; resp.result(boost::beast::http::status::switching_protocols); resp.version(req.version()); diff --git a/src/xrpld/overlay/detail/Handshake.h b/src/xrpld/overlay/detail/Handshake.h index 77a346477f..64a48ae269 100644 --- a/src/xrpld/overlay/detail/Handshake.h +++ b/src/xrpld/overlay/detail/Handshake.h @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -174,6 +175,7 @@ peerFeatureEnabled( std::string value, bool config) { + TRACE_FUNC(); return config && isFeatureValue(request, feature, value); } @@ -182,6 +184,7 @@ template bool peerFeatureEnabled(Headers const& request, std::string const& feature, bool config) { + TRACE_FUNC(); return config && peerFeatureEnabled(request, feature, "1", config); } diff --git a/src/xrpld/overlay/detail/Message.cpp b/src/xrpld/overlay/detail/Message.cpp index 30f4c281ed..a91f33e119 100644 --- a/src/xrpld/overlay/detail/Message.cpp +++ b/src/xrpld/overlay/detail/Message.cpp @@ -5,6 +5,7 @@ #include #include +#include #include @@ -25,6 +26,7 @@ Message::Message( : category_(static_cast(TrafficCount::categorize(message, type, false))) , validatorKey_(validator) { + TRACE_FUNC(); using namespace xrpl::compression; auto const messageBytes = messageSize(message); @@ -47,6 +49,7 @@ Message::Message( std::size_t Message::messageSize(::google::protobuf::Message const& message) { + TRACE_FUNC(); #if defined(GOOGLE_PROTOBUF_VERSION) && (GOOGLE_PROTOBUF_VERSION >= 3011000) return message.ByteSizeLong(); #else @@ -58,12 +61,14 @@ Message::messageSize(::google::protobuf::Message const& message) std::size_t Message::totalSize(::google::protobuf::Message const& message) { + TRACE_FUNC(); return messageSize(message) + compression::kHEADER_BYTES; } void Message::compress() { + TRACE_FUNC(); using namespace xrpl::compression; auto const messageBytes = buffer_.size() - kHEADER_BYTES; @@ -170,6 +175,7 @@ Message::setHeader( Algorithm compression, std::uint32_t uncompressedBytes) { + TRACE_FUNC(); auto h = in; auto pack = [](std::uint8_t*& in, std::uint32_t size) { @@ -194,12 +200,14 @@ Message::setHeader( std::size_t Message::getBufferSize() { + TRACE_FUNC(); return buffer_.size(); } std::vector const& Message::getBuffer(Compressed tryCompressed) { + TRACE_FUNC(); if (tryCompressed == Compressed::Off) return buffer_; @@ -216,6 +224,7 @@ Message::getBuffer(Compressed tryCompressed) int Message::getType(std::uint8_t const* in) { + TRACE_FUNC(); int const type = (static_cast(*(in + 4)) << 8) + *(in + 5); return type; } diff --git a/src/xrpld/overlay/detail/OverlayImpl.cpp b/src/xrpld/overlay/detail/OverlayImpl.cpp index e21d00a1e7..e33215b680 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.cpp +++ b/src/xrpld/overlay/detail/OverlayImpl.cpp @@ -50,6 +50,7 @@ #include #include #include +#include #include #include @@ -111,6 +112,7 @@ OverlayImpl::Child::Child(OverlayImpl& overlay) : overlay_(overlay) OverlayImpl::Child::~Child() { + TRACE_FUNC(); overlay_.remove(*this); } @@ -123,6 +125,7 @@ OverlayImpl::Timer::Timer(OverlayImpl& overlay) : Child(overlay), timer(overlay_ void OverlayImpl::Timer::stop() { + TRACE_FUNC(); // This method is only ever called from the same strand that calls // Timer::on_timer, ensuring they never execute concurrently. stopping = true; @@ -132,6 +135,7 @@ OverlayImpl::Timer::stop() void OverlayImpl::Timer::asyncWait() { + TRACE_FUNC(); timer.expires_after(std::chrono::seconds(1)); timer.async_wait( boost::asio::bind_executor( @@ -142,6 +146,7 @@ OverlayImpl::Timer::asyncWait() void OverlayImpl::Timer::onTimer(error_code ec) { + TRACE_FUNC(); if (ec || stopping) { if (ec && ec != boost::asio::error::operation_aborted) @@ -204,6 +209,7 @@ OverlayImpl::OverlayImpl( return ret; }()) { + TRACE_FUNC(); beast::PropertyStream::Source::add(peerFinder_.get()); } @@ -213,6 +219,7 @@ OverlayImpl::onHandoff( http_request_type&& request, endpoint_type remoteEndpoint) { + TRACE_FUNC(); auto const id = next_id_++; auto peerJournal = app_.getJournal("Peer"); beast::WrappedSink sink(peerJournal.sink(), makePrefix(id)); @@ -365,6 +372,7 @@ OverlayImpl::onHandoff( bool OverlayImpl::isPeerUpgrade(http_request_type const& request) { + TRACE_FUNC(); if (!isUpgrade(request)) return false; auto const versions = parseProtocolVersions(request["Upgrade"]); @@ -374,6 +382,7 @@ OverlayImpl::isPeerUpgrade(http_request_type const& request) std::string OverlayImpl::makePrefix(std::uint32_t id) { + TRACE_FUNC(); std::stringstream ss; ss << "[" << std::setfill('0') << std::setw(3) << id << "] "; return ss.str(); @@ -385,6 +394,7 @@ OverlayImpl::makeRedirectResponse( http_request_type const& request, address_type remoteAddress) { + TRACE_FUNC(); boost::beast::http::response msg; msg.version(request.version()); msg.result(boost::beast::http::status::service_unavailable); @@ -413,6 +423,7 @@ OverlayImpl::makeErrorResponse( address_type remoteAddress, std::string text) { + TRACE_FUNC(); boost::beast::http::response msg; msg.version(request.version()); msg.result(boost::beast::http::status::bad_request); @@ -429,6 +440,7 @@ OverlayImpl::makeErrorResponse( void OverlayImpl::connect(beast::IP::Endpoint const& remoteEndpoint) { + TRACE_FUNC(); XRPL_ASSERT(work_, "xrpl::OverlayImpl::connect : work is set"); auto usage = resourceManager().newOutboundEndpoint(remoteEndpoint); @@ -468,6 +480,7 @@ OverlayImpl::connect(beast::IP::Endpoint const& remoteEndpoint) void OverlayImpl::addActive(std::shared_ptr const& peer) { + TRACE_FUNC(); beast::WrappedSink sink{journal_.sink(), peer->prefix()}; beast::Journal const journal{sink}; @@ -499,6 +512,7 @@ OverlayImpl::addActive(std::shared_ptr const& peer) void OverlayImpl::remove(std::shared_ptr const& slot) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); auto const iter = peers_.find(slot); XRPL_ASSERT(iter != peers_.end(), "xrpl::OverlayImpl::remove : valid input"); @@ -508,6 +522,7 @@ OverlayImpl::remove(std::shared_ptr const& slot) void OverlayImpl::start() { + TRACE_FUNC(); PeerFinder::Config const config = PeerFinder::Config::makeConfig( app_.config(), serverHandler_.setup().overlay.port(), @@ -595,6 +610,7 @@ OverlayImpl::start() void OverlayImpl::stop() { + TRACE_FUNC(); boost::asio::dispatch(strand_, std::bind(&OverlayImpl::stopChildren, this)); { std::unique_lock lock(mutex_); @@ -612,6 +628,7 @@ OverlayImpl::stop() void OverlayImpl::onWrite(beast::PropertyStream::Map& stream) { + TRACE_FUNC(); beast::PropertyStream::Set set("traffic", stream); auto const stats = traffic_.getCounts(); for (auto const& pair : stats) @@ -634,6 +651,7 @@ OverlayImpl::onWrite(beast::PropertyStream::Map& stream) void OverlayImpl::activate(std::shared_ptr const& peer) { + TRACE_FUNC(); beast::WrappedSink sink{journal_.sink(), peer->prefix()}; beast::Journal const journal{sink}; @@ -655,6 +673,7 @@ OverlayImpl::activate(std::shared_ptr const& peer) void OverlayImpl::onPeerDeactivate(Peer::id_t id) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); ids_.erase(id); } @@ -664,6 +683,7 @@ OverlayImpl::onManifests( std::shared_ptr const& m, std::shared_ptr const& from) { + TRACE_FUNC(); auto const n = m->list_size(); auto const& journal = from->pJournal(); @@ -719,12 +739,14 @@ OverlayImpl::onManifests( void OverlayImpl::reportInboundTraffic(TrafficCount::Category cat, int size) { + TRACE_FUNC(); traffic_.addCount(cat, true, size); } void OverlayImpl::reportOutboundTraffic(TrafficCount::Category cat, int size) { + TRACE_FUNC(); traffic_.addCount(cat, false, size); } /** The number of active peers on the network @@ -734,6 +756,7 @@ OverlayImpl::reportOutboundTraffic(TrafficCount::Category cat, int size) std::size_t OverlayImpl::size() const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); return ids_.size(); } @@ -741,12 +764,14 @@ OverlayImpl::size() const int OverlayImpl::limit() { + TRACE_FUNC(); return peerFinder_->config().maxPeers; } json::Value OverlayImpl::getOverlayInfo() const { + TRACE_FUNC(); using namespace std::chrono; json::Value jv; auto& av = jv[jss::active] = json::Value(json::ArrayValue); @@ -791,6 +816,7 @@ OverlayImpl::getOverlayInfo() const json::Value OverlayImpl::getServerInfo() { + TRACE_FUNC(); bool const humanReadable = false; bool const admin = false; bool const counters = false; @@ -818,12 +844,14 @@ OverlayImpl::getServerInfo() json::Value OverlayImpl::getServerCounts() { + TRACE_FUNC(); return getCountsJson(app_, 10); } json::Value OverlayImpl::getUnlInfo() { + TRACE_FUNC(); json::Value validators = app_.getValidators().getJson(); if (validators.isMember(jss::publisher_lists)) @@ -854,6 +882,7 @@ OverlayImpl::getUnlInfo() json::Value OverlayImpl::json() { + TRACE_FUNC(); json::Value json; for (auto const& peer : getActivePeers()) { @@ -865,6 +894,7 @@ OverlayImpl::json() bool OverlayImpl::processCrawl(http_request_type const& req, Handoff& handoff) { + TRACE_FUNC(); if (req.target() != "/crawl" || setup_.crawlOptions == CrawlOptions::Disabled) return false; @@ -901,6 +931,7 @@ OverlayImpl::processCrawl(http_request_type const& req, Handoff& handoff) bool OverlayImpl::processValidatorList(http_request_type const& req, Handoff& handoff) { + TRACE_FUNC(); // If the target is in the form "/vl/", // return the most recent validator list for that key. constexpr std::string_view kPREFIX("/vl/"); @@ -965,6 +996,7 @@ OverlayImpl::processValidatorList(http_request_type const& req, Handoff& handoff bool OverlayImpl::processHealth(http_request_type const& req, Handoff& handoff) { + TRACE_FUNC(); if (req.target() != "/health") return false; boost::beast::http::response msg; @@ -1069,6 +1101,7 @@ OverlayImpl::processHealth(http_request_type const& req, Handoff& handoff) bool OverlayImpl::processRequest(http_request_type const& req, Handoff& handoff) { + TRACE_FUNC(); // Take advantage of || short-circuiting return processCrawl(req, handoff) || processValidatorList(req, handoff) || processHealth(req, handoff); @@ -1077,6 +1110,7 @@ OverlayImpl::processRequest(http_request_type const& req, Handoff& handoff) Overlay::PeerSequence OverlayImpl::getActivePeers() const { + TRACE_FUNC(); Overlay::PeerSequence ret; ret.reserve(size()); @@ -1092,6 +1126,7 @@ OverlayImpl::getActivePeers( std::size_t& disabled, std::size_t& enabledInSkip) const { + TRACE_FUNC(); Overlay::PeerSequence ret; std::scoped_lock const lock(mutex_); @@ -1127,12 +1162,14 @@ OverlayImpl::getActivePeers( void OverlayImpl::checkTracking(std::uint32_t index) { + TRACE_FUNC(); forEach([index](std::shared_ptr const& sp) { sp->checkTracking(index); }); } std::shared_ptr OverlayImpl::findPeerByShortID(Peer::id_t const& id) const { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); auto const iter = ids_.find(id); if (iter != ids_.end()) @@ -1145,6 +1182,7 @@ OverlayImpl::findPeerByShortID(Peer::id_t const& id) const std::shared_ptr OverlayImpl::findPeerByPublicKey(PublicKey const& pubKey) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); // NOTE The purpose of peer is to delay the destruction of PeerImp std::shared_ptr peer; @@ -1162,6 +1200,7 @@ OverlayImpl::findPeerByPublicKey(PublicKey const& pubKey) void OverlayImpl::broadcast(protocol::TMProposeSet& m) { + TRACE_FUNC(); auto const sm = std::make_shared(m, protocol::mtPROPOSE_LEDGER); forEach([&](std::shared_ptr const& p) { p->send(sm); }); } @@ -1169,6 +1208,7 @@ OverlayImpl::broadcast(protocol::TMProposeSet& m) std::set OverlayImpl::relay(protocol::TMProposeSet& m, uint256 const& uid, PublicKey const& validator) { + TRACE_FUNC(); if (auto const toSkip = app_.getHashRouter().shouldRelay(uid)) { auto const sm = std::make_shared(m, protocol::mtPROPOSE_LEDGER, validator); @@ -1184,6 +1224,7 @@ OverlayImpl::relay(protocol::TMProposeSet& m, uint256 const& uid, PublicKey cons void OverlayImpl::broadcast(protocol::TMValidation& m) { + TRACE_FUNC(); auto const sm = std::make_shared(m, protocol::mtVALIDATION); forEach([sm](std::shared_ptr const& p) { p->send(sm); }); } @@ -1191,6 +1232,7 @@ OverlayImpl::broadcast(protocol::TMValidation& m) std::set OverlayImpl::relay(protocol::TMValidation& m, uint256 const& uid, PublicKey const& validator) { + TRACE_FUNC(); if (auto const toSkip = app_.getHashRouter().shouldRelay(uid)) { auto const sm = std::make_shared(m, protocol::mtVALIDATION, validator); @@ -1206,6 +1248,7 @@ OverlayImpl::relay(protocol::TMValidation& m, uint256 const& uid, PublicKey cons std::shared_ptr OverlayImpl::getManifestsMessage() { + TRACE_FUNC(); std::scoped_lock const g(manifestLock_); if (auto seq = app_.getValidatorManifests().sequence(); seq != manifestListSeq_) @@ -1236,6 +1279,7 @@ OverlayImpl::relay( std::optional> tx, std::set const& toSkip) { + TRACE_FUNC(); bool relay = tx.has_value(); if (relay) { @@ -1325,6 +1369,7 @@ OverlayImpl::relay( void OverlayImpl::remove(Child& child) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); list_.erase(&child); if (list_.empty()) @@ -1334,6 +1379,7 @@ OverlayImpl::remove(Child& child) void OverlayImpl::stopChildren() { + TRACE_FUNC(); // Calling list_[].second->stop() may cause list_ to be modified // (OverlayImpl::remove() may be called on this same thread). So // iterating directly over list_ to call child->stop() could lead to @@ -1366,6 +1412,7 @@ OverlayImpl::stopChildren() void OverlayImpl::autoConnect() { + TRACE_FUNC(); auto const result = peerFinder_->autoconnect(); for (auto const& addr : result) connect(addr); @@ -1374,6 +1421,7 @@ OverlayImpl::autoConnect() void OverlayImpl::sendEndpoints() { + TRACE_FUNC(); auto const result = peerFinder_->buildEndpointsForPeers(); for (auto const& e : result) { @@ -1392,6 +1440,7 @@ OverlayImpl::sendEndpoints() void OverlayImpl::sendTxQueue() const { + TRACE_FUNC(); forEach([](auto const& p) { if (p->txReduceRelayEnabled()) p->sendTxQueue(); @@ -1401,6 +1450,7 @@ OverlayImpl::sendTxQueue() const std::shared_ptr makeSquelchMessage(PublicKey const& validator, bool squelch, uint32_t squelchDuration) { + TRACE_FUNC(); protocol::TMSquelch m; m.set_squelch(squelch); m.set_validatorpubkey(validator.data(), validator.size()); @@ -1412,6 +1462,7 @@ makeSquelchMessage(PublicKey const& validator, bool squelch, uint32_t squelchDur void OverlayImpl::unsquelch(PublicKey const& validator, Peer::id_t id) const { + TRACE_FUNC(); if (auto peer = findPeerByShortID(id); peer) { // optimize - multiple message with different @@ -1423,6 +1474,7 @@ OverlayImpl::unsquelch(PublicKey const& validator, Peer::id_t id) const void OverlayImpl::squelch(PublicKey const& validator, Peer::id_t id, uint32_t squelchDuration) const { + TRACE_FUNC(); if (auto peer = findPeerByShortID(id); peer) { peer->send(makeSquelchMessage(validator, true, squelchDuration)); @@ -1436,6 +1488,7 @@ OverlayImpl::updateSlotAndSquelch( std::set&& peers, protocol::MessageType type) { + TRACE_FUNC(); if (!slots_.baseSquelchReady()) return; @@ -1466,6 +1519,7 @@ OverlayImpl::updateSlotAndSquelch( Peer::id_t peer, protocol::MessageType type) { + TRACE_FUNC(); if (!slots_.baseSquelchReady()) return; @@ -1490,6 +1544,7 @@ OverlayImpl::updateSlotAndSquelch( void OverlayImpl::deletePeer(Peer::id_t id) { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { post(strand_, std::bind(&OverlayImpl::deletePeer, this, id)); @@ -1502,6 +1557,7 @@ OverlayImpl::deletePeer(Peer::id_t id) void OverlayImpl::deleteIdlePeers() { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { post(strand_, std::bind(&OverlayImpl::deleteIdlePeers, this)); @@ -1516,6 +1572,7 @@ OverlayImpl::deleteIdlePeers() Overlay::Setup setupOverlay(BasicConfig const& config) { + TRACE_FUNC(); Overlay::Setup setup; { @@ -1627,6 +1684,7 @@ makeOverlay( BasicConfig const& config, beast::insight::Collector::ptr const& collector) { + TRACE_FUNC(); return std::make_unique( app, setup, serverHandler, resourceManager, resolver, ioContext, config, collector); } diff --git a/src/xrpld/overlay/detail/OverlayImpl.h b/src/xrpld/overlay/detail/OverlayImpl.h index 65c93a5845..a1d579ca1e 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.h +++ b/src/xrpld/overlay/detail/OverlayImpl.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -140,18 +141,21 @@ public: PeerFinder::Manager& peerFinder() { + TRACE_FUNC(); return *peerFinder_; } Resource::Manager& resourceManager() { + TRACE_FUNC(); return resourceManager_; } Setup const& setup() const { + TRACE_FUNC(); return setup_; } @@ -252,6 +256,7 @@ public: void forEach(UnaryFunc&& f) const { + TRACE_FUNC(); std::vector> wp; { std::scoped_lock const lock(mutex_); @@ -284,6 +289,7 @@ public: static bool isPeerUpgrade(boost::beast::http::response const& response) { + TRACE_FUNC(); if (!isUpgrade(response)) return false; return response.result() == boost::beast::http::status::switching_protocols; @@ -293,6 +299,7 @@ public: static bool isUpgrade(boost::beast::http::header const& req) { + TRACE_FUNC(); if (req.version() < 11) return false; if (req.method() != boost::beast::http::verb::get) @@ -306,6 +313,7 @@ public: static bool isUpgrade(boost::beast::http::header const& req) { + TRACE_FUNC(); if (req.version() < 11) return false; if (!boost::beast::http::token_list{req["Connection"]}.exists("upgrade")) @@ -325,42 +333,49 @@ public: void incJqTransOverflow() override { + TRACE_FUNC(); ++jqTransOverflow_; } std::uint64_t getJqTransOverflow() const override { + TRACE_FUNC(); return jqTransOverflow_; } void incPeerDisconnect() override { + TRACE_FUNC(); ++peerDisconnects_; } std::uint64_t getPeerDisconnect() const override { + TRACE_FUNC(); return peerDisconnects_; } void incPeerDisconnectCharges() override { + TRACE_FUNC(); ++peerDisconnectsCharges_; } std::uint64_t getPeerDisconnectCharges() const override { + TRACE_FUNC(); return peerDisconnectsCharges_; } std::optional networkID() const override { + TRACE_FUNC(); return setup_.networkID; } @@ -400,6 +415,7 @@ public: json::Value txMetrics() const override { + TRACE_FUNC(); return txMetrics_.json(); } @@ -408,6 +424,7 @@ public: void addTxMetrics(Args... args) { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) return post(strand_, std::bind(&OverlayImpl::addTxMetrics, this, args...)); @@ -571,6 +588,7 @@ private: void collectMetrics() { + TRACE_FUNC(); auto counts = traffic_.getCounts(); std::scoped_lock const lock(statsMutex_); XRPL_ASSERT( diff --git a/src/xrpld/overlay/detail/PeerImp.cpp b/src/xrpld/overlay/detail/PeerImp.cpp index fa65cb604a..d351ff4c08 100644 --- a/src/xrpld/overlay/detail/PeerImp.cpp +++ b/src/xrpld/overlay/detail/PeerImp.cpp @@ -63,6 +63,7 @@ #include #include #include +#include #include #include @@ -167,6 +168,7 @@ PeerImp::PeerImp( peerFeatureEnabled(headers_, kFEATURE_LEDGER_REPLAY, app_.config().LEDGER_REPLAY)) , ledgerReplayMsgHandler_(app, app.getLedgerReplayer()) { + TRACE_FUNC(); JLOG(journal_.info()) << "compression enabled " << (compressionEnabled_ == Compressed::On) << " vp reduce-relay base squelch enabled " << peerFeatureEnabled( @@ -178,6 +180,7 @@ PeerImp::PeerImp( PeerImp::~PeerImp() { + TRACE_FUNC(); bool const inCluster{cluster()}; overlay_.deletePeer(id_); @@ -195,12 +198,14 @@ PeerImp::~PeerImp() static bool stringIsUint256Sized(std::string const& pBuffStr) { + TRACE_FUNC(); return pBuffStr.size() == uint256::size(); } void PeerImp::run() { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { post(strand_, std::bind(&PeerImp::run, shared_from_this())); @@ -263,6 +268,7 @@ PeerImp::run() void PeerImp::stop() { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { post(strand_, std::bind(&PeerImp::stop, shared_from_this())); @@ -286,6 +292,7 @@ PeerImp::stop() void PeerImp::send(std::shared_ptr const& m) { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { post(strand_, std::bind(&PeerImp::send, shared_from_this(), m)); @@ -356,6 +363,7 @@ PeerImp::send(std::shared_ptr const& m) void PeerImp::sendTxQueue() { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { post(strand_, std::bind(&PeerImp::sendTxQueue, shared_from_this())); @@ -376,6 +384,7 @@ PeerImp::sendTxQueue() void PeerImp::addTxQueue(uint256 const& hash) { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { post(strand_, std::bind(&PeerImp::addTxQueue, shared_from_this(), hash)); @@ -395,6 +404,7 @@ PeerImp::addTxQueue(uint256 const& hash) void PeerImp::removeTxQueue(uint256 const& hash) { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { post(strand_, std::bind(&PeerImp::removeTxQueue, shared_from_this(), hash)); @@ -408,6 +418,7 @@ PeerImp::removeTxQueue(uint256 const& hash) void PeerImp::charge(Resource::Charge const& fee, std::string const& context) { + TRACE_FUNC(); if ((usage_.charge(fee, context) == Resource::Disposition::Drop) && usage_.disconnect(pJournal_) && strand_.running_in_this_thread()) { @@ -422,6 +433,7 @@ PeerImp::charge(Resource::Charge const& fee, std::string const& context) bool PeerImp::crawl() const { + TRACE_FUNC(); auto const iter = headers_.find("Crawl"); if (iter == headers_.end()) return false; @@ -431,12 +443,14 @@ PeerImp::crawl() const bool PeerImp::cluster() const { + TRACE_FUNC(); return static_cast(app_.getCluster().member(publicKey_)); } std::string PeerImp::getVersion() const { + TRACE_FUNC(); if (inbound_) return headers_["User-Agent"]; return headers_["Server"]; @@ -445,6 +459,7 @@ PeerImp::getVersion() const json::Value PeerImp::json() { + TRACE_FUNC(); json::Value ret(json::ObjectValue); ret[jss::public_key] = toBase58(TokenType::NodePublic, publicKey_); @@ -559,6 +574,7 @@ PeerImp::json() bool PeerImp::supportsFeature(ProtocolFeature f) const { + TRACE_FUNC(); switch (f) { case ProtocolFeature::ValidatorListPropagation: @@ -576,6 +592,7 @@ PeerImp::supportsFeature(ProtocolFeature f) const bool PeerImp::hasLedger(uint256 const& hash, std::uint32_t seq) const { + TRACE_FUNC(); { std::scoped_lock const sl(recentLock_); if ((seq != 0) && (seq >= minLedger_) && (seq <= maxLedger_) && @@ -590,6 +607,7 @@ PeerImp::hasLedger(uint256 const& hash, std::uint32_t seq) const void PeerImp::ledgerRange(std::uint32_t& minSeq, std::uint32_t& maxSeq) const { + TRACE_FUNC(); std::scoped_lock const sl(recentLock_); minSeq = minLedger_; @@ -599,6 +617,7 @@ PeerImp::ledgerRange(std::uint32_t& minSeq, std::uint32_t& maxSeq) const bool PeerImp::hasTxSet(uint256 const& hash) const { + TRACE_FUNC(); std::scoped_lock const sl(recentLock_); return std::ranges::find(recentTxSets_, hash) != recentTxSets_.end(); } @@ -606,6 +625,7 @@ PeerImp::hasTxSet(uint256 const& hash) const void PeerImp::cycleStatus() { + TRACE_FUNC(); // Operations on closedLedgerHash_ and previousLedgerHash_ must be // guarded by recentLock_. std::scoped_lock const sl(recentLock_); @@ -616,6 +636,7 @@ PeerImp::cycleStatus() bool PeerImp::hasRange(std::uint32_t uMin, std::uint32_t uMax) { + TRACE_FUNC(); std::scoped_lock const sl(recentLock_); return (tracking_ != Tracking::Diverged) && (uMin >= minLedger_) && (uMax <= maxLedger_); } @@ -625,6 +646,7 @@ PeerImp::hasRange(std::uint32_t uMin, std::uint32_t uMax) void PeerImp::fail(std::string const& name, error_code ec) { + TRACE_FUNC(); XRPL_ASSERT(strand_.running_in_this_thread(), "xrpl::PeerImp::fail : strand in this thread"); if (!socket_.is_open()) @@ -638,6 +660,7 @@ PeerImp::fail(std::string const& name, error_code ec) void PeerImp::fail(std::string const& reason) { + TRACE_FUNC(); if (!strand_.running_in_this_thread()) { post( @@ -663,6 +686,7 @@ PeerImp::fail(std::string const& reason) void PeerImp::tryAsyncShutdown() { + TRACE_FUNC(); XRPL_ASSERT( strand_.running_in_this_thread(), "xrpl::PeerImp::tryAsyncShutdown : strand in this thread"); @@ -685,6 +709,7 @@ PeerImp::tryAsyncShutdown() void PeerImp::shutdown() { + TRACE_FUNC(); XRPL_ASSERT(strand_.running_in_this_thread(), "xrpl::PeerImp::shutdown: strand in this thread"); if (!socket_.is_open() || shutdown_) @@ -700,6 +725,7 @@ PeerImp::shutdown() void PeerImp::onShutdown(error_code ec) { + TRACE_FUNC(); cancelTimer(); if (ec) { @@ -724,6 +750,7 @@ PeerImp::onShutdown(error_code ec) void PeerImp::close() { + TRACE_FUNC(); XRPL_ASSERT(strand_.running_in_this_thread(), "xrpl::PeerImp::close : strand in this thread"); if (!socket_.is_open()) @@ -748,6 +775,7 @@ PeerImp::close() void PeerImp::setTimer(std::chrono::seconds interval) { + TRACE_FUNC(); try { timer_.expires_after(interval); @@ -768,6 +796,7 @@ PeerImp::setTimer(std::chrono::seconds interval) std::string PeerImp::makePrefix(std::string const& fingerprint) { + TRACE_FUNC(); std::stringstream ss; ss << "[" << fingerprint << "] "; return ss.str(); @@ -776,6 +805,7 @@ PeerImp::makePrefix(std::string const& fingerprint) void PeerImp::onTimer(error_code const& ec) { + TRACE_FUNC(); XRPL_ASSERT(strand_.running_in_this_thread(), "xrpl::PeerImp::onTimer : strand in this thread"); if (!socket_.is_open()) @@ -848,6 +878,7 @@ PeerImp::onTimer(error_code const& ec) void PeerImp::cancelTimer() noexcept { + TRACE_FUNC(); try { timer_.cancel(); @@ -862,6 +893,7 @@ PeerImp::cancelTimer() noexcept void PeerImp::doAccept() { + TRACE_FUNC(); XRPL_ASSERT(readBuffer_.size() == 0, "xrpl::PeerImp::doAccept : empty read buffer"); JLOG(journal_.debug()) << "doAccept"; @@ -946,6 +978,7 @@ PeerImp::doAccept() std::string PeerImp::name() const { + TRACE_FUNC(); std::shared_lock const readLock{nameMutex_}; return name_; } @@ -953,6 +986,7 @@ PeerImp::name() const std::string PeerImp::domain() const { + TRACE_FUNC(); return headers_["Server-Domain"]; } @@ -963,6 +997,7 @@ PeerImp::domain() const void PeerImp::doProtocolStart() { + TRACE_FUNC(); // a shutdown was initiated before the handshare, there is nothing to do if (shutdown_) { @@ -1008,6 +1043,7 @@ PeerImp::doProtocolStart() void PeerImp::onReadMessage(error_code ec, std::size_t bytesTransferred) { + TRACE_FUNC(); XRPL_ASSERT( strand_.running_in_this_thread(), "xrpl::PeerImp::onReadMessage : strand in this thread"); @@ -1107,6 +1143,7 @@ PeerImp::onReadMessage(error_code ec, std::size_t bytesTransferred) void PeerImp::onWriteMessage(error_code ec, std::size_t bytesTransferred) { + TRACE_FUNC(); XRPL_ASSERT( strand_.running_in_this_thread(), "xrpl::PeerImp::onWriteMessage : strand in this thread"); @@ -1173,6 +1210,7 @@ PeerImp::onWriteMessage(error_code ec, std::size_t bytesTransferred) void PeerImp::onMessageUnknown(std::uint16_t type) { + TRACE_FUNC(); // TODO } @@ -1184,6 +1222,7 @@ PeerImp::onMessageBegin( std::size_t uncompressedSize, bool isCompressed) { + TRACE_FUNC(); auto const name = protocolMessageName(type); loadEvent_ = app_.getJobQueue().makeLoadEvent(JtPeer, name); fee_ = {.fee = Resource::kFEE_TRIVIAL_PEER, .context = name}; @@ -1219,6 +1258,7 @@ PeerImp::onMessageBegin( void PeerImp::onMessageEnd(std::uint16_t, std::shared_ptr<::google::protobuf::Message> const&) { + TRACE_FUNC(); loadEvent_.reset(); charge(fee_.fee, fee_.context); } @@ -1226,6 +1266,7 @@ PeerImp::onMessageEnd(std::uint16_t, std::shared_ptr<::google::protobuf::Message void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); auto const s = m->list_size(); if (s == 0) @@ -1245,6 +1286,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); if (m->type() == protocol::TMPing::ptPING) { // We have received a ping request, reply with a pong @@ -1286,6 +1328,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); // VFALCO NOTE I think we should drop the peer immediately if (!cluster()) { @@ -1355,6 +1398,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); // Don't allow endpoints from peers that are not known tracking or are // not using a version of the message that we support: if (tracking_.load() != Tracking::Converged || m->version() != 2) @@ -1412,6 +1456,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); handleTransaction(m, true, false); } @@ -1421,6 +1466,7 @@ PeerImp::handleTransaction( bool eraseTxQueue, bool batch) { + TRACE_FUNC(); XRPL_ASSERT(eraseTxQueue != batch, ("xrpl::PeerImp::handleTransaction : valid inputs")); if (tracking_.load() == Tracking::Diverged) return; @@ -1548,6 +1594,7 @@ PeerImp::handleTransaction( void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); auto badData = [&](std::string const& msg) { fee_.update(Resource::kFEE_INVALID_DATA, "get_ledger " + msg); JLOG(pJournal_.warn()) << "TMGetLedger: " << msg; @@ -1658,6 +1705,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); JLOG(pJournal_.trace()) << "onMessage, TMProofPathRequest"; if (!ledgerReplayEnabled_) { @@ -1693,6 +1741,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); if (!ledgerReplayEnabled_) { fee_.update(Resource::kFEE_MALFORMED_REQUEST, "proof_path_response disabled"); @@ -1708,6 +1757,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); JLOG(pJournal_.trace()) << "onMessage, TMReplayDeltaRequest"; if (!ledgerReplayEnabled_) { @@ -1743,6 +1793,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); if (!ledgerReplayEnabled_) { fee_.update(Resource::kFEE_MALFORMED_REQUEST, "replay_delta_response disabled"); @@ -1758,6 +1809,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); auto badData = [&](std::string const& msg) { fee_.update(Resource::kFEE_INVALID_DATA, msg); JLOG(pJournal_.warn()) << "TMLedgerData: " << msg; @@ -1853,6 +1905,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); protocol::TMProposeSet const& set = *m; auto const sig = makeSlice(set.signature()); @@ -1958,6 +2011,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); JLOG(pJournal_.trace()) << "Status: Change"; if (!m->has_networktime()) @@ -2131,6 +2185,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::checkTracking(std::uint32_t validationSeq) { + TRACE_FUNC(); std::uint32_t serverSeq = 0; { // Extract the sequence number of the highest @@ -2150,6 +2205,7 @@ PeerImp::checkTracking(std::uint32_t validationSeq) void PeerImp::checkTracking(std::uint32_t seq1, std::uint32_t seq2) { + TRACE_FUNC(); int const diff = std::max(seq1, seq2) - std::min(seq1, seq2); if (diff < Tuning::ConvergedLedgerLimit) @@ -2171,6 +2227,7 @@ PeerImp::checkTracking(std::uint32_t seq1, std::uint32_t seq2) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); if (!stringIsUint256Sized(m->hash())) { fee_.update(Resource::kFEE_MALFORMED_REQUEST, "bad hash"); @@ -2200,6 +2257,7 @@ PeerImp::onValidatorListMessage( std::uint32_t version, std::vector const& blobs) { + TRACE_FUNC(); // If there are no blobs, the message is malformed (possibly because of // ValidatorList class rules), so charge accordingly and skip processing. if (blobs.empty()) @@ -2392,6 +2450,7 @@ PeerImp::onValidatorListMessage( void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); try { if (!supportsFeature(ProtocolFeature::ValidatorListPropagation)) @@ -2416,6 +2475,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); try { if (!supportsFeature(ProtocolFeature::ValidatorList2Propagation)) @@ -2449,6 +2509,7 @@ PeerImp::onMessage(std::shared_ptr const& m void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); if (m->validation().size() < 50) { JLOG(pJournal_.warn()) << "Validation: Too small"; @@ -2555,6 +2616,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); protocol::TMGetObjectByHash const& packet = *m; JLOG(pJournal_.trace()) << "received TMGetObjectByHash " << packet.type() << " " @@ -2707,6 +2769,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); if (!txReduceRelayEnabled()) { JLOG(pJournal_.error()) << "TMHaveTransactions: tx reduce-relay is disabled"; @@ -2724,6 +2787,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::handleHaveTransactions(std::shared_ptr const& m) { + TRACE_FUNC(); protocol::TMGetObjectByHash tmBH; tmBH.set_type(protocol::TMGetObjectByHash_ObjectType_otTRANSACTIONS); tmBH.set_query(true); @@ -2770,6 +2834,7 @@ PeerImp::handleHaveTransactions(std::shared_ptr co void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); if (!txReduceRelayEnabled()) { JLOG(pJournal_.error()) << "TMTransactions: tx reduce-relay is disabled"; @@ -2794,6 +2859,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::onMessage(std::shared_ptr const& m) { + TRACE_FUNC(); using on_message_fn = void (PeerImp::*)(std::shared_ptr const&); if (!strand_.running_in_this_thread()) { @@ -2840,6 +2906,7 @@ PeerImp::onMessage(std::shared_ptr const& m) void PeerImp::addLedger(uint256 const& hash, std::scoped_lock const& lockedRecentLock) { + TRACE_FUNC(); // lockedRecentLock is passed as a reminder that recentLock_ must be // locked by the caller. (void)lockedRecentLock; @@ -2853,6 +2920,7 @@ PeerImp::addLedger(uint256 const& hash, std::scoped_lock const& lock void PeerImp::doFetchPack(std::shared_ptr const& packet) { + TRACE_FUNC(); // VFALCO TODO Invert this dependency using an observer and shared state // object. Don't queue fetch pack jobs if we're under load or we already // have some queued. @@ -2886,6 +2954,7 @@ PeerImp::doFetchPack(std::shared_ptr const& packet) void PeerImp::doTransactions(std::shared_ptr const& packet) { + TRACE_FUNC(); protocol::TMTransactions reply; JLOG(pJournal_.trace()) << "received TMGetObjectByHash requesting tx " @@ -2942,6 +3011,7 @@ PeerImp::checkTransaction( std::shared_ptr const& stx, bool batch) { + TRACE_FUNC(); // VFALCO TODO Rewrite to not use exceptions try { @@ -3074,6 +3144,7 @@ PeerImp::checkPropose( std::shared_ptr const& packet, RCLCxPeerPos peerPos) { + TRACE_FUNC(); JLOG(pJournal_.trace()) << "Checking " << (isTrusted ? "trusted" : "UNTRUSTED") << " proposal"; XRPL_ASSERT(packet, "xrpl::PeerImp::checkPropose : non-null packet"); @@ -3122,6 +3193,7 @@ PeerImp::checkValidation( uint256 const& key, std::shared_ptr const& packet) { + TRACE_FUNC(); if (!val->isValid()) { std::string const desc{"Validation forwarded by peer is invalid"}; @@ -3161,6 +3233,7 @@ PeerImp::checkValidation( static std::shared_ptr getPeerWithTree(OverlayImpl& ov, uint256 const& rootHash, PeerImp const* skip) { + TRACE_FUNC(); std::shared_ptr ret; int retScore = 0; @@ -3189,6 +3262,7 @@ getPeerWithLedger( LedgerIndex ledger, PeerImp const* skip) { + TRACE_FUNC(); std::shared_ptr ret; int retScore = 0; @@ -3212,6 +3286,7 @@ PeerImp::sendLedgerBase( std::shared_ptr const& ledger, protocol::TMLedgerData& ledgerData) { + TRACE_FUNC(); JLOG(pJournal_.trace()) << "sendLedgerBase: Base data"; Serializer s(sizeof(LedgerHeader)); @@ -3247,6 +3322,7 @@ PeerImp::sendLedgerBase( std::shared_ptr PeerImp::getLedger(std::shared_ptr const& m) { + TRACE_FUNC(); JLOG(pJournal_.trace()) << "getLedger: Ledger"; std::shared_ptr ledger; @@ -3331,6 +3407,7 @@ PeerImp::getLedger(std::shared_ptr const& m) std::shared_ptr PeerImp::getTxSet(std::shared_ptr const& m) const { + TRACE_FUNC(); JLOG(pJournal_.trace()) << "getTxSet: TX set"; uint256 const txSetHash{m->ledgerhash()}; @@ -3363,6 +3440,7 @@ PeerImp::getTxSet(std::shared_ptr const& m) const void PeerImp::processLedgerRequest(std::shared_ptr const& m) { + TRACE_FUNC(); // Do not resource charge a peer responding to a relay if (!m->has_requestcookie()) charge(Resource::kFEE_MODERATE_BURDEN_PEER, "received a get ledger request"); @@ -3534,6 +3612,7 @@ PeerImp::processLedgerRequest(std::shared_ptr const& m) int PeerImp::getScore(bool haveItem) const { + TRACE_FUNC(); // Random component of score, used to break ties and avoid // overloading the "best" peer static int const kSP_RANDOM_MAX = 9999; @@ -3576,6 +3655,7 @@ PeerImp::getScore(bool haveItem) const bool PeerImp::isHighLatency() const { + TRACE_FUNC(); std::scoped_lock const sl(recentLock_); return latency_ >= kPEER_HIGH_LATENCY; } @@ -3583,6 +3663,7 @@ PeerImp::isHighLatency() const void PeerImp::Metrics::addMessage(std::uint64_t bytes) { + TRACE_FUNC(); using namespace std::chrono_literals; std::unique_lock const lock{mutex_}; @@ -3607,6 +3688,7 @@ PeerImp::Metrics::addMessage(std::uint64_t bytes) std::uint64_t PeerImp::Metrics::averageBytes() const { + TRACE_FUNC(); std::shared_lock const lock{mutex_}; return rollingAvgBytes_; } @@ -3614,6 +3696,7 @@ PeerImp::Metrics::averageBytes() const std::uint64_t PeerImp::Metrics::totalBytes() const { + TRACE_FUNC(); std::shared_lock const lock{mutex_}; return totalBytes_; } diff --git a/src/xrpld/overlay/detail/PeerImp.h b/src/xrpld/overlay/detail/PeerImp.h index 676057ad82..13080fddc3 100644 --- a/src/xrpld/overlay/detail/PeerImp.h +++ b/src/xrpld/overlay/detail/PeerImp.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -196,6 +197,7 @@ private: void update(Resource::Charge f, std::string const& add) { + TRACE_FUNC(); XRPL_ASSERT(f >= fee, "xrpl::PeerImp::ChargeWithContext::update : fee increases"); fee = f; if (!context.empty()) @@ -319,12 +321,14 @@ public: beast::Journal const& pJournal() const { + TRACE_FUNC(); return pJournal_; } std::shared_ptr const& slot() { + TRACE_FUNC(); return slot_; } @@ -370,6 +374,7 @@ public: beast::IP::Endpoint getRemoteAddress() const override { + TRACE_FUNC(); return remoteAddress_; } @@ -383,6 +388,7 @@ public: Peer::id_t id() const override { + TRACE_FUNC(); return id_; } @@ -405,6 +411,7 @@ public: PublicKey const& getNodePublic() const override { + TRACE_FUNC(); return publicKey_; } @@ -416,6 +423,7 @@ public: clock_type::duration uptime() const { + TRACE_FUNC(); return clock_type::now() - creationTime_; } @@ -428,6 +436,7 @@ public: std::optional publisherListSequence(PublicKey const& pubKey) const override { + TRACE_FUNC(); std::scoped_lock const sl(recentLock_); auto iter = publisherListSequences_.find(pubKey); @@ -439,6 +448,7 @@ public: void setPublisherListSequence(PublicKey const& pubKey, std::size_t const seq) override { + TRACE_FUNC(); std::scoped_lock const sl(recentLock_); publisherListSequences_[pubKey] = seq; @@ -451,6 +461,7 @@ public: uint256 const& getClosedLedgerHash() const override { + TRACE_FUNC(); return closedLedgerHash_; } @@ -479,12 +490,14 @@ public: bool compressionEnabled() const override { + TRACE_FUNC(); return compressionEnabled_ == Compressed::On; } bool txReduceRelayEnabled() const override { + TRACE_FUNC(); return txReduceRelayEnabled_; } @@ -666,12 +679,14 @@ private: std::string const& fingerprint() const override { + TRACE_FUNC(); return fingerprint_; } std::string const& prefix() const { + TRACE_FUNC(); return prefix_; } @@ -848,6 +863,7 @@ PeerImp::PeerImp( peerFeatureEnabled(headers_, kFEATURE_LEDGER_REPLAY, app_.config().LEDGER_REPLAY)) , ledgerReplayMsgHandler_(app, app.getLedgerReplayer()) { + TRACE_FUNC(); readBuffer_.commit( boost::asio::buffer_copy(readBuffer_.prepare(boost::asio::buffer_size(buffers)), buffers)); JLOG(journal_.info()) << "compression enabled " << (compressionEnabled_ == Compressed::On) @@ -864,6 +880,7 @@ template void PeerImp::sendEndpoints(FwdIt first, FwdIt last) { + TRACE_FUNC(); protocol::TMEndpoints tm; while (first != last) diff --git a/src/xrpld/overlay/detail/PeerReservationTable.cpp b/src/xrpld/overlay/detail/PeerReservationTable.cpp index ec0f914dd6..367da92c70 100644 --- a/src/xrpld/overlay/detail/PeerReservationTable.cpp +++ b/src/xrpld/overlay/detail/PeerReservationTable.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -18,6 +19,7 @@ namespace xrpl { auto PeerReservation::toJson() const -> json::Value { + TRACE_FUNC(); json::Value result{json::ObjectValue}; result[jss::node] = toBase58(TokenType::NodePublic, nodeId); if (!description.empty()) @@ -30,6 +32,7 @@ PeerReservation::toJson() const -> json::Value auto PeerReservationTable::list() const -> std::vector { + TRACE_FUNC(); std::vector list; { std::scoped_lock const lock(mutex_); @@ -49,6 +52,7 @@ PeerReservationTable::list() const -> std::vector bool PeerReservationTable::load(DatabaseCon& connection) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); connection_ = &connection; @@ -62,6 +66,7 @@ PeerReservationTable::load(DatabaseCon& connection) std::optional PeerReservationTable::insertOrAssign(PeerReservation const& reservation) { + TRACE_FUNC(); std::optional previous; std::scoped_lock const lock(mutex_); @@ -96,6 +101,7 @@ PeerReservationTable::insertOrAssign(PeerReservation const& reservation) std::optional PeerReservationTable::erase(PublicKey const& nodeId) { + TRACE_FUNC(); std::optional previous; std::scoped_lock const lock(mutex_); diff --git a/src/xrpld/overlay/detail/PeerSet.cpp b/src/xrpld/overlay/detail/PeerSet.cpp index 6dda492315..9ebb5d5dbf 100644 --- a/src/xrpld/overlay/detail/PeerSet.cpp +++ b/src/xrpld/overlay/detail/PeerSet.cpp @@ -7,6 +7,7 @@ #include #include +#include #include @@ -63,6 +64,7 @@ PeerSetImpl::addPeers( std::function const&)> hasItem, std::function const&)> onPeerAdded) { + TRACE_FUNC(); using ScoredPeer = std::pair>; auto const& overlay = app_.getOverlay(); @@ -96,6 +98,7 @@ PeerSetImpl::sendRequest( protocol::MessageType type, std::shared_ptr const& peer) { + TRACE_FUNC(); auto packet = std::make_shared(message, type); if (peer) { @@ -113,6 +116,7 @@ PeerSetImpl::sendRequest( std::set const& PeerSetImpl::getPeerIds() const { + TRACE_FUNC(); return peers_; } @@ -126,6 +130,7 @@ public: std::unique_ptr build() override { + TRACE_FUNC(); return std::make_unique(app_); } @@ -136,6 +141,7 @@ private: std::unique_ptr makePeerSetBuilder(Application& app) { + TRACE_FUNC(); return std::make_unique(app); } @@ -152,6 +158,7 @@ public: std::function const&)> hasItem, std::function const&)> onPeerAdded) override { + TRACE_FUNC(); JLOG(j_.error()) << "DummyPeerSet addPeers should not be called"; } @@ -161,12 +168,14 @@ public: protocol::MessageType type, std::shared_ptr const& peer) override { + TRACE_FUNC(); JLOG(j_.error()) << "DummyPeerSet sendRequest should not be called"; } [[nodiscard]] std::set const& getPeerIds() const override { + TRACE_FUNC(); static std::set const kEMPTY_PEERS; JLOG(j_.error()) << "DummyPeerSet getPeerIds should not be called"; return kEMPTY_PEERS; @@ -179,6 +188,7 @@ private: std::unique_ptr makeDummyPeerSet(Application& app) { + TRACE_FUNC(); return std::make_unique(app); } diff --git a/src/xrpld/overlay/detail/ProtocolMessage.h b/src/xrpld/overlay/detail/ProtocolMessage.h index 0550cf68e0..d666366581 100644 --- a/src/xrpld/overlay/detail/ProtocolMessage.h +++ b/src/xrpld/overlay/detail/ProtocolMessage.h @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -20,18 +21,21 @@ namespace xrpl { inline protocol::MessageType protocolMessageType(protocol::TMGetLedger const&) { + TRACE_FUNC(); return protocol::mtGET_LEDGER; } inline protocol::MessageType protocolMessageType(protocol::TMReplayDeltaRequest const&) { + TRACE_FUNC(); return protocol::mtREPLAY_DELTA_REQ; } inline protocol::MessageType protocolMessageType(protocol::TMProofPathRequest const&) { + TRACE_FUNC(); return protocol::mtPROOF_PATH_REQ; } @@ -40,6 +44,7 @@ template std::string protocolMessageName(int type) { + TRACE_FUNC(); switch (type) { case protocol::mtMANIFESTS: @@ -123,6 +128,7 @@ template auto buffersBegin(BufferSequence const& bufs) { + TRACE_FUNC(); return boost::asio::buffers_iterator::begin(bufs); } @@ -130,6 +136,7 @@ template auto buffersEnd(BufferSequence const& bufs) { + TRACE_FUNC(); return boost::asio::buffers_iterator::end(bufs); } @@ -146,6 +153,7 @@ template std::optional parseMessageHeader(boost::system::error_code& ec, BufferSequence const& bufs, std::size_t size) { + TRACE_FUNC(); using namespace xrpl::compression; MessageHeader hdr; @@ -237,6 +245,7 @@ template < std::shared_ptr parseMessageContent(MessageHeader const& header, Buffers const& buffers) { + TRACE_FUNC(); auto m = std::make_shared(); ZeroCopyInputStream stream(buffers); @@ -273,6 +282,7 @@ template < bool invoke(MessageHeader const& header, Buffers const& buffers, Handler& handler) { + TRACE_FUNC(); auto const m = parseMessageContent(header, buffers); if (!m) return false; @@ -308,6 +318,7 @@ template std::pair invokeProtocolMessage(Buffers const& buffers, Handler& handler, std::size_t& hint) { + TRACE_FUNC(); std::pair result = {0, {}}; auto const size = boost::asio::buffer_size(buffers); diff --git a/src/xrpld/overlay/detail/ProtocolVersion.cpp b/src/xrpld/overlay/detail/ProtocolVersion.cpp index 86525068f8..20d3033828 100644 --- a/src/xrpld/overlay/detail/ProtocolVersion.cpp +++ b/src/xrpld/overlay/detail/ProtocolVersion.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -60,12 +61,14 @@ static_assert( std::string to_string(ProtocolVersion const& p) { + TRACE_FUNC(); return "XRPL/" + std::to_string(p.first) + "." + std::to_string(p.second); } std::vector parseProtocolVersions(boost::beast::string_view const& value) { + TRACE_FUNC(); static boost::regex const kRE( "^" // start of line "XRPL/" // The string "XRPL/" @@ -114,6 +117,7 @@ parseProtocolVersions(boost::beast::string_view const& value) std::optional negotiateProtocolVersion(std::vector const& versions) { + TRACE_FUNC(); std::optional result; // The protocol version we want to negotiate is the largest item in the @@ -133,6 +137,7 @@ negotiateProtocolVersion(std::vector const& versions) std::optional negotiateProtocolVersion(boost::beast::string_view const& versions) { + TRACE_FUNC(); auto const them = parseProtocolVersions(versions); return negotiateProtocolVersion(them); @@ -141,6 +146,7 @@ negotiateProtocolVersion(boost::beast::string_view const& versions) std::string const& supportedProtocolVersions() { + TRACE_FUNC(); static std::string const kSUPPORTED = []() { std::string ret; for (auto const& v : kSUPPORTED_PROTOCOL_LIST) @@ -159,6 +165,7 @@ supportedProtocolVersions() bool isProtocolSupported(ProtocolVersion const& v) { + TRACE_FUNC(); return std::end(kSUPPORTED_PROTOCOL_LIST) != std::ranges::find(kSUPPORTED_PROTOCOL_LIST, v); } diff --git a/src/xrpld/overlay/detail/ProtocolVersion.h b/src/xrpld/overlay/detail/ProtocolVersion.h index d6d9da7ad3..d3caa4f710 100644 --- a/src/xrpld/overlay/detail/ProtocolVersion.h +++ b/src/xrpld/overlay/detail/ProtocolVersion.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace xrpl { diff --git a/src/xrpld/overlay/detail/TrafficCount.cpp b/src/xrpld/overlay/detail/TrafficCount.cpp index 4dc99e3e37..5d9ab5281e 100644 --- a/src/xrpld/overlay/detail/TrafficCount.cpp +++ b/src/xrpld/overlay/detail/TrafficCount.cpp @@ -1,4 +1,5 @@ #include +#include #include @@ -33,6 +34,7 @@ TrafficCount::categorize( protocol::MessageType type, bool inbound) { + TRACE_FUNC(); if (auto item = kTYPE_LOOKUP.find(type); item != kTYPE_LOOKUP.end()) return item->second; diff --git a/src/xrpld/overlay/detail/TrafficCount.h b/src/xrpld/overlay/detail/TrafficCount.h index 233f06b70f..a01da34a31 100644 --- a/src/xrpld/overlay/detail/TrafficCount.h +++ b/src/xrpld/overlay/detail/TrafficCount.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -56,6 +57,7 @@ public: operator bool() const { + TRACE_FUNC(); return (messagesIn != 0u) || (messagesOut != 0u); } }; @@ -192,6 +194,7 @@ public: void addCount(Category cat, bool inbound, int bytes) { + TRACE_FUNC(); XRPL_ASSERT( cat <= Category::Unknown, "xrpl::TrafficCount::addCount : valid category input"); @@ -220,12 +223,14 @@ public: [[nodiscard]] auto const& getCounts() const { + TRACE_FUNC(); return counts_; } static std::string toString(Category cat) { + TRACE_FUNC(); static std::unordered_map const kCATEGORY_MAP = { {Category::Base, "overhead"}, {Category::Cluster, "overhead_cluster"}, diff --git a/src/xrpld/overlay/detail/TxMetrics.cpp b/src/xrpld/overlay/detail/TxMetrics.cpp index c1a336b11e..ab65195fd2 100644 --- a/src/xrpld/overlay/detail/TxMetrics.cpp +++ b/src/xrpld/overlay/detail/TxMetrics.cpp @@ -2,6 +2,7 @@ #include #include +#include #include @@ -16,6 +17,7 @@ namespace xrpl::metrics { void TxMetrics::addMetrics(protocol::MessageType type, std::uint32_t val) { + TRACE_FUNC(); auto add = [&](auto& m, std::uint32_t val) { std::scoped_lock const lock(mutex); m.addMetrics(val); @@ -46,6 +48,7 @@ TxMetrics::addMetrics(protocol::MessageType type, std::uint32_t val) void TxMetrics::addMetrics(std::uint32_t selected, std::uint32_t suppressed, std::uint32_t notenabled) { + TRACE_FUNC(); std::scoped_lock const lock(mutex); selectedPeers.addMetrics(selected); suppressedPeers.addMetrics(suppressed); @@ -55,6 +58,7 @@ TxMetrics::addMetrics(std::uint32_t selected, std::uint32_t suppressed, std::uin void TxMetrics::addMetrics(std::uint32_t missing) { + TRACE_FUNC(); std::scoped_lock const lock(mutex); missingTx.addMetrics(missing); } @@ -62,12 +66,14 @@ TxMetrics::addMetrics(std::uint32_t missing) void MultipleMetrics::addMetrics(std::uint32_t val2) { + TRACE_FUNC(); addMetrics(1, val2); } void MultipleMetrics::addMetrics(std::uint32_t val1, std::uint32_t val2) { + TRACE_FUNC(); m1.addMetrics(val1); m2.addMetrics(val2); } @@ -75,6 +81,7 @@ MultipleMetrics::addMetrics(std::uint32_t val1, std::uint32_t val2) void SingleMetrics::addMetrics(std::uint32_t val) { + TRACE_FUNC(); using namespace std::chrono_literals; accum += val; N++; @@ -99,6 +106,7 @@ SingleMetrics::addMetrics(std::uint32_t val) json::Value TxMetrics::json() const { + TRACE_FUNC(); std::scoped_lock const l(mutex); json::Value ret(json::ObjectValue); diff --git a/src/xrpld/overlay/detail/ZeroCopyStream.h b/src/xrpld/overlay/detail/ZeroCopyStream.h index d8d311105d..48c919a60d 100644 --- a/src/xrpld/overlay/detail/ZeroCopyStream.h +++ b/src/xrpld/overlay/detail/ZeroCopyStream.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include @@ -40,6 +41,7 @@ public: [[nodiscard]] google::protobuf::int64 ByteCount() const override { + TRACE_FUNC(); return count_; } }; @@ -58,6 +60,7 @@ template bool ZeroCopyInputStream::Next(void const** data, int* size) { + TRACE_FUNC(); *data = pos_.data(); *size = boost::asio::buffer_size(pos_); if (first_ == last_) @@ -71,6 +74,7 @@ template void ZeroCopyInputStream::BackUp(int count) { + TRACE_FUNC(); --first_; pos_ = *first_ + (boost::asio::buffer_size(*first_) - count); count_ -= count; @@ -80,6 +84,7 @@ template bool ZeroCopyInputStream::Skip(int count) { + TRACE_FUNC(); if (first_ == last_) return false; while (count > 0) @@ -135,6 +140,7 @@ public: [[nodiscard]] google::protobuf::int64 ByteCount() const override { + TRACE_FUNC(); return count_; } }; @@ -153,6 +159,7 @@ ZeroCopyOutputStream::ZeroCopyOutputStream(Streambuf& streambuf, std: template ZeroCopyOutputStream::~ZeroCopyOutputStream() { + TRACE_FUNC(); if (commit_ != 0) streambuf_.commit(commit_); } @@ -161,6 +168,7 @@ template bool ZeroCopyOutputStream::Next(void** data, int* size) { + TRACE_FUNC(); if (commit_ != 0) { streambuf_.commit(commit_); @@ -184,6 +192,7 @@ template void ZeroCopyOutputStream::BackUp(int count) { + TRACE_FUNC(); XRPL_ASSERT(count <= commit_, "xrpl::ZeroCopyOutputStream::BackUp : valid input"); auto const n = commit_ - count; streambuf_.commit(n); diff --git a/src/xrpld/overlay/predicates.h b/src/xrpld/overlay/predicates.h index d7c2add937..e4ad5c7d45 100644 --- a/src/xrpld/overlay/predicates.h +++ b/src/xrpld/overlay/predicates.h @@ -2,6 +2,7 @@ #include #include +#include #include @@ -21,6 +22,7 @@ struct SendAlways void operator()(std::shared_ptr const& peer) const { + TRACE_FUNC(); peer->send(msg); } }; @@ -43,6 +45,7 @@ struct SendIfPred void operator()(std::shared_ptr const& peer) const { + TRACE_FUNC(); if (predicate(peer)) peer->send(msg); } @@ -53,6 +56,7 @@ template SendIfPred sendIf(std::shared_ptr const& m, Predicate const& f) { + TRACE_FUNC(); return SendIfPred(m, f); } @@ -74,6 +78,7 @@ struct SendIfNotPred void operator()(std::shared_ptr const& peer) const { + TRACE_FUNC(); if (!predicate(peer)) peer->send(msg); } @@ -84,6 +89,7 @@ template SendIfNotPred sendIfNot(std::shared_ptr const& m, Predicate const& f) { + TRACE_FUNC(); return SendIfNotPred(m, f); } @@ -101,6 +107,7 @@ struct MatchPeer bool operator()(std::shared_ptr const& peer) const { + TRACE_FUNC(); return (matchPeer != nullptr) && (peer.get() == matchPeer); } }; @@ -119,6 +126,7 @@ struct PeerInCluster bool operator()(std::shared_ptr const& peer) const { + TRACE_FUNC(); if (skipPeer(peer)) return false; @@ -143,6 +151,7 @@ struct PeerInSet bool operator()(std::shared_ptr const& peer) const { + TRACE_FUNC(); return peerSet.contains(peer->id()); } }; diff --git a/src/xrpld/peerfinder/PeerfinderManager.h b/src/xrpld/peerfinder/PeerfinderManager.h index 072750efe7..6e85e6ba76 100644 --- a/src/xrpld/peerfinder/PeerfinderManager.h +++ b/src/xrpld/peerfinder/PeerfinderManager.h @@ -6,6 +6,7 @@ #include #include +#include #include @@ -110,6 +111,7 @@ struct Endpoint inline bool operator<(Endpoint const& lhs, Endpoint const& rhs) { + TRACE_FUNC(); return lhs.address < rhs.address; } @@ -138,6 +140,7 @@ enum class Result { InboundDisabled, DuplicatePeer, IpLimitExceeded, Full, Succe inline std::string_view to_string(Result result) noexcept { + TRACE_FUNC(); switch (result) { case Result::InboundDisabled: diff --git a/src/xrpld/peerfinder/detail/Bootcache.cpp b/src/xrpld/peerfinder/detail/Bootcache.cpp index 140d0f01c6..b4350bfdcf 100644 --- a/src/xrpld/peerfinder/detail/Bootcache.cpp +++ b/src/xrpld/peerfinder/detail/Bootcache.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -26,48 +27,56 @@ Bootcache::Bootcache(Store& store, clock_type& clock, beast::Journal journal) Bootcache::~Bootcache() { + TRACE_FUNC(); update(); } bool Bootcache::empty() const { + TRACE_FUNC(); return map_.empty(); } Bootcache::map_type::size_type Bootcache::size() const { + TRACE_FUNC(); return map_.size(); } Bootcache::const_iterator Bootcache::begin() const { + TRACE_FUNC(); return const_iterator(map_.right.begin()); } Bootcache::const_iterator Bootcache::cbegin() const { + TRACE_FUNC(); return const_iterator(map_.right.begin()); } Bootcache::const_iterator Bootcache::end() const { + TRACE_FUNC(); return const_iterator(map_.right.end()); } Bootcache::const_iterator Bootcache::cend() const { + TRACE_FUNC(); return const_iterator(map_.right.end()); } void Bootcache::clear() { + TRACE_FUNC(); map_.clear(); needsUpdate_ = true; } @@ -77,6 +86,7 @@ Bootcache::clear() void Bootcache::load() { + TRACE_FUNC(); clear(); auto const n(store_.load([this](beast::IP::Endpoint const& endpoint, int valence) { auto const result(this->map_.insert(value_type(endpoint, valence))); @@ -97,6 +107,7 @@ Bootcache::load() bool Bootcache::insert(beast::IP::Endpoint const& endpoint) { + TRACE_FUNC(); auto const result(map_.insert(value_type(endpoint, 0))); if (result.second) { @@ -110,6 +121,7 @@ Bootcache::insert(beast::IP::Endpoint const& endpoint) bool Bootcache::insertStatic(beast::IP::Endpoint const& endpoint) { + TRACE_FUNC(); auto result(map_.insert(value_type(endpoint, kSTATIC_VALENCE))); if (!result.second && (result.first->right.valence() < kSTATIC_VALENCE)) @@ -131,6 +143,7 @@ Bootcache::insertStatic(beast::IP::Endpoint const& endpoint) void Bootcache::onSuccess(beast::IP::Endpoint const& endpoint) { + TRACE_FUNC(); auto result(map_.insert(value_type(endpoint, 1))); if (result.second) { @@ -154,6 +167,7 @@ Bootcache::onSuccess(beast::IP::Endpoint const& endpoint) void Bootcache::onFailure(beast::IP::Endpoint const& endpoint) { + TRACE_FUNC(); auto result(map_.insert(value_type(endpoint, -1))); if (result.second) { @@ -178,6 +192,7 @@ Bootcache::onFailure(beast::IP::Endpoint const& endpoint) void Bootcache::periodicActivity() { + TRACE_FUNC(); checkUpdate(); } @@ -186,6 +201,7 @@ Bootcache::periodicActivity() void Bootcache::onWrite(beast::PropertyStream::Map& map) { + TRACE_FUNC(); beast::PropertyStream::Set entries("entries", map); for (auto iter = map_.right.begin(); iter != map_.right.end(); ++iter) { @@ -199,6 +215,7 @@ Bootcache::onWrite(beast::PropertyStream::Map& map) void Bootcache::prune() { + TRACE_FUNC(); if (size() <= Tuning::BootcacheSize) return; @@ -226,6 +243,7 @@ Bootcache::prune() void Bootcache::update() { + TRACE_FUNC(); if (!needsUpdate_) return; std::vector list; @@ -247,6 +265,7 @@ Bootcache::update() void Bootcache::checkUpdate() { + TRACE_FUNC(); if (needsUpdate_ && whenUpdate_ < clock_.now()) update(); } @@ -255,6 +274,7 @@ Bootcache::checkUpdate() void Bootcache::flagForUpdate() { + TRACE_FUNC(); needsUpdate_ = true; checkUpdate(); } diff --git a/src/xrpld/peerfinder/detail/Bootcache.h b/src/xrpld/peerfinder/detail/Bootcache.h index c061f37595..39124e5cb7 100644 --- a/src/xrpld/peerfinder/detail/Bootcache.h +++ b/src/xrpld/peerfinder/detail/Bootcache.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -42,18 +43,21 @@ private: int& valence() { + TRACE_FUNC(); return valence_; } [[nodiscard]] int valence() const { + TRACE_FUNC(); return valence_; } friend bool operator<(Entry const& lhs, Entry const& rhs) { + TRACE_FUNC(); return lhs.valence() > rhs.valence(); } @@ -79,6 +83,7 @@ private: beast::IP::Endpoint const& operator()(map_type::right_map::const_iterator::value_type const& v) const { + TRACE_FUNC(); return v.get_left(); } }; diff --git a/src/xrpld/peerfinder/detail/Checker.h b/src/xrpld/peerfinder/detail/Checker.h index 8ab084830c..661108578b 100644 --- a/src/xrpld/peerfinder/detail/Checker.h +++ b/src/xrpld/peerfinder/detail/Checker.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -45,6 +46,7 @@ private: ~AsyncOp() override { + TRACE_FUNC(); checker.remove(*this); } @@ -121,6 +123,7 @@ template void Checker::AsyncOp::stop() { + TRACE_FUNC(); error_code ec; socket.cancel(ec); } @@ -130,6 +133,7 @@ template void Checker::AsyncOp::operator()(error_code const& ec) { + TRACE_FUNC(); handler(ec); } @@ -143,6 +147,7 @@ Checker::Checker(boost::asio::io_context& ioContext) : ioContext_(ioCo template Checker::~Checker() { + TRACE_FUNC(); wait(); } @@ -150,6 +155,7 @@ template void Checker::stop() { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); if (!stop_) { @@ -163,6 +169,7 @@ template void Checker::wait() { + TRACE_FUNC(); std::unique_lock lock(mutex_); while (!list_.empty()) cond_.wait(lock); @@ -173,6 +180,7 @@ template void Checker::asyncConnect(beast::IP::Endpoint const& endpoint, Handler&& handler) { + TRACE_FUNC(); auto const op = std::make_shared>(*this, ioContext_, std::forward(handler)); { @@ -188,6 +196,7 @@ template void Checker::remove(BasicAsyncOp& op) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); list_.erase(list_.iterator_to(op)); if (list_.size() == 0) diff --git a/src/xrpld/peerfinder/detail/Counts.h b/src/xrpld/peerfinder/detail/Counts.h index e859b09d21..4dd1cf3e9a 100644 --- a/src/xrpld/peerfinder/detail/Counts.h +++ b/src/xrpld/peerfinder/detail/Counts.h @@ -5,6 +5,7 @@ #include #include +#include namespace xrpl::PeerFinder { @@ -19,6 +20,7 @@ public: void add(Slot const& s) { + TRACE_FUNC(); adjust(s, CountAdjustment::Increment); } @@ -26,6 +28,7 @@ public: void remove(Slot const& s) { + TRACE_FUNC(); adjust(s, CountAdjustment::Decrement); } @@ -33,6 +36,7 @@ public: [[nodiscard]] bool canActivate(Slot const& s) const { + TRACE_FUNC(); // Must be handshaked and in the right state XRPL_ASSERT( s.state() == Slot::State::Connected || s.state() == Slot::State::Accept, @@ -51,6 +55,7 @@ public: [[nodiscard]] std::size_t attemptsNeeded() const { + TRACE_FUNC(); if (attempts_ >= Tuning::MaxConnectAttempts) return 0; return Tuning::MaxConnectAttempts - attempts_; @@ -60,6 +65,7 @@ public: [[nodiscard]] std::size_t attempts() const { + TRACE_FUNC(); return attempts_; } @@ -67,6 +73,7 @@ public: [[nodiscard]] int outMax() const { + TRACE_FUNC(); return out_max_; } @@ -76,6 +83,7 @@ public: [[nodiscard]] int outActive() const { + TRACE_FUNC(); return out_active_; } @@ -83,6 +91,7 @@ public: [[nodiscard]] std::size_t fixed() const { + TRACE_FUNC(); return fixed_; } @@ -90,6 +99,7 @@ public: [[nodiscard]] std::size_t fixedActive() const { + TRACE_FUNC(); return fixed_active_; } @@ -99,6 +109,7 @@ public: void onConfig(Config const& config) { + TRACE_FUNC(); out_max_ = config.outPeers; if (config.wantIncoming) in_max_ = config.inPeers; @@ -108,6 +119,7 @@ public: [[nodiscard]] int acceptCount() const { + TRACE_FUNC(); return acceptCount_; } @@ -115,6 +127,7 @@ public: [[nodiscard]] int connectCount() const { + TRACE_FUNC(); return attempts_; } @@ -122,6 +135,7 @@ public: [[nodiscard]] int closingCount() const { + TRACE_FUNC(); return closingCount_; } @@ -129,6 +143,7 @@ public: [[nodiscard]] int inMax() const { + TRACE_FUNC(); return in_max_; } @@ -136,6 +151,7 @@ public: [[nodiscard]] int inboundActive() const { + TRACE_FUNC(); return in_active_; } @@ -143,6 +159,7 @@ public: [[nodiscard]] int totalActive() const { + TRACE_FUNC(); return in_active_ + out_active_; } @@ -152,6 +169,7 @@ public: [[nodiscard]] int inboundSlotsFree() const { + TRACE_FUNC(); if (in_active_ < in_max_) return in_max_ - in_active_; return 0; @@ -163,6 +181,7 @@ public: [[nodiscard]] int outboundSlotsFree() const { + TRACE_FUNC(); if (out_active_ < out_max_) return out_max_ - out_active_; return 0; @@ -175,6 +194,7 @@ public: [[nodiscard]] bool isConnectedToNetwork() const { + TRACE_FUNC(); // We will consider ourselves connected if we have reached // the number of outgoing connections desired, or if connect // automatically is false. @@ -188,6 +208,7 @@ public: void onWrite(beast::PropertyStream::Map& map) const { + TRACE_FUNC(); map["accept"] = acceptCount(); map["connect"] = connectCount(); map["close"] = closingCount(); @@ -202,6 +223,7 @@ public: [[nodiscard]] std::string stateString() const { + TRACE_FUNC(); std::stringstream ss; ss << out_active_ << "/" << out_max_ << " out, " << in_active_ << "/" << in_max_ << " in, " << connectCount() << " connecting, " << closingCount() << " closing"; @@ -215,6 +237,7 @@ private: static void adjustCounter(T& counter, CountAdjustment dir) { + TRACE_FUNC(); switch (dir) { case CountAdjustment::Increment: @@ -237,6 +260,7 @@ private: void adjust(Slot const& s, CountAdjustment const dir) { + TRACE_FUNC(); int const n = static_cast(dir); if (s.fixed()) adjustCounter(fixed_, dir); diff --git a/src/xrpld/peerfinder/detail/Fixed.h b/src/xrpld/peerfinder/detail/Fixed.h index c334b9ac99..59140f5828 100644 --- a/src/xrpld/peerfinder/detail/Fixed.h +++ b/src/xrpld/peerfinder/detail/Fixed.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace xrpl::PeerFinder { @@ -18,6 +19,7 @@ public: [[nodiscard]] clock_type::time_point const& when() const { + TRACE_FUNC(); return when_; } @@ -25,6 +27,7 @@ public: void failure(clock_type::time_point const& now) { + TRACE_FUNC(); failures_ = std::min(failures_ + 1, Tuning::kCONNECTION_BACKOFF.size() - 1); when_ = now + std::chrono::minutes(Tuning::kCONNECTION_BACKOFF[failures_]); } @@ -33,6 +36,7 @@ public: void success(clock_type::time_point const& now) { + TRACE_FUNC(); failures_ = 0; when_ = now; } diff --git a/src/xrpld/peerfinder/detail/Handouts.h b/src/xrpld/peerfinder/detail/Handouts.h index f4c7483e3f..0f4ce25b9d 100644 --- a/src/xrpld/peerfinder/detail/Handouts.h +++ b/src/xrpld/peerfinder/detail/Handouts.h @@ -5,6 +5,7 @@ #include #include +#include #include @@ -23,6 +24,7 @@ template std::size_t handoutOne(Target& t, HopContainer& h) { + TRACE_FUNC(); XRPL_ASSERT(!t.full(), "xrpl::PeerFinder::detail::handout_one : target is not full"); for (auto it = h.begin(); it != h.end(); ++it) { @@ -46,6 +48,7 @@ template void handout(TargetFwdIter first, TargetFwdIter last, SeqFwdIter seqFirst, SeqFwdIter seqLast) { + TRACE_FUNC(); for (;;) { std::size_t n(0); @@ -88,24 +91,28 @@ public: [[nodiscard]] bool full() const { + TRACE_FUNC(); return list_.size() >= Tuning::kREDIRECT_ENDPOINT_COUNT; } [[nodiscard]] SlotImp::ptr const& slot() const { + TRACE_FUNC(); return slot_; } std::vector& list() { + TRACE_FUNC(); return list_; } [[nodiscard]] std::vector const& list() const { + TRACE_FUNC(); return list_; } @@ -117,6 +124,7 @@ private: template RedirectHandouts::RedirectHandouts(SlotImp::ptr slot) : slot_(std::move(slot)) { + TRACE_FUNC(); list_.reserve(Tuning::kREDIRECT_ENDPOINT_COUNT); } @@ -124,6 +132,7 @@ template bool RedirectHandouts::tryInsert(Endpoint const& ep) { + TRACE_FUNC(); if (full()) return false; @@ -172,24 +181,28 @@ public: [[nodiscard]] bool full() const { + TRACE_FUNC(); return list_.size() >= Tuning::kNUMBER_OF_ENDPOINTS; } void insert(Endpoint const& ep) { + TRACE_FUNC(); list_.push_back(ep); } [[nodiscard]] SlotImp::ptr const& slot() const { + TRACE_FUNC(); return slot_; } [[nodiscard]] std::vector const& list() const { + TRACE_FUNC(); return list_; } @@ -201,6 +214,7 @@ private: template SlotHandouts::SlotHandouts(SlotImp::ptr slot) : slot_(std::move(slot)) { + TRACE_FUNC(); list_.reserve(Tuning::kNUMBER_OF_ENDPOINTS); } @@ -208,6 +222,7 @@ template bool SlotHandouts::tryInsert(Endpoint const& ep) { + TRACE_FUNC(); if (full()) return false; @@ -268,30 +283,35 @@ public: [[nodiscard]] bool empty() const { + TRACE_FUNC(); return list_.empty(); } [[nodiscard]] bool full() const { + TRACE_FUNC(); return list_.size() >= needed_; } bool tryInsert(Endpoint const& endpoint) { + TRACE_FUNC(); return tryInsert(endpoint.address); } list_type& list() { + TRACE_FUNC(); return list_; } [[nodiscard]] list_type const& list() const { + TRACE_FUNC(); return list_; } }; @@ -300,6 +320,7 @@ template ConnectHandouts::ConnectHandouts(std::size_t needed, Squelches& squelches) : needed_(needed), squelches_(squelches) { + TRACE_FUNC(); list_.reserve(needed); } @@ -307,6 +328,7 @@ template bool ConnectHandouts::tryInsert(beast::IP::Endpoint const& endpoint) { + TRACE_FUNC(); if (full()) return false; diff --git a/src/xrpld/peerfinder/detail/Livecache.h b/src/xrpld/peerfinder/detail/Livecache.h index 063fb622cf..2fe96fd957 100644 --- a/src/xrpld/peerfinder/detail/Livecache.h +++ b/src/xrpld/peerfinder/detail/Livecache.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -60,6 +61,7 @@ public: Endpoint const& operator()(Element const& e) const { + TRACE_FUNC(); return e.endpoint; } }; @@ -77,48 +79,56 @@ public: [[nodiscard]] iterator begin() const { + TRACE_FUNC(); return iterator(list_.get().cbegin(), Transform()); } [[nodiscard]] iterator cbegin() const { + TRACE_FUNC(); return iterator(list_.get().cbegin(), Transform()); } [[nodiscard]] iterator end() const { + TRACE_FUNC(); return iterator(list_.get().cend(), Transform()); } [[nodiscard]] iterator cend() const { + TRACE_FUNC(); return iterator(list_.get().cend(), Transform()); } [[nodiscard]] reverse_iterator rbegin() const { + TRACE_FUNC(); return reverse_iterator(list_.get().crbegin(), Transform()); } [[nodiscard]] reverse_iterator crbegin() const { + TRACE_FUNC(); return reverse_iterator(list_.get().crbegin(), Transform()); } [[nodiscard]] reverse_iterator rend() const { + TRACE_FUNC(); return reverse_iterator(list_.get().crend(), Transform()); } [[nodiscard]] reverse_iterator crend() const { + TRACE_FUNC(); return reverse_iterator(list_.get().crend(), Transform()); } @@ -126,6 +136,7 @@ public: void moveBack(const_iterator pos) { + TRACE_FUNC(); auto& e(const_cast(*pos.base())); list_.get().erase(list_.get().iterator_to(e)); list_.get().push_back(e); @@ -147,6 +158,7 @@ protected: static Hop makeHop(typename beast::MaybeConst::type& list) { + TRACE_FUNC(); return Hop(list); } }; @@ -217,6 +229,7 @@ public: operator()(typename beast::MaybeConst::type& list) const { + TRACE_FUNC(); return makeHop(list); } }; @@ -236,72 +249,84 @@ public: iterator begin() { + TRACE_FUNC(); return iterator(lists_.begin(), Transform()); } [[nodiscard]] const_iterator begin() const { + TRACE_FUNC(); return const_iterator(lists_.cbegin(), Transform()); } [[nodiscard]] const_iterator cbegin() const { + TRACE_FUNC(); return const_iterator(lists_.cbegin(), Transform()); } iterator end() { + TRACE_FUNC(); return iterator(lists_.end(), Transform()); } [[nodiscard]] const_iterator end() const { + TRACE_FUNC(); return const_iterator(lists_.cend(), Transform()); } [[nodiscard]] const_iterator cend() const { + TRACE_FUNC(); return const_iterator(lists_.cend(), Transform()); } reverse_iterator rbegin() { + TRACE_FUNC(); return reverse_iterator(lists_.rbegin(), Transform()); } [[nodiscard]] const_reverse_iterator rbegin() const { + TRACE_FUNC(); return const_reverse_iterator(lists_.crbegin(), Transform()); } [[nodiscard]] const_reverse_iterator crbegin() const { + TRACE_FUNC(); return const_reverse_iterator(lists_.crbegin(), Transform()); } reverse_iterator rend() { + TRACE_FUNC(); return reverse_iterator(lists_.rend(), Transform()); } [[nodiscard]] const_reverse_iterator rend() const { + TRACE_FUNC(); return const_reverse_iterator(lists_.crend(), Transform()); } [[nodiscard]] const_reverse_iterator crend() const { + TRACE_FUNC(); return const_reverse_iterator(lists_.crend(), Transform()); } @@ -334,6 +359,7 @@ public: [[nodiscard]] bool empty() const { + TRACE_FUNC(); return cache_.empty(); } @@ -341,6 +367,7 @@ public: typename cache_type::size_type size() const { + TRACE_FUNC(); return cache_.size(); } @@ -369,6 +396,7 @@ template void Livecache::expire() { + TRACE_FUNC(); std::size_t n(0); typename cache_type::time_point const expired( cache_.clock().now() - Tuning::kLIVE_CACHE_SECONDS_TO_LIVE); @@ -391,6 +419,7 @@ template void Livecache::insert(Endpoint const& ep) { + TRACE_FUNC(); // The caller already incremented hop, so if we got a // message at maxHops we will store it at maxHops + 1. // This means we won't give out the address to other peers @@ -438,6 +467,7 @@ template void Livecache::onWrite(beast::PropertyStream::Map& map) { + TRACE_FUNC(); typename cache_type::time_point const expired( cache_.clock().now() - Tuning::kLIVE_CACHE_SECONDS_TO_LIVE); map["size"] = size(); @@ -461,6 +491,7 @@ template void Livecache::HopsT::shuffle() { + TRACE_FUNC(); for (auto& list : lists_) { std::vector> v; @@ -477,6 +508,7 @@ template std::string Livecache::HopsT::histogram() const { + TRACE_FUNC(); std::string s; for (auto const& h : hist_) { @@ -490,6 +522,7 @@ Livecache::HopsT::histogram() const template Livecache::HopsT::HopsT(Allocator const& alloc) { + TRACE_FUNC(); std::ranges::fill(hist_, 0); } @@ -497,6 +530,7 @@ template void Livecache::HopsT::insert(Element& e) { + TRACE_FUNC(); XRPL_ASSERT( e.endpoint.hops <= Tuning::kMAX_HOPS + 1, "xrpl::PeerFinder::Livecache::hops_t::insert : maximum input hops"); @@ -509,6 +543,7 @@ template void Livecache::HopsT::reinsert(Element& e, std::uint32_t numHops) { + TRACE_FUNC(); XRPL_ASSERT( numHops <= Tuning::kMAX_HOPS + 1, "xrpl::PeerFinder::Livecache::hops_t::reinsert : maximum hops input"); @@ -526,6 +561,7 @@ template void Livecache::HopsT::remove(Element& e) { + TRACE_FUNC(); --hist_[e.endpoint.hops]; auto& list = lists_[e.endpoint.hops]; diff --git a/src/xrpld/peerfinder/detail/Logic.h b/src/xrpld/peerfinder/detail/Logic.h index 89e7336a33..0e95ae5aa5 100644 --- a/src/xrpld/peerfinder/detail/Logic.h +++ b/src/xrpld/peerfinder/detail/Logic.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -99,6 +100,7 @@ public: , whenBroadcast(clock.now()) , squelches(clock) { + TRACE_FUNC(); config({}); } @@ -107,6 +109,7 @@ public: void load() { + TRACE_FUNC(); std::scoped_lock const _(lock); bootcache.load(); } @@ -120,6 +123,7 @@ public: void stop() { + TRACE_FUNC(); std::scoped_lock const _(lock); stopping = true; if (fetchSource != nullptr) @@ -135,6 +139,7 @@ public: void config(Config const& c) { + TRACE_FUNC(); std::scoped_lock const _(lock); config_ = c; counts_.onConfig(config_); @@ -143,6 +148,7 @@ public: Config config() { + TRACE_FUNC(); std::scoped_lock const _(lock); return config_; } @@ -150,12 +156,14 @@ public: void addFixedPeer(std::string const& name, beast::IP::Endpoint const& ep) { + TRACE_FUNC(); addFixedPeer(name, std::vector{ep}); } void addFixedPeer(std::string const& name, std::vector const& addresses) { + TRACE_FUNC(); std::scoped_lock const _(lock); if (addresses.empty()) @@ -195,6 +203,7 @@ public: beast::IP::Endpoint const& checkedAddress, boost::system::error_code ec) { + TRACE_FUNC(); if (ec == boost::asio::error::operation_aborted) return; @@ -237,6 +246,7 @@ public: beast::IP::Endpoint const& localEndpoint, beast::IP::Endpoint const& remoteEndpoint) { + TRACE_FUNC(); JLOG(journal.debug()) << beast::Leftw(18) << "Logic accept" << remoteEndpoint << " on local " << localEndpoint; @@ -286,6 +296,7 @@ public: std::pair newOutboundSlot(beast::IP::Endpoint const& remoteEndpoint) { + TRACE_FUNC(); JLOG(journal.debug()) << beast::Leftw(18) << "Logic connect " << remoteEndpoint; std::scoped_lock const _(lock); @@ -322,6 +333,7 @@ public: bool onConnected(SlotImp::ptr const& slot, beast::IP::Endpoint const& localEndpoint) { + TRACE_FUNC(); beast::WrappedSink sink{journal.sink(), slot->prefix()}; beast::Journal const journal{sink}; @@ -360,6 +372,7 @@ public: Result activate(SlotImp::ptr const& slot, PublicKey const& key, bool reserved) { + TRACE_FUNC(); beast::WrappedSink sink{journal.sink(), slot->prefix()}; beast::Journal const journal{sink}; @@ -439,6 +452,7 @@ public: std::vector redirect(SlotImp::ptr const& slot) { + TRACE_FUNC(); std::scoped_lock const _(lock); RedirectHandouts h(slot); livecache.hops.shuffle(); @@ -455,6 +469,7 @@ public: std::vector autoconnect() { + TRACE_FUNC(); std::vector none; std::scoped_lock const _(lock); @@ -560,6 +575,7 @@ public: std::vector, std::vector>> buildEndpointsForPeers() { + TRACE_FUNC(); std::vector, std::vector>> result; std::scoped_lock const _(lock); @@ -642,6 +658,7 @@ public: void oncePerSecond() { + TRACE_FUNC(); std::scoped_lock const _(lock); // Expire the Livecache @@ -663,6 +680,7 @@ public: void preprocess(SlotImp::ptr const& slot, Endpoints& list) { + TRACE_FUNC(); bool neighbor(false); for (auto iter = list.begin(); iter != list.end();) { @@ -727,6 +745,7 @@ public: void onEndpoints(SlotImp::ptr const& slot, Endpoints list) { + TRACE_FUNC(); beast::WrappedSink sink{journal.sink(), slot->prefix()}; beast::Journal const journal{sink}; @@ -824,6 +843,7 @@ public: void remove(SlotImp::ptr const& slot) { + TRACE_FUNC(); { auto const iter = slots.find(slot->remoteEndpoint()); // The slot must exist in the table @@ -872,6 +892,7 @@ public: void onClosed(SlotImp::ptr const& slot) { + TRACE_FUNC(); std::scoped_lock const _(lock); remove(slot); @@ -932,6 +953,7 @@ public: void onFailure(SlotImp::ptr const& slot) { + TRACE_FUNC(); std::scoped_lock const _(lock); bootcache.onFailure(slot->remoteEndpoint()); @@ -949,6 +971,7 @@ public: bool fixed(beast::IP::Endpoint const& endpoint) const { + TRACE_FUNC(); for (auto const& entry : fixed_) { if (entry.first == endpoint) @@ -963,6 +986,7 @@ public: bool fixed(beast::IP::Address const& address) const { + TRACE_FUNC(); for (auto const& entry : fixed_) { if (entry.first.address() == address) @@ -982,6 +1006,7 @@ public: void getFixed(std::size_t needed, Container& c, typename ConnectHandouts::Squelches& squelches) { + TRACE_FUNC(); auto const now(clock.now()); for (auto iter = fixed_.begin(); needed && iter != fixed_.end(); ++iter) { @@ -1003,12 +1028,14 @@ public: void addStaticSource(std::shared_ptr const& source) { + TRACE_FUNC(); fetch(source); } void addSource(std::shared_ptr const& source) { + TRACE_FUNC(); sources.push_back(source); } @@ -1024,6 +1051,7 @@ public: int addBootcacheAddresses(IPAddresses const& list) { + TRACE_FUNC(); int count(0); std::scoped_lock const _(lock); for (auto const& addr : list) @@ -1038,6 +1066,7 @@ public: void fetch(std::shared_ptr const& source) { + TRACE_FUNC(); Source::Results results; { @@ -1086,6 +1115,7 @@ public: bool isValidAddress(beast::IP::Endpoint const& address) { + TRACE_FUNC(); if (isUnspecified(address)) return false; if (!isPublic(address)) @@ -1104,6 +1134,7 @@ public: void writeSlots(beast::PropertyStream::Set& set, Slots const& slots) { + TRACE_FUNC(); for (auto const& entry : slots) { beast::PropertyStream::Map item(set); @@ -1125,6 +1156,7 @@ public: void onWrite(beast::PropertyStream::Map& map) { + TRACE_FUNC(); std::scoped_lock const _(lock); // VFALCO NOTE These ugly casts are needed because @@ -1168,12 +1200,14 @@ public: Counts const& counts() const { + TRACE_FUNC(); return counts_; } static std::string stateString(Slot::State state) { + TRACE_FUNC(); switch (state) { case Slot::State::Accept: @@ -1203,6 +1237,7 @@ Logic::onRedirects( FwdIter last, boost::asio::ip::tcp::endpoint const& remoteAddress) { + TRACE_FUNC(); std::scoped_lock const _(lock); std::size_t n = 0; for (; first != last && n < Tuning::MaxRedirects; ++first, ++n) diff --git a/src/xrpld/peerfinder/detail/PeerfinderConfig.cpp b/src/xrpld/peerfinder/detail/PeerfinderConfig.cpp index ed9bba0ee4..13b9bf2536 100644 --- a/src/xrpld/peerfinder/detail/PeerfinderConfig.cpp +++ b/src/xrpld/peerfinder/detail/PeerfinderConfig.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -18,6 +19,7 @@ Config::Config() : outPeers(calcOutPeers()) bool operator==(Config const& lhs, Config const& rhs) { + TRACE_FUNC(); return lhs.autoConnect == rhs.autoConnect && lhs.peerPrivate == rhs.peerPrivate && lhs.wantIncoming == rhs.wantIncoming && lhs.inPeers == rhs.inPeers && lhs.maxPeers == rhs.maxPeers && lhs.outPeers == rhs.outPeers && @@ -28,12 +30,14 @@ operator==(Config const& lhs, Config const& rhs) std::size_t Config::calcOutPeers() const { + TRACE_FUNC(); return std::max((maxPeers * Tuning::OutPercent + 50) / 100, std::size_t(Tuning::MinOutCount)); } void Config::applyTuning() { + TRACE_FUNC(); if (ipLimit == 0) { // Unless a limit is explicitly set, we allow between @@ -53,6 +57,7 @@ Config::applyTuning() void Config::onWrite(beast::PropertyStream::Map& map) const { + TRACE_FUNC(); map["max_peers"] = maxPeers; map["out_peers"] = outPeers; map["want_incoming"] = wantIncoming; @@ -69,6 +74,7 @@ Config::makeConfig( bool validationPublicKey, int ipLimit) { + TRACE_FUNC(); PeerFinder::Config config; config.peerPrivate = cfg.PEER_PRIVATE; diff --git a/src/xrpld/peerfinder/detail/PeerfinderManager.cpp b/src/xrpld/peerfinder/detail/PeerfinderManager.cpp index 873c18aad9..2601506a56 100644 --- a/src/xrpld/peerfinder/detail/PeerfinderManager.cpp +++ b/src/xrpld/peerfinder/detail/PeerfinderManager.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -66,12 +67,14 @@ public: ~ManagerImp() override { + TRACE_FUNC(); stop(); } void stop() override { + TRACE_FUNC(); if (work_) { work_.reset(); @@ -89,12 +92,14 @@ public: void setConfig(Config const& config) override { + TRACE_FUNC(); logic_.config(config); } Config config() override { + TRACE_FUNC(); return logic_.config(); } @@ -102,18 +107,21 @@ public: addFixedPeer(std::string const& name, std::vector const& addresses) override { + TRACE_FUNC(); logic_.addFixedPeer(name, addresses); } void addFallbackStrings(std::string const& name, std::vector const& strings) override { + TRACE_FUNC(); logic_.addStaticSource(SourceStrings::make(name, strings)); } void addFallbackURL(std::string const& name, std::string const& url) { + TRACE_FUNC(); // VFALCO TODO This needs to be implemented } @@ -124,18 +132,21 @@ public: beast::IP::Endpoint const& localEndpoint, beast::IP::Endpoint const& remoteEndpoint) override { + TRACE_FUNC(); return logic_.newInboundSlot(localEndpoint, remoteEndpoint); } std::pair, Result> newOutboundSlot(beast::IP::Endpoint const& remoteEndpoint) override { + TRACE_FUNC(); return logic_.newOutboundSlot(remoteEndpoint); } void onEndpoints(std::shared_ptr const& slot, Endpoints const& endpoints) override { + TRACE_FUNC(); SlotImp::ptr const impl(std::dynamic_pointer_cast(slot)); logic_.onEndpoints(impl, endpoints); } @@ -143,6 +154,7 @@ public: void onClosed(std::shared_ptr const& slot) override { + TRACE_FUNC(); SlotImp::ptr const impl(std::dynamic_pointer_cast(slot)); logic_.onClosed(impl); } @@ -150,6 +162,7 @@ public: void onFailure(std::shared_ptr const& slot) override { + TRACE_FUNC(); SlotImp::ptr const impl(std::dynamic_pointer_cast(slot)); logic_.onFailure(impl); } @@ -159,6 +172,7 @@ public: boost::asio::ip::tcp::endpoint const& remoteAddress, std::vector const& eps) override { + TRACE_FUNC(); logic_.onRedirects(eps.begin(), eps.end(), remoteAddress); } @@ -168,6 +182,7 @@ public: onConnected(std::shared_ptr const& slot, beast::IP::Endpoint const& localEndpoint) override { + TRACE_FUNC(); SlotImp::ptr const impl(std::dynamic_pointer_cast(slot)); return logic_.onConnected(impl, localEndpoint); } @@ -175,6 +190,7 @@ public: Result activate(std::shared_ptr const& slot, PublicKey const& key, bool reserved) override { + TRACE_FUNC(); SlotImp::ptr const impl(std::dynamic_pointer_cast(slot)); return logic_.activate(impl, key, reserved); } @@ -182,6 +198,7 @@ public: std::vector redirect(std::shared_ptr const& slot) override { + TRACE_FUNC(); SlotImp::ptr const impl(std::dynamic_pointer_cast(slot)); return logic_.redirect(impl); } @@ -189,24 +206,28 @@ public: std::vector autoconnect() override { + TRACE_FUNC(); return logic_.autoconnect(); } void oncePerSecond() override { + TRACE_FUNC(); logic_.oncePerSecond(); } std::vector, std::vector>> buildEndpointsForPeers() override { + TRACE_FUNC(); return logic_.buildEndpointsForPeers(); } void start() override { + TRACE_FUNC(); store_.open(config_); logic_.load(); } @@ -220,6 +241,7 @@ public: void onWrite(beast::PropertyStream::Map& map) override { + TRACE_FUNC(); logic_.onWrite(map); } @@ -245,6 +267,7 @@ private: void collectMetrics() { + TRACE_FUNC(); std::scoped_lock const lock(statsMutex_); stats_.activeInboundPeers = logic_.counts().inboundActive(); stats_.activeOutboundPeers = logic_.counts().outActive(); @@ -265,6 +288,7 @@ makeManager( BasicConfig const& config, beast::insight::Collector::ptr const& collector) { + TRACE_FUNC(); return std::make_unique(ioContext, clock, journal, config, collector); } diff --git a/src/xrpld/peerfinder/detail/SlotImp.cpp b/src/xrpld/peerfinder/detail/SlotImp.cpp index b941f54b48..a0b2521cba 100644 --- a/src/xrpld/peerfinder/detail/SlotImp.cpp +++ b/src/xrpld/peerfinder/detail/SlotImp.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -49,6 +50,7 @@ SlotImp::SlotImp(beast::IP::Endpoint remoteEndpoint, bool fixed, clock_type& clo void SlotImp::state(State state) { + TRACE_FUNC(); // Must go through activate() to set active state XRPL_ASSERT( state != State::Active, "xrpl::PeerFinder::SlotImp::state : input state is not active"); @@ -82,6 +84,7 @@ SlotImp::state(State state) void SlotImp::activate(clock_type::time_point const& now) { + TRACE_FUNC(); // Can only become active from the accept or connected state XRPL_ASSERT( state_ == State::Accept || state_ == State::Connected, @@ -104,6 +107,7 @@ SlotImp::RecentT::RecentT(clock_type& clock) : cache_(clock) void SlotImp::RecentT::insert(beast::IP::Endpoint const& ep, std::uint32_t hops) { + TRACE_FUNC(); auto const result(cache_.emplace(ep, hops)); if (!result.second) { @@ -119,6 +123,7 @@ SlotImp::RecentT::insert(beast::IP::Endpoint const& ep, std::uint32_t hops) bool SlotImp::RecentT::filter(beast::IP::Endpoint const& ep, std::uint32_t hops) { + TRACE_FUNC(); auto const iter(cache_.find(ep)); if (iter == cache_.end()) return false; @@ -131,6 +136,7 @@ SlotImp::RecentT::filter(beast::IP::Endpoint const& ep, std::uint32_t hops) void SlotImp::RecentT::expire() { + TRACE_FUNC(); beast::expire(cache_, Tuning::kLIVE_CACHE_SECONDS_TO_LIVE); } diff --git a/src/xrpld/peerfinder/detail/SlotImp.h b/src/xrpld/peerfinder/detail/SlotImp.h index b198c93e5d..356bb8a1c6 100644 --- a/src/xrpld/peerfinder/detail/SlotImp.h +++ b/src/xrpld/peerfinder/detail/SlotImp.h @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -28,54 +29,63 @@ public: bool inbound() const override { + TRACE_FUNC(); return inbound_; } bool fixed() const override { + TRACE_FUNC(); return fixed_; } bool reserved() const override { + TRACE_FUNC(); return reserved_; } State state() const override { + TRACE_FUNC(); return state_; } beast::IP::Endpoint const& remoteEndpoint() const override { + TRACE_FUNC(); return remote_endpoint_; } std::optional const& localEndpoint() const override { + TRACE_FUNC(); return local_endpoint_; } std::optional const& publicKey() const override { + TRACE_FUNC(); return public_key_; } std::string prefix() const { + TRACE_FUNC(); return "[" + getFingerprint(remoteEndpoint(), publicKey()) + "] "; } std::optional listeningPort() const override { + TRACE_FUNC(); std::uint32_t const value = listening_port_; if (value == kUNKNOWN_PORT) return std::nullopt; @@ -85,30 +95,35 @@ public: void setListeningPort(std::uint16_t port) { + TRACE_FUNC(); listening_port_ = port; } void localEndpoint(beast::IP::Endpoint const& endpoint) { + TRACE_FUNC(); local_endpoint_ = endpoint; } void remoteEndpoint(beast::IP::Endpoint const& endpoint) { + TRACE_FUNC(); remote_endpoint_ = endpoint; } void publicKey(PublicKey const& key) { + TRACE_FUNC(); public_key_ = key; } void reserved(bool reserved) { + TRACE_FUNC(); reserved_ = reserved; } @@ -152,6 +167,7 @@ public: void expire() { + TRACE_FUNC(); recent.expire(); } diff --git a/src/xrpld/peerfinder/detail/SourceStrings.cpp b/src/xrpld/peerfinder/detail/SourceStrings.cpp index 61a3e0c021..5af38b41bc 100644 --- a/src/xrpld/peerfinder/detail/SourceStrings.cpp +++ b/src/xrpld/peerfinder/detail/SourceStrings.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -24,12 +25,14 @@ public: std::string const& name() override { + TRACE_FUNC(); return name_; } void fetch(Results& results, beast::Journal journal) override { + TRACE_FUNC(); results.addresses.resize(0); results.addresses.reserve(strings_.size()); for (int i = 0; i < strings_.size(); ++i) @@ -52,6 +55,7 @@ private: std::shared_ptr SourceStrings::make(std::string const& name, Strings const& strings) { + TRACE_FUNC(); return std::make_shared(name, strings); } diff --git a/src/xrpld/peerfinder/detail/StoreSqdb.h b/src/xrpld/peerfinder/detail/StoreSqdb.h index 13338cbd73..d785ef5c2c 100644 --- a/src/xrpld/peerfinder/detail/StoreSqdb.h +++ b/src/xrpld/peerfinder/detail/StoreSqdb.h @@ -4,6 +4,7 @@ #include #include +#include namespace xrpl::PeerFinder { @@ -32,6 +33,7 @@ public: void open(BasicConfig const& config) { + TRACE_FUNC(); init(config); update(); } @@ -41,6 +43,7 @@ public: std::size_t load(load_callback const& cb) override { + TRACE_FUNC(); std::size_t n(0); readPeerFinderDB(sqlDb_, [&](std::string const& s, int valence) { @@ -65,6 +68,7 @@ public: void save(std::vector const& v) override { + TRACE_FUNC(); savePeerFinderDB(sqlDb_, v); } @@ -73,6 +77,7 @@ public: void update() { + TRACE_FUNC(); updatePeerFinderDB(sqlDb_, CurrentSchemaVersion, journal_); } @@ -80,6 +85,7 @@ private: void init(BasicConfig const& config) { + TRACE_FUNC(); initPeerFinderDB(sqlDb_, config, journal_); } }; diff --git a/src/xrpld/peerfinder/detail/iosformat.h b/src/xrpld/peerfinder/detail/iosformat.h index 632ac10c16..8a59122078 100644 --- a/src/xrpld/peerfinder/detail/iosformat.h +++ b/src/xrpld/peerfinder/detail/iosformat.h @@ -3,6 +3,7 @@ #include #include #include +#include namespace beast { @@ -20,6 +21,7 @@ struct Leftw friend std::basic_ios& operator<<(std::basic_ios& ios, Leftw const& p) { + TRACE_FUNC(); ios.setf(std::ios_base::left, std::ios_base::adjustfield); ios.width(p.width); return ios; @@ -31,6 +33,7 @@ template std::basic_string heading(std::basic_string title, int width = 80, CharT fill = CharT('-')) { + TRACE_FUNC(); title.reserve(width); title.push_back(CharT(' ')); title.resize(width, fill); @@ -50,6 +53,7 @@ struct Divider friend std::basic_ostream& operator<<(std::basic_ostream& os, Divider const& d) { + TRACE_FUNC(); os << std::basic_string(d.width, d.fill); return os; } @@ -67,6 +71,7 @@ struct Fpad friend std::basic_ostream& operator<<(std::basic_ostream& os, Fpad const& f) { + TRACE_FUNC(); os << std::basic_string(f.width, f.fill); return os; } @@ -80,6 +85,7 @@ template std::string to_string(T const& t) { + TRACE_FUNC(); std::stringstream ss; ss << t; return ss.str(); @@ -109,6 +115,7 @@ public: friend std::basic_ostream& operator<<(std::basic_ostream& os, FieldT const& f) { + TRACE_FUNC(); std::size_t const length(f.text.length()); if (f.right) { @@ -136,6 +143,7 @@ field( int pad = 0, bool right = false) { + TRACE_FUNC(); return FieldT(text, width, pad, right); } @@ -143,6 +151,7 @@ template FieldT field(CharT const* text, int width = 8, int pad = 0, bool right = false) { + TRACE_FUNC(); return FieldT, std::allocator>( std::basic_string, std::allocator>(text), width, @@ -154,6 +163,7 @@ template FieldT field(T const& t, int width = 8, int pad = 0, bool right = false) { + TRACE_FUNC(); std::string const text(detail::to_string(t)); return field(text, width, pad, right); } @@ -162,6 +172,7 @@ template FieldT rField(std::basic_string const& text, int width = 8, int pad = 0) { + TRACE_FUNC(); return FieldT(text, width, pad, true); } @@ -169,6 +180,7 @@ template FieldT rField(CharT const* text, int width = 8, int pad = 0) { + TRACE_FUNC(); return FieldT, std::allocator>( std::basic_string, std::allocator>(text), width, @@ -180,6 +192,7 @@ template FieldT rField(T const& t, int width = 8, int pad = 0) { + TRACE_FUNC(); std::string const text(detail::to_string(t)); return field(text, width, pad, true); } diff --git a/src/xrpld/perflog/detail/PerfLogImp.cpp b/src/xrpld/perflog/detail/PerfLogImp.cpp index d50a4ab863..9427b7d9a4 100644 --- a/src/xrpld/perflog/detail/PerfLogImp.cpp +++ b/src/xrpld/perflog/detail/PerfLogImp.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -33,6 +34,7 @@ namespace xrpl::perf { PerfLogImp::Counters::Counters(std::set const& labels, JobTypes const& jobTypes) { + TRACE_FUNC(); { // populateRpc rpc.reserve(labels.size()); @@ -72,6 +74,7 @@ PerfLogImp::Counters::Counters(std::set const& labels, JobTypes con json::Value PerfLogImp::Counters::countersJson() const { + TRACE_FUNC(); json::Value rpcobj(json::ObjectValue); // totalRpc represents all rpc methods. All that started, finished, etc. Rpc totalRpc; @@ -162,6 +165,7 @@ PerfLogImp::Counters::countersJson() const json::Value PerfLogImp::Counters::currentJson() const { + TRACE_FUNC(); auto const present = steady_clock::now(); json::Value jobsArray(json::ArrayValue); @@ -209,6 +213,7 @@ PerfLogImp::Counters::currentJson() const void PerfLogImp::openLog() { + TRACE_FUNC(); if (setup_.perfLog.empty()) return; @@ -242,6 +247,7 @@ PerfLogImp::openLog() void PerfLogImp::run() { + TRACE_FUNC(); beast::setCurrentThreadName("perflog"); lastLog_ = system_clock::now(); @@ -266,6 +272,7 @@ PerfLogImp::run() void PerfLogImp::report() { + TRACE_FUNC(); if (!logFile_) { // If logFile_ is not writable do no further work. @@ -300,17 +307,20 @@ PerfLogImp::PerfLogImp( std::function&& signalStop) : setup_(std::move(setup)), app_(app), j_(journal), signalStop_(std::move(signalStop)) { + TRACE_FUNC(); openLog(); } PerfLogImp::~PerfLogImp() { + TRACE_FUNC(); stop(); } void PerfLogImp::rpcStart(std::string const& method, std::uint64_t const requestId) { + TRACE_FUNC(); auto counter = counters_.rpc.find(method); if (counter == counters_.rpc.end()) { @@ -331,6 +341,7 @@ PerfLogImp::rpcStart(std::string const& method, std::uint64_t const requestId) void PerfLogImp::rpcEnd(std::string const& method, std::uint64_t const requestId, bool finish) { + TRACE_FUNC(); auto counter = counters_.rpc.find(method); if (counter == counters_.rpc.end()) { @@ -371,6 +382,7 @@ PerfLogImp::rpcEnd(std::string const& method, std::uint64_t const requestId, boo void PerfLogImp::jobQueue(JobType const type) { + TRACE_FUNC(); auto counter = counters_.jq.find(type); if (counter == counters_.jq.end()) { @@ -390,6 +402,7 @@ PerfLogImp::jobStart( steady_time_point startTime, int instance) { + TRACE_FUNC(); auto counter = counters_.jq.find(type); if (counter == counters_.jq.end()) { @@ -412,6 +425,7 @@ PerfLogImp::jobStart( void PerfLogImp::jobFinish(JobType const type, microseconds dur, int instance) { + TRACE_FUNC(); auto counter = counters_.jq.find(type); if (counter == counters_.jq.end()) { @@ -434,6 +448,7 @@ PerfLogImp::jobFinish(JobType const type, microseconds dur, int instance) void PerfLogImp::resizeJobs(int const resize) { + TRACE_FUNC(); std::scoped_lock const lock(counters_.jobsMutex); if (resize > counters_.jobs.size()) counters_.jobs.resize(resize, {JtInvalid, steady_time_point()}); @@ -442,6 +457,7 @@ PerfLogImp::resizeJobs(int const resize) void PerfLogImp::rotate() { + TRACE_FUNC(); if (setup_.perfLog.empty()) return; @@ -453,6 +469,7 @@ PerfLogImp::rotate() void PerfLogImp::start() { + TRACE_FUNC(); if (!setup_.perfLog.empty()) thread_ = std::thread(&PerfLogImp::run, this); } @@ -460,6 +477,7 @@ PerfLogImp::start() void PerfLogImp::stop() { + TRACE_FUNC(); if (thread_.joinable()) { { @@ -476,6 +494,7 @@ PerfLogImp::stop() PerfLog::Setup setupPerfLog(Section const& section, boost::filesystem::path const& configDir) { + TRACE_FUNC(); PerfLog::Setup setup; std::string perfLog; set(perfLog, "perf_log", section); @@ -501,6 +520,7 @@ makePerfLog( beast::Journal journal, std::function&& signalStop) { + TRACE_FUNC(); return std::make_unique(setup, app, journal, std::move(signalStop)); } diff --git a/src/xrpld/rpc/BookChanges.h b/src/xrpld/rpc/BookChanges.h index f80de30b09..b5ca17df57 100644 --- a/src/xrpld/rpc/BookChanges.h +++ b/src/xrpld/rpc/BookChanges.h @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -26,6 +27,7 @@ template json::Value computeBookChanges(std::shared_ptr const& lpAccepted) { + TRACE_FUNC(); std::map< std::string, std::tuple< diff --git a/src/xrpld/rpc/CTID.h b/src/xrpld/rpc/CTID.h index 6c7e95a246..c06fba57d1 100644 --- a/src/xrpld/rpc/CTID.h +++ b/src/xrpld/rpc/CTID.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace xrpl::RPC { @@ -30,6 +31,7 @@ namespace xrpl::RPC { inline std::optional encodeCTID(uint32_t ledgerSeq, uint32_t txnIndex, uint32_t networkID) noexcept { + TRACE_FUNC(); constexpr uint32_t kMAX_LEDGER_SEQ = 0x0FFF'FFFF; constexpr uint32_t kMAX_TXN_INDEX = 0xFFFF; constexpr uint32_t kMAX_NETWORK_ID = 0xFFFF; @@ -57,6 +59,7 @@ template inline std::optional> decodeCTID(T const ctid) noexcept { + TRACE_FUNC(); uint64_t ctidValue = 0; if constexpr ( diff --git a/src/xrpld/rpc/Output.h b/src/xrpld/rpc/Output.h index 1c74562842..658961136c 100644 --- a/src/xrpld/rpc/Output.h +++ b/src/xrpld/rpc/Output.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace xrpl { namespace RPC { @@ -10,6 +11,7 @@ using Output = std::function; inline Output stringOutput(std::string& s) { + TRACE_FUNC(); return [&](boost::string_ref const& b) { s.append(b.data(), b.size()); }; } diff --git a/src/xrpld/rpc/ServerHandler.h b/src/xrpld/rpc/ServerHandler.h index 6b4cc34cc5..63289531cf 100644 --- a/src/xrpld/rpc/ServerHandler.h +++ b/src/xrpld/rpc/ServerHandler.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -24,6 +25,7 @@ namespace xrpl { inline bool operator<(Port const& lhs, Port const& rhs) { + TRACE_FUNC(); return lhs.name < rhs.name; } @@ -118,12 +120,14 @@ public: [[nodiscard]] Setup const& setup() const { + TRACE_FUNC(); return setup_; } [[nodiscard]] Endpoints const& endpoints() const { + TRACE_FUNC(); return endpoints_; } @@ -150,6 +154,7 @@ public: http_request_type&& request, // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved) boost::asio::ip::tcp::endpoint const& remoteAddress) { + TRACE_FUNC(); return onHandoff(session, {}, std::forward(request), remoteAddress); } diff --git a/src/xrpld/rpc/Status.h b/src/xrpld/rpc/Status.h index 8f7c620baa..af128217b8 100644 --- a/src/xrpld/rpc/Status.h +++ b/src/xrpld/rpc/Status.h @@ -3,6 +3,7 @@ #include #include #include +#include namespace xrpl::RPC { @@ -55,6 +56,7 @@ public: /** Returns true if the Status is *not* OK. */ operator bool() const { + TRACE_FUNC(); return code_ != kOK; } @@ -62,6 +64,7 @@ public: bool operator!() const { + TRACE_FUNC(); return !bool(*this); } @@ -70,6 +73,7 @@ public: [[nodiscard]] TER toTER() const { + TRACE_FUNC(); XRPL_ASSERT(type_ == Type::TER, "xrpl::RPC::Status::toTER : type is TER"); return TER::fromInt(code_); } @@ -79,6 +83,7 @@ public: [[nodiscard]] ErrorCodeI toErrorCode() const { + TRACE_FUNC(); XRPL_ASSERT(type_ == Type::ErrorCodeI, "xrpl::RPC::Status::toTER : type is error code"); return ErrorCodeI(code_); } @@ -88,6 +93,7 @@ public: void inject(json::Value& object) const { + TRACE_FUNC(); if (auto ec = toErrorCode()) { if (messages_.empty()) @@ -104,6 +110,7 @@ public: [[nodiscard]] Strings const& messages() const { + TRACE_FUNC(); return messages_; } @@ -114,6 +121,7 @@ public: [[nodiscard]] Type type() const { + TRACE_FUNC(); return type_; } diff --git a/src/xrpld/rpc/detail/AccountAssets.cpp b/src/xrpld/rpc/detail/AccountAssets.cpp index 5bc4360a0e..a805d1abc6 100644 --- a/src/xrpld/rpc/detail/AccountAssets.cpp +++ b/src/xrpld/rpc/detail/AccountAssets.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -19,6 +20,7 @@ accountSourceAssets( std::shared_ptr const& lrCache, bool includeXRP) { + TRACE_FUNC(); hash_set assets; // YYY Only bother if they are above reserve @@ -63,6 +65,7 @@ accountDestAssets( std::shared_ptr const& lrCache, bool includeXRP) { + TRACE_FUNC(); hash_set assets; if (includeXRP) diff --git a/src/xrpld/rpc/detail/AssetCache.cpp b/src/xrpld/rpc/detail/AssetCache.cpp index a0743a2303..621c6c71d9 100644 --- a/src/xrpld/rpc/detail/AssetCache.cpp +++ b/src/xrpld/rpc/detail/AssetCache.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -25,11 +26,13 @@ namespace xrpl { AssetCache::AssetCache(std::shared_ptr const& ledger, beast::Journal j) : ledger_(ledger), journal_(j) { + TRACE_FUNC(); JLOG(journal_.debug()) << "created for ledger " << ledger_->header().seq; } AssetCache::~AssetCache() { + TRACE_FUNC(); JLOG(journal_.debug()) << "destroyed for ledger " << ledger_->header().seq << " with " << lines_.size() << " accounts and " << totalLineCount_ << " distinct trust lines."; @@ -38,6 +41,7 @@ AssetCache::~AssetCache() std::shared_ptr> AssetCache::getRippleLines(AccountID const& accountID, LineDirection direction) { + TRACE_FUNC(); auto const hash = hasher_(accountID); AccountKey key(accountID, direction, hash); AccountKey otherkey( @@ -117,6 +121,7 @@ AssetCache::getRippleLines(AccountID const& accountID, LineDirection direction) std::shared_ptr> const& AssetCache::getMPTs(xrpl::AccountID const& account) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); if (auto it = mpts_.find(account); it != mpts_.end()) diff --git a/src/xrpld/rpc/detail/AssetCache.h b/src/xrpld/rpc/detail/AssetCache.h index 9112d78715..3dc36b575b 100644 --- a/src/xrpld/rpc/detail/AssetCache.h +++ b/src/xrpld/rpc/detail/AssetCache.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,7 @@ public: [[nodiscard]] std::shared_ptr const& getLedger() const { + TRACE_FUNC(); return ledger_; } @@ -71,6 +73,7 @@ private: bool operator==(AccountKey const& lhs) const { + TRACE_FUNC(); return hash_value == lhs.hash_value && account == lhs.account && direction == lhs.direction; } @@ -78,6 +81,7 @@ private: [[nodiscard]] std::size_t getHash() const { + TRACE_FUNC(); return hash_value; } @@ -88,6 +92,7 @@ private: std::size_t operator()(AccountKey const& key) const noexcept { + TRACE_FUNC(); return key.getHash(); } }; diff --git a/src/xrpld/rpc/detail/DeliveredAmount.cpp b/src/xrpld/rpc/detail/DeliveredAmount.cpp index 32554e8b5f..d5e716bd15 100644 --- a/src/xrpld/rpc/detail/DeliveredAmount.cpp +++ b/src/xrpld/rpc/detail/DeliveredAmount.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -36,6 +37,7 @@ getDeliveredAmount( std::shared_ptr const& serializedTx, TxMeta const& transactionMeta) { + TRACE_FUNC(); if (!serializedTx) return {}; @@ -73,6 +75,7 @@ canHaveDeliveredAmount( std::shared_ptr const& serializedTx, TxMeta const& transactionMeta) { + TRACE_FUNC(); if (!serializedTx) return false; @@ -90,6 +93,7 @@ insertDeliveredAmount( std::shared_ptr const& serializedTx, TxMeta const& transactionMeta) { + TRACE_FUNC(); auto const info = ledger.header(); if (canHaveDeliveredAmount(serializedTx, transactionMeta)) @@ -119,6 +123,7 @@ getDeliveredAmount( TxMeta const& transactionMeta, GetLedgerIndex const& getLedgerIndex) { + TRACE_FUNC(); if (canHaveDeliveredAmount(serializedTx, transactionMeta)) { auto const getCloseTime = [&context, @@ -138,6 +143,7 @@ getDeliveredAmount( TxMeta const& transactionMeta, LedgerIndex const& ledgerIndex) { + TRACE_FUNC(); return getDeliveredAmount( context, serializedTx, transactionMeta, [&ledgerIndex]() { return ledgerIndex; }); } @@ -149,6 +155,7 @@ insertDeliveredAmount( std::shared_ptr const& transaction, TxMeta const& transactionMeta) { + TRACE_FUNC(); insertDeliveredAmount(meta, context, transaction->getSTransaction(), transactionMeta); } @@ -159,6 +166,7 @@ insertDeliveredAmount( std::shared_ptr const& transaction, TxMeta const& transactionMeta) { + TRACE_FUNC(); if (canHaveDeliveredAmount(transaction, transactionMeta)) { auto amt = getDeliveredAmount(context, transaction, transactionMeta, [&transactionMeta]() { diff --git a/src/xrpld/rpc/detail/Handler.cpp b/src/xrpld/rpc/detail/Handler.cpp index 6b04f24094..43a7ec4036 100644 --- a/src/xrpld/rpc/detail/Handler.cpp +++ b/src/xrpld/rpc/detail/Handler.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,7 @@ template Handler::Method byRef(Function const& f) { + TRACE_FUNC(); return [f](JsonContext& context, json::Value& result) { result = f(context); if (result.type() != json::ObjectValue) @@ -44,6 +46,7 @@ template Status handle(JsonContext& context, Object& object) { + TRACE_FUNC(); XRPL_ASSERT( context.apiVersion >= HandlerImpl::minApiVer && context.apiVersion <= HandlerImpl::maxApiVer, @@ -66,6 +69,7 @@ template Handler handlerFrom() { + TRACE_FUNC(); return { HandlerImpl::name, &handle, @@ -371,6 +375,7 @@ private: unsigned minVer, unsigned maxVer) { + TRACE_FUNC(); XRPL_ASSERT(minVer <= maxVer, "xrpl::RPC::HandlerTable : valid API version range"); XRPL_ASSERT( maxVer <= RPC::kAPI_MAXIMUM_VALID_VERSION, @@ -387,6 +392,7 @@ private: template explicit HandlerTable(Handler const (&entries)[N]) { + TRACE_FUNC(); for (auto const& entry : entries) { if (overlappingApiVersion( @@ -409,6 +415,7 @@ public: static HandlerTable const& instance() { + TRACE_FUNC(); static HandlerTable const kHANDLER_TABLE(kHANDLER_ARRAY); return kHANDLER_TABLE; } @@ -416,6 +423,7 @@ public: [[nodiscard]] Handler const* getHandler(unsigned version, bool betaEnabled, std::string const& name) const { + TRACE_FUNC(); if (version < RPC::kAPI_MINIMUM_SUPPORTED_VERSION || version > (betaEnabled ? RPC::kAPI_BETA_VERSION : RPC::kAPI_MAXIMUM_SUPPORTED_VERSION)) return nullptr; @@ -431,6 +439,7 @@ public: [[nodiscard]] std::set getHandlerNames() const { + TRACE_FUNC(); std::set ret; for (auto const& i : table_) ret.insert(i.second.name); @@ -445,6 +454,7 @@ private: void addHandler() { + TRACE_FUNC(); static_assert(HandlerImpl::minApiVer <= HandlerImpl::maxApiVer); static_assert(HandlerImpl::maxApiVer <= RPC::kAPI_MAXIMUM_VALID_VERSION); static_assert(RPC::kAPI_MINIMUM_SUPPORTED_VERSION <= HandlerImpl::minApiVer); @@ -468,12 +478,14 @@ private: Handler const* getHandler(unsigned version, bool betaEnabled, std::string const& name) { + TRACE_FUNC(); return HandlerTable::instance().getHandler(version, betaEnabled, name); } std::set getHandlerNames() { + TRACE_FUNC(); return HandlerTable::instance().getHandlerNames(); } diff --git a/src/xrpld/rpc/detail/Handler.h b/src/xrpld/rpc/detail/Handler.h index 1e1db7bb99..12d8dc1f6a 100644 --- a/src/xrpld/rpc/detail/Handler.h +++ b/src/xrpld/rpc/detail/Handler.h @@ -7,6 +7,7 @@ #include #include +#include namespace json { class Object; @@ -46,6 +47,7 @@ template json::Value makeObjectValue(Value const& value, json::StaticString const& field = jss::message) { + TRACE_FUNC(); json::Value result(json::ObjectValue); result[field] = value; return result; @@ -59,6 +61,7 @@ template ErrorCodeI conditionMet(Condition conditionRequired, T& context) { + TRACE_FUNC(); if (context.app.getOPs().isAmendmentBlocked() && (conditionRequired != NoCondition)) { return RpcAmendmentBlocked; diff --git a/src/xrpld/rpc/detail/LegacyPathFind.cpp b/src/xrpld/rpc/detail/LegacyPathFind.cpp index 83c7c30549..b279bd66e4 100644 --- a/src/xrpld/rpc/detail/LegacyPathFind.cpp +++ b/src/xrpld/rpc/detail/LegacyPathFind.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -13,6 +14,7 @@ namespace xrpl::RPC { LegacyPathFind::LegacyPathFind(bool isAdmin, Application& app) { + TRACE_FUNC(); if (isAdmin) { ++inProgress; @@ -41,6 +43,7 @@ LegacyPathFind::LegacyPathFind(bool isAdmin, Application& app) LegacyPathFind::~LegacyPathFind() { + TRACE_FUNC(); if (isOk_) --inProgress; } diff --git a/src/xrpld/rpc/detail/LegacyPathFind.h b/src/xrpld/rpc/detail/LegacyPathFind.h index 226191848f..32d2aea9e7 100644 --- a/src/xrpld/rpc/detail/LegacyPathFind.h +++ b/src/xrpld/rpc/detail/LegacyPathFind.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace xrpl { @@ -17,6 +18,7 @@ public: [[nodiscard]] bool isOk() const { + TRACE_FUNC(); return isOk_; } diff --git a/src/xrpld/rpc/detail/MPT.h b/src/xrpld/rpc/detail/MPT.h index 5cf2d5490f..fefd6046ca 100644 --- a/src/xrpld/rpc/detail/MPT.h +++ b/src/xrpld/rpc/detail/MPT.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace xrpl { @@ -23,21 +24,25 @@ public: } operator MPTID const&() const { + TRACE_FUNC(); return mptID_; } [[nodiscard]] MPTID const& getMptID() const { + TRACE_FUNC(); return mptID_; } [[nodiscard]] bool isZeroBalance() const { + TRACE_FUNC(); return zeroBalance_; } [[nodiscard]] bool isMaxedOut() const { + TRACE_FUNC(); return maxedOut_; } }; diff --git a/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp b/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp index e34980aee2..f3f8413fc3 100644 --- a/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp +++ b/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,7 @@ canHaveMPTokenIssuanceID( std::shared_ptr const& serializedTx, TxMeta const& transactionMeta) { + TRACE_FUNC(); if (!serializedTx) return false; @@ -40,6 +42,7 @@ canHaveMPTokenIssuanceID( std::optional getIDFromCreatedIssuance(TxMeta const& transactionMeta) { + TRACE_FUNC(); for (STObject const& node : transactionMeta.getNodes()) { if (node.getFieldU16(sfLedgerEntryType) != ltMPTOKEN_ISSUANCE || @@ -59,6 +62,7 @@ insertMPTokenIssuanceID( std::shared_ptr const& transaction, TxMeta const& transactionMeta) { + TRACE_FUNC(); if (!canHaveMPTokenIssuanceID(transaction, transactionMeta)) return; diff --git a/src/xrpld/rpc/detail/PathRequest.cpp b/src/xrpld/rpc/detail/PathRequest.cpp index 46069ce3bb..4d2ac1def2 100644 --- a/src/xrpld/rpc/detail/PathRequest.cpp +++ b/src/xrpld/rpc/detail/PathRequest.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -67,6 +68,7 @@ PathRequest::PathRequest( , iIdentifier_(id) , created_(std::chrono::steady_clock::now()) { + TRACE_FUNC(); JLOG(journal_.debug()) << iIdentifier_ << " created"; } @@ -90,11 +92,13 @@ PathRequest::PathRequest( , iIdentifier_(id) , created_(std::chrono::steady_clock::now()) { + TRACE_FUNC(); JLOG(journal_.debug()) << iIdentifier_ << " created"; } PathRequest::~PathRequest() { + TRACE_FUNC(); using namespace std::chrono; auto stream = journal_.info(); if (!stream) @@ -121,6 +125,7 @@ PathRequest::~PathRequest() bool PathRequest::isNew() { + TRACE_FUNC(); std::scoped_lock const sl(indexLock_); // does this path request still need its first full path @@ -130,6 +135,7 @@ PathRequest::isNew() bool PathRequest::needsUpdate(bool newOnly, LedgerIndex index) { + TRACE_FUNC(); std::scoped_lock const sl(indexLock_); if (inProgress_) @@ -156,12 +162,14 @@ PathRequest::needsUpdate(bool newOnly, LedgerIndex index) bool PathRequest::hasCompletion() { + TRACE_FUNC(); return bool(fCompletion_); } void PathRequest::updateComplete() { + TRACE_FUNC(); std::scoped_lock const sl(indexLock_); XRPL_ASSERT(inProgress_, "xrpl::PathRequest::updateComplete : in progress"); @@ -177,6 +185,7 @@ PathRequest::updateComplete() bool PathRequest::isValid(std::shared_ptr const& crCache) { + TRACE_FUNC(); if (!raSrcAccount_ || !raDstAccount_) return false; @@ -246,6 +255,7 @@ PathRequest::isValid(std::shared_ptr const& crCache) std::pair PathRequest::doCreate(std::shared_ptr const& cache, json::Value const& value) { + TRACE_FUNC(); bool valid = false; if (parseJson(value) != PFR_PJ_INVALID) @@ -274,6 +284,7 @@ PathRequest::doCreate(std::shared_ptr const& cache, json::Value cons int PathRequest::parseJson(json::Value const& jvParams) { + TRACE_FUNC(); if (!jvParams.isMember(jss::source_account)) { jvStatus_ = rpcError(RpcSrcActMissing); @@ -477,6 +488,7 @@ PathRequest::parseJson(json::Value const& jvParams) json::Value PathRequest::doClose() { + TRACE_FUNC(); JLOG(journal_.debug()) << iIdentifier_ << " closed"; std::scoped_lock const sl(lock_); jvStatus_[jss::closed] = true; @@ -486,6 +498,7 @@ PathRequest::doClose() json::Value PathRequest::doStatus(json::Value const&) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); jvStatus_[jss::status] = jss::success; return jvStatus_; @@ -494,6 +507,7 @@ PathRequest::doStatus(json::Value const&) void PathRequest::doAborting() const { + TRACE_FUNC(); JLOG(journal_.info()) << iIdentifier_ << " aborting early"; } @@ -506,6 +520,7 @@ PathRequest::getPathFinder( int const level, std::function const& continueCallback) { + TRACE_FUNC(); auto i = currencyMap.find(currency); if (i != currencyMap.end()) return i->second; @@ -539,6 +554,7 @@ PathRequest::findPaths( json::Value& jvArray, std::function const& continueCallback) { + TRACE_FUNC(); auto sourceAssets = sciSourceAssets_; if (sourceAssets.empty() && saSendMax_) { @@ -712,6 +728,7 @@ PathRequest::doUpdate( bool fast, std::function const& continueCallback) { + TRACE_FUNC(); using namespace std::chrono; JLOG(journal_.debug()) << iIdentifier_ << " update " << (fast ? "fast" : "normal"); @@ -818,6 +835,7 @@ PathRequest::doUpdate( InfoSub::pointer PathRequest::getSubscriber() const { + TRACE_FUNC(); return wpSubscriber_.lock(); } diff --git a/src/xrpld/rpc/detail/PathRequestManager.cpp b/src/xrpld/rpc/detail/PathRequestManager.cpp index ba42a0122f..db8ef8d6e6 100644 --- a/src/xrpld/rpc/detail/PathRequestManager.cpp +++ b/src/xrpld/rpc/detail/PathRequestManager.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,7 @@ namespace xrpl { std::shared_ptr PathRequestManager::getAssetCache(std::shared_ptr const& ledger, bool authoritative) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); auto assetCache = assetCache_.lock(); @@ -59,6 +61,7 @@ PathRequestManager::getAssetCache(std::shared_ptr const& ledger, void PathRequestManager::updateAll(std::shared_ptr const& inLedger) { + TRACE_FUNC(); auto event = app_.getJobQueue().makeLoadEvent(JtPathFind, "PathRequest::updateAll"); std::vector requests; @@ -206,6 +209,7 @@ PathRequestManager::updateAll(std::shared_ptr const& inLedger) bool PathRequestManager::requestsPending() const { + TRACE_FUNC(); std::scoped_lock const sl(lock_); return !requests_.empty(); } @@ -213,6 +217,7 @@ PathRequestManager::requestsPending() const void PathRequestManager::insertPathRequest(PathRequest::pointer const& req) { + TRACE_FUNC(); std::scoped_lock const sl(lock_); // Insert after any older unserviced requests but before @@ -234,6 +239,7 @@ PathRequestManager::makePathRequest( std::shared_ptr const& inLedger, json::Value const& requestJson) { + TRACE_FUNC(); auto req = std::make_shared(app_, subscriber, ++lastIdentifier_, *this, journal_); auto [valid, jvRes] = req->doCreate(getAssetCache(inLedger, false), requestJson); @@ -256,6 +262,7 @@ PathRequestManager::makeLegacyPathRequest( std::shared_ptr const& inLedger, json::Value const& request) { + TRACE_FUNC(); // This assignment must take place before the // completion function is called req = std::make_shared( @@ -287,6 +294,7 @@ PathRequestManager::doLegacyPathRequest( std::shared_ptr const& inLedger, json::Value const& request) { + TRACE_FUNC(); auto cache = std::make_shared(inLedger, app_.getJournal("AssetCache")); auto req = diff --git a/src/xrpld/rpc/detail/PathRequestManager.h b/src/xrpld/rpc/detail/PathRequestManager.h index 5a5cfde402..2bd2298009 100644 --- a/src/xrpld/rpc/detail/PathRequestManager.h +++ b/src/xrpld/rpc/detail/PathRequestManager.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -21,6 +22,7 @@ public: beast::insight::Collector::ptr const& collector) : app_(app), journal_(journal), lastIdentifier_(0) { + TRACE_FUNC(); fast_ = collector->makeEvent("pathfind_fast"); full_ = collector->makeEvent("pathfind_full"); } @@ -68,12 +70,14 @@ public: void reportFast(std::chrono::milliseconds ms) { + TRACE_FUNC(); fast_.notify(ms); } void reportFull(std::chrono::milliseconds ms) { + TRACE_FUNC(); full_.notify(ms); } diff --git a/src/xrpld/rpc/detail/Pathfinder.cpp b/src/xrpld/rpc/detail/Pathfinder.cpp index 9a34cf44f1..774600ee6f 100644 --- a/src/xrpld/rpc/detail/Pathfinder.cpp +++ b/src/xrpld/rpc/detail/Pathfinder.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -47,11 +48,13 @@ namespace xrpl { static std::ostream& operator<<(std::ostream& os, Pathfinder::NodeType t) { + TRACE_FUNC(); return os << static_cast(t); } static std::ostream& operator<<(std::ostream& os, Pathfinder::PaymentType t) { + TRACE_FUNC(); return os << static_cast(t); } } // namespace xrpl @@ -110,6 +113,7 @@ compareAccountCandidate( AccountCandidate const& first, AccountCandidate const& second) { + TRACE_FUNC(); // Primary sort key: priority descending if (first.priority != second.priority) return first.priority > second.priority; @@ -147,6 +151,7 @@ PathTable gPathTable; std::string pathTypeToString(Pathfinder::PathType const& type) { + TRACE_FUNC(); std::string ret; for (auto const& node : type) @@ -182,6 +187,7 @@ pathTypeToString(Pathfinder::PathType const& type) STAmount smallestUsefulAmount(STAmount const& amount, int maxPaths) { + TRACE_FUNC(); return divide(amount, STAmount(maxPaths + 2), amount.asset()); } @@ -191,6 +197,7 @@ amountFromPathAsset( std::optional const& srcIssuer, AccountID const& srcAccount) { + TRACE_FUNC(); return pathAsset.visit( [&](Currency const& currency) { auto const& account = srcIssuer.value_or(isXRP(currency) ? xrpAccount() : srcAccount); @@ -202,6 +209,7 @@ amountFromPathAsset( Asset assetFromPathAsset(PathAsset const& pathAsset, AccountID const& account) { + TRACE_FUNC(); return pathAsset.visit( [&](Currency const& currency) { return Asset{Issue{currency, account}}; }, [](MPTID const& mpt) { return Asset{mpt}; }); @@ -233,6 +241,7 @@ Pathfinder::Pathfinder( , app_(app) , j_(app.getJournal("Pathfinder")) { + TRACE_FUNC(); XRPL_ASSERT( !uSrcIssuer || uSrcPathAsset.isXRP() == isXRP(uSrcIssuer.value()), "xrpl::Pathfinder::Pathfinder : valid inputs"); @@ -241,6 +250,7 @@ Pathfinder::Pathfinder( bool Pathfinder::findPaths(int searchLevel, std::function const& continueCallback) { + TRACE_FUNC(); JLOG(j_.trace()) << "findPaths start"; if (dstAmount_ == beast::kZERO) { @@ -451,6 +461,7 @@ Pathfinder::getPathLiquidity( void Pathfinder::computePathRanks(int maxPaths, std::function const& continueCallback) { + TRACE_FUNC(); remainingAmount_ = convertAmount(dstAmount_, convert_all_); // Must subtract liquidity in default path from remaining amount. @@ -492,6 +503,7 @@ Pathfinder::computePathRanks(int maxPaths, std::function const& cont static bool isDefaultPath(STPath const& path) { + TRACE_FUNC(); // FIXME: default paths can consist of more than just an account: // // JoelKatz writes: @@ -511,6 +523,7 @@ isDefaultPath(STPath const& path) static STPath removeIssuer(STPath const& path) { + TRACE_FUNC(); // This path starts with the issuer, which is already implied // so remove the head node STPath ret; @@ -530,6 +543,7 @@ Pathfinder::rankPaths( std::vector& rankedPaths, std::function const& continueCallback) { + TRACE_FUNC(); JLOG(j_.trace()) << "rankPaths with " << paths.size() << " candidates, and " << maxPaths << " maximum"; rankedPaths.clear(); @@ -605,6 +619,7 @@ Pathfinder::getBestPaths( AccountID const& srcIssuer, std::function const& continueCallback) { + TRACE_FUNC(); JLOG(j_.debug()) << "findPaths: " << completePaths_.size() << " paths and " << extraPaths.size() << " extras"; @@ -737,6 +752,7 @@ Pathfinder::getBestPaths( bool Pathfinder::issueMatchesOrigin(Asset const& asset) { + TRACE_FUNC(); bool const matchingAsset = (asset == srcPathAsset_); bool const matchingAccount = isXRP(asset) || (srcIssuer_ && asset.getIssuer() == srcIssuer_) || asset.getIssuer() == srcAccount_; @@ -753,6 +769,7 @@ Pathfinder::getPathsOut( AccountID const& dstAccount, std::function const& continueCallback) { + TRACE_FUNC(); Asset const asset = assetFromPathAsset(pathAsset, account); auto [it, inserted] = pathsOutCountMap_.emplace(asset, 0); @@ -859,6 +876,7 @@ Pathfinder::addLinks( int addFlags, std::function const& continueCallback) { + TRACE_FUNC(); JLOG(j_.debug()) << "addLink< on " << currentPaths.size() << " source(s), flags=" << addFlags; for (auto const& path : currentPaths) { @@ -873,6 +891,7 @@ Pathfinder::addPathsForType( PathType const& pathType, std::function const& continueCallback) { + TRACE_FUNC(); JLOG(j_.debug()) << "addPathsForType " << CollectionAndDelimiter(pathType, ", "); // See if the set of paths for this type already exists. auto it = paths_.find(pathType); @@ -947,6 +966,7 @@ Pathfinder::isNoRipple( AccountID const& toAccount, Currency const& currency) { + TRACE_FUNC(); auto sleRipple = ledger_->read(keylet::line(toAccount, fromAccount, currency)); auto const flag((toAccount > fromAccount) ? lsfHighNoRipple : lsfLowNoRipple); @@ -959,6 +979,7 @@ Pathfinder::isNoRipple( bool Pathfinder::isNoRippleOut(STPath const& currentPath) { + TRACE_FUNC(); // Must have at least one link. if (currentPath.empty()) return false; @@ -980,6 +1001,7 @@ Pathfinder::isNoRippleOut(STPath const& currentPath) void addUniquePath(STPathSet& pathSet, STPath const& path) { + TRACE_FUNC(); // TODO(tom): building an STPathSet this way is quadratic in the size // of the STPathSet! for (auto const& p : pathSet) @@ -997,6 +1019,7 @@ Pathfinder::addLink( int addFlags, std::function const& continueCallback) { + TRACE_FUNC(); auto const& pathEnd = currentPath.empty() ? source_ : currentPath.back(); auto const& uEndPathAsset = pathEnd.getPathAsset(); auto const& uEndIssuer = pathEnd.getIssuerID(); @@ -1326,6 +1349,7 @@ namespace { Pathfinder::PathType makePath(char const* string) { + TRACE_FUNC(); Pathfinder::PathType ret; while (true) @@ -1368,6 +1392,7 @@ makePath(char const* string) void fillPaths(Pathfinder::PaymentType type, PathCostList const& costs) { + TRACE_FUNC(); auto& list = gPathTable[type]; XRPL_ASSERT(list.empty(), "xrpl::fillPaths : empty paths"); for (auto& cost : costs) @@ -1386,6 +1411,7 @@ fillPaths(Pathfinder::PaymentType type, PathCostList const& costs) void Pathfinder::initPathTable() { + TRACE_FUNC(); // CAUTION: Do not include rules that build default paths gPathTable.clear(); diff --git a/src/xrpld/rpc/detail/PathfinderUtils.h b/src/xrpld/rpc/detail/PathfinderUtils.h index ff47de3217..2890ebafb2 100644 --- a/src/xrpld/rpc/detail/PathfinderUtils.h +++ b/src/xrpld/rpc/detail/PathfinderUtils.h @@ -1,12 +1,14 @@ #pragma once #include +#include namespace xrpl { inline STAmount largestAmount(STAmount const& amt) { + TRACE_FUNC(); return amt.asset().visit( [&](Issue const& issue) -> STAmount { if (issue.native()) @@ -19,6 +21,7 @@ largestAmount(STAmount const& amt) inline STAmount convertAmount(STAmount const& amt, bool all) { + TRACE_FUNC(); if (!all) return amt; @@ -28,6 +31,7 @@ convertAmount(STAmount const& amt, bool all) inline bool convertAllCheck(STAmount const& a) { + TRACE_FUNC(); return a == largestAmount(a); } diff --git a/src/xrpld/rpc/detail/RPCCall.cpp b/src/xrpld/rpc/detail/RPCCall.cpp index 98cb7ee9ba..c70d909184 100644 --- a/src/xrpld/rpc/detail/RPCCall.cpp +++ b/src/xrpld/rpc/detail/RPCCall.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -70,6 +71,7 @@ createHTTPPost( std::string const& strMsg, std::unordered_map const& mapRequestHeaders) { + TRACE_FUNC(); std::ostringstream s; // CHECKME this uses a different version than the replies below use. Is @@ -102,6 +104,7 @@ private: static bool jvParseLedger(json::Value& jvRequest, std::string const& strLedger) { + TRACE_FUNC(); if (strLedger == "current" || strLedger == "closed" || strLedger == "validated") { jvRequest[jss::ledger_index] = strLedger; @@ -123,6 +126,7 @@ private: static json::Value jvParseCurrencyIssuer(std::string const& strCurrencyIssuer) { + TRACE_FUNC(); // Matches a sequence of 3 characters from // `xrpl::detail::isoCharSet` (the currency), // optionally followed by a forward slash and some other characters @@ -156,6 +160,7 @@ private: static bool validPublicKey(std::string const& strPk, TokenType type = TokenType::AccountPublic) { + TRACE_FUNC(); if (parseBase58(type, strPk)) return true; @@ -176,6 +181,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseAsIs(json::Value const& jvParams) { + TRACE_FUNC(); json::Value v(json::ObjectValue); if (jvParams.isArray() && (jvParams.size() > 0)) @@ -188,6 +194,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseInternal(json::Value const& jvParams) { + TRACE_FUNC(); json::Value v(json::ObjectValue); v[jss::internal_command] = jvParams[0u]; @@ -205,6 +212,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseManifest(json::Value const& jvParams) { + TRACE_FUNC(); if (jvParams.size() == 1) { json::Value jvRequest(json::ObjectValue); @@ -317,6 +325,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseBookOffers(json::Value const& jvParams) { + TRACE_FUNC(); json::Value jvRequest(json::ObjectValue); json::Value jvTakerPays = jvParseCurrencyIssuer(jvParams[0u].asString()); @@ -459,6 +468,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseEvented(json::Value const& jvParams) { + TRACE_FUNC(); return rpcError(RpcNoEvents); } @@ -515,6 +525,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseSignFor(json::Value const& jvParams) { + TRACE_FUNC(); bool const bOffline = 4 == jvParams.size() && jvParams[3u].asString() == "offline"; if (3 == jvParams.size() || bOffline) @@ -543,6 +554,7 @@ private: json::Value parseJson(json::Value const& jvParams) { + TRACE_FUNC(); json::Reader reader; json::Value jvRequest; @@ -565,6 +577,7 @@ private: bool isValidJson2(json::Value const& jv) { + TRACE_FUNC(); if (jv.isArray()) { if (jv.size() == 0) @@ -593,6 +606,7 @@ private: json::Value parseJson2(json::Value const& jvParams) { + TRACE_FUNC(); json::Reader reader; json::Value jv; bool const validParse = reader.parse(jvParams[0u].asString(), jv); @@ -675,6 +689,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseLedgerId(json::Value const& jvParams) { + TRACE_FUNC(); json::Value jvRequest(json::ObjectValue); std::string const strLedger = jvParams[0u].asString(); @@ -714,6 +729,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseLogLevel(json::Value const& jvParams) { + TRACE_FUNC(); json::Value jvRequest(json::ObjectValue); if (jvParams.size() == 1) @@ -741,6 +757,7 @@ private: json::Value parseAccountCurrencies(json::Value const& jvParams) { + TRACE_FUNC(); return parseAccountRaw1(jvParams); } @@ -763,6 +780,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseChannelAuthorize(json::Value const& jvParams) { + TRACE_FUNC(); json::Value jvRequest(json::ObjectValue); unsigned int index = 0; @@ -807,6 +825,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseChannelVerify(json::Value const& jvParams) { + TRACE_FUNC(); std::string const strPk = jvParams[0u].asString(); if (!validPublicKey(strPk)) @@ -836,6 +855,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseAccountRaw2(json::Value const& jvParams, char const* const acc2Field) { + TRACE_FUNC(); std::array accFields{{jss::account, acc2Field}}; auto const nParams = jvParams.size(); json::Value jvRequest(json::ObjectValue); @@ -878,6 +898,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseAccountRaw1(json::Value const& jvParams) { + TRACE_FUNC(); std::string const strIdent = jvParams[0u].asString(); unsigned int const iCursor = jvParams.size(); @@ -899,6 +920,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseVault(json::Value const& jvParams) { + TRACE_FUNC(); std::string const strVaultID = jvParams[0u].asString(); uint256 id = beast::kZERO; if (!id.parseHex(strVaultID)) @@ -932,6 +954,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parsePeerReservationsDel(json::Value const& jvParams) { + TRACE_FUNC(); json::Value jvRequest; jvRequest[jss::public_key] = jvParams[0u].asString(); return jvRequest; @@ -1000,6 +1023,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseSignSubmit(json::Value const& jvParams) { + TRACE_FUNC(); json::Value txJSON; json::Reader reader; bool const bOffline = jvParams.size() >= 3 && jvParams[2u].asString() == "offline"; @@ -1050,6 +1074,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseSubmitMultiSigned(json::Value const& jvParams) { + TRACE_FUNC(); if (1 == jvParams.size()) { json::Value txJSON; @@ -1070,6 +1095,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseTransactionEntry(json::Value const& jvParams) { + TRACE_FUNC(); // Parameter count should have already been verified. XRPL_ASSERT( jvParams.size() == 2, "xrpl::RPCParser::parseTransactionEntry : valid parameter count"); @@ -1096,6 +1122,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseTx(json::Value const& jvParams) { + TRACE_FUNC(); json::Value jvRequest{json::ObjectValue}; if (jvParams.size() == 2 || jvParams.size() == 4) @@ -1129,6 +1156,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseTxHistory(json::Value const& jvParams) { + TRACE_FUNC(); json::Value jvRequest{json::ObjectValue}; jvRequest[jss::start] = jvParams[0u].asUInt(); @@ -1146,6 +1174,7 @@ private: // NOLINTNEXTLINE(readability-convert-member-functions-to-static) parseValidationCreate(json::Value const& jvParams) { + TRACE_FUNC(); json::Value jvRequest{json::ObjectValue}; if (jvParams.size() != 0u) @@ -1255,6 +1284,7 @@ public: json::Value parseCommand(std::string strMethod, json::Value jvParams, bool allowAnyCommand) { + TRACE_FUNC(); if (auto stream = j_.trace()) { stream << "Method: '" << strMethod << "'"; @@ -1523,6 +1553,7 @@ public: std::string jsonrpcRequest(std::string const& strMethod, json::Value const& params, json::Value const& id) { + TRACE_FUNC(); json::Value request; request[jss::method] = strMethod; request[jss::params] = params; @@ -1547,6 +1578,7 @@ struct RPCCallImp static void callRPCHandler(json::Value* jvOutput, json::Value const& jvInput) { + TRACE_FUNC(); (*jvOutput) = jvInput; } @@ -1558,6 +1590,7 @@ struct RPCCallImp std::string const& strData, beast::Journal j) { + TRACE_FUNC(); if (callbackFuncP) { // Only care about the result, if we care to deliver it @@ -1606,6 +1639,7 @@ struct RPCCallImp std::string const& strHost, beast::Journal j) { + TRACE_FUNC(); JLOG(j.debug()) << "requestRPC: strPath='" << strPath << "'"; std::ostream osRequest(&sb); @@ -1624,6 +1658,7 @@ rpcCmdToJson( unsigned int apiVersion, beast::Journal j) { + TRACE_FUNC(); json::Value jvRequest(json::ObjectValue); RPCParser rpParser(apiVersion, j); @@ -1670,6 +1705,7 @@ rpcClient( unsigned int apiVersion, std::unordered_map const& headers) { + TRACE_FUNC(); static_assert(RpcBadSyntax == 1 && RpcSuccess == 0, "Expect specific rpc enum values."); if (args.empty()) return {RpcBadSyntax, {}}; // rpcBAD_SYNTAX = print usage @@ -1818,6 +1854,7 @@ namespace RPCCall { int fromCommandLine(Config const& config, std::vector const& vCmd, Logs& logs) { + TRACE_FUNC(); auto const result = rpcClient(vCmd, config, logs, RPC::kAPI_COMMAND_LINE_VERSION); std::cout << result.second.toStyledString(); @@ -1843,6 +1880,7 @@ fromNetwork( std::function callbackFuncP, std::unordered_map headers) { + TRACE_FUNC(); auto j = logs.journal("HTTPClient"); // Connect to localhost diff --git a/src/xrpld/rpc/detail/RPCHandler.cpp b/src/xrpld/rpc/detail/RPCHandler.cpp index fb99aa682a..9989958b6c 100644 --- a/src/xrpld/rpc/detail/RPCHandler.cpp +++ b/src/xrpld/rpc/detail/RPCHandler.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -110,6 +111,7 @@ namespace { ErrorCodeI fillHandler(JsonContext& context, Handler const*& result) { + TRACE_FUNC(); if (!isUnlimited(context.role)) { // Count all jobs at jtCLIENT priority or higher. @@ -157,6 +159,7 @@ template Status callMethod(JsonContext& context, Method method, std::string const& name, Object& result) { + TRACE_FUNC(); static std::atomic kREQUEST_ID{0}; auto& perfLog = context.app.getPerfLog(); std::uint64_t const curId = ++kREQUEST_ID; @@ -192,6 +195,7 @@ callMethod(JsonContext& context, Method method, std::string const& name, Object& Status doCommand(RPC::JsonContext& context, json::Value& result) { + TRACE_FUNC(); Handler const* handler = nullptr; if (auto error = fillHandler(context, handler)) { @@ -226,6 +230,7 @@ doCommand(RPC::JsonContext& context, json::Value& result) Role roleRequired(unsigned int version, bool betaEnabled, std::string const& method) { + TRACE_FUNC(); auto handler = RPC::getHandler(version, betaEnabled, method); if (handler == nullptr) diff --git a/src/xrpld/rpc/detail/RPCHelpers.cpp b/src/xrpld/rpc/detail/RPCHelpers.cpp index 84ecd4e607..947e925700 100644 --- a/src/xrpld/rpc/detail/RPCHelpers.cpp +++ b/src/xrpld/rpc/detail/RPCHelpers.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include @@ -48,6 +49,7 @@ namespace xrpl::RPC { std::uint64_t getStartHint(std::shared_ptr const& sle, AccountID const& accountID) { + TRACE_FUNC(); if (sle->getType() == ltRIPPLE_STATE) { if (sle->getFieldAmount(sfLowLimit).getIssuer() == accountID) @@ -72,6 +74,7 @@ isRelatedToAccount( std::shared_ptr const& sle, AccountID const& accountID) { + TRACE_FUNC(); if (sle->getType() == ltRIPPLE_STATE) { return (sle->getFieldAmount(sfLowLimit).getIssuer() == accountID) || @@ -106,6 +109,7 @@ isRelatedToAccount( hash_set parseAccountIds(json::Value const& jvArray) { + TRACE_FUNC(); hash_set result; for (auto const& jv : jvArray) { @@ -122,6 +126,7 @@ parseAccountIds(json::Value const& jvArray) std::optional readLimitField(unsigned int& limit, Tuning::LimitRange const& range, JsonContext const& context) { + TRACE_FUNC(); limit = range.rDefault; if (!context.params.isMember(jss::limit) || context.params[jss::limit].isNull()) return std::nullopt; @@ -143,6 +148,7 @@ readLimitField(unsigned int& limit, Tuning::LimitRange const& range, JsonContext std::optional parseXrplLibSeed(json::Value const& value) { + TRACE_FUNC(); // XrplLib encodes seed used to generate an Ed25519 wallet in a // non-standard way. While xrpld never encode seeds that way, we // try to detect such keys to avoid user confusion. @@ -161,6 +167,7 @@ parseXrplLibSeed(json::Value const& value) std::optional getSeedFromRPC(json::Value const& params, json::Value& error) { + TRACE_FUNC(); using string_to_seed_t = std::function(std::string const&)>; using seed_match_t = std::pair; @@ -216,6 +223,7 @@ getSeedFromRPC(json::Value const& params, json::Value& error) std::optional> keypairForSignature(json::Value const& params, json::Value& error, unsigned int apiVersion) { + TRACE_FUNC(); bool const hasKeyType = params.isMember(jss::key_type); // All of the secret types we allow, but only one at a time. @@ -348,6 +356,7 @@ keypairForSignature(json::Value const& params, json::Value& error, unsigned int std::pair chooseLedgerEntryType(json::Value const& params) { + TRACE_FUNC(); std::pair result{RPC::Status::kOK, ltANY}; if (params.isMember(jss::type)) { @@ -398,6 +407,7 @@ chooseLedgerEntryType(json::Value const& params) bool isAccountObjectsValidType(LedgerEntryType const& type) { + TRACE_FUNC(); switch (type) { case LedgerEntryType::ltAMENDMENTS: @@ -418,6 +428,7 @@ parseSubUnsubJson( json::StaticString const& name, beast::Journal j) { + TRACE_FUNC(); auto const& jv = params[name]; auto const [issuerError, assetError] = [&]() { if (name == jss::taker_pays) diff --git a/src/xrpld/rpc/detail/RPCLedgerHelpers.cpp b/src/xrpld/rpc/detail/RPCLedgerHelpers.cpp index f8ab42f499..34244ba36a 100644 --- a/src/xrpld/rpc/detail/RPCLedgerHelpers.cpp +++ b/src/xrpld/rpc/detail/RPCLedgerHelpers.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -33,6 +34,7 @@ namespace { bool isValidatedOld(LedgerMaster& ledgerMaster, bool standalone) { + TRACE_FUNC(); if (standalone) return false; @@ -47,6 +49,7 @@ ledgerFromHash( Context const& context, json::StaticString const fieldName) { + TRACE_FUNC(); uint256 ledgerHash; if (!ledgerHash.parseHex(hash.asString())) return {RpcInvalidParams, expectedFieldMessage(fieldName, "hex string")}; @@ -61,6 +64,7 @@ ledgerFromIndex( Context const& context, json::StaticString const fieldName) { + TRACE_FUNC(); auto const index = indexValue.asString(); if (index == "current" || index.empty()) @@ -83,6 +87,7 @@ template Status ledgerFromRequest(T& ledger, JsonContext const& context) { + TRACE_FUNC(); ledger.reset(); auto& params = context.params; @@ -150,6 +155,7 @@ template Status ledgerFromRequest(T& ledger, GRPCContext const& context) { + TRACE_FUNC(); R const& request = context.params; return ledgerFromSpecifier(ledger, request.ledger(), context); } @@ -179,6 +185,7 @@ ledgerFromSpecifier( org::xrpl::rpc::v1::LedgerSpecifier const& specifier, Context const& context) { + TRACE_FUNC(); ledger.reset(); using LedgerCase = org::xrpl::rpc::v1::LedgerSpecifier::LedgerCase; @@ -222,6 +229,7 @@ template Status getLedger(T& ledger, uint256 const& ledgerHash, Context const& context) { + TRACE_FUNC(); ledger = context.ledgerMaster.getLedgerByHash(ledgerHash); if (ledger == nullptr) return {RpcLgrNotFound, "ledgerNotFound"}; @@ -232,6 +240,7 @@ template Status getLedger(T& ledger, uint32_t ledgerIndex, Context const& context) { + TRACE_FUNC(); ledger = context.ledgerMaster.getLedgerBySeq(ledgerIndex); if (ledger == nullptr) { @@ -261,6 +270,7 @@ template Status getLedger(T& ledger, LedgerShortcut shortcut, Context const& context) { + TRACE_FUNC(); if (isValidatedOld(context.ledgerMaster, context.app.config().standalone())) { if (context.apiVersion == 1) @@ -352,6 +362,7 @@ lookupLedger( JsonContext const& context, json::Value& result) { + TRACE_FUNC(); if (auto status = ledgerFromRequest(ledger, context)) return status; @@ -374,6 +385,7 @@ lookupLedger( json::Value lookupLedger(std::shared_ptr& ledger, JsonContext const& context) { + TRACE_FUNC(); json::Value result; if (auto status = lookupLedger(ledger, context, result)) status.inject(result); @@ -384,6 +396,7 @@ lookupLedger(std::shared_ptr& ledger, JsonContext const& context Expected, json::Value> getOrAcquireLedger(RPC::JsonContext const& context) { + TRACE_FUNC(); auto const hasHash = context.params.isMember(jss::ledger_hash); auto const hasIndex = context.params.isMember(jss::ledger_index); std::uint32_t ledgerIndex = 0; diff --git a/src/xrpld/rpc/detail/RPCSub.cpp b/src/xrpld/rpc/detail/RPCSub.cpp index 56291ab34b..65ecd61d50 100644 --- a/src/xrpld/rpc/detail/RPCSub.cpp +++ b/src/xrpld/rpc/detail/RPCSub.cpp @@ -11,6 +11,7 @@ #include #include // IWYU pragma: keep #include +#include #include @@ -47,6 +48,7 @@ public: , j_(registry.getJournal("RPCSub")) , logs_(registry.getLogs()) { + TRACE_FUNC(); ParsedUrl pUrl; if (!parseUrl(pUrl, strUrl)) @@ -84,6 +86,7 @@ public: void send(json::Value const& jvObj, bool broadcast) override { + TRACE_FUNC(); std::scoped_lock const sl(lock_); auto jm = broadcast ? j_.debug() : j_.info(); @@ -104,6 +107,7 @@ public: void setUsername(std::string const& strUsername) override { + TRACE_FUNC(); std::scoped_lock const sl(lock_); username_ = strUsername; @@ -112,6 +116,7 @@ public: void setPassword(std::string const& strPassword) override { + TRACE_FUNC(); std::scoped_lock const sl(lock_); password_ = strPassword; @@ -123,6 +128,7 @@ private: void sendThread() { + TRACE_FUNC(); json::Value jvEvent; bool bSend = false; @@ -217,6 +223,7 @@ makeRPCSub( std::string const& strPassword, ServiceRegistry& registry) { + TRACE_FUNC(); return std::make_shared( std::ref(source), std::ref(ioContext), diff --git a/src/xrpld/rpc/detail/Role.cpp b/src/xrpld/rpc/detail/Role.cpp index 998eea15c9..3aea27b86d 100644 --- a/src/xrpld/rpc/detail/Role.cpp +++ b/src/xrpld/rpc/detail/Role.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,7 @@ namespace xrpl { bool passwordUnrequiredOrSentCorrect(Port const& port, json::Value const& params) { + TRACE_FUNC(); XRPL_ASSERT( !(port.admin_nets_v4.empty() && port.admin_nets_v6.empty()), "xrpl::passwordUnrequiredOrSentCorrect : non-empty admin nets"); @@ -43,6 +45,7 @@ ipAllowed( std::vector const& nets4, std::vector const& nets6) { + TRACE_FUNC(); // To test whether the remoteIP is part of one of the configured // subnets, first convert it to a subnet definition. For ipv4, // this means appending /32. For ipv6, /128. Then based on protocol @@ -79,6 +82,7 @@ ipAllowed( bool isAdmin(Port const& port, json::Value const& params, beast::IP::Address const& remoteIp) { + TRACE_FUNC(); return ipAllowed(remoteIp, port.admin_nets_v4, port.admin_nets_v6) && passwordUnrequiredOrSentCorrect(port, params); } @@ -91,6 +95,7 @@ requestRole( beast::IP::Endpoint const& remoteIp, std::string_view user) { + TRACE_FUNC(); if (isAdmin(port, params, remoteIp.address())) return Role::ADMIN; @@ -113,6 +118,7 @@ requestRole( bool isUnlimited(Role const& role) { + TRACE_FUNC(); return role == Role::ADMIN || role == Role::IDENTIFIED; } @@ -124,6 +130,7 @@ isUnlimited( beast::IP::Endpoint const& remoteIp, std::string const& user) { + TRACE_FUNC(); return isUnlimited(requestRole(required, port, params, remoteIp, user)); } @@ -135,6 +142,7 @@ requestInboundEndpoint( std::string_view user, std::string_view forwardedFor) { + TRACE_FUNC(); if (isUnlimited(role)) return manager.newUnlimitedEndpoint(remoteAddress); @@ -144,6 +152,7 @@ requestInboundEndpoint( static std::string_view extractIpAddrFromField(std::string_view field) { + TRACE_FUNC(); // Lambda to trim leading and trailing spaces on the field. auto trim = [](std::string_view str) -> std::string_view { std::string_view ret = str; @@ -249,6 +258,7 @@ extractIpAddrFromField(std::string_view field) std::string_view forwardedFor(http_request_type const& request) { + TRACE_FUNC(); // Look for the Forwarded field in the request. if (auto it = request.find(boost::beast::http::field::forwarded); it != request.end()) { diff --git a/src/xrpld/rpc/detail/ServerHandler.cpp b/src/xrpld/rpc/detail/ServerHandler.cpp index e81fc37cc5..bfec2cbf22 100644 --- a/src/xrpld/rpc/detail/ServerHandler.cpp +++ b/src/xrpld/rpc/detail/ServerHandler.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -81,6 +82,7 @@ class CanonicalTXSet; static bool isStatusRequest(http_request_type const& request) { + TRACE_FUNC(); return request.version() >= 11 && request.target() == "/" && request.body().size() == 0 && request.method() == boost::beast::http::verb::get; } @@ -88,6 +90,7 @@ isStatusRequest(http_request_type const& request) static Handoff statusRequestResponse(http_request_type const& request, boost::beast::http::status status) { + TRACE_FUNC(); using namespace boost::beast::http; Handoff handoff; response msg; @@ -106,6 +109,7 @@ statusRequestResponse(http_request_type const& request, boost::beast::http::stat static bool authorized(Port const& port, std::map const& h) { + TRACE_FUNC(); if (port.user.empty() || port.password.empty()) return true; @@ -138,6 +142,7 @@ ServerHandler::ServerHandler( , server_(makeServer(*this, ioContext, app_.getJournal("Server"))) , jobQueue_(jobQueue) { + TRACE_FUNC(); auto const& group(cm.group("rpc")); rpc_requests_ = group->makeCounter("requests"); rpc_size_ = group->makeEvent("size"); @@ -146,12 +151,14 @@ ServerHandler::ServerHandler( ServerHandler::~ServerHandler() { + TRACE_FUNC(); server_ = nullptr; } void ServerHandler::setup(Setup const& setup, beast::Journal journal) { + TRACE_FUNC(); setup_ = setup; endpoints_ = server_->ports(setup.ports); @@ -179,6 +186,7 @@ ServerHandler::setup(Setup const& setup, beast::Journal journal) void ServerHandler::stop() { + TRACE_FUNC(); server_->close(); { std::unique_lock lock(mutex_); @@ -191,6 +199,7 @@ ServerHandler::stop() bool ServerHandler::onAccept(Session& session, boost::asio::ip::tcp::endpoint endpoint) { + TRACE_FUNC(); auto const& port = session.port(); auto const c = [this, &port]() { @@ -214,6 +223,7 @@ ServerHandler::onHandoff( http_request_type&& request, boost::asio::ip::tcp::endpoint const& remoteAddress) { + TRACE_FUNC(); using namespace boost::beast; auto const& p{session.port().protocol}; bool const isWs{ @@ -264,12 +274,14 @@ ServerHandler::onHandoff( static inline json::Output makeOutput(Session& session) { + TRACE_FUNC(); return [&](boost::beast::string_view const& b) { session.write(b.data(), b.size()); }; } static std::map buildMap(boost::beast::http::fields const& h) { + TRACE_FUNC(); std::map c; for (auto const& e : h) { @@ -287,6 +299,7 @@ template static std::string buffersToString(ConstBufferSequence const& bs) { + TRACE_FUNC(); using boost::asio::buffer_size; std::string s; s.reserve(buffer_size(bs)); @@ -300,6 +313,7 @@ buffersToString(ConstBufferSequence const& bs) void ServerHandler::onRequest(Session& session) { + TRACE_FUNC(); // Make sure RPC is enabled on the port if (session.port().protocol.count("http") == 0 && session.port().protocol.count("https") == 0) { @@ -335,6 +349,7 @@ ServerHandler::onWSMessage( std::shared_ptr session, std::vector const& buffers) { + TRACE_FUNC(); json::Value jv; auto const size = boost::asio::buffer_size(buffers); if (size > RPC::Tuning::kMAX_REQUEST_SIZE || !json::Reader{}.parse(jv, buffers) || @@ -378,6 +393,7 @@ ServerHandler::onWSMessage( void ServerHandler::onClose(Session& session, boost::system::error_code const&) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); --count_[session.port()]; } @@ -385,6 +401,7 @@ ServerHandler::onClose(Session& session, boost::system::error_code const&) void ServerHandler::onStopped(Server&) { + TRACE_FUNC(); std::scoped_lock const lock(mutex_); stopped_ = true; condition_.notify_one(); @@ -396,6 +413,7 @@ template void logDuration(json::Value const& request, T const& duration, beast::Journal& journal) { + TRACE_FUNC(); using namespace std::chrono_literals; auto const level = [&]() { if (duration >= 10s) @@ -416,6 +434,7 @@ ServerHandler::processSession( std::shared_ptr const& coro, json::Value const& jv) { + TRACE_FUNC(); auto is = std::static_pointer_cast(session->appDefined); if (is->getConsumer().disconnect(journal_)) { @@ -558,6 +577,7 @@ ServerHandler::processSession( std::shared_ptr const& session, std::shared_ptr coro) { + TRACE_FUNC(); processRequest( session->port(), buffersToString(session->request().body().data()), @@ -585,6 +605,7 @@ ServerHandler::processSession( static json::Value makeJsonError(json::Int code, json::Value&& message) { + TRACE_FUNC(); json::Value sub{json::ObjectValue}; sub["code"] = code; sub["message"] = std::move(message); @@ -608,6 +629,7 @@ ServerHandler::processRequest( std::string_view forwardedFor, std::string_view user) { + TRACE_FUNC(); auto rpcJ = app_.getJournal("RPC"); json::Value jsonOrig; @@ -1027,6 +1049,7 @@ ServerHandler::processRequest( Handoff ServerHandler::statusResponse(http_request_type const& request) const { + TRACE_FUNC(); using namespace boost::beast::http; Handoff handoff; response msg; @@ -1057,6 +1080,7 @@ ServerHandler::statusResponse(http_request_type const& request) const void ServerHandler::Setup::makeContexts() { + TRACE_FUNC(); for (auto& p : ports) { if (p.secure()) @@ -1081,6 +1105,7 @@ ServerHandler::Setup::makeContexts() static Port toPort(ParsedPort const& parsed, std::ostream& log) { + TRACE_FUNC(); Port p; p.name = parsed.name; @@ -1127,6 +1152,7 @@ toPort(ParsedPort const& parsed, std::ostream& log) static std::vector parsePorts(Config const& config, std::ostream& log) { + TRACE_FUNC(); std::vector result; if (!config.exists("server")) @@ -1201,6 +1227,7 @@ parsePorts(Config const& config, std::ostream& log) static void setupClient(ServerHandler::Setup& setup) { + TRACE_FUNC(); decltype(setup.ports)::const_iterator iter; for (iter = setup.ports.cbegin(); iter != setup.ports.cend(); ++iter) { @@ -1230,6 +1257,7 @@ setupClient(ServerHandler::Setup& setup) static void setupOverlay(ServerHandler::Setup& setup) { + TRACE_FUNC(); auto const iter = std::ranges::find_if( setup.ports, [](Port const& port) { return port.protocol.count("peer") != 0; }); if (iter == setup.ports.cend()) @@ -1243,6 +1271,7 @@ setupOverlay(ServerHandler::Setup& setup) ServerHandler::Setup setupServerHandler(Config const& config, std::ostream& log) { + TRACE_FUNC(); ServerHandler::Setup setup; setup.ports = parsePorts(config, log); @@ -1261,6 +1290,7 @@ makeServerHandler( Resource::Manager& resourceManager, CollectorManager& cm) { + TRACE_FUNC(); return std::make_unique( ServerHandler::ServerHandlerCreator(), app, diff --git a/src/xrpld/rpc/detail/Status.cpp b/src/xrpld/rpc/detail/Status.cpp index 58d2f8cb80..035554854e 100644 --- a/src/xrpld/rpc/detail/Status.cpp +++ b/src/xrpld/rpc/detail/Status.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -14,6 +15,7 @@ namespace xrpl::RPC { std::string Status::codeString() const { + TRACE_FUNC(); if (!*this) return ""; @@ -47,6 +49,7 @@ Status::codeString() const void Status::fillJson(json::Value& value) { + TRACE_FUNC(); if (!*this) return; @@ -66,6 +69,7 @@ Status::fillJson(json::Value& value) std::string Status::message() const { + TRACE_FUNC(); std::string result; for (auto& m : messages_) { @@ -80,6 +84,7 @@ Status::message() const std::string Status::toString() const { + TRACE_FUNC(); if (*this) return codeString() + ":" + message(); return ""; diff --git a/src/xrpld/rpc/detail/TransactionSign.cpp b/src/xrpld/rpc/detail/TransactionSign.cpp index c6ceeee65f..0d1e064d98 100644 --- a/src/xrpld/rpc/detail/TransactionSign.cpp +++ b/src/xrpld/rpc/detail/TransactionSign.cpp @@ -51,6 +51,7 @@ #include #include // Validity::Valid #include +#include #include #include @@ -89,12 +90,14 @@ public: [[nodiscard]] bool isMultiSigning() const { + TRACE_FUNC(); return multiSigningAcctID_ != nullptr; } [[nodiscard]] bool isSingleSigning() const { + TRACE_FUNC(); return !isMultiSigning(); } @@ -102,12 +105,14 @@ public: [[nodiscard]] bool editFields() const { + TRACE_FUNC(); return !isMultiSigning(); } [[nodiscard]] bool validMultiSign() const { + TRACE_FUNC(); return isMultiSigning() && multiSignPublicKey_ && !multiSignature_.empty(); } @@ -115,6 +120,7 @@ public: [[nodiscard]] AccountID const& getSigner() const { + TRACE_FUNC(); if (multiSigningAcctID_ == nullptr) logicError("Accessing unknown SigningForParams::getSigner()"); return *multiSigningAcctID_; @@ -123,6 +129,7 @@ public: [[nodiscard]] PublicKey const& getPublicKey() const { + TRACE_FUNC(); if (!multiSignPublicKey_) logicError("Accessing unknown SigningForParams::getPublicKey()"); return *multiSignPublicKey_; @@ -131,30 +138,35 @@ public: [[nodiscard]] Buffer const& getSignature() const { + TRACE_FUNC(); return multiSignature_; } [[nodiscard]] std::optional> const& getSignatureTarget() const { + TRACE_FUNC(); return signatureTarget_; } void setPublicKey(PublicKey const& multiSignPublicKey) { + TRACE_FUNC(); multiSignPublicKey_ = multiSignPublicKey; } void setSignatureTarget(std::optional> const& field) { + TRACE_FUNC(); signatureTarget_ = field; } void moveMultiSignature(Buffer&& multiSignature) { + TRACE_FUNC(); multiSignature_ = std::move(multiSignature); } }; @@ -167,6 +179,7 @@ acctMatchesPubKey( AccountID const& accountID, PublicKey const& publicKey) { + TRACE_FUNC(); auto const publicKeyAcctID = calcAccountID(publicKey); bool const isMasterKey = publicKeyAcctID == accountID; @@ -205,6 +218,7 @@ checkPayment( Application& app, bool doPath) { + TRACE_FUNC(); // Only path find for Payments. if (txJson[jss::TransactionType].asString() != jss::Payment) return json::Value(); @@ -351,6 +365,7 @@ checkTxJsonFields( LoadFeeTrack const& feeTrack, unsigned apiVersion) { + TRACE_FUNC(); std::pair ret; if (!txJson.isObject()) @@ -441,6 +456,7 @@ transactionPreProcessImpl( std::chrono::seconds validatedLedgerAge, Application& app) { + TRACE_FUNC(); auto j = app.getJournal("RPCHandler"); json::Value jvResult; @@ -686,6 +702,7 @@ transactionConstructImpl( Rules const& rules, Application& app) { + TRACE_FUNC(); std::pair ret; // Turn the passed in STTx into a Transaction. @@ -755,6 +772,7 @@ transactionConstructImpl( static json::Value transactionFormatResultImpl(Transaction::pointer tpTrans, unsigned apiVersion) { + TRACE_FUNC(); json::Value jvResult; try { @@ -799,6 +817,7 @@ transactionFormatResultImpl(Transaction::pointer tpTrans, unsigned apiVersion) [[nodiscard]] static XRPAmount getTxFee(Application const& app, Config const& config, json::Value tx) { + TRACE_FUNC(); auto const& ledger = app.getOpenLedger().current(); // autofilling only needed in this function so that the `STParsedJSONObject` // parsing works properly it should not be modifying the actual `tx` object @@ -880,6 +899,7 @@ getCurrentNetworkFee( int mult, int div) { + TRACE_FUNC(); XRPAmount const feeDefault = getTxFee(app, config, tx); auto ledger = app.getOpenLedger().current(); @@ -917,6 +937,7 @@ checkFee( TxQ const& txQ, Application const& app) { + TRACE_FUNC(); json::Value& tx(request[jss::tx_json]); if (tx.isMember(jss::Fee)) return json::Value(); @@ -982,6 +1003,7 @@ transactionSign( std::chrono::seconds validatedLedgerAge, Application& app) { + TRACE_FUNC(); using namespace detail; auto j = app.getJournal("RPCHandler"); @@ -1017,6 +1039,7 @@ transactionSubmit( Application& app, ProcessTransactionFn const& processTransaction) { + TRACE_FUNC(); using namespace detail; auto const& ledger = app.getOpenLedger().current(); @@ -1058,6 +1081,7 @@ namespace detail { static json::Value checkMultiSignFields(json::Value const& jvRequest) { + TRACE_FUNC(); if (!jvRequest.isMember(jss::tx_json)) return RPC::missingFieldError(jss::tx_json); @@ -1094,6 +1118,7 @@ checkMultiSignFields(json::Value const& jvRequest) static json::Value sortAndValidateSigners(STArray& signers, AccountID const& signingForID) { + TRACE_FUNC(); if (signers.empty()) return RPC::makeParamError("Signers array may not be empty."); @@ -1139,6 +1164,7 @@ transactionSignFor( std::chrono::seconds validatedLedgerAge, Application& app) { + TRACE_FUNC(); auto const& ledger = app.getOpenLedger().current(); auto j = app.getJournal("RPCHandler"); JLOG(j.debug()) << "transactionSignFor: " << jvRequest; @@ -1252,6 +1278,7 @@ transactionSubmitMultiSigned( Application& app, ProcessTransactionFn const& processTransaction) { + TRACE_FUNC(); auto const& ledger = app.getOpenLedger().current(); auto j = app.getJournal("RPCHandler"); JLOG(j.debug()) << "transactionSubmitMultiSigned: " << jvRequest; diff --git a/src/xrpld/rpc/detail/TransactionSign.h b/src/xrpld/rpc/detail/TransactionSign.h index 3d6f41ba30..cad0607d10 100644 --- a/src/xrpld/rpc/detail/TransactionSign.h +++ b/src/xrpld/rpc/detail/TransactionSign.h @@ -6,6 +6,7 @@ #include #include +#include namespace xrpl { @@ -75,6 +76,7 @@ using ProcessTransactionFn = std::function& transaction, bool bUnlimited, diff --git a/src/xrpld/rpc/detail/TrustLine.cpp b/src/xrpld/rpc/detail/TrustLine.cpp index 4d0393bfed..9f32547b2b 100644 --- a/src/xrpld/rpc/detail/TrustLine.cpp +++ b/src/xrpld/rpc/detail/TrustLine.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,7 @@ TrustLineBase::TrustLineBase(std::shared_ptr const& sle, AccountID co , flags_(sle->getFieldU32(sfFlags)) , viewLowest_(lowLimit_.getIssuer() == viewAccount) { + TRACE_FUNC(); if (!viewLowest_) balance_.negate(); } @@ -30,6 +32,7 @@ TrustLineBase::TrustLineBase(std::shared_ptr const& sle, AccountID co json::Value TrustLineBase::getJson(int) { + TRACE_FUNC(); json::Value ret(json::ObjectValue); ret["low_id"] = to_string(lowLimit_.getIssuer()); ret["high_id"] = to_string(highLimit_.getIssuer()); @@ -39,6 +42,7 @@ TrustLineBase::getJson(int) std::optional PathFindTrustLine::makeItem(AccountID const& accountID, std::shared_ptr const& sle) { + TRACE_FUNC(); if (!sle || sle->getType() != ltRIPPLE_STATE) return {}; return std::optional{PathFindTrustLine{sle, accountID}}; @@ -52,6 +56,7 @@ getTrustLineItems( ReadView const& view, LineDirection direction = LineDirection::Outgoing) { + TRACE_FUNC(); std::vector items; forEachItem( view, @@ -75,6 +80,7 @@ PathFindTrustLine::getItems( ReadView const& view, LineDirection direction) { + TRACE_FUNC(); return detail::getTrustLineItems(accountID, view, direction); } @@ -90,6 +96,7 @@ RPCTrustLine::RPCTrustLine(std::shared_ptr const& sle, AccountID cons std::optional RPCTrustLine::makeItem(AccountID const& accountID, std::shared_ptr const& sle) { + TRACE_FUNC(); if (!sle || sle->getType() != ltRIPPLE_STATE) return {}; return std::optional{RPCTrustLine{sle, accountID}}; @@ -98,6 +105,7 @@ RPCTrustLine::makeItem(AccountID const& accountID, std::shared_ptr co std::vector RPCTrustLine::getItems(AccountID const& accountID, ReadView const& view) { + TRACE_FUNC(); return detail::getTrustLineItems(accountID, view); } diff --git a/src/xrpld/rpc/detail/TrustLine.h b/src/xrpld/rpc/detail/TrustLine.h index 72d4d44ae3..4ef009e410 100644 --- a/src/xrpld/rpc/detail/TrustLine.h +++ b/src/xrpld/rpc/detail/TrustLine.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -50,6 +51,7 @@ public: [[nodiscard]] uint256 const& key() const { + TRACE_FUNC(); return key_; } @@ -58,12 +60,14 @@ public: [[nodiscard]] AccountID const& getAccountID() const { + TRACE_FUNC(); return viewLowest_ ? lowLimit_.getIssuer() : highLimit_.getIssuer(); } [[nodiscard]] AccountID const& getAccountIDPeer() const { + TRACE_FUNC(); return !viewLowest_ ? lowLimit_.getIssuer() : highLimit_.getIssuer(); } @@ -71,36 +75,42 @@ public: [[nodiscard]] bool getAuth() const { + TRACE_FUNC(); return (flags_ & (viewLowest_ ? lsfLowAuth : lsfHighAuth)) != 0u; } [[nodiscard]] bool getAuthPeer() const { + TRACE_FUNC(); return (flags_ & (!viewLowest_ ? lsfLowAuth : lsfHighAuth)) != 0u; } [[nodiscard]] bool getNoRipple() const { + TRACE_FUNC(); return (flags_ & (viewLowest_ ? lsfLowNoRipple : lsfHighNoRipple)) != 0u; } [[nodiscard]] bool getNoRipplePeer() const { + TRACE_FUNC(); return (flags_ & (!viewLowest_ ? lsfLowNoRipple : lsfHighNoRipple)) != 0u; } [[nodiscard]] LineDirection getDirection() const { + TRACE_FUNC(); return getNoRipple() ? LineDirection::Incoming : LineDirection::Outgoing; } [[nodiscard]] LineDirection getDirectionPeer() const { + TRACE_FUNC(); return getNoRipplePeer() ? LineDirection::Incoming : LineDirection::Outgoing; } @@ -108,6 +118,7 @@ public: [[nodiscard]] bool getFreeze() const { + TRACE_FUNC(); return (flags_ & (viewLowest_ ? lsfLowFreeze : lsfHighFreeze)) != 0u; } @@ -115,6 +126,7 @@ public: [[nodiscard]] bool getDeepFreeze() const { + TRACE_FUNC(); return (flags_ & (viewLowest_ ? lsfLowDeepFreeze : lsfHighDeepFreeze)) != 0u; } @@ -122,6 +134,7 @@ public: [[nodiscard]] bool getFreezePeer() const { + TRACE_FUNC(); return (flags_ & (!viewLowest_ ? lsfLowFreeze : lsfHighFreeze)) != 0u; } @@ -129,24 +142,28 @@ public: [[nodiscard]] bool getDeepFreezePeer() const { + TRACE_FUNC(); return (flags_ & (!viewLowest_ ? lsfLowDeepFreeze : lsfHighDeepFreeze)) != 0u; } [[nodiscard]] STAmount const& getBalance() const { + TRACE_FUNC(); return balance_; } [[nodiscard]] STAmount const& getLimit() const { + TRACE_FUNC(); return viewLowest_ ? lowLimit_ : highLimit_; } [[nodiscard]] STAmount const& getLimitPeer() const { + TRACE_FUNC(); return !viewLowest_ ? lowLimit_ : highLimit_; } @@ -195,12 +212,14 @@ public: [[nodiscard]] Rate const& getQualityIn() const { + TRACE_FUNC(); return viewLowest_ ? lowQualityIn_ : highQualityIn_; } [[nodiscard]] Rate const& getQualityOut() const { + TRACE_FUNC(); return viewLowest_ ? lowQualityOut_ : highQualityOut_; } diff --git a/src/xrpld/rpc/detail/WSInfoSub.h b/src/xrpld/rpc/detail/WSInfoSub.h index 336f35957f..1bf6a231a9 100644 --- a/src/xrpld/rpc/detail/WSInfoSub.h +++ b/src/xrpld/rpc/detail/WSInfoSub.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -21,6 +22,7 @@ class WSInfoSub : public InfoSub public: WSInfoSub(Source& source, std::shared_ptr const& ws) : InfoSub(source), ws_(ws) { + TRACE_FUNC(); auto const& h = ws->request(); if (ipAllowed( beast::IPAddressConversion::fromAsio(ws->remoteEndpoint()).address(), @@ -37,18 +39,21 @@ public: [[nodiscard]] std::string_view user() const { + TRACE_FUNC(); return user_; } [[nodiscard]] std::string_view forwardedFor() const { + TRACE_FUNC(); return fwdfor_; } void send(json::Value const& jv, bool) override { + TRACE_FUNC(); auto sp = ws_.lock(); if (!sp) return; diff --git a/src/xrpld/rpc/handlers/ChannelVerify.cpp b/src/xrpld/rpc/handlers/ChannelVerify.cpp index 082188f8dc..2a9a0c0537 100644 --- a/src/xrpld/rpc/handlers/ChannelVerify.cpp +++ b/src/xrpld/rpc/handlers/ChannelVerify.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ namespace xrpl { json::Value doChannelVerify(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& params(context.params); for (auto const& p : {jss::public_key, jss::channel_id, jss::amount, jss::signature}) { diff --git a/src/xrpld/rpc/handlers/VaultInfo.cpp b/src/xrpld/rpc/handlers/VaultInfo.cpp index 59795736ed..3588186ff8 100644 --- a/src/xrpld/rpc/handlers/VaultInfo.cpp +++ b/src/xrpld/rpc/handlers/VaultInfo.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -18,6 +19,7 @@ namespace xrpl { static std::optional parseVault(json::Value const& params, json::Value& jvResult) { + TRACE_FUNC(); auto const hasVaultId = params.isMember(jss::vault_id); auto const hasOwner = params.isMember(jss::owner); auto const hasSeq = params.isMember(jss::seq); @@ -63,6 +65,7 @@ parseVault(json::Value const& params, json::Value& jvResult) json::Value doVaultInfo(RPC::JsonContext& context) { + TRACE_FUNC(); std::shared_ptr lpLedger; auto jvResult = RPC::lookupLedger(lpLedger, context); diff --git a/src/xrpld/rpc/handlers/account/AccountChannels.cpp b/src/xrpld/rpc/handlers/account/AccountChannels.cpp index 52c6b3148f..9946572211 100644 --- a/src/xrpld/rpc/handlers/account/AccountChannels.cpp +++ b/src/xrpld/rpc/handlers/account/AccountChannels.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -38,6 +39,7 @@ namespace xrpl { void addChannel(json::Value& jsonLines, SLE const& line) { + TRACE_FUNC(); json::Value& jDst(jsonLines.append(json::ObjectValue)); jDst[jss::channel_id] = to_string(line.key()); jDst[jss::account] = to_string(line[sfAccount]); @@ -71,6 +73,7 @@ addChannel(json::Value& jsonLines, SLE const& line) json::Value doAccountChannels(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& params(context.params); if (!params.isMember(jss::account)) return RPC::missingFieldError(jss::account); diff --git a/src/xrpld/rpc/handlers/account/AccountCurrencies.cpp b/src/xrpld/rpc/handlers/account/AccountCurrencies.cpp index 1ea629c5ff..1eb3a0802d 100644 --- a/src/xrpld/rpc/handlers/account/AccountCurrencies.cpp +++ b/src/xrpld/rpc/handlers/account/AccountCurrencies.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -21,6 +22,7 @@ namespace xrpl { json::Value doAccountCurrencies(RPC::JsonContext& context) { + TRACE_FUNC(); auto& params = context.params; if (!(params.isMember(jss::account) || params.isMember(jss::ident))) diff --git a/src/xrpld/rpc/handlers/account/AccountInfo.cpp b/src/xrpld/rpc/handlers/account/AccountInfo.cpp index 69b0fb2879..487a8fb60c 100644 --- a/src/xrpld/rpc/handlers/account/AccountInfo.cpp +++ b/src/xrpld/rpc/handlers/account/AccountInfo.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -49,6 +50,7 @@ namespace xrpl { void injectSLE(json::Value& jv, SLE const& sle) { + TRACE_FUNC(); jv = sle.getJson(JsonOptions::KNone); if (sle.getType() == ltACCOUNT_ROOT) { @@ -86,6 +88,7 @@ injectSLE(json::Value& jv, SLE const& sle) json::Value doAccountInfo(RPC::JsonContext& context) { + TRACE_FUNC(); auto& params = context.params; std::string strIdent; diff --git a/src/xrpld/rpc/handlers/account/AccountLines.cpp b/src/xrpld/rpc/handlers/account/AccountLines.cpp index 7d0d4daa5a..cee0171962 100644 --- a/src/xrpld/rpc/handlers/account/AccountLines.cpp +++ b/src/xrpld/rpc/handlers/account/AccountLines.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,7 @@ namespace xrpl { void addLine(json::Value& jsonLines, RPCTrustLine const& line) { + TRACE_FUNC(); STAmount const& saBalance(line.getBalance()); STAmount const& saLimit(line.getLimit()); STAmount const& saLimitPeer(line.getLimitPeer()); @@ -84,6 +86,7 @@ addLine(json::Value& jsonLines, RPCTrustLine const& line) json::Value doAccountLines(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& params(context.params); if (!params.isMember(jss::account)) return RPC::missingFieldError(jss::account); diff --git a/src/xrpld/rpc/handlers/account/AccountNFTs.cpp b/src/xrpld/rpc/handlers/account/AccountNFTs.cpp index 077001e543..7c25ac9391 100644 --- a/src/xrpld/rpc/handlers/account/AccountNFTs.cpp +++ b/src/xrpld/rpc/handlers/account/AccountNFTs.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -35,6 +36,7 @@ namespace xrpl { json::Value doAccountNFTs(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& params = context.params; if (!params.isMember(jss::account)) return RPC::missingFieldError(jss::account); diff --git a/src/xrpld/rpc/handlers/account/AccountObjects.cpp b/src/xrpld/rpc/handlers/account/AccountObjects.cpp index c930333d91..c0351d695c 100644 --- a/src/xrpld/rpc/handlers/account/AccountObjects.cpp +++ b/src/xrpld/rpc/handlers/account/AccountObjects.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,7 @@ getAccountObjects( std::uint32_t const limit, json::Value& jvResult) { + TRACE_FUNC(); // check if dirIndex is valid if (!dirIndex.isZero() && !ledger.read({ltDIR_NODE, dirIndex})) return false; @@ -229,6 +231,7 @@ getAccountObjects( json::Value doAccountObjects(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& params = context.params; if (!params.isMember(jss::account)) return RPC::missingFieldError(jss::account); diff --git a/src/xrpld/rpc/handlers/account/AccountOffers.cpp b/src/xrpld/rpc/handlers/account/AccountOffers.cpp index 6314dc8ec2..b80ecbafa2 100644 --- a/src/xrpld/rpc/handlers/account/AccountOffers.cpp +++ b/src/xrpld/rpc/handlers/account/AccountOffers.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -35,6 +36,7 @@ namespace xrpl { void appendOfferJson(std::shared_ptr const& offer, json::Value& offers) { + TRACE_FUNC(); STAmount const dirRate = amountFromQuality(getQuality(offer->getFieldH256(sfBookDirectory))); json::Value& obj(offers.append(json::ObjectValue)); offer->getFieldAmount(sfTakerPays).setJson(obj[jss::taker_pays]); @@ -56,6 +58,7 @@ appendOfferJson(std::shared_ptr const& offer, json::Value& offers) json::Value doAccountOffers(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& params(context.params); if (!params.isMember(jss::account)) return RPC::missingFieldError(jss::account); diff --git a/src/xrpld/rpc/handlers/account/AccountTx.cpp b/src/xrpld/rpc/handlers/account/AccountTx.cpp index 7c8e45f523..3b718b5ed3 100644 --- a/src/xrpld/rpc/handlers/account/AccountTx.cpp +++ b/src/xrpld/rpc/handlers/account/AccountTx.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -49,6 +50,7 @@ using LedgerSpecifier = RelationalDatabase::LedgerSpecifier; std::variant, json::Value> parseLedgerArgs(RPC::Context& context, json::Value const& params) { + TRACE_FUNC(); json::Value response; // if ledger_index_min or max is specified, then ledger_hash or ledger_index // should not be specified. Error out if it is @@ -132,6 +134,7 @@ parseLedgerArgs(RPC::Context& context, json::Value const& params) std::variant getLedgerRange(RPC::Context& context, std::optional const& ledgerSpecifier) { + TRACE_FUNC(); std::uint32_t uValidatedMin = 0; std::uint32_t uValidatedMax = 0; bool const bValidated = context.ledgerMaster.getValidatedRange(uValidatedMin, uValidatedMax); @@ -211,6 +214,7 @@ getLedgerRange(RPC::Context& context, std::optional const& ledg std::pair doAccountTxHelp(RPC::Context& context, AccountTxArgs const& args) { + TRACE_FUNC(); context.loadType = Resource::kFEE_MEDIUM_BURDEN_RPC; AccountTxResult result; @@ -278,6 +282,7 @@ populateJsonResponse( AccountTxArgs const& args, RPC::JsonContext const& context) { + TRACE_FUNC(); json::Value response; RPC::Status const& error = res.second; if (error.toErrorCode() != RpcSuccess) @@ -386,6 +391,7 @@ populateJsonResponse( json::Value doAccountTx(RPC::JsonContext& context) { + TRACE_FUNC(); if (!context.app.config().useTxTables()) return rpcError(RpcNotEnabled); diff --git a/src/xrpld/rpc/handlers/account/GatewayBalances.cpp b/src/xrpld/rpc/handlers/account/GatewayBalances.cpp index 7b6d6ca07b..50cbbf2b9d 100644 --- a/src/xrpld/rpc/handlers/account/GatewayBalances.cpp +++ b/src/xrpld/rpc/handlers/account/GatewayBalances.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -51,6 +52,7 @@ namespace xrpl { json::Value doGatewayBalances(RPC::JsonContext& context) { + TRACE_FUNC(); auto& params = context.params; // Get the current ledger diff --git a/src/xrpld/rpc/handlers/account/NoRippleCheck.cpp b/src/xrpld/rpc/handlers/account/NoRippleCheck.cpp index 2f4c90e4e7..84f8056606 100644 --- a/src/xrpld/rpc/handlers/account/NoRippleCheck.cpp +++ b/src/xrpld/rpc/handlers/account/NoRippleCheck.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,7 @@ fillTransaction( std::uint32_t& sequence, ReadView const& ledger) { + TRACE_FUNC(); txArray["Sequence"] = json::UInt(sequence++); txArray["Account"] = toBase58(accountID); auto& fees = ledger.fees(); @@ -51,6 +53,7 @@ fillTransaction( json::Value doNoRippleCheck(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& params(context.params); if (!params.isMember(jss::account)) return RPC::missingFieldError("account"); diff --git a/src/xrpld/rpc/handlers/account/OwnerInfo.cpp b/src/xrpld/rpc/handlers/account/OwnerInfo.cpp index 7cfed3cf53..c35d348b71 100644 --- a/src/xrpld/rpc/handlers/account/OwnerInfo.cpp +++ b/src/xrpld/rpc/handlers/account/OwnerInfo.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -19,6 +20,7 @@ namespace xrpl { json::Value doOwnerInfo(RPC::JsonContext& context) { + TRACE_FUNC(); if (!context.params.isMember(jss::account) && !context.params.isMember(jss::ident)) { return RPC::missingFieldError(jss::account); diff --git a/src/xrpld/rpc/handlers/admin/BlackList.cpp b/src/xrpld/rpc/handlers/admin/BlackList.cpp index 5065a41ec4..254b5ba829 100644 --- a/src/xrpld/rpc/handlers/admin/BlackList.cpp +++ b/src/xrpld/rpc/handlers/admin/BlackList.cpp @@ -4,12 +4,14 @@ #include #include #include +#include namespace xrpl { json::Value doBlackList(RPC::JsonContext& context) { + TRACE_FUNC(); auto& rm = context.app.getResourceManager(); if (context.params.isMember(jss::threshold)) { diff --git a/src/xrpld/rpc/handlers/admin/UnlList.cpp b/src/xrpld/rpc/handlers/admin/UnlList.cpp index 58a5bd3c25..7f7e392b05 100644 --- a/src/xrpld/rpc/handlers/admin/UnlList.cpp +++ b/src/xrpld/rpc/handlers/admin/UnlList.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -14,6 +15,7 @@ namespace xrpl { json::Value doUnlList(RPC::JsonContext& context) { + TRACE_FUNC(); json::Value obj(json::ObjectValue); context.app.getValidators().forEachListed( diff --git a/src/xrpld/rpc/handlers/admin/data/LedgerCleaner.cpp b/src/xrpld/rpc/handlers/admin/data/LedgerCleaner.cpp index a62ca44cca..09d319c765 100644 --- a/src/xrpld/rpc/handlers/admin/data/LedgerCleaner.cpp +++ b/src/xrpld/rpc/handlers/admin/data/LedgerCleaner.cpp @@ -5,12 +5,14 @@ #include #include +#include namespace xrpl { json::Value doLedgerCleaner(RPC::JsonContext& context) { + TRACE_FUNC(); context.app.getLedgerCleaner().clean(context.params); return RPC::makeObjectValue("Cleaner configured"); } diff --git a/src/xrpld/rpc/handlers/admin/data/LedgerRequest.cpp b/src/xrpld/rpc/handlers/admin/data/LedgerRequest.cpp index 4b15dbdcaf..8906d469a1 100644 --- a/src/xrpld/rpc/handlers/admin/data/LedgerRequest.cpp +++ b/src/xrpld/rpc/handlers/admin/data/LedgerRequest.cpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace xrpl { @@ -15,6 +16,7 @@ namespace xrpl { json::Value doLedgerRequest(RPC::JsonContext& context) { + TRACE_FUNC(); context.loadType = Resource::kFEE_HEAVY_BURDEN_RPC; auto res = RPC::getOrAcquireLedger(context); diff --git a/src/xrpld/rpc/handlers/admin/keygen/ValidationCreate.cpp b/src/xrpld/rpc/handlers/admin/keygen/ValidationCreate.cpp index 4ef16c4f97..195187b182 100644 --- a/src/xrpld/rpc/handlers/admin/keygen/ValidationCreate.cpp +++ b/src/xrpld/rpc/handlers/admin/keygen/ValidationCreate.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -17,6 +18,7 @@ namespace xrpl { static std::optional validationSeed(json::Value const& params) { + TRACE_FUNC(); if (!params.isMember(jss::secret)) return randomSeed(); @@ -32,6 +34,7 @@ validationSeed(json::Value const& params) json::Value doValidationCreate(RPC::JsonContext& context) { + TRACE_FUNC(); json::Value obj(json::ObjectValue); auto seed = validationSeed(context.params); diff --git a/src/xrpld/rpc/handlers/admin/keygen/WalletPropose.cpp b/src/xrpld/rpc/handlers/admin/keygen/WalletPropose.cpp index 3d670b9818..c377c64d43 100644 --- a/src/xrpld/rpc/handlers/admin/keygen/WalletPropose.cpp +++ b/src/xrpld/rpc/handlers/admin/keygen/WalletPropose.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,7 @@ namespace xrpl { double estimateEntropy(std::string const& input) { + TRACE_FUNC(); // First, we calculate the Shannon entropy. This gives // the average number of bits per symbol that we would // need to encode the input. @@ -54,12 +56,14 @@ estimateEntropy(std::string const& input) json::Value doWalletPropose(RPC::JsonContext& context) { + TRACE_FUNC(); return walletPropose(context.params); } json::Value walletPropose(json::Value const& params) { + TRACE_FUNC(); std::optional keyType; std::optional seed; bool libSeed = false; diff --git a/src/xrpld/rpc/handlers/admin/log/LogLevel.cpp b/src/xrpld/rpc/handlers/admin/log/LogLevel.cpp index a18fd8cc89..173aa278fc 100644 --- a/src/xrpld/rpc/handlers/admin/log/LogLevel.cpp +++ b/src/xrpld/rpc/handlers/admin/log/LogLevel.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -18,6 +19,7 @@ namespace xrpl { json::Value doLogLevel(RPC::JsonContext& context) { + TRACE_FUNC(); // log_level if (!context.params.isMember(jss::severity)) { diff --git a/src/xrpld/rpc/handlers/admin/log/LogRotate.cpp b/src/xrpld/rpc/handlers/admin/log/LogRotate.cpp index 5f5c3e64df..b2a816d97e 100644 --- a/src/xrpld/rpc/handlers/admin/log/LogRotate.cpp +++ b/src/xrpld/rpc/handlers/admin/log/LogRotate.cpp @@ -5,12 +5,14 @@ #include #include #include +#include namespace xrpl { json::Value doLogRotate(RPC::JsonContext& context) { + TRACE_FUNC(); context.app.getPerfLog().rotate(); return RPC::makeObjectValue(context.app.getLogs().rotate()); } diff --git a/src/xrpld/rpc/handlers/admin/peer/Connect.cpp b/src/xrpld/rpc/handlers/admin/peer/Connect.cpp index cfa79eeb82..984ab48f5b 100644 --- a/src/xrpld/rpc/handlers/admin/peer/Connect.cpp +++ b/src/xrpld/rpc/handlers/admin/peer/Connect.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -23,6 +24,7 @@ namespace xrpl { json::Value doConnect(RPC::JsonContext& context) { + TRACE_FUNC(); if (context.app.config().standalone()) { return RPC::makeError(RpcNotSynced); diff --git a/src/xrpld/rpc/handlers/admin/peer/PeerReservationsAdd.cpp b/src/xrpld/rpc/handlers/admin/peer/PeerReservationsAdd.cpp index b437d17c6a..db8d229cd6 100644 --- a/src/xrpld/rpc/handlers/admin/peer/PeerReservationsAdd.cpp +++ b/src/xrpld/rpc/handlers/admin/peer/PeerReservationsAdd.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -17,6 +18,7 @@ namespace xrpl { json::Value doPeerReservationsAdd(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& params = context.params; if (!params.isMember(jss::public_key)) diff --git a/src/xrpld/rpc/handlers/admin/peer/PeerReservationsDel.cpp b/src/xrpld/rpc/handlers/admin/peer/PeerReservationsDel.cpp index 374170b135..d02c8a6fa1 100644 --- a/src/xrpld/rpc/handlers/admin/peer/PeerReservationsDel.cpp +++ b/src/xrpld/rpc/handlers/admin/peer/PeerReservationsDel.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -15,6 +16,7 @@ namespace xrpl { json::Value doPeerReservationsDel(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& params = context.params; // We repeat much of the parameter parsing from `doPeerReservationsAdd`. diff --git a/src/xrpld/rpc/handlers/admin/peer/PeerReservationsList.cpp b/src/xrpld/rpc/handlers/admin/peer/PeerReservationsList.cpp index a9323340f9..7b4d893284 100644 --- a/src/xrpld/rpc/handlers/admin/peer/PeerReservationsList.cpp +++ b/src/xrpld/rpc/handlers/admin/peer/PeerReservationsList.cpp @@ -3,12 +3,14 @@ #include #include +#include namespace xrpl { json::Value doPeerReservationsList(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& reservations = context.app.getPeerReservations().list(); // Enumerate the reservations in context.app.getPeerReservations() // as a json::Value. diff --git a/src/xrpld/rpc/handlers/admin/peer/Peers.cpp b/src/xrpld/rpc/handlers/admin/peer/Peers.cpp index 41132826e4..ef09abcad2 100644 --- a/src/xrpld/rpc/handlers/admin/peer/Peers.cpp +++ b/src/xrpld/rpc/handlers/admin/peer/Peers.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -19,6 +20,7 @@ namespace xrpl { json::Value doPeers(RPC::JsonContext& context) { + TRACE_FUNC(); json::Value jvResult(json::ObjectValue); jvResult[jss::peers] = context.app.getOverlay().json(); diff --git a/src/xrpld/rpc/handlers/admin/server_control/LedgerAccept.cpp b/src/xrpld/rpc/handlers/admin/server_control/LedgerAccept.cpp index ce06a6e480..501337d61f 100644 --- a/src/xrpld/rpc/handlers/admin/server_control/LedgerAccept.cpp +++ b/src/xrpld/rpc/handlers/admin/server_control/LedgerAccept.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -14,6 +15,7 @@ namespace xrpl { json::Value doLedgerAccept(RPC::JsonContext& context) { + TRACE_FUNC(); json::Value jvResult; if (!context.app.config().standalone()) diff --git a/src/xrpld/rpc/handlers/admin/server_control/Stop.cpp b/src/xrpld/rpc/handlers/admin/server_control/Stop.cpp index 3e86bd4632..54f50536e6 100644 --- a/src/xrpld/rpc/handlers/admin/server_control/Stop.cpp +++ b/src/xrpld/rpc/handlers/admin/server_control/Stop.cpp @@ -3,6 +3,7 @@ #include #include +#include namespace xrpl { @@ -13,6 +14,7 @@ struct JsonContext; json::Value doStop(RPC::JsonContext& context) { + TRACE_FUNC(); context.app.signalStop("RPC"); return RPC::makeObjectValue(systemName() + " server stopping"); } diff --git a/src/xrpld/rpc/handlers/admin/signing/ChannelAuthorize.cpp b/src/xrpld/rpc/handlers/admin/signing/ChannelAuthorize.cpp index d9b6cfb2eb..ea71771e86 100644 --- a/src/xrpld/rpc/handlers/admin/signing/ChannelAuthorize.cpp +++ b/src/xrpld/rpc/handlers/admin/signing/ChannelAuthorize.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,7 @@ namespace xrpl { json::Value doChannelAuthorize(RPC::JsonContext& context) { + TRACE_FUNC(); if (context.role != Role::ADMIN && !context.app.config().canSign()) { return RPC::makeError(RpcNotSupported, "Signing is not supported by this server."); diff --git a/src/xrpld/rpc/handlers/admin/signing/Sign.cpp b/src/xrpld/rpc/handlers/admin/signing/Sign.cpp index 6953dfd3d8..d6dfba5bf5 100644 --- a/src/xrpld/rpc/handlers/admin/signing/Sign.cpp +++ b/src/xrpld/rpc/handlers/admin/signing/Sign.cpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace xrpl { @@ -17,6 +18,7 @@ namespace xrpl { json::Value doSign(RPC::JsonContext& context) { + TRACE_FUNC(); if (context.role != Role::ADMIN && !context.app.config().canSign()) { return RPC::makeError(RpcNotSupported, "Signing is not supported by this server."); diff --git a/src/xrpld/rpc/handlers/admin/signing/SignFor.cpp b/src/xrpld/rpc/handlers/admin/signing/SignFor.cpp index 102cea08b4..7e3e623faa 100644 --- a/src/xrpld/rpc/handlers/admin/signing/SignFor.cpp +++ b/src/xrpld/rpc/handlers/admin/signing/SignFor.cpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace xrpl { @@ -18,6 +19,7 @@ namespace xrpl { json::Value doSignFor(RPC::JsonContext& context) { + TRACE_FUNC(); if (context.role != Role::ADMIN && !context.app.config().canSign()) { return RPC::makeError(RpcNotSupported, "Signing is not supported by this server."); diff --git a/src/xrpld/rpc/handlers/admin/status/ConsensusInfo.cpp b/src/xrpld/rpc/handlers/admin/status/ConsensusInfo.cpp index d55d4bb206..b7dc568eb8 100644 --- a/src/xrpld/rpc/handlers/admin/status/ConsensusInfo.cpp +++ b/src/xrpld/rpc/handlers/admin/status/ConsensusInfo.cpp @@ -3,12 +3,14 @@ #include #include #include +#include namespace xrpl { json::Value doConsensusInfo(RPC::JsonContext& context) { + TRACE_FUNC(); json::Value ret(json::ObjectValue); ret[jss::info] = context.netOps.getConsensusInfo(); diff --git a/src/xrpld/rpc/handlers/admin/status/FetchInfo.cpp b/src/xrpld/rpc/handlers/admin/status/FetchInfo.cpp index 5cf05ee00f..a82eb400bf 100644 --- a/src/xrpld/rpc/handlers/admin/status/FetchInfo.cpp +++ b/src/xrpld/rpc/handlers/admin/status/FetchInfo.cpp @@ -3,12 +3,14 @@ #include #include #include +#include namespace xrpl { json::Value doFetchInfo(RPC::JsonContext& context) { + TRACE_FUNC(); json::Value ret(json::ObjectValue); if (context.params.isMember(jss::clear) && context.params[jss::clear].asBool()) diff --git a/src/xrpld/rpc/handlers/admin/status/GetCounts.cpp b/src/xrpld/rpc/handlers/admin/status/GetCounts.cpp index 83a2aa2127..84364d7c46 100644 --- a/src/xrpld/rpc/handlers/admin/status/GetCounts.cpp +++ b/src/xrpld/rpc/handlers/admin/status/GetCounts.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -24,6 +25,7 @@ textTime( char const* unitName, std::chrono::seconds unitVal) { + TRACE_FUNC(); auto i = seconds.time_since_epoch() / unitVal; if (i == 0) @@ -45,6 +47,7 @@ textTime( json::Value getCountsJson(Application& app, int minObjectCount) { + TRACE_FUNC(); auto objectCounts = CountedObjects::getInstance().getCounts(minObjectCount); json::Value ret(json::ObjectValue); @@ -113,6 +116,7 @@ getCountsJson(Application& app, int minObjectCount) json::Value doGetCounts(RPC::JsonContext& context) { + TRACE_FUNC(); int minCount = 10; if (context.params.isMember(jss::min_count)) diff --git a/src/xrpld/rpc/handlers/admin/status/Print.cpp b/src/xrpld/rpc/handlers/admin/status/Print.cpp index 99fd01c9f4..1bde1de9b4 100644 --- a/src/xrpld/rpc/handlers/admin/status/Print.cpp +++ b/src/xrpld/rpc/handlers/admin/status/Print.cpp @@ -4,12 +4,14 @@ #include #include #include +#include namespace xrpl { json::Value doPrint(RPC::JsonContext& context) { + TRACE_FUNC(); JsonPropertyStream stream; if (context.params.isObject() && context.params[jss::params].isArray() && context.params[jss::params][0u].isString()) diff --git a/src/xrpld/rpc/handlers/admin/status/ValidatorInfo.cpp b/src/xrpld/rpc/handlers/admin/status/ValidatorInfo.cpp index efe1529ccb..0a65a562f7 100644 --- a/src/xrpld/rpc/handlers/admin/status/ValidatorInfo.cpp +++ b/src/xrpld/rpc/handlers/admin/status/ValidatorInfo.cpp @@ -9,11 +9,13 @@ #include #include #include +#include namespace xrpl { json::Value doValidatorInfo(RPC::JsonContext& context) { + TRACE_FUNC(); // return error if not configured as validator auto const validationPK = context.app.getValidationPublicKey(); if (!validationPK) diff --git a/src/xrpld/rpc/handlers/admin/status/ValidatorListSites.cpp b/src/xrpld/rpc/handlers/admin/status/ValidatorListSites.cpp index 7497105c50..4d1b190c83 100644 --- a/src/xrpld/rpc/handlers/admin/status/ValidatorListSites.cpp +++ b/src/xrpld/rpc/handlers/admin/status/ValidatorListSites.cpp @@ -3,12 +3,14 @@ #include #include +#include namespace xrpl { json::Value doValidatorListSites(RPC::JsonContext& context) { + TRACE_FUNC(); return context.app.getValidatorSites().getJson(); } diff --git a/src/xrpld/rpc/handlers/admin/status/Validators.cpp b/src/xrpld/rpc/handlers/admin/status/Validators.cpp index 48e4466861..da0b1d7663 100644 --- a/src/xrpld/rpc/handlers/admin/status/Validators.cpp +++ b/src/xrpld/rpc/handlers/admin/status/Validators.cpp @@ -3,12 +3,14 @@ #include #include +#include namespace xrpl { json::Value doValidators(RPC::JsonContext& context) { + TRACE_FUNC(); return context.app.getValidators().getJson(); } diff --git a/src/xrpld/rpc/handlers/ledger/Ledger.cpp b/src/xrpld/rpc/handlers/ledger/Ledger.cpp index 2b6116da27..bd874f602a 100644 --- a/src/xrpld/rpc/handlers/ledger/Ledger.cpp +++ b/src/xrpld/rpc/handlers/ledger/Ledger.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -42,6 +43,7 @@ LedgerHandler::LedgerHandler(JsonContext& context) : context_(context) Status LedgerHandler::check() { + TRACE_FUNC(); auto const& params = context_.params; auto getBool = [&](json::StaticString const& field) -> Expected { @@ -125,6 +127,7 @@ LedgerHandler::check() void LedgerHandler::writeResult(json::Value& value) { + TRACE_FUNC(); if (ledger_) { copyFrom(value, result_); @@ -164,6 +167,7 @@ LedgerHandler::writeResult(json::Value& value) std::pair doLedgerGrpc(RPC::GRPCContext& context) { + TRACE_FUNC(); auto begin = std::chrono::system_clock::now(); org::xrpl::rpc::v1::GetLedgerRequest const& request = context.params; org::xrpl::rpc::v1::GetLedgerResponse response; diff --git a/src/xrpld/rpc/handlers/ledger/LedgerClosed.cpp b/src/xrpld/rpc/handlers/ledger/LedgerClosed.cpp index 7ea314292f..1eb0420313 100644 --- a/src/xrpld/rpc/handlers/ledger/LedgerClosed.cpp +++ b/src/xrpld/rpc/handlers/ledger/LedgerClosed.cpp @@ -6,12 +6,14 @@ #include #include #include +#include namespace xrpl { json::Value doLedgerClosed(RPC::JsonContext& context) { + TRACE_FUNC(); auto ledger = context.ledgerMaster.getClosedLedger(); XRPL_ASSERT(ledger, "xrpl::doLedgerClosed : non-null closed ledger"); diff --git a/src/xrpld/rpc/handlers/ledger/LedgerCurrent.cpp b/src/xrpld/rpc/handlers/ledger/LedgerCurrent.cpp index 1d05774163..87a6c6ab89 100644 --- a/src/xrpld/rpc/handlers/ledger/LedgerCurrent.cpp +++ b/src/xrpld/rpc/handlers/ledger/LedgerCurrent.cpp @@ -4,12 +4,14 @@ #include #include #include +#include namespace xrpl { json::Value doLedgerCurrent(RPC::JsonContext& context) { + TRACE_FUNC(); json::Value jvResult; jvResult[jss::ledger_current_index] = context.ledgerMaster.getCurrentLedgerIndex(); return jvResult; diff --git a/src/xrpld/rpc/handlers/ledger/LedgerData.cpp b/src/xrpld/rpc/handlers/ledger/LedgerData.cpp index f450c88dab..e8b2180e81 100644 --- a/src/xrpld/rpc/handlers/ledger/LedgerData.cpp +++ b/src/xrpld/rpc/handlers/ledger/LedgerData.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -38,6 +39,7 @@ namespace xrpl { json::Value doLedgerData(RPC::JsonContext& context) { + TRACE_FUNC(); std::shared_ptr lpLedger; auto const& params = context.params; @@ -133,6 +135,7 @@ doLedgerData(RPC::JsonContext& context) std::pair doLedgerDataGrpc(RPC::GRPCContext& context) { + TRACE_FUNC(); org::xrpl::rpc::v1::GetLedgerDataRequest const& request = context.params; org::xrpl::rpc::v1::GetLedgerDataResponse response; grpc::Status const status = grpc::Status::OK; diff --git a/src/xrpld/rpc/handlers/ledger/LedgerDiff.cpp b/src/xrpld/rpc/handlers/ledger/LedgerDiff.cpp index f1a9253de2..2ebd10c1b4 100644 --- a/src/xrpld/rpc/handlers/ledger/LedgerDiff.cpp +++ b/src/xrpld/rpc/handlers/ledger/LedgerDiff.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -17,6 +18,7 @@ namespace xrpl { std::pair doLedgerDiffGrpc(RPC::GRPCContext& context) { + TRACE_FUNC(); org::xrpl::rpc::v1::GetLedgerDiffRequest const& request = context.params; org::xrpl::rpc::v1::GetLedgerDiffResponse response; grpc::Status const status = grpc::Status::OK; diff --git a/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp b/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp index a5fcee7a5e..91099b471b 100644 --- a/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp +++ b/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -52,6 +53,7 @@ parseFixed( static FunctionType fixed(Keylet const& keylet) { + TRACE_FUNC(); return [keylet]( json::Value const& params, json::StaticString const fieldName, @@ -66,6 +68,7 @@ parseObjectID( json::StaticString const fieldName, std::string const& expectedType = "hex string or object") { + TRACE_FUNC(); if (auto const uNodeIndex = LedgerEntryHelpers::parse(params)) { return *uNodeIndex; @@ -76,6 +79,7 @@ parseObjectID( static Expected parseIndex(json::Value const& params, json::StaticString const fieldName, unsigned const apiVersion) { + TRACE_FUNC(); if (apiVersion > 2u && params.isString()) { std::string const index = params.asString(); @@ -101,6 +105,7 @@ parseAccountRoot( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (auto const account = LedgerEntryHelpers::parse(params)) { return keylet::account(*account).key; @@ -117,6 +122,7 @@ parseAMM( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName); @@ -145,6 +151,7 @@ parseBridge( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isMember(jss::bridge)) { return Unexpected(LedgerEntryHelpers::missingFieldError(jss::bridge)); @@ -178,6 +185,7 @@ parseCheck( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); return parseObjectID(params, fieldName, "hex string"); } @@ -187,6 +195,7 @@ parseCredential( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!cred.isObject()) { return parseObjectID(cred, fieldName); @@ -216,6 +225,7 @@ parseDelegate( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName); @@ -237,6 +247,7 @@ parseDelegate( static Expected parseAuthorizeCredentials(json::Value const& jv) { + TRACE_FUNC(); if (!jv.isArray()) { return LedgerEntryHelpers::invalidFieldError( @@ -305,6 +316,7 @@ parseDepositPreauth( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!dp.isObject()) { return parseObjectID(dp, fieldName); @@ -356,6 +368,7 @@ parseDID( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); auto const account = LedgerEntryHelpers::parse(params); if (!account) { @@ -371,6 +384,7 @@ parseDirectoryNode( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName); @@ -422,6 +436,7 @@ parseEscrow( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName); @@ -446,6 +461,7 @@ parseFixed( json::StaticString const& fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isBool()) { return parseObjectID(params, fieldName, "hex string"); @@ -464,6 +480,7 @@ parseLedgerHashes( json::StaticString const fieldName, unsigned const apiVersion) { + TRACE_FUNC(); if (params.isUInt() || params.isInt()) { // If the index doesn't parse as a UInt, throw @@ -484,6 +501,7 @@ parseLoanBroker( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName, "hex string"); @@ -505,6 +523,7 @@ parseLoan( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName, "hex string"); @@ -527,6 +546,7 @@ parseMPToken( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName); @@ -551,6 +571,7 @@ parseMPTokenIssuance( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); auto const mptIssuanceID = LedgerEntryHelpers::parse(params); if (!mptIssuanceID) { @@ -567,6 +588,7 @@ parseNFTokenOffer( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); return parseObjectID(params, fieldName, "hex string"); } @@ -576,6 +598,7 @@ parseNFTokenPage( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); return parseObjectID(params, fieldName, "hex string"); } @@ -587,6 +610,7 @@ parseOffer( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName); @@ -609,6 +633,7 @@ parseOracle( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName); @@ -632,6 +657,7 @@ parsePayChannel( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); return parseObjectID(params, fieldName, "hex string"); } @@ -641,6 +667,7 @@ parsePermissionedDomain( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (pd.isString()) { return parseObjectID(pd, fieldName); @@ -670,6 +697,7 @@ parseRippleState( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); Currency uCurrency; if (!jvRippleState.isObject()) @@ -719,6 +747,7 @@ parseSignerList( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); return parseObjectID(params, fieldName, "hex string"); } @@ -728,6 +757,7 @@ parseTicket( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName); @@ -751,6 +781,7 @@ parseVault( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!params.isObject()) { return parseObjectID(params, fieldName); @@ -773,6 +804,7 @@ parseXChainOwnedClaimID( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!claimId.isObject()) { return parseObjectID(claimId, fieldName); @@ -799,6 +831,7 @@ parseXChainOwnedCreateAccountClaimID( json::StaticString const fieldName, [[maybe_unused]] unsigned const apiVersion) { + TRACE_FUNC(); if (!claimId.isObject()) { return parseObjectID(claimId, fieldName); @@ -836,6 +869,7 @@ struct LedgerEntry json::Value doLedgerEntry(RPC::JsonContext& context) { + TRACE_FUNC(); static auto kLEDGER_ENTRY_PARSERS = std::to_array({ #pragma push_macro("LEDGER_ENTRY") #undef LEDGER_ENTRY @@ -979,6 +1013,7 @@ doLedgerEntry(RPC::JsonContext& context) std::pair doLedgerEntryGrpc(RPC::GRPCContext& context) { + TRACE_FUNC(); org::xrpl::rpc::v1::GetLedgerEntryRequest const& request = context.params; org::xrpl::rpc::v1::GetLedgerEntryResponse response; grpc::Status const status = grpc::Status::OK; diff --git a/src/xrpld/rpc/handlers/ledger/LedgerHeader.cpp b/src/xrpld/rpc/handlers/ledger/LedgerHeader.cpp index e2cb80615b..3852d7b8db 100644 --- a/src/xrpld/rpc/handlers/ledger/LedgerHeader.cpp +++ b/src/xrpld/rpc/handlers/ledger/LedgerHeader.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -20,6 +21,7 @@ namespace xrpl { json::Value doLedgerHeader(RPC::JsonContext& context) { + TRACE_FUNC(); std::shared_ptr lpLedger; auto jvResult = RPC::lookupLedger(lpLedger, context); diff --git a/src/xrpld/rpc/handlers/orderbook/AMMInfo.cpp b/src/xrpld/rpc/handlers/orderbook/AMMInfo.cpp index 73dfb178bc..8467dd1e4f 100644 --- a/src/xrpld/rpc/handlers/orderbook/AMMInfo.cpp +++ b/src/xrpld/rpc/handlers/orderbook/AMMInfo.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -38,6 +39,7 @@ namespace xrpl { Expected getAsset(json::Value const& v, beast::Journal j) { + TRACE_FUNC(); try { return assetFromJson(v); @@ -52,6 +54,7 @@ getAsset(json::Value const& v, beast::Journal j) std::string toIso8601(NetClock::time_point tp) { + TRACE_FUNC(); // 2000-01-01 00:00:00 UTC is 946684800s from 1970-01-01 00:00:00 UTC using namespace std::chrono; return date::format( @@ -63,6 +66,7 @@ toIso8601(NetClock::time_point tp) json::Value doAMMInfo(RPC::JsonContext& context) { + TRACE_FUNC(); auto const& params(context.params); json::Value result; diff --git a/src/xrpld/rpc/handlers/orderbook/BookChanges.cpp b/src/xrpld/rpc/handlers/orderbook/BookChanges.cpp index 947a257916..c929b6aaab 100644 --- a/src/xrpld/rpc/handlers/orderbook/BookChanges.cpp +++ b/src/xrpld/rpc/handlers/orderbook/BookChanges.cpp @@ -4,6 +4,7 @@ #include #include +#include #include @@ -12,6 +13,7 @@ namespace xrpl { json::Value doBookChanges(RPC::JsonContext& context) { + TRACE_FUNC(); std::shared_ptr ledger; json::Value result = RPC::lookupLedger(ledger, context); diff --git a/src/xrpld/rpc/handlers/orderbook/BookOffers.cpp b/src/xrpld/rpc/handlers/orderbook/BookOffers.cpp index 2c9c53620c..bdced1f858 100644 --- a/src/xrpld/rpc/handlers/orderbook/BookOffers.cpp +++ b/src/xrpld/rpc/handlers/orderbook/BookOffers.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,7 @@ namespace xrpl { std::optional validateTakerJSON(json::Value const& taker, json::StaticString const& name) { + TRACE_FUNC(); if (!taker.isMember(jss::currency) && !taker.isMember(jss::mpt_issuance_id)) { return RPC::missingFieldError((boost::format("%s.currency") % name.cStr()).str()); @@ -58,6 +60,7 @@ parseTakerAssetJSON( json::StaticString const& name, beast::Journal j) { + TRACE_FUNC(); auto const assetError = [&]() { if (name == jss::taker_pays) return RpcSrcCurMalformed; @@ -99,6 +102,7 @@ parseTakerIssuerJSON( json::StaticString const& name, beast::Journal j) { + TRACE_FUNC(); auto const issuerError = [&]() { if (name == jss::taker_pays) return RpcSrcIsrMalformed; @@ -164,6 +168,7 @@ parseTakerIssuerJSON( json::Value doBookOffers(RPC::JsonContext& context) { + TRACE_FUNC(); // VFALCO TODO Here is a terrible place for this kind of business // logic. It needs to be moved elsewhere and documented, // and encapsulated into a function. diff --git a/src/xrpld/rpc/handlers/orderbook/GetAggregatePrice.cpp b/src/xrpld/rpc/handlers/orderbook/GetAggregatePrice.cpp index 1d34ca21b2..06d4052092 100644 --- a/src/xrpld/rpc/handlers/orderbook/GetAggregatePrice.cpp +++ b/src/xrpld/rpc/handlers/orderbook/GetAggregatePrice.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -51,6 +52,7 @@ iteratePriceData( std::shared_ptr const& sle, std::function const& f) { + TRACE_FUNC(); using Meta = std::shared_ptr; constexpr std::uint8_t kMAX_HISTORY = 3; bool isNew = false; @@ -122,6 +124,7 @@ iteratePriceData( static std::tuple getStats(Prices::right_const_iterator const& begin, Prices::right_const_iterator const& end) { + TRACE_FUNC(); STAmount avg{noIssue(), 0, 0}; Number sd{0}; std::uint16_t const size = std::distance(begin, end); diff --git a/src/xrpld/rpc/handlers/orderbook/NFTBuyOffers.cpp b/src/xrpld/rpc/handlers/orderbook/NFTBuyOffers.cpp index 88e4392dad..b3f1c8663f 100644 --- a/src/xrpld/rpc/handlers/orderbook/NFTBuyOffers.cpp +++ b/src/xrpld/rpc/handlers/orderbook/NFTBuyOffers.cpp @@ -6,12 +6,14 @@ #include #include #include +#include namespace xrpl { json::Value doNFTBuyOffers(RPC::JsonContext& context) { + TRACE_FUNC(); if (!context.params.isMember(jss::nft_id)) return RPC::missingFieldError(jss::nft_id); diff --git a/src/xrpld/rpc/handlers/orderbook/NFTSellOffers.cpp b/src/xrpld/rpc/handlers/orderbook/NFTSellOffers.cpp index 309df93605..8cd98e7fbc 100644 --- a/src/xrpld/rpc/handlers/orderbook/NFTSellOffers.cpp +++ b/src/xrpld/rpc/handlers/orderbook/NFTSellOffers.cpp @@ -6,12 +6,14 @@ #include #include #include +#include namespace xrpl { json::Value doNFTSellOffers(RPC::JsonContext& context) { + TRACE_FUNC(); if (!context.params.isMember(jss::nft_id)) return RPC::missingFieldError(jss::nft_id); diff --git a/src/xrpld/rpc/handlers/orderbook/PathFind.cpp b/src/xrpld/rpc/handlers/orderbook/PathFind.cpp index da338dfcc8..c44db6c03f 100644 --- a/src/xrpld/rpc/handlers/orderbook/PathFind.cpp +++ b/src/xrpld/rpc/handlers/orderbook/PathFind.cpp @@ -9,12 +9,14 @@ #include #include #include +#include namespace xrpl { json::Value doPathFind(RPC::JsonContext& context) { + TRACE_FUNC(); if (context.app.config().PATH_SEARCH_MAX == 0) return rpcError(RpcNotSupported); diff --git a/src/xrpld/rpc/handlers/orderbook/RipplePathFind.cpp b/src/xrpld/rpc/handlers/orderbook/RipplePathFind.cpp index 316f26fa32..16a297e3b6 100644 --- a/src/xrpld/rpc/handlers/orderbook/RipplePathFind.cpp +++ b/src/xrpld/rpc/handlers/orderbook/RipplePathFind.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,7 @@ namespace xrpl { json::Value doRipplePathFind(RPC::JsonContext& context) { + TRACE_FUNC(); if (context.app.config().PATH_SEARCH_MAX == 0) return rpcError(RpcNotSupported); diff --git a/src/xrpld/rpc/handlers/server_info/Feature.cpp b/src/xrpld/rpc/handlers/server_info/Feature.cpp index 4de07297d4..6fefbdaa73 100644 --- a/src/xrpld/rpc/handlers/server_info/Feature.cpp +++ b/src/xrpld/rpc/handlers/server_info/Feature.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace xrpl { @@ -20,6 +21,7 @@ namespace xrpl { json::Value doFeature(RPC::JsonContext& context) { + TRACE_FUNC(); if (context.params.isMember(jss::feature)) { // ensure that the `feature` param is a string diff --git a/src/xrpld/rpc/handlers/server_info/Fee.cpp b/src/xrpld/rpc/handlers/server_info/Fee.cpp index a3847d743a..d6256411f0 100644 --- a/src/xrpld/rpc/handlers/server_info/Fee.cpp +++ b/src/xrpld/rpc/handlers/server_info/Fee.cpp @@ -5,11 +5,13 @@ #include #include #include +#include namespace xrpl { json::Value doFee(RPC::JsonContext& context) { + TRACE_FUNC(); auto result = context.app.getTxQ().doRPC(context.app); if (result.type() == json::ObjectValue) return result; diff --git a/src/xrpld/rpc/handlers/server_info/Manifest.cpp b/src/xrpld/rpc/handlers/server_info/Manifest.cpp index cb1771750b..3dbf74ca6f 100644 --- a/src/xrpld/rpc/handlers/server_info/Manifest.cpp +++ b/src/xrpld/rpc/handlers/server_info/Manifest.cpp @@ -9,11 +9,13 @@ #include #include #include +#include namespace xrpl { json::Value doManifest(RPC::JsonContext& context) { + TRACE_FUNC(); auto& params = context.params; if (!params.isMember(jss::public_key)) diff --git a/src/xrpld/rpc/handlers/server_info/ServerDefinitions.cpp b/src/xrpld/rpc/handlers/server_info/ServerDefinitions.cpp index ca887bb0c8..542885d9f9 100644 --- a/src/xrpld/rpc/handlers/server_info/ServerDefinitions.cpp +++ b/src/xrpld/rpc/handlers/server_info/ServerDefinitions.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -45,12 +46,14 @@ public: [[nodiscard]] bool hashMatches(uint256 hash) const { + TRACE_FUNC(); return defsHash_ == hash; } [[nodiscard]] json::Value const& get() const { + TRACE_FUNC(); return defs_; } }; @@ -58,6 +61,7 @@ public: std::string ServerDefinitions::translate(std::string const& inp) { + TRACE_FUNC(); auto replace = [&](std::string_view oldStr, std::string_view newStr) -> std::string { std::string out = inp; boost::replace_all(out, oldStr, newStr); @@ -374,6 +378,7 @@ ServerDefinitions::ServerDefinitions() : defs_{json::ObjectValue} ServerDefinitions const& getDefinitions() { + TRACE_FUNC(); static ServerDefinitions const kDEFS{}; return kDEFS; } @@ -383,12 +388,14 @@ getDefinitions() json::Value const& getServerDefinitionsJson() { + TRACE_FUNC(); return detail::getDefinitions().get(); } json::Value doServerDefinitions(RPC::JsonContext& context) { + TRACE_FUNC(); auto& params = context.params; uint256 hash; diff --git a/src/xrpld/rpc/handlers/server_info/ServerInfo.cpp b/src/xrpld/rpc/handlers/server_info/ServerInfo.cpp index af401cd22f..efa0491b5d 100644 --- a/src/xrpld/rpc/handlers/server_info/ServerInfo.cpp +++ b/src/xrpld/rpc/handlers/server_info/ServerInfo.cpp @@ -5,12 +5,14 @@ #include #include #include +#include namespace xrpl { json::Value doServerInfo(RPC::JsonContext& context) { + TRACE_FUNC(); json::Value ret(json::ObjectValue); ret[jss::info] = context.netOps.getServerInfo( diff --git a/src/xrpld/rpc/handlers/server_info/ServerState.cpp b/src/xrpld/rpc/handlers/server_info/ServerState.cpp index a3730ca703..bf6c3a061c 100644 --- a/src/xrpld/rpc/handlers/server_info/ServerState.cpp +++ b/src/xrpld/rpc/handlers/server_info/ServerState.cpp @@ -4,12 +4,14 @@ #include #include #include +#include namespace xrpl { json::Value doServerState(RPC::JsonContext& context) { + TRACE_FUNC(); json::Value ret(json::ObjectValue); ret[jss::state] = context.netOps.getServerInfo( diff --git a/src/xrpld/rpc/handlers/subscribe/Subscribe.cpp b/src/xrpld/rpc/handlers/subscribe/Subscribe.cpp index dee88533af..ccb1aca083 100644 --- a/src/xrpld/rpc/handlers/subscribe/Subscribe.cpp +++ b/src/xrpld/rpc/handlers/subscribe/Subscribe.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ namespace xrpl { json::Value doSubscribe(RPC::JsonContext& context) { + TRACE_FUNC(); InfoSub::pointer ispSub; json::Value jvResult(json::ObjectValue); diff --git a/src/xrpld/rpc/handlers/subscribe/Unsubscribe.cpp b/src/xrpld/rpc/handlers/subscribe/Unsubscribe.cpp index 580f213ec4..5412ea66e4 100644 --- a/src/xrpld/rpc/handlers/subscribe/Unsubscribe.cpp +++ b/src/xrpld/rpc/handlers/subscribe/Unsubscribe.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include @@ -20,6 +21,7 @@ namespace xrpl { json::Value doUnsubscribe(RPC::JsonContext& context) { + TRACE_FUNC(); InfoSub::pointer ispSub; json::Value jvResult(json::ObjectValue); bool removeUrl{false}; diff --git a/src/xrpld/rpc/handlers/transaction/Simulate.cpp b/src/xrpld/rpc/handlers/transaction/Simulate.cpp index a119ea94f6..dd9da068ad 100644 --- a/src/xrpld/rpc/handlers/transaction/Simulate.cpp +++ b/src/xrpld/rpc/handlers/transaction/Simulate.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,7 @@ namespace xrpl { static Expected getAutofillSequence(json::Value const& txJson, RPC::JsonContext& context) { + TRACE_FUNC(); // autofill Sequence bool const hasTicketSeq = txJson.isMember(sfTicketSequence.jsonName); auto const& accountStr = txJson[jss::Account]; @@ -78,6 +80,7 @@ getAutofillSequence(json::Value const& txJson, RPC::JsonContext& context) static std::optional autofillSignature(json::Value& sigObject) { + TRACE_FUNC(); if (!sigObject.isMember(jss::SigningPubKey)) { // autofill SigningPubKey @@ -131,6 +134,7 @@ autofillSignature(json::Value& sigObject) static std::optional autofillTx(json::Value& txJson, RPC::JsonContext& context) { + TRACE_FUNC(); if (!txJson.isMember(jss::Fee)) { // autofill Fee @@ -172,6 +176,7 @@ autofillTx(json::Value& txJson, RPC::JsonContext& context) static json::Value getTxJsonFromParams(json::Value const& params) { + TRACE_FUNC(); json::Value txJson; if (params.isMember(jss::tx_blob)) @@ -231,6 +236,7 @@ getTxJsonFromParams(json::Value const& params) static json::Value simulateTxn(RPC::JsonContext& context, std::shared_ptr transaction) { + TRACE_FUNC(); json::Value jvResult; // Process the transaction OpenView view = *context.app.getOpenLedger().current(); @@ -306,6 +312,7 @@ simulateTxn(RPC::JsonContext& context, std::shared_ptr transaction) json::Value doSimulate(RPC::JsonContext& context) { + TRACE_FUNC(); context.loadType = Resource::kFEE_MEDIUM_BURDEN_RPC; json::Value txJson; // the tx as a JSON diff --git a/src/xrpld/rpc/handlers/transaction/Submit.cpp b/src/xrpld/rpc/handlers/transaction/Submit.cpp index d3ce5c3fc0..99e2287598 100644 --- a/src/xrpld/rpc/handlers/transaction/Submit.cpp +++ b/src/xrpld/rpc/handlers/transaction/Submit.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ namespace xrpl { static Expected getFailHard(RPC::JsonContext const& context) { + TRACE_FUNC(); if (context.params.isMember(jss::fail_hard) && !context.params[jss::fail_hard].isBool()) { return Unexpected(RPC::expectedFieldError(jss::fail_hard, "boolean")); @@ -44,6 +46,7 @@ getFailHard(RPC::JsonContext const& context) json::Value doSubmit(RPC::JsonContext& context) { + TRACE_FUNC(); context.loadType = Resource::kFEE_MEDIUM_BURDEN_RPC; if (!context.params.isMember(jss::tx_blob)) diff --git a/src/xrpld/rpc/handlers/transaction/SubmitMultiSigned.cpp b/src/xrpld/rpc/handlers/transaction/SubmitMultiSigned.cpp index 80ec0c6702..890a524a16 100644 --- a/src/xrpld/rpc/handlers/transaction/SubmitMultiSigned.cpp +++ b/src/xrpld/rpc/handlers/transaction/SubmitMultiSigned.cpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace xrpl { @@ -15,6 +16,7 @@ namespace xrpl { json::Value doSubmitMultiSigned(RPC::JsonContext& context) { + TRACE_FUNC(); context.loadType = Resource::kFEE_HEAVY_BURDEN_RPC; auto const failHard = context.params[jss::fail_hard].asBool(); auto const failType = NetworkOPs::doFailHard(failHard); diff --git a/src/xrpld/rpc/handlers/transaction/TransactionEntry.cpp b/src/xrpld/rpc/handlers/transaction/TransactionEntry.cpp index c951053c51..763d1c163d 100644 --- a/src/xrpld/rpc/handlers/transaction/TransactionEntry.cpp +++ b/src/xrpld/rpc/handlers/transaction/TransactionEntry.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -23,6 +24,7 @@ namespace xrpl { json::Value doTransactionEntry(RPC::JsonContext& context) { + TRACE_FUNC(); std::shared_ptr lpLedger; json::Value jvResult = RPC::lookupLedger(lpLedger, context); diff --git a/src/xrpld/rpc/handlers/transaction/Tx.cpp b/src/xrpld/rpc/handlers/transaction/Tx.cpp index cddda6d2c2..dcdda5809b 100644 --- a/src/xrpld/rpc/handlers/transaction/Tx.cpp +++ b/src/xrpld/rpc/handlers/transaction/Tx.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,7 @@ namespace xrpl { static bool isValidated(LedgerMaster& ledgerMaster, std::uint32_t seq, uint256 const& hash) { + TRACE_FUNC(); if (!ledgerMaster.haveLedger(seq)) return false; @@ -71,6 +73,7 @@ struct TxArgs std::pair doTxHelp(RPC::Context& context, TxArgs args) { + TRACE_FUNC(); TxResult result; ClosedInterval range; @@ -182,6 +185,7 @@ populateJsonResponse( TxArgs const& args, RPC::JsonContext const& context) { + TRACE_FUNC(); json::Value response; RPC::Status const& error = res.second; TxResult const& result = res.first; @@ -268,6 +272,7 @@ populateJsonResponse( json::Value doTxJson(RPC::JsonContext& context) { + TRACE_FUNC(); if (!context.app.config().useTxTables()) return rpcError(RpcNotEnabled); diff --git a/src/xrpld/rpc/handlers/transaction/TxHistory.cpp b/src/xrpld/rpc/handlers/transaction/TxHistory.cpp index b7333d0115..4738a6acf9 100644 --- a/src/xrpld/rpc/handlers/transaction/TxHistory.cpp +++ b/src/xrpld/rpc/handlers/transaction/TxHistory.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace xrpl { @@ -18,6 +19,7 @@ namespace xrpl { json::Value doTxHistory(RPC::JsonContext& context) { + TRACE_FUNC(); if (!context.app.config().useTxTables()) return rpcError(RpcNotEnabled); diff --git a/src/xrpld/rpc/handlers/transaction/TxReduceRelay.cpp b/src/xrpld/rpc/handlers/transaction/TxReduceRelay.cpp index edc4eff057..b64a96a535 100644 --- a/src/xrpld/rpc/handlers/transaction/TxReduceRelay.cpp +++ b/src/xrpld/rpc/handlers/transaction/TxReduceRelay.cpp @@ -3,12 +3,14 @@ #include #include +#include namespace xrpl { json::Value doTxReduceRelay(RPC::JsonContext& context) { + TRACE_FUNC(); return context.app.getOverlay().txMetrics(); } diff --git a/src/xrpld/rpc/handlers/utility/Ping.cpp b/src/xrpld/rpc/handlers/utility/Ping.cpp index 428b16ddd4..b2725d395e 100644 --- a/src/xrpld/rpc/handlers/utility/Ping.cpp +++ b/src/xrpld/rpc/handlers/utility/Ping.cpp @@ -3,6 +3,7 @@ #include #include +#include namespace xrpl { @@ -13,6 +14,7 @@ struct JsonContext; json::Value doPing(RPC::JsonContext& context) { + TRACE_FUNC(); json::Value ret(json::ObjectValue); switch (context.role) { diff --git a/src/xrpld/rpc/handlers/utility/Random.cpp b/src/xrpld/rpc/handlers/utility/Random.cpp index 56df442cf1..5eb658ebf9 100644 --- a/src/xrpld/rpc/handlers/utility/Random.cpp +++ b/src/xrpld/rpc/handlers/utility/Random.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -21,6 +22,7 @@ struct JsonContext; json::Value doRandom(RPC::JsonContext& context) { + TRACE_FUNC(); // TODO(tom): the try/catch is almost certainly redundant, we catch at the // top level too. try diff --git a/src/xrpld/rpc/json_body.h b/src/xrpld/rpc/json_body.h index 9f881cacbc..494366e3a4 100644 --- a/src/xrpld/rpc/json_body.h +++ b/src/xrpld/rpc/json_body.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -29,6 +30,7 @@ struct JsonBody template explicit reader(boost::beast::http::message const& m) { + TRACE_FUNC(); stream(m.body, [&](void const* data, std::size_t n) { buffer_.commit( boost::asio::buffer_copy(buffer_.prepare(n), boost::asio::buffer(data, n))); @@ -45,6 +47,7 @@ struct JsonBody boost::optional> get(boost::beast::error_code& ec) { + TRACE_FUNC(); return {{buffer_.data(), false}}; } @@ -72,6 +75,7 @@ struct JsonBody static void init(boost::beast::error_code& ec) { + TRACE_FUNC(); ec.assign(0, ec.category()); } @@ -80,6 +84,7 @@ struct JsonBody boost::optional> get(boost::beast::error_code& ec) { + TRACE_FUNC(); ec.assign(0, ec.category()); return {{const_buffers_type{body_string_.data(), body_string_.size()}, false}}; } diff --git a/src/xrpld/shamap/NodeFamily.cpp b/src/xrpld/shamap/NodeFamily.cpp index aab36b7ca3..84cf0c5bf6 100644 --- a/src/xrpld/shamap/NodeFamily.cpp +++ b/src/xrpld/shamap/NodeFamily.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,7 @@ NodeFamily::NodeFamily(Application& app, CollectorManager& cm) void NodeFamily::sweep() { + TRACE_FUNC(); fbCache_->sweep(); tnCache_->sweep(); } @@ -52,6 +54,7 @@ NodeFamily::sweep() void NodeFamily::reset() { + TRACE_FUNC(); { std::scoped_lock const lock(maxSeqMutex_); maxSeq_ = 0; @@ -64,6 +67,7 @@ NodeFamily::reset() void NodeFamily::missingNodeAcquireBySeq(std::uint32_t seq, uint256 const& nodeHash) { + TRACE_FUNC(); JLOG(j_.error()) << "Missing node in " << seq; std::unique_lock lock(maxSeqMutex_); if (maxSeq_ == 0) @@ -93,6 +97,7 @@ NodeFamily::missingNodeAcquireBySeq(std::uint32_t seq, uint256 const& nodeHash) void NodeFamily::acquire(uint256 const& hash, std::uint32_t seq) { + TRACE_FUNC(); if (hash.isNonZero()) { JLOG(j_.error()) << "Missing node in " << to_string(hash);