mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Clean up Overlay and PeerFinder sources:
* Tidy up identifiers and declarations * Merge PeerFinder headers into one file * Merge handout classes and functions into one file
This commit is contained in:
@@ -2832,12 +2832,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\overlay\tests\peer_info.test.cpp">
|
<ClCompile Include="..\..\src\ripple\overlay\tests\peer_info.test.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\Callback.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\Config.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\Endpoint.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Bootcache.cpp">
|
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Bootcache.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -2853,11 +2847,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Config.cpp">
|
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Config.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\ConnectHandouts.cpp">
|
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\ConnectHandouts.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Counts.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Counts.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Endpoint.cpp">
|
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Endpoint.cpp">
|
||||||
@@ -2865,7 +2854,7 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Fixed.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Fixed.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\handout.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Handouts.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\iosformat.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\impl\iosformat.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -2879,18 +2868,8 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Manager.cpp">
|
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Manager.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\RedirectHandouts.cpp">
|
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\RedirectHandouts.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Reporting.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Reporting.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\SlotHandouts.cpp">
|
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\SlotHandouts.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\SlotImp.cpp">
|
<ClCompile Include="..\..\src\ripple\peerfinder\impl\SlotImp.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -2932,8 +2911,6 @@
|
|||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\Slot.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\Slot.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\Types.h">
|
|
||||||
</ClInclude>
|
|
||||||
<CustomBuild Include="..\..\src\ripple\proto\ripple.proto">
|
<CustomBuild Include="..\..\src\ripple\proto\ripple.proto">
|
||||||
<FileType>Document</FileType>
|
<FileType>Document</FileType>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='debug|x64'">protoc --cpp_out=..\..\build\proto --proto_path=%(RelativeDir) %(Identity)</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='debug|x64'">protoc --cpp_out=..\..\build\proto --proto_path=%(RelativeDir) %(Identity)</Command>
|
||||||
|
|||||||
@@ -3978,15 +3978,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\overlay\tests\peer_info.test.cpp">
|
<ClCompile Include="..\..\src\ripple\overlay\tests\peer_info.test.cpp">
|
||||||
<Filter>ripple\overlay\tests</Filter>
|
<Filter>ripple\overlay\tests</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\Callback.h">
|
|
||||||
<Filter>ripple\peerfinder</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\Config.h">
|
|
||||||
<Filter>ripple\peerfinder</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\Endpoint.h">
|
|
||||||
<Filter>ripple\peerfinder</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Bootcache.cpp">
|
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Bootcache.cpp">
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
<Filter>ripple\peerfinder\impl</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -4005,12 +3996,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Config.cpp">
|
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Config.cpp">
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
<Filter>ripple\peerfinder\impl</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\ConnectHandouts.cpp">
|
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\ConnectHandouts.h">
|
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Counts.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Counts.h">
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
<Filter>ripple\peerfinder\impl</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -4020,7 +4005,7 @@
|
|||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Fixed.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Fixed.h">
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
<Filter>ripple\peerfinder\impl</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\handout.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Handouts.h">
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
<Filter>ripple\peerfinder\impl</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\iosformat.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\impl\iosformat.h">
|
||||||
@@ -4038,21 +4023,9 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Manager.cpp">
|
<ClCompile Include="..\..\src\ripple\peerfinder\impl\Manager.cpp">
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
<Filter>ripple\peerfinder\impl</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\RedirectHandouts.cpp">
|
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\RedirectHandouts.h">
|
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Reporting.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\impl\Reporting.h">
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
<Filter>ripple\peerfinder\impl</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\SlotHandouts.cpp">
|
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\impl\SlotHandouts.h">
|
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\peerfinder\impl\SlotImp.cpp">
|
<ClCompile Include="..\..\src\ripple\peerfinder\impl\SlotImp.cpp">
|
||||||
<Filter>ripple\peerfinder\impl</Filter>
|
<Filter>ripple\peerfinder\impl</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -4110,9 +4083,6 @@
|
|||||||
<ClInclude Include="..\..\src\ripple\peerfinder\Slot.h">
|
<ClInclude Include="..\..\src\ripple\peerfinder\Slot.h">
|
||||||
<Filter>ripple\peerfinder</Filter>
|
<Filter>ripple\peerfinder</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple\peerfinder\Types.h">
|
|
||||||
<Filter>ripple\peerfinder</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<CustomBuild Include="..\..\src\ripple\proto\ripple.proto">
|
<CustomBuild Include="..\..\src\ripple\proto\ripple.proto">
|
||||||
<Filter>ripple\proto</Filter>
|
<Filter>ripple\proto</Filter>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
|
|||||||
@@ -60,8 +60,11 @@ public:
|
|||||||
virtual ShortId getShortId () const = 0;
|
virtual ShortId getShortId () const = 0;
|
||||||
virtual RippleAddress const& getNodePublic () const = 0;
|
virtual RippleAddress const& getNodePublic () const = 0;
|
||||||
virtual Json::Value json () = 0;
|
virtual Json::Value json () = 0;
|
||||||
|
// VFALCO TODO Replace both with
|
||||||
|
// boost::optional<std::string> const& cluster_id();
|
||||||
|
//
|
||||||
virtual bool isInCluster () const = 0;
|
virtual bool isInCluster () const = 0;
|
||||||
virtual std::string getClusterNodeName() const = 0;
|
virtual std::string const& getClusterNodeName() const = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Ledger
|
// Ledger
|
||||||
|
|||||||
@@ -539,7 +539,7 @@ OverlayImpl::getActivePeers ()
|
|||||||
|
|
||||||
ret.reserve (m_publicKeyMap.size ());
|
ret.reserve (m_publicKeyMap.size ());
|
||||||
|
|
||||||
BOOST_FOREACH (PeerByPublicKey::value_type const& pair, m_publicKeyMap)
|
for (auto const& pair : m_publicKeyMap)
|
||||||
{
|
{
|
||||||
assert (pair.second);
|
assert (pair.second);
|
||||||
ret.push_back (pair.second);
|
ret.push_back (pair.second);
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
#include <ripple/common/Resolver.h>
|
#include <ripple/common/Resolver.h>
|
||||||
#include <ripple/common/seconds_clock.h>
|
#include <ripple/common/seconds_clock.h>
|
||||||
#include <ripple/common/UnorderedContainers.h>
|
#include <ripple/common/UnorderedContainers.h>
|
||||||
#include <ripple/peerfinder/Callback.h>
|
|
||||||
#include <ripple/peerfinder/Manager.h>
|
#include <ripple/peerfinder/Manager.h>
|
||||||
#include <ripple/resource/api/Manager.h>
|
#include <ripple/resource/api/Manager.h>
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,54 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef RIPPLE_PEERFINDER_CALLBACK_H_INCLUDED
|
|
||||||
#define RIPPLE_PEERFINDER_CALLBACK_H_INCLUDED
|
|
||||||
|
|
||||||
#include <ripple/peerfinder/Slot.h>
|
|
||||||
#include <ripple/peerfinder/Types.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
/** The Callback receives PeerFinder notifications.
|
|
||||||
The notifications are sent on a thread owned by the PeerFinder,
|
|
||||||
so it is best not to do too much work in here. Just post functor
|
|
||||||
to another worker thread or job queue and return.
|
|
||||||
*/
|
|
||||||
struct Callback
|
|
||||||
{
|
|
||||||
/** Initiate outgoing Peer connections to the specified set of endpoints. */
|
|
||||||
virtual void connect (IPAddresses const& addresses) = 0;
|
|
||||||
|
|
||||||
/** Activate the handshaked peer with the specified address. */
|
|
||||||
virtual void activate (Slot::ptr const& slot) = 0;
|
|
||||||
|
|
||||||
/** Sends a set of Endpoint records to the specified peer. */
|
|
||||||
virtual void send (Slot::ptr const& slot, Endpoints const& endpoints) = 0;
|
|
||||||
|
|
||||||
/** Disconnect the handshaked peer with the specified address.
|
|
||||||
@param graceful `true` to wait for send buffers to drain before closing.
|
|
||||||
*/
|
|
||||||
virtual void disconnect (Slot::ptr const& slot, bool graceful) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef RIPPLE_PEERFINDER_CONFIG_H_INCLUDED
|
|
||||||
#define RIPPLE_PEERFINDER_CONFIG_H_INCLUDED
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
/** PeerFinder configuration settings. */
|
|
||||||
struct Config
|
|
||||||
{
|
|
||||||
/** The largest number of public peer slots to allow.
|
|
||||||
This includes both inbound and outbound, but does not include
|
|
||||||
fixed peers.
|
|
||||||
*/
|
|
||||||
int maxPeers;
|
|
||||||
|
|
||||||
/** The number of automatic outbound connections to maintain.
|
|
||||||
Outbound connections are only maintained if autoConnect
|
|
||||||
is `true`. The value can be fractional; The decision to round up
|
|
||||||
or down will be made using a per-process pseudorandom number and
|
|
||||||
a probability proportional to the fractional part.
|
|
||||||
Example:
|
|
||||||
If outPeers is 9.3, then 30% of nodes will maintain 9 outbound
|
|
||||||
connections, while 70% of nodes will maintain 10 outbound
|
|
||||||
connections.
|
|
||||||
*/
|
|
||||||
double outPeers;
|
|
||||||
|
|
||||||
/** `true` if we want to accept incoming connections. */
|
|
||||||
bool wantIncoming;
|
|
||||||
|
|
||||||
/** `true` if we want to establish connections automatically */
|
|
||||||
bool autoConnect;
|
|
||||||
|
|
||||||
/** The listening port number. */
|
|
||||||
std::uint16_t listeningPort;
|
|
||||||
|
|
||||||
/** The set of features we advertise. */
|
|
||||||
std::string features;
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/** Create a configuration with default values. */
|
|
||||||
Config ();
|
|
||||||
|
|
||||||
/** Returns a suitable value for outPeers according to the rules. */
|
|
||||||
double calcOutPeers () const;
|
|
||||||
|
|
||||||
/** Adjusts the values so they follow the business rules. */
|
|
||||||
void applyTuning ();
|
|
||||||
|
|
||||||
/** Write the configuration into a property stream */
|
|
||||||
void onWrite (beast::PropertyStream::Map& map);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef RIPPLE_PEERFINDER_ENDPOINT_H_INCLUDED
|
|
||||||
#define RIPPLE_PEERFINDER_ENDPOINT_H_INCLUDED
|
|
||||||
|
|
||||||
#include <beast/net/IPEndpoint.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
/** Describes a connectible peer address along with some metadata. */
|
|
||||||
struct Endpoint
|
|
||||||
{
|
|
||||||
Endpoint ();
|
|
||||||
|
|
||||||
Endpoint (beast::IP::Endpoint const& ep, int hops_);
|
|
||||||
|
|
||||||
int hops;
|
|
||||||
beast::IP::Endpoint address;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool operator< (Endpoint const& lhs, Endpoint const& rhs);
|
|
||||||
|
|
||||||
} // namespace PeerFinder
|
|
||||||
} // namespace ripple
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -20,16 +20,122 @@
|
|||||||
#ifndef RIPPLE_PEERFINDER_MANAGER_H_INCLUDED
|
#ifndef RIPPLE_PEERFINDER_MANAGER_H_INCLUDED
|
||||||
#define RIPPLE_PEERFINDER_MANAGER_H_INCLUDED
|
#define RIPPLE_PEERFINDER_MANAGER_H_INCLUDED
|
||||||
|
|
||||||
#include <ripple/peerfinder/Callback.h>
|
|
||||||
#include <ripple/peerfinder/Config.h>
|
|
||||||
#include <ripple/peerfinder/Slot.h>
|
#include <ripple/peerfinder/Slot.h>
|
||||||
#include <ripple/peerfinder/Types.h>
|
|
||||||
#include <ripple/sitefiles/api/Manager.h>
|
#include <ripple/sitefiles/api/Manager.h>
|
||||||
|
#include <beast/chrono/abstract_clock.h>
|
||||||
#include <beast/module/core/files/File.h>
|
#include <beast/module/core/files/File.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
namespace PeerFinder {
|
namespace PeerFinder {
|
||||||
|
|
||||||
|
typedef beast::abstract_clock <std::chrono::seconds> clock_type;
|
||||||
|
|
||||||
|
/** Represents a set of addresses. */
|
||||||
|
typedef std::vector <beast::IP::Endpoint> IPAddresses;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** PeerFinder configuration settings. */
|
||||||
|
struct Config
|
||||||
|
{
|
||||||
|
/** The largest number of public peer slots to allow.
|
||||||
|
This includes both inbound and outbound, but does not include
|
||||||
|
fixed peers.
|
||||||
|
*/
|
||||||
|
int maxPeers;
|
||||||
|
|
||||||
|
/** The number of automatic outbound connections to maintain.
|
||||||
|
Outbound connections are only maintained if autoConnect
|
||||||
|
is `true`. The value can be fractional; The decision to round up
|
||||||
|
or down will be made using a per-process pseudorandom number and
|
||||||
|
a probability proportional to the fractional part.
|
||||||
|
Example:
|
||||||
|
If outPeers is 9.3, then 30% of nodes will maintain 9 outbound
|
||||||
|
connections, while 70% of nodes will maintain 10 outbound
|
||||||
|
connections.
|
||||||
|
*/
|
||||||
|
double outPeers;
|
||||||
|
|
||||||
|
/** `true` if we want to accept incoming connections. */
|
||||||
|
bool wantIncoming;
|
||||||
|
|
||||||
|
/** `true` if we want to establish connections automatically */
|
||||||
|
bool autoConnect;
|
||||||
|
|
||||||
|
/** The listening port number. */
|
||||||
|
std::uint16_t listeningPort;
|
||||||
|
|
||||||
|
/** The set of features we advertise. */
|
||||||
|
std::string features;
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** Create a configuration with default values. */
|
||||||
|
Config ();
|
||||||
|
|
||||||
|
/** Returns a suitable value for outPeers according to the rules. */
|
||||||
|
double calcOutPeers () const;
|
||||||
|
|
||||||
|
/** Adjusts the values so they follow the business rules. */
|
||||||
|
void applyTuning ();
|
||||||
|
|
||||||
|
/** Write the configuration into a property stream */
|
||||||
|
void onWrite (beast::PropertyStream::Map& map);
|
||||||
|
};
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** Describes a connectible peer address along with some metadata. */
|
||||||
|
struct Endpoint
|
||||||
|
{
|
||||||
|
Endpoint ();
|
||||||
|
|
||||||
|
Endpoint (beast::IP::Endpoint const& ep, int hops_);
|
||||||
|
|
||||||
|
int hops;
|
||||||
|
beast::IP::Endpoint address;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator< (Endpoint const& lhs, Endpoint const& rhs);
|
||||||
|
|
||||||
|
/** A set of Endpoint used for connecting. */
|
||||||
|
typedef std::vector <Endpoint> Endpoints;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** The Callback receives PeerFinder notifications.
|
||||||
|
The notifications are sent on a thread owned by the PeerFinder,
|
||||||
|
so it is best not to do too much work in here. Just post functor
|
||||||
|
to another worker thread or job queue and return.
|
||||||
|
*/
|
||||||
|
// DEPRECATED Callbacks only cause re-entrancy pain
|
||||||
|
struct Callback
|
||||||
|
{
|
||||||
|
/** Initiate outgoing Peer connections to the specified set of endpoints. */
|
||||||
|
virtual void connect (IPAddresses const& addresses) = 0;
|
||||||
|
|
||||||
|
/** Activate the handshaked peer with the specified address. */
|
||||||
|
virtual void activate (Slot::ptr const& slot) = 0;
|
||||||
|
|
||||||
|
/** Sends a set of Endpoint records to the specified peer. */
|
||||||
|
virtual void send (Slot::ptr const& slot, Endpoints const& endpoints) = 0;
|
||||||
|
|
||||||
|
/** Disconnect the handshaked peer with the specified address.
|
||||||
|
@param graceful `true` to wait for send buffers to drain before closing.
|
||||||
|
*/
|
||||||
|
virtual void disconnect (Slot::ptr const& slot, bool graceful) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** Possible results from activating a slot. */
|
||||||
|
enum class Result
|
||||||
|
{
|
||||||
|
duplicate,
|
||||||
|
full,
|
||||||
|
success
|
||||||
|
};
|
||||||
|
|
||||||
/** Maintains a set of IP addresses used for getting into the network. */
|
/** Maintains a set of IP addresses used for getting into the network. */
|
||||||
class Manager
|
class Manager
|
||||||
: public beast::Stoppable
|
: public beast::Stoppable
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef RIPPLE_PEERFINDER_TYPES_H_INCLUDED
|
|
||||||
#define RIPPLE_PEERFINDER_TYPES_H_INCLUDED
|
|
||||||
|
|
||||||
#include <ripple/peerfinder/Endpoint.h>
|
|
||||||
|
|
||||||
#include <beast/chrono/abstract_clock.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
/** Represents a set of addresses. */
|
|
||||||
typedef std::vector <beast::IP::Endpoint> IPAddresses;
|
|
||||||
|
|
||||||
/** A set of Endpoint used for connecting. */
|
|
||||||
typedef std::vector <Endpoint> Endpoints;
|
|
||||||
|
|
||||||
typedef beast::abstract_clock <std::chrono::seconds> clock_type;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
#ifndef RIPPLE_PEERFINDER_BOOTCACHE_H_INCLUDED
|
#ifndef RIPPLE_PEERFINDER_BOOTCACHE_H_INCLUDED
|
||||||
#define RIPPLE_PEERFINDER_BOOTCACHE_H_INCLUDED
|
#define RIPPLE_PEERFINDER_BOOTCACHE_H_INCLUDED
|
||||||
|
|
||||||
#include <ripple/peerfinder/Types.h>
|
#include <ripple/peerfinder/Manager.h>
|
||||||
#include <ripple/peerfinder/impl/Store.h>
|
#include <ripple/peerfinder/impl/Store.h>
|
||||||
#include <beast/utility/Journal.h>
|
#include <beast/utility/Journal.h>
|
||||||
#include <beast/utility/PropertyStream.h>
|
#include <beast/utility/PropertyStream.h>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
#include <ripple/peerfinder/Config.h>
|
#include <ripple/peerfinder/Manager.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
namespace PeerFinder {
|
namespace PeerFinder {
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#include <ripple/peerfinder/impl/ConnectHandouts.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
ConnectHandouts::ConnectHandouts (
|
|
||||||
std::size_t needed, Squelches& squelches)
|
|
||||||
: m_needed (needed)
|
|
||||||
, m_squelches (squelches)
|
|
||||||
{
|
|
||||||
m_list.reserve (needed);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
ConnectHandouts::try_insert (beast::IP::Endpoint const& endpoint)
|
|
||||||
{
|
|
||||||
if (full ())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Make sure the address isn't already in our list
|
|
||||||
if (std::any_of (m_list.begin(), m_list.end(),
|
|
||||||
[&endpoint](beast::IP::Endpoint const& other)
|
|
||||||
{
|
|
||||||
// Ignore port for security reasons
|
|
||||||
return other.address() ==
|
|
||||||
endpoint.address();
|
|
||||||
}))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add to squelch list so we don't try it too often.
|
|
||||||
// If its already there, then make try_insert fail.
|
|
||||||
auto const result (m_squelches.insert (
|
|
||||||
endpoint.address()));
|
|
||||||
if (! result.second)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
m_list.push_back (endpoint);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef RIPPLE_PEERFINDER_CONNECTHANDOUTS_H_INCLUDED
|
|
||||||
#define RIPPLE_PEERFINDER_CONNECTHANDOUTS_H_INCLUDED
|
|
||||||
|
|
||||||
#include <ripple/peerfinder/impl/Tuning.h>
|
|
||||||
|
|
||||||
#include <beast/container/aged_set.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
/** Receives handouts for making automatic connections. */
|
|
||||||
class ConnectHandouts
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// Keeps track of addresses we have made outgoing connections
|
|
||||||
// to, for the purposes of not connecting to them too frequently.
|
|
||||||
typedef beast::aged_set <beast::IP::Address> Squelches;
|
|
||||||
|
|
||||||
typedef std::vector <beast::IP::Endpoint> list_type;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::size_t m_needed;
|
|
||||||
Squelches& m_squelches;
|
|
||||||
list_type m_list;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ConnectHandouts (std::size_t needed, Squelches& squelches);
|
|
||||||
|
|
||||||
bool empty() const
|
|
||||||
{
|
|
||||||
return m_list.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool full() const
|
|
||||||
{
|
|
||||||
return m_list.size() >= m_needed;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool try_insert (Endpoint const& endpoint)
|
|
||||||
{
|
|
||||||
return try_insert (endpoint.address);
|
|
||||||
}
|
|
||||||
|
|
||||||
list_type& list()
|
|
||||||
{
|
|
||||||
return m_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
list_type const& list() const
|
|
||||||
{
|
|
||||||
return m_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool try_insert (beast::IP::Endpoint const& endpoint);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
#ifndef RIPPLE_PEERFINDER_COUNTS_H_INCLUDED
|
#ifndef RIPPLE_PEERFINDER_COUNTS_H_INCLUDED
|
||||||
#define RIPPLE_PEERFINDER_COUNTS_H_INCLUDED
|
#define RIPPLE_PEERFINDER_COUNTS_H_INCLUDED
|
||||||
|
|
||||||
#include <ripple/peerfinder/Config.h>
|
#include <ripple/peerfinder/Manager.h>
|
||||||
#include <ripple/peerfinder/Slot.h>
|
#include <ripple/peerfinder/Slot.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
#include <ripple/peerfinder/Endpoint.h>
|
#include <ripple/peerfinder/Manager.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
namespace PeerFinder {
|
namespace PeerFinder {
|
||||||
|
|||||||
352
src/ripple/peerfinder/impl/Handouts.h
Normal file
352
src/ripple/peerfinder/impl/Handouts.h
Normal file
@@ -0,0 +1,352 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of rippled: https://github.com/ripple/rippled
|
||||||
|
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#ifndef RIPPLE_PEERFINDER_HANDOUTS_H_INCLUDED
|
||||||
|
#define RIPPLE_PEERFINDER_HANDOUTS_H_INCLUDED
|
||||||
|
|
||||||
|
#include <ripple/peerfinder/impl/SlotImp.h>
|
||||||
|
#include <ripple/peerfinder/impl/Tuning.h>
|
||||||
|
#include <beast/container/aged_set.h>
|
||||||
|
#include <cassert>
|
||||||
|
#include <iterator>
|
||||||
|
#include <beast/cxx14/type_traits.h> // <type_traits>
|
||||||
|
|
||||||
|
namespace ripple {
|
||||||
|
namespace PeerFinder {
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
/** Try to insert one object in the target.
|
||||||
|
When an item is handed out it is moved to the end of the container.
|
||||||
|
@return The number of objects inserted
|
||||||
|
*/
|
||||||
|
// VFALCO TODO specialization that handles std::list for SequenceContainer
|
||||||
|
// using splice for optimization over erase/push_back
|
||||||
|
//
|
||||||
|
template <class Target, class HopContainer>
|
||||||
|
std::size_t
|
||||||
|
handout_one (Target& t, HopContainer& h)
|
||||||
|
{
|
||||||
|
assert (! t.full());
|
||||||
|
for (auto it = h.begin(); it != h.end(); ++it)
|
||||||
|
{
|
||||||
|
auto const& e = *it;
|
||||||
|
if (t.try_insert (e))
|
||||||
|
{
|
||||||
|
h.move_back (it);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Distributes objects to targets according to business rules.
|
||||||
|
A best effort is made to evenly distribute items in the sequence
|
||||||
|
container list into the target sequence list.
|
||||||
|
*/
|
||||||
|
template <class TargetFwdIter, class SeqFwdIter>
|
||||||
|
void
|
||||||
|
handout (TargetFwdIter first, TargetFwdIter last,
|
||||||
|
SeqFwdIter seq_first, SeqFwdIter seq_last)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
std::size_t n (0);
|
||||||
|
for (auto si = seq_first; si != seq_last; ++si)
|
||||||
|
{
|
||||||
|
auto c = *si;
|
||||||
|
bool all_full (true);
|
||||||
|
for (auto ti = first; ti != last; ++ti)
|
||||||
|
{
|
||||||
|
auto& t = *ti;
|
||||||
|
if (! t.full())
|
||||||
|
{
|
||||||
|
n += detail::handout_one (t, c);
|
||||||
|
all_full = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (all_full)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (! n)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** Receives handouts for redirecting a connection.
|
||||||
|
An incoming connection request is redirected when we are full on slots.
|
||||||
|
*/
|
||||||
|
class RedirectHandouts
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template <class = void>
|
||||||
|
explicit
|
||||||
|
RedirectHandouts (SlotImp::ptr const& slot);
|
||||||
|
|
||||||
|
template <class = void>
|
||||||
|
bool try_insert (Endpoint const& ep);
|
||||||
|
|
||||||
|
bool full () const
|
||||||
|
{
|
||||||
|
return list_.size() >= Tuning::redirectEndpointCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
SlotImp::ptr const& slot () const
|
||||||
|
{
|
||||||
|
return slot_;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector <Endpoint> const& list() const
|
||||||
|
{
|
||||||
|
return list_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
SlotImp::ptr slot_;
|
||||||
|
std::vector <Endpoint> list_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class>
|
||||||
|
RedirectHandouts::RedirectHandouts (SlotImp::ptr const& slot)
|
||||||
|
: slot_ (slot)
|
||||||
|
{
|
||||||
|
list_.reserve (Tuning::redirectEndpointCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class>
|
||||||
|
bool
|
||||||
|
RedirectHandouts::try_insert (Endpoint const& ep)
|
||||||
|
{
|
||||||
|
if (full ())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// VFALCO NOTE This check can be removed when we provide the
|
||||||
|
// addresses in a peer HTTP handshake instead of
|
||||||
|
// the tmENDPOINTS message.
|
||||||
|
//
|
||||||
|
if (ep.hops > Tuning::maxHops)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Don't send them our address
|
||||||
|
if (ep.hops == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Don't send them their own address
|
||||||
|
if (slot_->remote_endpoint().address() ==
|
||||||
|
ep.address.address())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Make sure the address isn't already in our list
|
||||||
|
if (std::any_of (list_.begin(), list_.end(),
|
||||||
|
[&ep](Endpoint const& other)
|
||||||
|
{
|
||||||
|
// Ignore port for security reasons
|
||||||
|
return other.address.address() == ep.address.address();
|
||||||
|
}))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_.emplace_back (ep.address, ep.hops);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** Receives endpoints for a slot during periodic handouts. */
|
||||||
|
class SlotHandouts
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template <class = void>
|
||||||
|
explicit
|
||||||
|
SlotHandouts (SlotImp::ptr const& slot);
|
||||||
|
|
||||||
|
template <class = void>
|
||||||
|
bool try_insert (Endpoint const& ep);
|
||||||
|
|
||||||
|
bool full () const
|
||||||
|
{
|
||||||
|
return list_.size() >= Tuning::numberOfEndpoints;
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert (Endpoint const& ep)
|
||||||
|
{
|
||||||
|
list_.push_back (ep);
|
||||||
|
}
|
||||||
|
|
||||||
|
SlotImp::ptr const& slot () const
|
||||||
|
{
|
||||||
|
return slot_;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector <Endpoint> const& list() const
|
||||||
|
{
|
||||||
|
return list_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
SlotImp::ptr slot_;
|
||||||
|
std::vector <Endpoint> list_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class>
|
||||||
|
SlotHandouts::SlotHandouts (SlotImp::ptr const& slot)
|
||||||
|
: slot_ (slot)
|
||||||
|
{
|
||||||
|
list_.reserve (Tuning::numberOfEndpoints);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class>
|
||||||
|
bool
|
||||||
|
SlotHandouts::try_insert (Endpoint const& ep)
|
||||||
|
{
|
||||||
|
if (full ())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (ep.hops > Tuning::maxHops)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (slot_->recent.filter (ep.address, ep.hops))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Don't send them their own address
|
||||||
|
if (slot_->remote_endpoint().address() ==
|
||||||
|
ep.address.address())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Make sure the address isn't already in our list
|
||||||
|
if (std::any_of (list_.begin(), list_.end(),
|
||||||
|
[&ep](Endpoint const& other)
|
||||||
|
{
|
||||||
|
// Ignore port for security reasons
|
||||||
|
return other.address.address() == ep.address.address();
|
||||||
|
}))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
list_.emplace_back (ep.address, ep.hops);
|
||||||
|
|
||||||
|
// Insert into this slot's recent table. Although the endpoint
|
||||||
|
// didn't come from the slot, adding it to the slot's table
|
||||||
|
// prevents us from sending it again until it has expired from
|
||||||
|
// the other end's cache.
|
||||||
|
//
|
||||||
|
slot_->recent.insert (ep.address, ep.hops);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** Receives handouts for making automatic connections. */
|
||||||
|
class ConnectHandouts
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Keeps track of addresses we have made outgoing connections
|
||||||
|
// to, for the purposes of not connecting to them too frequently.
|
||||||
|
typedef beast::aged_set <beast::IP::Address> Squelches;
|
||||||
|
|
||||||
|
typedef std::vector <beast::IP::Endpoint> list_type;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::size_t m_needed;
|
||||||
|
Squelches& m_squelches;
|
||||||
|
list_type m_list;
|
||||||
|
|
||||||
|
public:
|
||||||
|
template <class = void>
|
||||||
|
ConnectHandouts (std::size_t needed, Squelches& squelches);
|
||||||
|
|
||||||
|
template <class = void>
|
||||||
|
bool try_insert (beast::IP::Endpoint const& endpoint);
|
||||||
|
|
||||||
|
bool empty() const
|
||||||
|
{
|
||||||
|
return m_list.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool full() const
|
||||||
|
{
|
||||||
|
return m_list.size() >= m_needed;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool try_insert (Endpoint const& endpoint)
|
||||||
|
{
|
||||||
|
return try_insert (endpoint.address);
|
||||||
|
}
|
||||||
|
|
||||||
|
list_type& list()
|
||||||
|
{
|
||||||
|
return m_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_type const& list() const
|
||||||
|
{
|
||||||
|
return m_list;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class>
|
||||||
|
ConnectHandouts::ConnectHandouts (
|
||||||
|
std::size_t needed, Squelches& squelches)
|
||||||
|
: m_needed (needed)
|
||||||
|
, m_squelches (squelches)
|
||||||
|
{
|
||||||
|
m_list.reserve (needed);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class>
|
||||||
|
bool
|
||||||
|
ConnectHandouts::try_insert (beast::IP::Endpoint const& endpoint)
|
||||||
|
{
|
||||||
|
if (full ())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Make sure the address isn't already in our list
|
||||||
|
if (std::any_of (m_list.begin(), m_list.end(),
|
||||||
|
[&endpoint](beast::IP::Endpoint const& other)
|
||||||
|
{
|
||||||
|
// Ignore port for security reasons
|
||||||
|
return other.address() ==
|
||||||
|
endpoint.address();
|
||||||
|
}))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add to squelch list so we don't try it too often.
|
||||||
|
// If its already there, then make try_insert fail.
|
||||||
|
auto const result (m_squelches.insert (
|
||||||
|
endpoint.address()));
|
||||||
|
if (! result.second)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_list.push_back (endpoint);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -20,8 +20,7 @@
|
|||||||
#ifndef RIPPLE_PEERFINDER_LIVECACHE_H_INCLUDED
|
#ifndef RIPPLE_PEERFINDER_LIVECACHE_H_INCLUDED
|
||||||
#define RIPPLE_PEERFINDER_LIVECACHE_H_INCLUDED
|
#define RIPPLE_PEERFINDER_LIVECACHE_H_INCLUDED
|
||||||
|
|
||||||
#include <ripple/peerfinder/Endpoint.h>
|
#include <ripple/peerfinder/Manager.h>
|
||||||
#include <ripple/peerfinder/Types.h>
|
|
||||||
#include <beast/chrono/chrono_io.h>
|
#include <beast/chrono/chrono_io.h>
|
||||||
#include <beast/container/aged_map.h>
|
#include <beast/container/aged_map.h>
|
||||||
#include <beast/utility/maybe_const.h>
|
#include <beast/utility/maybe_const.h>
|
||||||
|
|||||||
@@ -20,15 +20,12 @@
|
|||||||
#ifndef RIPPLE_PEERFINDER_LOGIC_H_INCLUDED
|
#ifndef RIPPLE_PEERFINDER_LOGIC_H_INCLUDED
|
||||||
#define RIPPLE_PEERFINDER_LOGIC_H_INCLUDED
|
#define RIPPLE_PEERFINDER_LOGIC_H_INCLUDED
|
||||||
|
|
||||||
#include <ripple/peerfinder/Callback.h>
|
#include <ripple/peerfinder/Manager.h>
|
||||||
#include <ripple/peerfinder/impl/ConnectHandouts.h>
|
|
||||||
#include <ripple/peerfinder/impl/Counts.h>
|
#include <ripple/peerfinder/impl/Counts.h>
|
||||||
#include <ripple/peerfinder/impl/Fixed.h>
|
#include <ripple/peerfinder/impl/Fixed.h>
|
||||||
#include <ripple/peerfinder/impl/handout.h>
|
|
||||||
#include <ripple/peerfinder/impl/iosformat.h>
|
#include <ripple/peerfinder/impl/iosformat.h>
|
||||||
#include <ripple/peerfinder/impl/RedirectHandouts.h>
|
#include <ripple/peerfinder/impl/Handouts.h>
|
||||||
#include <ripple/peerfinder/impl/Reporting.h>
|
#include <ripple/peerfinder/impl/Reporting.h>
|
||||||
#include <ripple/peerfinder/impl/SlotHandouts.h>
|
|
||||||
#include <ripple/peerfinder/impl/SlotImp.h>
|
#include <ripple/peerfinder/impl/SlotImp.h>
|
||||||
#include <ripple/peerfinder/impl/Source.h>
|
#include <ripple/peerfinder/impl/Source.h>
|
||||||
|
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#include <ripple/peerfinder/impl/RedirectHandouts.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
RedirectHandouts::RedirectHandouts (SlotImp::ptr const& slot)
|
|
||||||
: m_slot (slot)
|
|
||||||
{
|
|
||||||
m_list.reserve (Tuning::redirectEndpointCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
RedirectHandouts::try_insert (Endpoint const& ep)
|
|
||||||
{
|
|
||||||
if (full ())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// VFALCO NOTE This check can be removed when we provide the
|
|
||||||
// addresses in a peer HTTP handshake instead of
|
|
||||||
// the tmENDPOINTS message.
|
|
||||||
//
|
|
||||||
if (ep.hops > Tuning::maxHops)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Don't send them our address
|
|
||||||
if (ep.hops == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Don't send them their own address
|
|
||||||
if (m_slot->remote_endpoint().address() ==
|
|
||||||
ep.address.address())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Make sure the address isn't already in our list
|
|
||||||
if (std::any_of (m_list.begin(), m_list.end(),
|
|
||||||
[&ep](Endpoint const& other)
|
|
||||||
{
|
|
||||||
// Ignore port for security reasons
|
|
||||||
return other.address.address() == ep.address.address();
|
|
||||||
}))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_list.emplace_back (ep.address, ep.hops);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef RIPPLE_PEERFINDER_REDIRECTHANDOUTS_H_INCLUDED
|
|
||||||
#define RIPPLE_PEERFINDER_REDIRECTHANDOUTS_H_INCLUDED
|
|
||||||
|
|
||||||
#include <ripple/peerfinder/impl/SlotImp.h>
|
|
||||||
#include <ripple/peerfinder/impl/Tuning.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
/** Receives handouts for redirecting a connection.
|
|
||||||
An incoming connection request is redirected when we are full on slots.
|
|
||||||
*/
|
|
||||||
class RedirectHandouts
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
RedirectHandouts (SlotImp::ptr const& slot);
|
|
||||||
|
|
||||||
bool full () const
|
|
||||||
{
|
|
||||||
return m_list.size() >= Tuning::redirectEndpointCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
SlotImp::ptr const& slot () const
|
|
||||||
{
|
|
||||||
return m_slot;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector <Endpoint> const& list() const
|
|
||||||
{
|
|
||||||
return m_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool try_insert (Endpoint const& ep);
|
|
||||||
|
|
||||||
private:
|
|
||||||
SlotImp::ptr m_slot;
|
|
||||||
std::vector <Endpoint> m_list;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#include <ripple/peerfinder/impl/SlotHandouts.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
SlotHandouts::SlotHandouts (SlotImp::ptr const& slot)
|
|
||||||
: m_slot (slot)
|
|
||||||
{
|
|
||||||
m_list.reserve (Tuning::numberOfEndpoints);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
SlotHandouts::try_insert (Endpoint const& ep)
|
|
||||||
{
|
|
||||||
if (full ())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (ep.hops > Tuning::maxHops)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (m_slot->recent.filter (ep.address, ep.hops))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Don't send them their own address
|
|
||||||
if (m_slot->remote_endpoint().address() ==
|
|
||||||
ep.address.address())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Make sure the address isn't already in our list
|
|
||||||
if (std::any_of (m_list.begin(), m_list.end(),
|
|
||||||
[&ep](Endpoint const& other)
|
|
||||||
{
|
|
||||||
// Ignore port for security reasons
|
|
||||||
return other.address.address() == ep.address.address();
|
|
||||||
}))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
m_list.emplace_back (ep.address, ep.hops);
|
|
||||||
|
|
||||||
// Insert into this slot's recent table. Although the endpoint
|
|
||||||
// didn't come from the slot, adding it to the slot's table
|
|
||||||
// prevents us from sending it again until it has expired from
|
|
||||||
// the other end's cache.
|
|
||||||
//
|
|
||||||
m_slot->recent.insert (ep.address, ep.hops);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef RIPPLE_PEERFINDER_SLOTHANDOUTS_H_INCLUDED
|
|
||||||
#define RIPPLE_PEERFINDER_SLOTHANDOUTS_H_INCLUDED
|
|
||||||
|
|
||||||
#include <ripple/peerfinder/impl/SlotImp.h>
|
|
||||||
#include <ripple/peerfinder/impl/Tuning.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
/** Functor to receive endpoints for a slot during handout. */
|
|
||||||
class SlotHandouts
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit SlotHandouts (SlotImp::ptr const& slot);
|
|
||||||
|
|
||||||
bool full () const
|
|
||||||
{
|
|
||||||
return m_list.size() >= Tuning::numberOfEndpoints;
|
|
||||||
}
|
|
||||||
|
|
||||||
void insert (Endpoint const& ep)
|
|
||||||
{
|
|
||||||
m_list.push_back (ep);
|
|
||||||
}
|
|
||||||
|
|
||||||
SlotImp::ptr const& slot () const
|
|
||||||
{
|
|
||||||
return m_slot;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector <Endpoint> const& list() const
|
|
||||||
{
|
|
||||||
return m_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool try_insert (Endpoint const& ep);
|
|
||||||
|
|
||||||
private:
|
|
||||||
SlotImp::ptr m_slot;
|
|
||||||
std::vector <Endpoint> m_list;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef RIPPLE_PEERFINDER_HANDOUT_H_INCLUDED
|
|
||||||
#define RIPPLE_PEERFINDER_HANDOUT_H_INCLUDED
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace PeerFinder {
|
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
|
|
||||||
/** Tries to insert one object in the target.
|
|
||||||
When an item is handed out it is moved to the end of the container.
|
|
||||||
@return The number of objects handed out
|
|
||||||
*/
|
|
||||||
// VFALCO TODO specialization that handles std::list for SequenceContainer
|
|
||||||
// using splice for optimization over erase/push_back
|
|
||||||
//
|
|
||||||
template <class Target, class HopContainer>
|
|
||||||
std::size_t handout_one (Target& t, HopContainer& h)
|
|
||||||
{
|
|
||||||
assert (! t.full());
|
|
||||||
for (auto hi (h.begin()); hi != h.end(); ++hi)
|
|
||||||
{
|
|
||||||
auto const& e (*hi);
|
|
||||||
if (t.try_insert (e))
|
|
||||||
{
|
|
||||||
h.move_back (hi);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Distributes objects to targets according to business rules.
|
|
||||||
A best effort is made to evenly distribute items in the sequence
|
|
||||||
container list into the target sequence list.
|
|
||||||
*/
|
|
||||||
template <class TargetFwdIter, class SeqFwdIter>
|
|
||||||
void handout (TargetFwdIter first, TargetFwdIter last,
|
|
||||||
SeqFwdIter seq_first, SeqFwdIter seq_last)
|
|
||||||
{
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
std::size_t n (0);
|
|
||||||
for (auto si (seq_first); si != seq_last; ++si)
|
|
||||||
{
|
|
||||||
auto c (*si);
|
|
||||||
bool all_full (true);
|
|
||||||
for (auto ti (first); ti != last; ++ti)
|
|
||||||
{
|
|
||||||
auto& t (*ti);
|
|
||||||
if (! t.full())
|
|
||||||
{
|
|
||||||
n += detail::handout_one (t, c);
|
|
||||||
all_full = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (all_full)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (! n)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -32,6 +32,11 @@ enum MessageType
|
|||||||
// token, response = give solution to proof of work
|
// token, response = give solution to proof of work
|
||||||
// token, result = report result of pow
|
// token, result = report result of pow
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/* Requests or responds to a proof of work.
|
||||||
|
Unimplemented and unused currently.
|
||||||
|
*/
|
||||||
message TMProofWork
|
message TMProofWork
|
||||||
{
|
{
|
||||||
required string token = 1;
|
required string token = 1;
|
||||||
@@ -52,6 +57,8 @@ message TMProofWork
|
|||||||
optional PowResult result = 6;
|
optional PowResult result = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Sent on connect
|
// Sent on connect
|
||||||
message TMHello
|
message TMHello
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,12 +28,9 @@
|
|||||||
#include <ripple/peerfinder/impl/Bootcache.cpp>
|
#include <ripple/peerfinder/impl/Bootcache.cpp>
|
||||||
#include <ripple/peerfinder/impl/Checker.cpp>
|
#include <ripple/peerfinder/impl/Checker.cpp>
|
||||||
#include <ripple/peerfinder/impl/Config.cpp>
|
#include <ripple/peerfinder/impl/Config.cpp>
|
||||||
#include <ripple/peerfinder/impl/ConnectHandouts.cpp>
|
|
||||||
#include <ripple/peerfinder/impl/Endpoint.cpp>
|
#include <ripple/peerfinder/impl/Endpoint.cpp>
|
||||||
#include <ripple/peerfinder/impl/Livecache.cpp>
|
#include <ripple/peerfinder/impl/Livecache.cpp>
|
||||||
#include <ripple/peerfinder/impl/Manager.cpp>
|
#include <ripple/peerfinder/impl/Manager.cpp>
|
||||||
#include <ripple/peerfinder/impl/RedirectHandouts.cpp>
|
|
||||||
#include <ripple/peerfinder/impl/SlotHandouts.cpp>
|
|
||||||
#include <ripple/peerfinder/impl/SlotImp.cpp>
|
#include <ripple/peerfinder/impl/SlotImp.cpp>
|
||||||
#include <ripple/peerfinder/impl/SourceStrings.cpp>
|
#include <ripple/peerfinder/impl/SourceStrings.cpp>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user