Don't use MultiSocket in Overlay:

The MultiSocket is obsolete technology which is superceded by a more
straightforward, template based implementation that is compatible with
boost::asio::coroutines. This removes support for the unused PROXY handshake
feature. After this change a large number of classes and source files may be
removed.
This commit is contained in:
Vinnie Falco
2014-10-13 10:43:52 -07:00
parent dbd75169e5
commit 4606d99951
13 changed files with 77 additions and 166 deletions

View File

@@ -2377,11 +2377,6 @@
<ClCompile Include="..\..\src\ripple\common\impl\KeyCache.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\ripple\common\impl\MultiSocket.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<ClInclude Include="..\..\src\ripple\common\impl\MultiSocketImpl.h">
</ClInclude>
<ClCompile Include="..\..\src\ripple\common\impl\ResolverAsio.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
@@ -2395,8 +2390,6 @@
</ClInclude>
<ClInclude Include="..\..\src\ripple\common\KeyCache.h">
</ClInclude>
<ClInclude Include="..\..\src\ripple\common\MultiSocket.h">
</ClInclude>
<ClInclude Include="..\..\src\ripple\common\Resolver.h">
</ClInclude>
<ClInclude Include="..\..\src\ripple\common\ResolverAsio.h">

View File

@@ -3414,12 +3414,6 @@
<ClCompile Include="..\..\src\ripple\common\impl\KeyCache.cpp">
<Filter>ripple\common\impl</Filter>
</ClCompile>
<ClCompile Include="..\..\src\ripple\common\impl\MultiSocket.cpp">
<Filter>ripple\common\impl</Filter>
</ClCompile>
<ClInclude Include="..\..\src\ripple\common\impl\MultiSocketImpl.h">
<Filter>ripple\common\impl</Filter>
</ClInclude>
<ClCompile Include="..\..\src\ripple\common\impl\ResolverAsio.cpp">
<Filter>ripple\common\impl</Filter>
</ClCompile>
@@ -3435,9 +3429,6 @@
<ClInclude Include="..\..\src\ripple\common\KeyCache.h">
<Filter>ripple\common</Filter>
</ClInclude>
<ClInclude Include="..\..\src\ripple\common\MultiSocket.h">
<Filter>ripple\common</Filter>
</ClInclude>
<ClInclude Include="..\..\src\ripple\common\Resolver.h">
<Filter>ripple\common</Filter>
</ClInclude>

View File

@@ -207,16 +207,6 @@ public:
/** Listening port number for peer connections. */
int peerListeningPort;
/** PROXY listening port number
If this is not zero, it indicates an additional port number on
which we should accept incoming Peer connections that will also
require a PROXY handshake.
The PROXY Protocol:
http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt
*/
int peerPROXYListeningPort;
/** List of Validators entries from rippled.cfg */
std::vector <std::string> validators;

View File

@@ -60,7 +60,6 @@ struct ConfigSection
#define SECTION_PATH_SEARCH_MAX "path_search_max"
#define SECTION_PEER_IP "peer_ip"
#define SECTION_PEER_PORT "peer_port"
#define SECTION_PEER_PROXY_PORT "peer_port_proxy"
#define SECTION_PEER_PRIVATE "peer_private"
#define SECTION_PEERS_MAX "peers_max"
#define SECTION_PEER_SSL_CIPHER_LIST "peer_ssl_cipher_list"

View File

@@ -233,8 +233,6 @@ Config::Config ()
peerListeningPort = SYSTEM_PEER_PORT;
peerPROXYListeningPort = 0;
//
//
//
@@ -536,18 +534,6 @@ void Config::load ()
if (getSingleSection (secConfig, SECTION_PEER_PORT, strTemp))
peerListeningPort = beast::lexicalCastThrow <int> (strTemp);
if (getSingleSection (secConfig, SECTION_PEER_PROXY_PORT, strTemp))
{
peerPROXYListeningPort = beast::lexicalCastThrow <int> (strTemp);
if (peerPROXYListeningPort != 0 && peerPROXYListeningPort == peerListeningPort)
throw std::runtime_error ("Peer and proxy listening ports can't be the same.");
}
else
{
peerPROXYListeningPort = 0;
}
//
// VFALCO END CLEAN
//

