rippled
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | Friends | List of all members
ripple::PeerImp Class Reference

This class manages established peer-to-peer connections, handles message exchange, monitors connection health, and graceful shutdown. More...

#include <PeerImp.h>

Inheritance diagram for ripple::PeerImp:
Inheritance graph
[legend]
Collaboration diagram for ripple::PeerImp:
Collaboration graph
[legend]

Classes

struct  ChargeWithContext
 
class  Metrics
 

Public Types

enum class  Tracking { diverged , unknown , converged }
 Whether the peer's view of the ledger converges or diverges from ours. More...
 
using ptr = std::shared_ptr< Peer >
 
using id_t = std::uint32_t
 Uniquely identifies a peer.
 

Public Member Functions

 PeerImp (PeerImp const &)=delete
 
PeerImpoperator= (PeerImp const &)=delete
 
 PeerImp (Application &app, id_t id, std::shared_ptr< PeerFinder::Slot > const &slot, http_request_type &&request, PublicKey const &publicKey, ProtocolVersion protocol, Resource::Consumer consumer, std::unique_ptr< stream_type > &&stream_ptr, OverlayImpl &overlay)
 Create an active incoming peer from an established ssl connection.
 
template<class Buffers >
 PeerImp (Application &app, std::unique_ptr< stream_type > &&stream_ptr, Buffers const &buffers, std::shared_ptr< PeerFinder::Slot > &&slot, http_response_type &&response, Resource::Consumer usage, PublicKey const &publicKey, ProtocolVersion protocol, id_t id, OverlayImpl &overlay)
 Create outgoing, handshaked peer.
 
virtual ~PeerImp ()
 
beast::Journal const & pjournal () const
 
std::shared_ptr< PeerFinder::Slot > const & slot ()
 
virtual void run ()
 
void stop () override
 
void send (std::shared_ptr< Message > const &m) override
 
void sendTxQueue () override
 Send aggregated transactions' hashes.
 
void addTxQueue (uint256 const &hash) override
 Add transaction's hash to the transactions' hashes queue.
 
void removeTxQueue (uint256 const &hash) override
 Remove transaction's hash from the transactions' hashes queue.
 
template<class FwdIt , class = typename std::enable_if_t<std::is_same< typename std::iterator_traits<FwdIt>::value_type, PeerFinder::Endpoint>::value>>
void sendEndpoints (FwdIt first, FwdIt last)
 Send a set of PeerFinder endpoints as a protocol message.
 
beast::IP::Endpoint getRemoteAddress () const override
 
void charge (Resource::Charge const &fee, std::string const &context) override
 Adjust this peer's load balance based on the type of load imposed.
 
Peer::id_t id () const override
 
bool crawl () const
 Returns true if this connection will publicly share its IP address.
 
bool cluster () const override
 Returns true if this connection is a member of the cluster.
 
void checkTracking (std::uint32_t validationSeq)
 Check if the peer is tracking.
 
void checkTracking (std::uint32_t seq1, std::uint32_t seq2)
 
PublicKey const & getNodePublic () const override
 
std::string getVersion () const
 Return the version of rippled that the peer is running, if reported.
 
clock_type::duration uptime () const
 
Json::Value json () override
 
bool supportsFeature (ProtocolFeature f) const override
 
std::optional< std::size_tpublisherListSequence (PublicKey const &pubKey) const override
 
void setPublisherListSequence (PublicKey const &pubKey, std::size_t const seq) override
 
uint256 const & getClosedLedgerHash () const override
 
bool hasLedger (uint256 const &hash, std::uint32_t seq) const override
 
void ledgerRange (std::uint32_t &minSeq, std::uint32_t &maxSeq) const override
 
bool hasTxSet (uint256 const &hash) const override
 
void cycleStatus () override
 
bool hasRange (std::uint32_t uMin, std::uint32_t uMax) override
 
int getScore (bool haveItem) const override
 
bool isHighLatency () const override
 
bool compressionEnabled () const override
 
bool txReduceRelayEnabled () const override
 
void onMessageUnknown (std::uint16_t type)
 
void onMessageBegin (std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &m, std::size_t size, std::size_t uncompressed_size, bool isCompressed)
 
void onMessageEnd (std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &m)
 
void onMessage (std::shared_ptr< protocol::TMManifests > const &m)
 
void onMessage (std::shared_ptr< protocol::TMPing > const &m)
 
void onMessage (std::shared_ptr< protocol::TMCluster > const &m)
 
void onMessage (std::shared_ptr< protocol::TMEndpoints > const &m)
 
void onMessage (std::shared_ptr< protocol::TMTransaction > const &m)
 
void onMessage (std::shared_ptr< protocol::TMGetLedger > const &m)
 
void onMessage (std::shared_ptr< protocol::TMLedgerData > const &m)
 
void onMessage (std::shared_ptr< protocol::TMProposeSet > const &m)
 
void onMessage (std::shared_ptr< protocol::TMStatusChange > const &m)
 
void onMessage (std::shared_ptr< protocol::TMHaveTransactionSet > const &m)
 
void onMessage (std::shared_ptr< protocol::TMValidatorList > const &m)
 
void onMessage (std::shared_ptr< protocol::TMValidatorListCollection > const &m)
 
void onMessage (std::shared_ptr< protocol::TMValidation > const &m)
 
void onMessage (std::shared_ptr< protocol::TMGetObjectByHash > const &m)
 
void onMessage (std::shared_ptr< protocol::TMHaveTransactions > const &m)
 
void onMessage (std::shared_ptr< protocol::TMTransactions > const &m)
 
void onMessage (std::shared_ptr< protocol::TMSquelch > const &m)
 
void onMessage (std::shared_ptr< protocol::TMProofPathRequest > const &m)
 
void onMessage (std::shared_ptr< protocol::TMProofPathResponse > const &m)
 
void onMessage (std::shared_ptr< protocol::TMReplayDeltaRequest > const &m)
 
void onMessage (std::shared_ptr< protocol::TMReplayDeltaResponse > const &m)
 
shared_from_this (T... args)
 
weak_from_this (T... args)
 

Private Types

using clock_type = std::chrono::steady_clock
 
using error_code = boost::system::error_code
 
using socket_type = boost::asio::ip::tcp::socket
 
using middle_type = boost::beast::tcp_stream
 
using stream_type = boost::beast::ssl_stream< middle_type >
 
using address_type = boost::asio::ip::address
 
using endpoint_type = boost::asio::ip::tcp::endpoint
 
using waitable_timer = boost::asio::basic_waitable_timer< std::chrono::steady_clock >
 
using Compressed = compression::Compressed
 

Private Member Functions

void fail (std::string const &name, error_code ec)
 Handles a failure associated with a specific error code.
 
void fail (std::string const &reason)
 Handles a failure described by a reason string.
 
void shutdown ()
 Initiates the peer disconnection sequence.
 
void tryAsyncShutdown ()
 Attempts to perform a graceful SSL shutdown if conditions are met.
 
void onShutdown (error_code ec)
 Handles the completion of the asynchronous SSL shutdown.
 
void close ()
 Forcibly closes the underlying socket connection.
 
void setTimer (std::chrono::seconds interval)
 Sets and starts the peer timer.
 
void onTimer (error_code const &ec)
 Handles the expiration of the peer activity timer.
 
void cancelTimer () noexcept
 Cancels any pending wait on the peer activity timer.
 
void doAccept ()
 
std::string name () const
 
std::string domain () const
 
void doProtocolStart ()
 
void onReadMessage (error_code ec, std::size_t bytes_transferred)
 
void onWriteMessage (error_code ec, std::size_t bytes_transferred)
 
void handleTransaction (std::shared_ptr< protocol::TMTransaction > const &m, bool eraseTxQueue, bool batch)
 Called from onMessage(TMTransaction(s)).
 
void handleHaveTransactions (std::shared_ptr< protocol::TMHaveTransactions > const &m)
 Handle protocol message with hashes of transactions that have not been relayed by an upstream node down to its peers - request transactions, which have not been relayed to this peer.
 
std::string const & fingerprint () const override
 
std::string const & prefix () const
 
void addLedger (uint256 const &hash, std::lock_guard< std::mutex > const &lockedRecentLock)
 
void doFetchPack (std::shared_ptr< protocol::TMGetObjectByHash > const &packet)
 
void onValidatorListMessage (std::string const &messageType, std::string const &manifest, std::uint32_t version, std::vector< ValidatorBlobInfo > const &blobs)
 
void doTransactions (std::shared_ptr< protocol::TMGetObjectByHash > const &packet)
 Process peer's request to send missing transactions.
 
void checkTransaction (HashRouterFlags flags, bool checkSignature, std::shared_ptr< STTx const > const &stx, bool batch)
 
void checkPropose (bool isTrusted, std::shared_ptr< protocol::TMProposeSet > const &packet, RCLCxPeerPos peerPos)
 
void checkValidation (std::shared_ptr< STValidation > const &val, uint256 const &key, std::shared_ptr< protocol::TMValidation > const &packet)
 
void sendLedgerBase (std::shared_ptr< Ledger const > const &ledger, protocol::TMLedgerData &ledgerData)
 
std::shared_ptr< Ledger const > getLedger (std::shared_ptr< protocol::TMGetLedger > const &m)
 
std::shared_ptr< SHAMap const > getTxSet (std::shared_ptr< protocol::TMGetLedger > const &m) const
 
void processLedgerRequest (std::shared_ptr< protocol::TMGetLedger > const &m)
 

Static Private Member Functions

static std::string makePrefix (std::string const &fingerprint)
 

Private Attributes

Applicationapp_
 
id_t const id_
 
std::string fingerprint_
 
std::string prefix_
 
beast::WrappedSink sink_
 
beast::WrappedSink p_sink_
 
beast::Journal const journal_
 
beast::Journal const p_journal_
 
std::unique_ptr< stream_typestream_ptr_
 
socket_typesocket_
 
stream_typestream_
 
boost::asio::strand< boost::asio::executor > strand_
 
waitable_timer timer_
 
beast::IP::Endpoint const remote_address_
 
OverlayImploverlay_
 
bool const inbound_
 
ProtocolVersion protocol_
 
std::atomic< Trackingtracking_
 
clock_type::time_point trackingTime_
 
PublicKey const publicKey_
 
std::string name_
 
std::shared_mutex nameMutex_
 
LedgerIndex minLedger_ = 0
 
LedgerIndex maxLedger_ = 0
 
uint256 closedLedgerHash_
 
uint256 previousLedgerHash_
 
boost::circular_buffer< uint256recentLedgers_ {128}
 
boost::circular_buffer< uint256recentTxSets_ {128}
 
std::optional< std::chrono::millisecondslatency_
 
std::optional< std::uint32_tlastPingSeq_
 
clock_type::time_point lastPingTime_
 
clock_type::time_point const creationTime_
 
reduce_relay::Squelch< UptimeClocksquelch_
 
std::mutex recentLock_
 
protocol::TMStatusChange last_status_
 
Resource::Consumer usage_
 
ChargeWithContext fee_
 
std::shared_ptr< PeerFinder::Slot > const slot_
 