View File

@@ -24,7 +24,6 @@
#include <ripple/http/Session.h>
#include <ripple/http/impl/Types.h>
#include <ripple/http/impl/ServerImpl.h>
#include <ripple/common/MultiSocket.h>
#include <beast/asio/placeholders.h>
#include <beast/asio/ssl.h> // for is_short_read?
#include <beast/http/message.h>

View File

@@ -84,7 +84,7 @@ OverlayImpl::~OverlayImpl ()
}
void
OverlayImpl::accept (bool proxyHandshake, socket_type&& socket)
OverlayImpl::accept (socket_type&& socket)
{
// An error getting an endpoint means the connection closed.
// Just do nothing and the socket will be closed by the caller.
@@ -107,15 +107,9 @@ OverlayImpl::accept (bool proxyHandshake, socket_type&& socket)
if (slot == nullptr)
return;
MultiSocket::Flag flags (
MultiSocket::Flag::server_role | MultiSocket::Flag::ssl_required);
if (proxyHandshake)
flags = flags.with (MultiSocket::Flag::proxy);
PeerImp::ptr const peer (std::make_shared <PeerImp> (
std::move (socket), remote_endpoint, *this, m_resourceManager,
*m_peerFinder, slot, m_ssl_context, flags));
*m_peerFinder, slot, m_ssl_context));
{
std::lock_guard <decltype(m_mutex)> lock (m_mutex);
@@ -150,12 +144,9 @@ OverlayImpl::connect (beast::IP::Endpoint const& remote_endpoint)
if (slot == nullptr)
return;
MultiSocket::Flag const flags (
MultiSocket::Flag::client_role | MultiSocket::Flag::ssl);
PeerImp::ptr const peer (std::make_shared <PeerImp> (
remote_endpoint, m_io_service, *this, m_resourceManager,
*m_peerFinder, slot, m_ssl_context, flags));
*m_peerFinder, slot, m_ssl_context));
{
std::lock_guard <decltype(m_mutex)> lock (m_mutex);
@@ -296,22 +287,8 @@ OverlayImpl::onPrepare ()
// peer connections:
if (! getConfig ().RUN_STANDALONE)
{
m_doorDirect = make_PeerDoor (
PeerDoor::sslRequired,
*this,
getConfig ().PEER_IP,
getConfig ().peerListeningPort,
m_io_service);
if (getConfig ().peerPROXYListeningPort != 0)
{
m_doorProxy = make_PeerDoor (
PeerDoor::sslAndPROXYRequired,
*this,
getConfig ().PEER_IP,
getConfig ().peerPROXYListeningPort,
m_io_service);
}
m_doorDirect = make_PeerDoor (*this, getConfig ().PEER_IP,
getConfig ().peerListeningPort, m_io_service);
}
}

View File

@@ -132,12 +132,10 @@ public:
public:
/** Process an incoming connection using the Peer protocol.
The caller transfers ownership of the socket via rvalue move.
@param proxyHandshake `true` If a PROXY handshake is required.
@param socket A socket in the accepted state.
*/
void
accept (bool proxyHandshake,
socket_type&& socket);
accept (socket_type&& socket);
Peer::ShortId
next_id();

View File