boost::beast::multi_buffer read_buffer_
 
http_request_type request_
 
http_response_type response_
 
boost::beast::http::fields const & headers_
 
std::queue< std::shared_ptr< Message > > send_queue_
 
bool shutdown_ = false
 
bool shutdownStarted_ = false
 
bool readPending_ = false
 
bool writePending_ = false
 
int large_sendq_ = 0
 
std::unique_ptr< LoadEventload_event_
 
hash_map< PublicKey, std::size_tpublisherListSequences_
 
Compressed compressionEnabled_ = Compressed::Off
 
hash_set< uint256txQueue_
 
bool txReduceRelayEnabled_ = false
 
bool ledgerReplayEnabled_ = false
 
LedgerReplayMsgHandler ledgerReplayMsgHandler_
 
struct { 
 
   Metrics   sent 
 
   Metrics   recv 
 
metrics_ 
 

Friends

class OverlayImpl
 

Detailed Description

This class manages established peer-to-peer connections, handles message exchange, monitors connection health, and graceful shutdown.

The PeerImp shutdown mechanism is a multi-stage process designed to ensure graceful connection termination while handling ongoing I/O operations safely. The shutdown can be initiated from multiple points and follows a deterministic state machine.

The shutdown process can be triggered from several entry points:

The shutdown follows this progression:

Normal Operation → shutdown() → tryAsyncShutdown() → onShutdown() → close() ↓ ↓ ↓ ↓ Set shutdown_ SSL graceful Timer cancel Socket close Cancel timer shutdown start & cleanup & metrics 5s safety timer Set shutdownStarted_ update

Two primary flags coordinate the shutdown process:

The shutdown mechanism carefully coordinates with ongoing read/write operations:

**Read Operations (onReadMessage)**:

**Write Operations (onWriteMessage)**:

Multiple timers require coordination during shutdown:

  1. Peer Timer: Regular ping/pong timer cancelled immediately in shutdown()
  2. Shutdown Timer: 5-second safety timer ensures shutdown completion
  3. Operation Cancellation: All pending async operations are cancelled

The shutdown implements fallback mechanisms:

All shutdown operations are serialized through the boost::asio::strand to ensure thread safety. The strand guarantees that shutdown state changes and I/O operation callbacks are executed sequentially.

Note
This class requires careful coordination between async operations, timer management, and shutdown procedures to ensure no resource leaks or hanging connections in high-throughput networking scenarios.

Definition at line 115 of file PeerImp.h.

Member Typedef Documentation

◆ clock_type

Definition at line 124 of file PeerImp.h.

◆ error_code

using ripple::PeerImp::error_code = boost::system::error_code
private

Definition at line 125 of file PeerImp.h.

◆ socket_type

using ripple::PeerImp::socket_type = boost::asio::ip::tcp::socket
private

Definition at line 126 of file PeerImp.h.

◆ middle_type

using ripple::PeerImp::middle_type = boost::beast::tcp_stream
private

Definition at line 127 of file PeerImp.h.

◆ stream_type

using ripple::PeerImp::stream_type = boost::beast::ssl_stream<middle_type>
private

Definition at line 128 of file PeerImp.h.

◆ address_type

using ripple::PeerImp::address_type = boost::asio::ip::address
private

Definition at line 129 of file PeerImp.h.

◆ endpoint_type

using ripple::PeerImp::endpoint_type = boost::asio::ip::tcp::endpoint
private

Definition at line 130 of file PeerImp.h.

◆ waitable_timer

using ripple::PeerImp::waitable_timer = boost::asio::basic_waitable_timer<std::chrono::steady_clock>
private

Definition at line 131 of file PeerImp.h.

◆ Compressed

Definition at line 133 of file PeerImp.h.

◆ ptr

Definition at line 46 of file xrpld/overlay/Peer.h.

◆ id_t

using ripple::Peer::id_t = std::uint32_t
inherited

Uniquely identifies a peer.

This can be stored in tables to find the peer later. Callers can discover if the peer is no longer connected and make adjustments as needed.

Definition at line 53 of file xrpld/overlay/Peer.h.

Member Enumeration Documentation

◆ Tracking

enum class ripple::PeerImp::Tracking
strong

Whether the peer's view of the ledger converges or diverges from ours.

Enumerator
diverged 
unknown 
converged 

Definition at line 121 of file PeerImp.h.

Constructor & Destructor Documentation

◆ PeerImp() [1/3]

ripple::PeerImp::PeerImp ( PeerImp const &  )
delete

◆ PeerImp() [2/3]

ripple::PeerImp::PeerImp ( Application app,
id_t  id,
std::shared_ptr< PeerFinder::Slot > const &  slot,
http_request_type &&  request,
PublicKey const &  publicKey,
ProtocolVersion  protocol,
Resource::Consumer  consumer,
std::unique_ptr< stream_type > &&  stream_ptr,
OverlayImpl overlay 
)

Create an active incoming peer from an established ssl connection.

Definition at line 72 of file PeerImp.cpp.

◆ PeerImp() [3/3]

template<class Buffers >
ripple::PeerImp::PeerImp ( Application app,
std::unique_ptr< stream_type > &&  stream_ptr,
Buffers const &  buffers,
std::shared_ptr< PeerFinder::Slot > &&  slot,
http_response_type &&  response,
Resource::Consumer  usage,
PublicKey const &  publicKey,
ProtocolVersion  protocol,
id_t  id,
OverlayImpl overlay 
)

Create outgoing, handshaked peer.

Definition at line 835 of file PeerImp.h.

◆ ~PeerImp()

ripple::PeerImp::~PeerImp ( )
virtual

Definition at line 140 of file PeerImp.cpp.

Member Function Documentation

◆ operator=()

PeerImp & ripple::PeerImp::operator= ( PeerImp const &  )
delete

◆ pjournal()

beast::Journal const & ripple::PeerImp::pjournal ( ) const

Definition at line 345 of file PeerImp.h.

◆ slot()

std::shared_ptr< PeerFinder::Slot > const & ripple::PeerImp::slot ( )

Definition at line 351 of file PeerImp.h.

◆ run()

void ripple::PeerImp::run ( )
virtual

Reimplemented in ripple::test::tx_reduce_relay_test::PeerTest.

Definition at line 163 of file PeerImp.cpp.

◆ stop()

void ripple::PeerImp::stop ( )
overridevirtual

Implements ripple::OverlayImpl::Child.

Definition at line 221 of file PeerImp.cpp.

◆ send()

void ripple::PeerImp::send ( std::shared_ptr< Message > const &  m)
overridevirtual

Implements ripple::Peer.

Reimplemented in ripple::test::tx_reduce_relay_test::PeerTest.

Definition at line 241 of file PeerImp.cpp.

◆ sendTxQueue()

void ripple::PeerImp::sendTxQueue ( )
overridevirtual

Send aggregated transactions' hashes.

Implements ripple::Peer.

Definition at line 308 of file PeerImp.cpp.

◆ addTxQueue()

void ripple::PeerImp::addTxQueue ( uint256 const &  hash)
overridevirtual

Add transaction's hash to the transactions' hashes queue.

Parameters
hashtransaction's hash

Implements ripple::Peer.

Reimplemented in ripple::test::tx_reduce_relay_test::PeerTest.

Definition at line 327 of file PeerImp.cpp.

◆ removeTxQueue()

void ripple::PeerImp::removeTxQueue ( uint256 const &  hash)
overridevirtual

Remove transaction's hash from the transactions' hashes queue.

Parameters
hashtransaction's hash

Implements ripple::Peer.

Definition at line 344 of file PeerImp.cpp.

◆ sendEndpoints()

template<class FwdIt , class >
void ripple::PeerImp::sendEndpoints ( FwdIt  first,
FwdIt  last 
)

Send a set of PeerFinder endpoints as a protocol message.

Definition at line 909 of file PeerImp.h.

◆ getRemoteAddress()

beast::IP::Endpoint ripple::PeerImp::getRemoteAddress ( ) const
overridevirtual

Implements ripple::Peer.

Definition at line 397 of file PeerImp.h.

◆ charge()

void ripple::PeerImp::charge ( Resource::Charge const &  fee,
std::string const &  context 
)
overridevirtual

Adjust this peer's load balance based on the type of load imposed.

Implements ripple::Peer.

Definition at line 356 of file PeerImp.cpp.

◆ id()

Peer::id_t ripple::PeerImp::id ( ) const
overridevirtual

Implements ripple::Peer.

Definition at line 410 of file PeerImp.h.

◆ crawl()

bool ripple::PeerImp::crawl ( ) const

Returns true if this connection will publicly share its IP address.

Definition at line 370 of file PeerImp.cpp.

◆ cluster()

bool ripple::PeerImp::cluster ( ) const
overridevirtual

Returns true if this connection is a member of the cluster.

Implements ripple::Peer.

Definition at line 379 of file PeerImp.cpp.

◆ checkTracking() [1/2]

void ripple::PeerImp::checkTracking ( std::uint32_t  validationSeq)

Check if the peer is tracking.

Parameters
validationSeqThe ledger sequence of a recently-validated ledger

Definition at line 2066 of file PeerImp.cpp.

◆ checkTracking() [2/2]

void ripple::PeerImp::checkTracking ( std::uint32_t  seq1,
std::uint32_t  seq2 
)

Definition at line 2085 of file PeerImp.cpp.

◆ getNodePublic()

PublicKey const & ripple::PeerImp::getNodePublic ( ) const
overridevirtual

Implements ripple::Peer.

Definition at line 432 of file PeerImp.h.

◆ getVersion()

std::string ripple::PeerImp::getVersion ( ) const

Return the version of rippled that the peer is running, if reported.

Definition at line 385 of file PeerImp.cpp.

◆ uptime()

clock_type::duration ripple::PeerImp::uptime ( ) const

Definition at line 443 of file PeerImp.h.

◆ json()

Json::Value ripple::PeerImp::json ( )
overridevirtual

Implements ripple::Peer.

Definition at line 393 of file PeerImp.cpp.

◆ supportsFeature()

bool ripple::PeerImp::supportsFeature ( ProtocolFeature  f) const
overridevirtual

Implements ripple::Peer.

Definition at line 511 of file PeerImp.cpp.

◆ publisherListSequence()

std::optional< std::size_t > ripple::PeerImp::publisherListSequence ( PublicKey const &  pubKey) const
overridevirtual

Implements ripple::Peer.

Definition at line 455 of file PeerImp.h.

◆ setPublisherListSequence()

void ripple::PeerImp::setPublisherListSequence ( PublicKey const &  pubKey,
std::size_t const  seq 
)
overridevirtual

Implements ripple::Peer.

Definition at line 466 of file PeerImp.h.

◆ getClosedLedgerHash()

uint256 const & ripple::PeerImp::getClosedLedgerHash ( ) const
overridevirtual

Implements ripple::Peer.

Definition at line 479 of file PeerImp.h.

◆ hasLedger()

bool ripple::PeerImp::hasLedger ( uint256 const &  hash,
std::uint32_t  seq 
) const
overridevirtual

Implements ripple::Peer.

Definition at line 528 of file PeerImp.cpp.

◆ ledgerRange()

void ripple::PeerImp::ledgerRange ( std::uint32_t minSeq,
std::uint32_t maxSeq 
) const
overridevirtual

Implements ripple::Peer.

Definition at line 543 of file PeerImp.cpp.

◆ hasTxSet()

bool ripple::PeerImp::hasTxSet ( uint256 const &  hash) const
overridevirtual

Implements ripple::Peer.

Definition at line 552 of file PeerImp.cpp.

◆ cycleStatus()

void ripple::PeerImp::cycleStatus ( )
overridevirtual

Implements ripple::Peer.

Definition at line 560 of file PeerImp.cpp.

◆ hasRange()

bool ripple::PeerImp::hasRange ( std::uint32_t  uMin,
std::uint32_t  uMax 
)
overridevirtual

Implements ripple::Peer.

Definition at line 570 of file PeerImp.cpp.

◆ getScore()

int ripple::PeerImp::getScore ( bool  haveItem) const
overridevirtual

Implements ripple::Peer.

Definition at line 3563 of file PeerImp.cpp.

◆ isHighLatency()

bool ripple::PeerImp::isHighLatency ( ) const
overridevirtual

Implements ripple::Peer.

Definition at line 3601 of file PeerImp.cpp.

◆ compressionEnabled()

bool ripple::PeerImp::compressionEnabled ( ) const
overridevirtual

Implements ripple::Peer.

Definition at line 507 of file PeerImp.h.

◆ txReduceRelayEnabled()

bool ripple::PeerImp::txReduceRelayEnabled ( ) const
overridevirtual

Implements ripple::Peer.

Definition at line 513 of file PeerImp.h.

◆ fail() [1/2]

void ripple::PeerImp::fail ( std::string const &  name,
error_code  ec 
)
private

Handles a failure associated with a specific error code.

This function is called when an operation fails with an error code. It logs the warning message and gracefully shutdowns the connection.

The function will do nothing if the connection is already closed or if a shutdown is already in progress.

Parameters
nameThe name of the operation that failed (e.g., "read", "write").
ecThe error code associated with the failure.
Note
This function must be called from within the object's strand.

Definition at line 580 of file PeerImp.cpp.

◆ fail() [2/2]

void ripple::PeerImp::fail ( std::string const &  reason)
private

Handles a failure described by a reason string.

This overload is used for logical errors or protocol violations not associated with a specific error code. It logs a warning with the given reason, then initiates a graceful shutdown.

The function will do nothing if the connection is already closed or if a shutdown is already in progress.

Parameters
reasonA descriptive string explaining the reason for the failure.
Note
This function must be called from within the object's strand.

Definition at line 595 of file PeerImp.cpp.

◆ shutdown()

void ripple::PeerImp::shutdown ( )
private

Initiates the peer disconnection sequence.

This is the primary entry point to start closing a peer connection. It marks the peer for shutdown and cancels any outstanding asynchronous operations. This cancellation allows the graceful shutdown to proceed once the handlers for the cancelled operations have completed.

Note
This method must be called on the peer's strand.

Definition at line 643 of file PeerImp.cpp.

◆ tryAsyncShutdown()

void ripple::PeerImp::tryAsyncShutdown ( )
private

Attempts to perform a graceful SSL shutdown if conditions are met.

This helper function checks if the peer is in a state where a graceful SSL shutdown can be performed (i.e., shutdown has been requested and no I/O operations are currently in progress).

Note
This method must be called on the peer's strand.

Definition at line 619 of file PeerImp.cpp.

◆ onShutdown()

void ripple::PeerImp::onShutdown ( error_code  ec)
private

Handles the completion of the asynchronous SSL shutdown.

This function is the callback for the async_shutdown operation started in shutdown(). Its first action is to cancel the timer. It then inspects the error code to determine the outcome.

Regardless of the result, this function proceeds to call close() to ensure the underlying socket is fully closed.

Parameters
ecThe error code resulting from the async_shutdown operation.

Definition at line 660 of file PeerImp.cpp.

◆ close()

void ripple::PeerImp::close ( )
private

Forcibly closes the underlying socket connection.

This function provides the final, non-graceful shutdown of the peer connection. It ensures any pending timers are cancelled and then immediately closes the TCP socket, bypassing the SSL shutdown handshake.

After closing, it notifies the overlay manager of the disconnection.

Note
This function must be called from within the object's strand.

Definition at line 686 of file PeerImp.cpp.

◆ setTimer()

void ripple::PeerImp::setTimer ( std::chrono::seconds  interval)
private

Sets and starts the peer timer.

This function starts timer, which is used to detect inactivity and prevent stalled connections. It sets the timer to expire after the predefined peerTimerInterval.

Note
This function will terminate the connection in case of any errors.

Definition at line 712 of file PeerImp.cpp.

◆ onTimer()

void ripple::PeerImp::onTimer ( error_code const &  ec)
private

Handles the expiration of the peer activity timer.

This callback is invoked when the timer set by setTimer expires. It watches the peer connection, checking for various timeout and health conditions.

Parameters
ecThe error code associated with the timer's expiration. operation_aborted is expected if the timer was cancelled.

Definition at line 741 of file PeerImp.cpp.

◆ cancelTimer()

void ripple::PeerImp::cancelTimer ( )
privatenoexcept

Cancels any pending wait on the peer activity timer.

This function is called to stop the timer. It gracefully manages any errors that might occur during the cancellation process.

Definition at line 808 of file PeerImp.cpp.

◆ makePrefix()

std::string ripple::PeerImp::makePrefix ( std::string const &  fingerprint)
staticprivate

Definition at line 733 of file PeerImp.cpp.

◆ doAccept()

void ripple::PeerImp::doAccept ( )
private

Definition at line 822 of file PeerImp.cpp.

◆ name()

std::string ripple::PeerImp::name ( ) const
private

Definition at line 892 of file PeerImp.cpp.

◆ domain()

std::string ripple::PeerImp::domain ( ) const
private

Definition at line 899 of file PeerImp.cpp.

◆ doProtocolStart()

void ripple::PeerImp::doProtocolStart ( )
private

Definition at line 909 of file PeerImp.cpp.

◆ onReadMessage()

void ripple::PeerImp::onReadMessage ( error_code  ec,
std::size_t  bytes_transferred 
)
private

Definition at line 951 of file PeerImp.cpp.

◆ onWriteMessage()

void ripple::PeerImp::onWriteMessage ( error_code  ec,
std::size_t  bytes_transferred 
)
private

Definition at line 1042 of file PeerImp.cpp.

◆ handleTransaction()

void ripple::PeerImp::handleTransaction ( std::shared_ptr< protocol::TMTransaction > const &  m,
bool  eraseTxQueue,
bool  batch 
)
private

Called from onMessage(TMTransaction(s)).

Parameters
mTransaction protocol message
eraseTxQueueis true when called from onMessage(TMTransaction) and is false when called from onMessage(TMTransactions). If true then the transaction hash is erased from txQueue_. Don't need to erase from the queue when called from onMessage(TMTransactions) because this message is a response to the missing transactions request and the queue would not have any of these transactions.
batchis false when called from onMessage(TMTransaction) and is true when called from onMessage(TMTransactions). If true, then the transaction is part of a batch, and should not be charged an extra fee.

Definition at line 1358 of file PeerImp.cpp.

◆ handleHaveTransactions()

void ripple::PeerImp::handleHaveTransactions ( std::shared_ptr< protocol::TMHaveTransactions > const &  m)
private

Handle protocol message with hashes of transactions that have not been relayed by an upstream node down to its peers - request transactions, which have not been relayed to this peer.

Parameters
mprotocol message with transactions' hashes

Definition at line 2710 of file PeerImp.cpp.

◆ fingerprint()

std::string const & ripple::PeerImp::fingerprint ( ) const
overrideprivatevirtual

Implements ripple::Peer.

Definition at line 695 of file PeerImp.h.

◆ prefix()

std::string const & ripple::PeerImp::prefix ( ) const
private

Definition at line 701 of file PeerImp.h.

◆ onMessageUnknown()

void ripple::PeerImp::onMessageUnknown ( std::uint16_t  type)

Definition at line 1108 of file PeerImp.cpp.

◆ onMessageBegin()

void ripple::PeerImp::onMessageBegin ( std::uint16_t  type,
std::shared_ptr<::google::protobuf::Message > const &  m,
std::size_t  size,
std::size_t  uncompressed_size,
bool  isCompressed 
)

Definition at line 1114 of file PeerImp.cpp.

◆ onMessageEnd()

void ripple::PeerImp::onMessageEnd ( std::uint16_t  type,
std::shared_ptr<::google::protobuf::Message > const &  m 
)

Definition at line 1157 of file PeerImp.cpp.

◆ onMessage() [1/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMManifests > const &  m)

Definition at line 1166 of file PeerImp.cpp.

◆ onMessage() [2/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMPing > const &  m)

Definition at line 1186 of file PeerImp.cpp.

◆ onMessage() [3/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMCluster > const &  m)

Definition at line 1223 of file PeerImp.cpp.

◆ onMessage() [4/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMEndpoints > const &  m)

Definition at line 1295 of file PeerImp.cpp.

◆ onMessage() [5/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMTransaction > const &  m)

Definition at line 1352 of file PeerImp.cpp.

◆ onMessage() [6/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMGetLedger > const &  m)

Definition at line 1480 of file PeerImp.cpp.

◆ onMessage() [7/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMLedgerData > const &  m)

Definition at line 1679 of file PeerImp.cpp.

◆ onMessage() [8/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMProposeSet > const &  m)

Definition at line 1770 of file PeerImp.cpp.

◆ onMessage() [9/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMStatusChange > const &  m)

Definition at line 1891 of file PeerImp.cpp.

◆ onMessage() [10/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMHaveTransactionSet > const &  m)

Definition at line 2107 of file PeerImp.cpp.

◆ onMessage() [11/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMValidatorList > const &  m)

Definition at line 2342 of file PeerImp.cpp.

◆ onMessage() [12/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMValidatorListCollection > const &  m)

Definition at line 2370 of file PeerImp.cpp.

◆ onMessage() [13/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMValidation > const &  m)

Definition at line 2410 of file PeerImp.cpp.

◆ onMessage() [14/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMGetObjectByHash > const &  m)

Definition at line 2535 of file PeerImp.cpp.

◆ onMessage() [15/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMHaveTransactions > const &  m)

Definition at line 2691 of file PeerImp.cpp.

◆ onMessage() [16/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMTransactions > const &  m)

Definition at line 2760 of file PeerImp.cpp.

◆ onMessage() [17/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMSquelch > const &  m)

Definition at line 2784 of file PeerImp.cpp.

◆ onMessage() [18/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMProofPathRequest > const &  m)

Definition at line 1569 of file PeerImp.cpp.

◆ onMessage() [19/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMProofPathResponse > const &  m)

Definition at line 1608 of file PeerImp.cpp.

◆ onMessage() [20/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMReplayDeltaRequest > const &  m)

Definition at line 1624 of file PeerImp.cpp.

◆ onMessage() [21/21]

void ripple::PeerImp::onMessage ( std::shared_ptr< protocol::TMReplayDeltaResponse > const &  m)

Definition at line 1663 of file PeerImp.cpp.

◆ addLedger()

void ripple::PeerImp::addLedger ( uint256 const &  hash,
std::lock_guard< std::mutex > const &  lockedRecentLock 
)
private

Definition at line 2830 of file PeerImp.cpp.

◆ doFetchPack()

void ripple::PeerImp::doFetchPack ( std::shared_ptr< protocol::TMGetObjectByHash > const &  packet)
private

Definition at line 2846 of file PeerImp.cpp.

◆ onValidatorListMessage()

void ripple::PeerImp::onValidatorListMessage ( std::string const &  messageType,
std::string const &  manifest,
std::uint32_t  version,
std::vector< ValidatorBlobInfo > const &  blobs 
)
private

Definition at line 2133 of file PeerImp.cpp.

◆ doTransactions()

void ripple::PeerImp::doTransactions ( std::shared_ptr< protocol::TMGetObjectByHash > const &  packet)
private

Process peer's request to send missing transactions.

The request is sent in response to TMHaveTransactions.

Parameters
packetprotocol message containing missing transactions' hashes.

Definition at line 2880 of file PeerImp.cpp.

◆ checkTransaction()

void ripple::PeerImp::checkTransaction ( HashRouterFlags  flags,
bool  checkSignature,
std::shared_ptr< STTx const > const &  stx,
bool  batch 
)
private

Definition at line 2935 of file PeerImp.cpp.

◆ checkPropose()

void ripple::PeerImp::checkPropose ( bool  isTrusted,
std::shared_ptr< protocol::TMProposeSet > const &  packet,
RCLCxPeerPos  peerPos 
)
private

Definition at line 3073 of file PeerImp.cpp.

◆ checkValidation()

void ripple::PeerImp::checkValidation ( std::shared_ptr< STValidation > const &  val,
uint256 const &  key,
std::shared_ptr< protocol::TMValidation > const &  packet 
)
private

Definition at line 3116 of file PeerImp.cpp.

◆ sendLedgerBase()

void ripple::PeerImp::sendLedgerBase ( std::shared_ptr< Ledger const > const &  ledger,
protocol::TMLedgerData &  ledgerData 
)
private

Definition at line 3213 of file PeerImp.cpp.

◆ getLedger()

std::shared_ptr< Ledger const > ripple::PeerImp::getLedger ( std::shared_ptr< protocol::TMGetLedger > const &  m)
private

Definition at line 3253 of file PeerImp.cpp.

◆ getTxSet()

std::shared_ptr< SHAMap const > ripple::PeerImp::getTxSet ( std::shared_ptr< protocol::TMGetLedger > const &  m) const
private

Definition at line 3349 of file PeerImp.cpp.

◆ processLedgerRequest()

void ripple::PeerImp::processLedgerRequest ( std::shared_ptr< protocol::TMGetLedger > const &  m)
private

Definition at line 3384 of file PeerImp.cpp.

Friends And Related Symbol Documentation

◆ OverlayImpl

friend class OverlayImpl
friend

Definition at line 275 of file PeerImp.h.

Member Data Documentation

◆ app_

Application& ripple::PeerImp::app_
private

Definition at line 135 of file PeerImp.h.

◆ id_

id_t const ripple::PeerImp::id_
private

Definition at line 136 of file PeerImp.h.

◆ fingerprint_

std::string ripple::PeerImp::fingerprint_
private

Definition at line 137 of file PeerImp.h.

◆ prefix_

std::string ripple::PeerImp::prefix_
private

Definition at line 138 of file PeerImp.h.

◆ sink_

beast::WrappedSink ripple::PeerImp::sink_
private

Definition at line 139 of file PeerImp.h.

◆ p_sink_

beast::WrappedSink ripple::PeerImp::p_sink_
private

Definition at line 140 of file PeerImp.h.

◆ journal_

beast::Journal const ripple::PeerImp::journal_
private

Definition at line 141 of file PeerImp.h.

◆ p_journal_

beast::Journal const ripple::PeerImp::p_journal_
private

Definition at line 142 of file PeerImp.h.

◆ stream_ptr_

std::unique_ptr<stream_type> ripple::PeerImp::stream_ptr_
private

Definition at line 143 of file PeerImp.h.

◆ socket_

socket_type& ripple::PeerImp::socket_
private

Definition at line 144 of file PeerImp.h.

◆ stream_

stream_type& ripple::PeerImp::stream_
private

Definition at line 145 of file PeerImp.h.

◆ strand_

boost::asio::strand<boost::asio::executor> ripple::PeerImp::strand_
private

Definition at line 146 of file PeerImp.h.

◆ timer_

waitable_timer ripple::PeerImp::timer_
private

Definition at line 149 of file PeerImp.h.

◆ remote_address_

beast::IP::Endpoint const ripple::PeerImp::remote_address_
private

Definition at line 153 of file PeerImp.h.

◆ overlay_

OverlayImpl& ripple::PeerImp::overlay_
private

Definition at line 157 of file PeerImp.h.

◆ inbound_

bool const ripple::PeerImp::inbound_
private

Definition at line 158 of file PeerImp.h.

◆ protocol_

ProtocolVersion ripple::PeerImp::protocol_
private

Definition at line 161 of file PeerImp.h.

◆ tracking_

std::atomic<Tracking> ripple::PeerImp::tracking_
private

Definition at line 163 of file PeerImp.h.

◆ trackingTime_

clock_type::time_point ripple::PeerImp::trackingTime_
private

Definition at line 164 of file PeerImp.h.

◆ publicKey_

PublicKey const ripple::PeerImp::publicKey_
private

Definition at line 166 of file PeerImp.h.

◆ name_

std::string ripple::PeerImp::name_
private

Definition at line 167 of file PeerImp.h.

◆ nameMutex_

std::shared_mutex ripple::PeerImp::nameMutex_
mutableprivate

Definition at line 168 of file PeerImp.h.

◆ minLedger_

LedgerIndex ripple::PeerImp::minLedger_ = 0
private

Definition at line 172 of file PeerImp.h.

◆ maxLedger_

LedgerIndex ripple::PeerImp::maxLedger_ = 0
private

Definition at line 173 of file PeerImp.h.

◆ closedLedgerHash_

uint256 ripple::PeerImp::closedLedgerHash_
private

Definition at line 174 of file PeerImp.h.

◆ previousLedgerHash_

uint256 ripple::PeerImp::previousLedgerHash_
private

Definition at line 175 of file PeerImp.h.

◆ recentLedgers_

boost::circular_buffer<uint256> ripple::PeerImp::recentLedgers_ {128}
private

Definition at line 177 of file PeerImp.h.

◆ recentTxSets_

boost::circular_buffer<uint256> ripple::PeerImp::recentTxSets_ {128}
private

Definition at line 178 of file PeerImp.h.

◆ latency_

std::optional<std::chrono::milliseconds> ripple::PeerImp::latency_
private

Definition at line 180 of file PeerImp.h.

◆ lastPingSeq_

std::optional<std::uint32_t> ripple::PeerImp::lastPingSeq_
private

Definition at line 181 of file PeerImp.h.

◆ lastPingTime_

clock_type::time_point ripple::PeerImp::lastPingTime_
private

Definition at line 182 of file PeerImp.h.

◆ creationTime_

clock_type::time_point const ripple::PeerImp::creationTime_
private

Definition at line 183 of file PeerImp.h.

◆ squelch_

reduce_relay::Squelch<UptimeClock> ripple::PeerImp::squelch_
private

Definition at line 185 of file PeerImp.h.

◆ recentLock_

std::mutex ripple::PeerImp::recentLock_
mutableprivate

Definition at line 234 of file PeerImp.h.

◆ last_status_

protocol::TMStatusChange ripple::PeerImp::last_status_
private

Definition at line 235 of file PeerImp.h.

◆ usage_

Resource::Consumer ripple::PeerImp::usage_
private

Definition at line 236 of file PeerImp.h.

◆ fee_

ChargeWithContext ripple::PeerImp::fee_
private

Definition at line 237 of file PeerImp.h.

◆ slot_

std::shared_ptr<PeerFinder::Slot> const ripple::PeerImp::slot_
private

Definition at line 238 of file PeerImp.h.

◆ read_buffer_

boost::beast::multi_buffer ripple::PeerImp::read_buffer_
private

Definition at line 239 of file PeerImp.h.

◆ request_

http_request_type ripple::PeerImp::request_
private

Definition at line 240 of file PeerImp.h.

◆ response_

http_response_type ripple::PeerImp::response_
private

Definition at line 241 of file PeerImp.h.

◆ headers_

boost::beast::http::fields const& ripple::PeerImp::headers_
private

Definition at line 242 of file PeerImp.h.

◆ send_queue_

std::queue<std::shared_ptr<Message> > ripple::PeerImp::send_queue_
private

Definition at line 243 of file PeerImp.h.

◆ shutdown_

bool ripple::PeerImp::shutdown_ = false
private

Definition at line 246 of file PeerImp.h.

◆ shutdownStarted_

bool ripple::PeerImp::shutdownStarted_ = false
private

Definition at line 249 of file PeerImp.h.

◆ readPending_

bool ripple::PeerImp::readPending_ = false
private

Definition at line 252 of file PeerImp.h.

◆ writePending_

bool ripple::PeerImp::writePending_ = false
private

Definition at line 255 of file PeerImp.h.

◆ large_sendq_

int ripple::PeerImp::large_sendq_ = 0
private

Definition at line 257 of file PeerImp.h.

◆ load_event_

std::unique_ptr<LoadEvent> ripple::PeerImp::load_event_
private

Definition at line 258 of file PeerImp.h.

◆ publisherListSequences_

hash_map<PublicKey, std::size_t> ripple::PeerImp::publisherListSequences_
private

Definition at line 261 of file PeerImp.h.

◆ compressionEnabled_

Compressed ripple::PeerImp::compressionEnabled_ = Compressed::Off
private

Definition at line 263 of file PeerImp.h.

◆ txQueue_

hash_set<uint256> ripple::PeerImp::txQueue_
private

Definition at line 268 of file PeerImp.h.

◆ txReduceRelayEnabled_

bool ripple::PeerImp::txReduceRelayEnabled_ = false
private

Definition at line 270 of file PeerImp.h.

◆ ledgerReplayEnabled_

bool ripple::PeerImp::ledgerReplayEnabled_ = false
private

Definition at line 272 of file PeerImp.h.

◆ ledgerReplayMsgHandler_

LedgerReplayMsgHandler ripple::PeerImp::ledgerReplayMsgHandler_
private

Definition at line 273 of file PeerImp.h.

◆ sent

Metrics ripple::PeerImp::sent

Definition at line 306 of file PeerImp.h.

◆ recv

Metrics ripple::PeerImp::recv

Definition at line 307 of file PeerImp.h.

◆ [struct]

struct { ... } ripple::PeerImp::metrics_