@@ -20,6 +20,7 @@
#include <ripple/overlay/impl/OverlayImpl.h>
#include <ripple/overlay/impl/PeerDoor.h>
#include <beast/asio/placeholders.h>
#include <boost/asio/ip/tcp.hpp>
namespace ripple {
@@ -28,31 +29,28 @@ class PeerDoorImp
, public beast::LeakChecked <PeerDoorImp>
{
private:
using socket_type = boost::asio::ip::tcp::socket;
OverlayImpl& m_overlay;
beast::Journal m_journal;
Kind m_kind;
boost::asio::ip::tcp::acceptor m_acceptor;
boost::asio::deadline_timer m_acceptDelay;
NativeSocketType m_socket;
socket_type m_socket;
public:
PeerDoorImp (Kind kind, OverlayImpl& overlay,
PeerDoorImp (OverlayImpl& overlay,
boost::asio::ip::tcp::endpoint const &ep,
boost::asio::io_service& io_service)
: m_overlay (overlay)
, m_journal (deprecatedLogs().journal("PeerDoor"))
, m_kind (kind)
, m_acceptor (io_service, ep)
, m_acceptDelay (io_service)
, m_socket (io_service)
{
m_journal.info <<
"Listening on " <<
beast::IPAddressConversion::from_asio (
m_acceptor.local_endpoint()) <<
((m_kind == sslAndPROXYRequired) ? " (proxy)" : "");
async_accept ();
"Listening on " << beast::IPAddressConversion::from_asio (
m_acceptor.local_endpoint());
async_accept();
}
void
@@ -103,9 +101,7 @@ public:
if (! ec)
{
bool const proxyHandshake (m_kind == sslAndPROXYRequired);
m_overlay.accept (proxyHandshake, std::move(m_socket));
m_overlay.accept (std::move(m_socket));
}
else
{
@@ -133,10 +129,8 @@ public:
//------------------------------------------------------------------------------
std::unique_ptr<PeerDoor>
make_PeerDoor (
PeerDoor::Kind kind, OverlayImpl& overlay,
std::string const& ip, int port,
boost::asio::io_service& io_service)
make_PeerDoor (OverlayImpl& overlay, std::string const& ip, int port,
boost::asio::io_service& io_service)
{
// You have to listen on something!
bassert(port != 0);
@@ -145,7 +139,7 @@ make_PeerDoor (
boost::asio::ip::address ().from_string (
ip.empty () ? "0.0.0.0" : ip), port);
return std::make_unique<PeerDoorImp>(kind, overlay, ep, io_service);
return std::make_unique<PeerDoorImp>(overlay, ep, io_service);
}
}

View File

@@ -21,7 +21,6 @@
#define RIPPLE_PEERDOOR_H_INCLUDED
#include <ripple/overlay/impl/OverlayImpl.h>
#include <beast/cxx14/memory.h> // <memory>
namespace ripple {
@@ -30,23 +29,17 @@ namespace ripple {
class PeerDoor
{
public:
virtual ~PeerDoor () = default;
enum Kind
{
sslRequired,
sslAndPROXYRequired
};
virtual
~PeerDoor() = default;
virtual
void stop() = 0;
};
// VFALCO DEPRECATED This will be replaced by a universal door
std::unique_ptr <PeerDoor>
make_PeerDoor (
PeerDoor::Kind kind, OverlayImpl& overlay,
std::string const& ip, int port,
boost::asio::io_service& io_service);
make_PeerDoor (OverlayImpl& overlay, std::string const& ip, int port,
boost::asio::io_service& io_service);
}

View File

@@ -25,24 +25,21 @@
namespace ripple {
PeerImp::PeerImp (NativeSocketType&& socket, beast::IP::Endpoint remoteAddress,
PeerImp::PeerImp (socket_type&& socket, beast::IP::Endpoint remoteAddress,
OverlayImpl& overlay, Resource::Manager& resourceManager,
PeerFinder::Manager& peerFinder, PeerFinder::Slot::ptr const& slot,
boost::asio::ssl::context& ssl_context, MultiSocket::Flag flags)
: m_owned_socket (std::move (socket))
, journal_ (deprecatedLogs().journal("Peer"))
boost::asio::ssl::context& ssl_context)
: journal_ (deprecatedLogs().journal("Peer"))
, socket_ (std::move (socket))
, stream_ (socket_, ssl_context)
, strand_ (socket_.get_io_service())
, timer_ (socket_.get_io_service())
, remote_address_ (remoteAddress)
, resourceManager_ (resourceManager)
, peerFinder_ (peerFinder)
, overlay_ (overlay)
, m_inbound (true)
, socket_ (MultiSocket::New (
m_owned_socket, ssl_context, flags.asBits ()))
, strand_ (m_owned_socket.get_io_service())
, state_ (stateConnected)
, minLedger_ (0)
, maxLedger_ (0)
, timer_ (m_owned_socket.get_io_service())
, slot_ (slot)
, message_stream_(*this)
{
@@ -52,21 +49,18 @@ PeerImp::PeerImp (beast::IP::Endpoint remoteAddress,
boost::asio::io_service& io_service, OverlayImpl& overlay,
Resource::Manager& resourceManager, PeerFinder::Manager& peerFinder,
PeerFinder::Slot::ptr const& slot,
boost::asio::ssl::context& ssl_context, MultiSocket::Flag flags)
: m_owned_socket (io_service)
, journal_ (deprecatedLogs().journal("Peer"))
boost::asio::ssl::context& ssl_context)
: journal_ (deprecatedLogs().journal("Peer"))
, socket_ (io_service)
, stream_ (socket_, ssl_context)
, strand_ (socket_.get_io_service())
, timer_ (socket_.get_io_service())
, remote_address_ (remoteAddress)
, resourceManager_ (resourceManager)
, peerFinder_ (peerFinder)
, overlay_ (overlay)
, m_inbound (false)
, socket_ (MultiSocket::New (
io_service, ssl_context, flags.asBits ()))
, strand_ (io_service)
, state_ (stateConnecting)
, minLedger_ (0)
, maxLedger_ (0)
, timer_ (io_service)
, slot_ (slot)
, message_stream_(*this)
{
@@ -94,8 +88,8 @@ PeerImp::close()
&PeerImp::close, shared_from_this()));
error_code ec;
timer_.cancel (ec);
socket_->close(ec);
timer_.cancel(ec);
stream_.next_layer().close(ec);
}
//------------------------------------------------------------------------------
@@ -317,7 +311,7 @@ void PeerImp::do_connect ()
return detach ("do_connect");
}
socket_->next_layer <NativeSocketType>().async_connect (
stream_.next_layer().async_connect (
beast::IPAddressConversion::to_asio_endpoint (remote_address_),
strand_.wrap (std::bind (&PeerImp::on_connect,
shared_from_this (), beast::asio::placeholders::error)));
@@ -329,10 +323,9 @@ PeerImp::on_connect (error_code ec)
if (detaching_ || ec == boost::asio::error::operation_aborted)
return;
NativeSocketType::endpoint_type local_endpoint;
socket_type::endpoint_type local_endpoint;
if (! ec)
local_endpoint = socket_->this_layer <
NativeSocketType> ().local_endpoint (ec);
local_endpoint = stream_.next_layer().local_endpoint (ec);
if (ec)
{
@@ -349,8 +342,8 @@ PeerImp::on_connect (error_code ec)
beast::IPAddressConversion::from_asio (local_endpoint)))
return detach("dup");
socket_->set_verify_mode (boost::asio::ssl::verify_none);
socket_->async_handshake (
stream_.set_verify_mode (boost::asio::ssl::verify_none);
stream_.async_handshake (
boost::asio::ssl::stream_base::client,
strand_.wrap (std::bind (&PeerImp::on_connect_ssl,
std::static_pointer_cast <PeerImp> (shared_from_this ()),
@@ -366,7 +359,7 @@ PeerImp::make_request()
m.url ("/");
m.version (1, 1);
m.headers.append ("User-Agent", BuildInfo::getFullVersionString());
//m.headers.append ("Local-Address", socket_->
//m.headers.append ("Local-Address", stream_.
m.headers.append ("Remote-Address", remote_address_.to_string());
m.headers.append ("Upgrade",
std::string("Ripple/") + to_string (BuildInfo::getCurrentProtocol()));
@@ -431,7 +424,7 @@ PeerImp::on_write_http_request (error_code ec, std::size_t bytes_transferred)
return;
}
socket_->async_write_some (write_buffer_.data(),
stream_.async_write_some (write_buffer_.data(),
strand_.wrap (std::bind (&PeerImp::on_write_http_request,
shared_from_this(), beast::asio::placeholders::error,
beast::asio::placeholders::bytes_transferred)));
@@ -489,7 +482,7 @@ PeerImp::on_read_http_response (error_code ec, std::size_t bytes_transferred)
return;
}
socket_->async_read_some (read_buffer_.prepare (Tuning::readBufferBytes),
stream_.async_read_some (read_buffer_.prepare (Tuning::readBufferBytes),
strand_.wrap (std::bind (&PeerImp::on_read_http_response,
shared_from_this(), beast::asio::placeholders::error,
beast::asio::placeholders::bytes_transferred)));
@@ -515,8 +508,8 @@ void PeerImp::do_accept ()
return;
}
socket_->set_verify_mode (boost::asio::ssl::verify_none);
socket_->async_handshake (boost::asio::ssl::stream_base::server,
stream_.set_verify_mode (boost::asio::ssl::verify_none);
stream_.async_handshake (boost::asio::ssl::stream_base::server,
strand_.wrap (std::bind (&PeerImp::on_accept_ssl,
std::static_pointer_cast <PeerImp> (shared_from_this ()),
beast::asio::placeholders::error)));
@@ -577,7 +570,7 @@ PeerImp::on_read_http_detect (error_code ec, std::size_t bytes_transferred)
return;
}
socket_->async_read_some (read_buffer_.prepare (Tuning::readBufferBytes),
stream_.async_read_some (read_buffer_.prepare (Tuning::readBufferBytes),
strand_.wrap (std::bind (&PeerImp::on_read_http_detect,
shared_from_this(), beast::asio::placeholders::error,
beast::asio::placeholders::bytes_transferred)));
@@ -644,7 +637,7 @@ PeerImp::on_read_http_request (error_code ec, std::size_t bytes_transferred)
return;
}
socket_->async_read_some (read_buffer_.prepare (Tuning::readBufferBytes),
stream_.async_read_some (read_buffer_.prepare (Tuning::readBufferBytes),
strand_.wrap (std::bind (&PeerImp::on_read_http_request,
shared_from_this(), beast::asio::placeholders::error,
beast::asio::placeholders::bytes_transferred)));
@@ -681,7 +674,7 @@ PeerImp::on_write_http_response (error_code ec, std::size_t bytes_transferred)
return;
}
socket_->async_write_some (write_buffer_.data(),
stream_.async_write_some (write_buffer_.data(),
strand_.wrap (std::bind (&PeerImp::on_write_http_response,
shared_from_this(), beast::asio::placeholders::error,
beast::asio::placeholders::bytes_transferred)));
@@ -731,7 +724,7 @@ PeerImp::on_read_protocol (error_code ec, std::size_t bytes_transferred)
return;
}
socket_->async_read_some (read_buffer_.prepare (Tuning::readBufferBytes),
stream_.async_read_some (read_buffer_.prepare (Tuning::readBufferBytes),
strand_.wrap (std::bind (&PeerImp::on_read_protocol,
shared_from_this(), beast::asio::placeholders::error,
beast::asio::placeholders::bytes_transferred)));
@@ -2137,15 +2130,14 @@ PeerImp::detach (const char* rsn, bool graceful)
if (graceful)
{
socket_->async_shutdown (
strand_.wrap ( std::bind(
&PeerImp::handleShutdown,
std::static_pointer_cast <PeerImp> (shared_from_this ()),
stream_.async_shutdown (strand_.wrap (std::bind(
&PeerImp::handleShutdown, shared_from_this(),
beast::asio::placeholders::error)));
}
else
{
socket_->cancel ();
error_code ec;
stream_.next_layer().cancel(ec);
}
// VFALCO TODO Stop doing this.
@@ -2187,7 +2179,7 @@ PeerImp::sendForce (const Message::pointer& packet)
{
send_packet_ = packet;
boost::asio::async_write (*socket_,
boost::asio::async_write (stream_,
boost::asio::buffer (packet->getBuffer ()),
strand_.wrap (std::bind (
&PeerImp::handleWrite,
@@ -2219,7 +2211,7 @@ PeerImp::hashLatestFinishedMessage (const SSL *sslSession, unsigned char *hash,
bool
PeerImp::calculateSessionCookie ()
{
SSL* ssl = socket_->ssl_handle ();
SSL* ssl = stream_.native_handle();
if (!ssl)
{

View File

@@ -20,7 +20,6 @@
#ifndef RIPPLE_OVERLAY_PEERIMP_H_INCLUDED
#define RIPPLE_OVERLAY_PEERIMP_H_INCLUDED
#include <ripple/common/MultiSocket.h>
#include <ripple/nodestore/Database.h>
#include <ripple/overlay/predicates.h>
#include <ripple/overlay/impl/message_name.h>
@@ -49,8 +48,6 @@
namespace ripple {
typedef boost::asio::ip::tcp::socket NativeSocketType;
class PeerImp;
std::string to_string (Peer const& peer);
@@ -96,6 +93,12 @@ public:
typedef std::shared_ptr <PeerImp> ptr;
private:
using clock_type = std::chrono::steady_clock;
using error_code= boost::system::error_code ;
using yield_context = boost::asio::yield_context;
using socket_type = boost::asio::ip::tcp::socket;
using stream_type = boost::asio::ssl::stream <socket_type&>;
// Time alloted for a peer to send a HELLO message (DEPRECATED)
static const boost::posix_time::seconds nodeVerifySeconds;
@@ -105,9 +108,11 @@ private:
// The length of the smallest valid finished message
static const size_t sslMinimumFinishedLength = 12;
NativeSocketType m_owned_socket;
beast::Journal journal_;
socket_type socket_;
stream_type stream_;
boost::asio::io_service::strand strand_;
boost::asio::deadline_timer timer_;
// A unique identifier (up to a restart of rippled) for this particular
// peer instance. A peer that disconnects will, upon reconnection, get a
@@ -126,10 +131,7 @@ private:
OverlayImpl& overlay_;
bool m_inbound;
std::unique_ptr <MultiSocket> socket_;
boost::asio::io_service::strand strand_;
State state_; // Current state
State state_; // Current state
bool detaching_ = false;
// True if peer is a node in our cluster
@@ -147,17 +149,15 @@ private:
// The indices of the smallest and largest ledgers this peer has available
//
LedgerIndex minLedger_;
LedgerIndex maxLedger_;
LedgerIndex minLedger_ = 0;
LedgerIndex maxLedger_ = 0;
uint256 closedLedgerHash_;
uint256 previousLedgerHash_;
std::list<uint256> recentLedgers_;
std::list<uint256> recentTxSets_;
mutable std::mutex recentLock_;
boost::asio::deadline_timer timer_;
std::list<uint256> recentLedgers_;
std::list<uint256> recentTxSets_;
mutable std::mutex recentLock_;
std::list <Message::pointer> send_queue_;
Message::pointer send_packet_;
@@ -182,10 +182,10 @@ private:
public:
/** Create an incoming peer from the specified socket */
PeerImp (NativeSocketType&& socket, beast::IP::Endpoint remoteAddress,
PeerImp (socket_type&& socket, beast::IP::Endpoint remoteAddress,
OverlayImpl& overlay, Resource::Manager& resourceManager,
PeerFinder::Manager& peerFinder, PeerFinder::Slot::ptr const& slot,
boost::asio::ssl::context& ssl_context, MultiSocket::Flag flags);
boost::asio::ssl::context& ssl_context);
/** Create an outgoing peer
@note Construction of outbound peers is a two step process: a second
@@ -196,7 +196,7 @@ public:
PeerImp (beast::IP::Endpoint remoteAddress, boost::asio::io_service& io_service,
OverlayImpl& overlay, Resource::Manager& resourceManager,
PeerFinder::Manager& peerFinder, PeerFinder::Slot::ptr const& slot,
boost::asio::ssl::context& ssl_context, MultiSocket::Flag flags);
boost::asio::ssl::context& ssl_context);
virtual
~PeerImp ();

View File

@@ -20,7 +20,6 @@
#include <BeastConfig.h>
#include <ripple/common/impl/KeyCache.cpp>
#include <ripple/common/impl/MultiSocket.cpp>
#include <ripple/common/impl/ResolverAsio.cpp>
#include <ripple/common/impl/RippleSSLContext.cpp>
#include <ripple/common/impl/TaggedCache.cpp>