diff --git a/Builds/VisualStudio2012/RippleD.vcxproj b/Builds/VisualStudio2012/RippleD.vcxproj
index 78533d76ce..31e9343a5d 100644
--- a/Builds/VisualStudio2012/RippleD.vcxproj
+++ b/Builds/VisualStudio2012/RippleD.vcxproj
@@ -1926,7 +1926,6 @@
-
diff --git a/Builds/VisualStudio2012/RippleD.vcxproj.filters b/Builds/VisualStudio2012/RippleD.vcxproj.filters
index 9e6a6a3a20..062fa9e7f3 100644
--- a/Builds/VisualStudio2012/RippleD.vcxproj.filters
+++ b/Builds/VisualStudio2012/RippleD.vcxproj.filters
@@ -1706,9 +1706,6 @@
[2] Old Ripple\ripple_app\peers
-
- [2] Old Ripple\ripple_core\functional
-
[2] Old Ripple\ripple_app\main
diff --git a/src/BeastConfig.h b/src/BeastConfig.h
index ca84a48060..2b97cb4e33 100644
--- a/src/BeastConfig.h
+++ b/src/BeastConfig.h
@@ -197,11 +197,4 @@
#define RIPPLE_USE_RPC_SERVICE_MANAGER 0
#endif
-// Here temporarily
-// Controls whether or not the new Resource manager replaces the BlackList
-// and LoadManager for measuring and controlling access to the server
-#ifndef RIPPLE_USE_RESOURCE_MANAGER
-#define RIPPLE_USE_RESOURCE_MANAGER 0
-#endif
-
#endif
diff --git a/src/ripple/resource/api/Charge.h b/src/ripple/resource/api/Charge.h
index 053c6b39ca..c6a7b3e042 100644
--- a/src/ripple/resource/api/Charge.h
+++ b/src/ripple/resource/api/Charge.h
@@ -47,6 +47,9 @@ public:
/** Converts this charge into a human readable string. */
std::string to_string () const;
+ bool operator== (Charge const&) const;
+ bool operator!= (Charge const&) const;
+
private:
value_type m_cost;
std::string m_label;
diff --git a/src/ripple/resource/api/Manager.h b/src/ripple/resource/api/Manager.h
index afdcf771dc..beb1400865 100644
--- a/src/ripple/resource/api/Manager.h
+++ b/src/ripple/resource/api/Manager.h
@@ -46,6 +46,10 @@ public:
/** Extract packaged consumer information for export. */
virtual Gossip exportConsumers () = 0;
+ /** Extract consumer information for reporting. */
+ virtual Json::Value getJson () = 0;
+ virtual Json::Value getJson (int threshold) = 0;
+
/** Import packaged consumer information.
@param origin An identifier that unique labels the origin.
*/
diff --git a/src/ripple/resource/impl/Charge.cpp b/src/ripple/resource/impl/Charge.cpp
index c792a71a81..8f33b33bcc 100644
--- a/src/ripple/resource/impl/Charge.cpp
+++ b/src/ripple/resource/impl/Charge.cpp
@@ -56,5 +56,15 @@ std::ostream& operator<< (std::ostream& os, Charge const& v)
return os;
}
+bool Charge::operator== (Charge const& c) const
+{
+ return c.m_cost == m_cost;
+}
+
+bool Charge::operator!= (Charge const& c) const
+{
+ return c.m_cost != m_cost;
+}
+
}
}
diff --git a/src/ripple/resource/impl/Consumer.cpp b/src/ripple/resource/impl/Consumer.cpp
index 62729efea8..0a44d1e16d 100644
--- a/src/ripple/resource/impl/Consumer.cpp
+++ b/src/ripple/resource/impl/Consumer.cpp
@@ -87,11 +87,15 @@ std::string Consumer::to_string () const
bool Consumer::admin () const
{
- return m_entry->admin();
+ if (m_entry != nullptr)
+ return m_entry->admin();
+
+ return false;
}
void Consumer::elevate (std::string const& name)
{
+ bassert (m_entry != nullptr);
m_entry = &m_logic->elevateToAdminEndpoint (*m_entry, name);
}
@@ -102,26 +106,31 @@ Disposition Consumer::disposition() const
Disposition Consumer::charge (Charge const& what)
{
+ bassert (m_entry != nullptr);
return m_logic->charge (*m_entry, what);
}
bool Consumer::warn ()
{
+ bassert (m_entry != nullptr);
return m_logic->warn (*m_entry);
}
bool Consumer::disconnect ()
{
+ bassert (m_entry != nullptr);
return m_logic->disconnect (*m_entry);
}
int Consumer::balance()
{
+ bassert (m_entry != nullptr);
return m_logic->balance (*m_entry);
}
Entry& Consumer::entry()
{
+ bassert (m_entry != nullptr);
return *m_entry;
}
diff --git a/src/ripple/resource/impl/Logic.h b/src/ripple/resource/impl/Logic.h
index 4bca32ad8d..3a91bfaef7 100644
--- a/src/ripple/resource/impl/Logic.h
+++ b/src/ripple/resource/impl/Logic.h
@@ -83,7 +83,7 @@ public:
Key key;
key.kind = kindInbound;
- key.address = address;
+ key.address = address.withPort (0);
Entry* entry (nullptr);
@@ -202,6 +202,61 @@ public:
return *entry;
}
+ Json::Value getJson ()
+ {
+ return getJson (warningThreshold);
+ }
+
+ Json::Value getJson (int threshold)
+ {
+ DiscreteTime const now (m_clock());
+
+ Json::Value ret (Json::objectValue);
+ SharedState::Access state (m_state);
+
+ for (List ::iterator iter (state->inbound.begin());
+ iter != state->inbound.end(); ++iter)
+ {
+ int localBalance = iter->local_balance.value (now);
+ if ((localBalance + iter->remote_balance) >= threshold)
+ {
+ Json::Value& entry = (ret[iter->to_string()] = Json::objectValue);
+ entry["local"] = localBalance;
+ entry["remote"] = iter->remote_balance;
+ entry["type"] = "outbound";
+ }
+
+ }
+ for (List ::iterator iter (state->outbound.begin());
+ iter != state->outbound.end(); ++iter)
+ {
+ int localBalance = iter->local_balance.value (now);
+ if ((localBalance + iter->remote_balance) >= threshold)
+ {
+ Json::Value& entry = (ret[iter->to_string()] = Json::objectValue);
+ entry["local"] = localBalance;
+ entry["remote"] = iter->remote_balance;
+ entry["type"] = "outbound";
+ }
+
+ }
+ for (List ::iterator iter (state->admin.begin());
+ iter != state->admin.end(); ++iter)
+ {
+ int localBalance = iter->local_balance.value (now);
+ if ((localBalance + iter->remote_balance) >= threshold)
+ {
+ Json::Value& entry = (ret[iter->to_string()] = Json::objectValue);
+ entry["local"] = localBalance;
+ entry["remote"] = iter->remote_balance;
+ entry["type"] = "admin";
+ }
+
+ }
+
+ return ret;
+ }
+
Gossip exportConsumers ()
{
DiscreteTime const now (m_clock());
@@ -318,8 +373,8 @@ public:
}
}
- for (Imports::iterator iter (state->import_table.begin());
- iter != state->import_table.end(); ++iter)
+ Imports::iterator iter (state->import_table.begin());
+ while (iter != state->import_table.end())
{
Import& import (iter->second);
if (iter->second.whenExpires <= now)
@@ -332,6 +387,8 @@ public:
iter = state->import_table.erase (iter);
}
+ else
+ ++iter;
}
}
diff --git a/src/ripple/resource/impl/Manager.cpp b/src/ripple/resource/impl/Manager.cpp
index 5c3261622f..509122e655 100644
--- a/src/ripple/resource/impl/Manager.cpp
+++ b/src/ripple/resource/impl/Manager.cpp
@@ -68,6 +68,18 @@ public:
//--------------------------------------------------------------------------
+ Json::Value getJson ()
+ {
+ return m_logic.getJson ();
+ }
+
+ Json::Value getJson (int threshold)
+ {
+ return m_logic.getJson (threshold);
+ }
+
+ //--------------------------------------------------------------------------
+
void onWrite (PropertyStream::Map& map)
{
m_logic.onWrite (map);
diff --git a/src/ripple/resource/ripple_resource.h b/src/ripple/resource/ripple_resource.h
index fd36c58c9c..a7da1f695a 100644
--- a/src/ripple/resource/ripple_resource.h
+++ b/src/ripple/resource/ripple_resource.h
@@ -26,6 +26,8 @@ namespace ripple {
using namespace beast;
}
+#include "../json/ripple_json.h"
+
# include "api/Types.h"
# include "api/Disposition.h"
# include "api/Charge.h"
diff --git a/src/ripple_app/ledger/InboundLedgers.cpp b/src/ripple_app/ledger/InboundLedgers.cpp
index e0caa175dd..6b21dd994f 100644
--- a/src/ripple_app/ledger/InboundLedgers.cpp
+++ b/src/ripple_app/ledger/InboundLedgers.cpp
@@ -130,7 +130,6 @@ void InboundLedgers::gotLedgerData (Job&, LedgerHash hash,
if (peer)
{
peer->charge (Resource::feeInvalidRequest);
- peer->applyLoadCharge (LT_InvalidRequest);
}
return;
@@ -147,7 +146,6 @@ void InboundLedgers::gotLedgerData (Job&, LedgerHash hash,
{
WriteLog (lsWARNING, InboundLedger) << "Got empty base data";
peer->charge (Resource::feeInvalidRequest);
- peer->applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -155,7 +153,6 @@ void InboundLedgers::gotLedgerData (Job&, LedgerHash hash,
{
WriteLog (lsWARNING, InboundLedger) << "Got invalid base data";
peer->charge (Resource::feeInvalidRequest);
- peer->applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -191,7 +188,6 @@ void InboundLedgers::gotLedgerData (Job&, LedgerHash hash,
{
WriteLog (lsINFO, InboundLedger) << "Got response with no nodes";
peer->charge (Resource::feeInvalidRequest);
- peer->applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -203,7 +199,6 @@ void InboundLedgers::gotLedgerData (Job&, LedgerHash hash,
{
WriteLog (lsWARNING, InboundLedger) << "Got bad node";
peer->charge (Resource::feeInvalidRequest);
- peer->applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -231,7 +226,6 @@ void InboundLedgers::gotLedgerData (Job&, LedgerHash hash,
WriteLog (lsWARNING, InboundLedger) << "Not sure what ledger data we got";
peer->charge (Resource::feeInvalidRequest);
- peer->applyLoadCharge (LT_InvalidRequest);
}
void InboundLedgers::sweep ()
diff --git a/src/ripple_app/main/Application.cpp b/src/ripple_app/main/Application.cpp
index 093698b412..813223b655 100644
--- a/src/ripple_app/main/Application.cpp
+++ b/src/ripple_app/main/Application.cpp
@@ -110,10 +110,10 @@ public:
, m_deprecatedUNL (UniqueNodeList::New (*m_jobQueue))
, m_rpcHTTPServer (RPCHTTPServer::New (*m_networkOPs,
- LogJournal::get (), *m_jobQueue, *m_networkOPs))
+ LogJournal::get (), *m_jobQueue, *m_networkOPs, *m_resourceManager))
#if ! RIPPLE_USE_RPC_SERVICE_MANAGER
- , m_rpcServerHandler (*m_networkOPs) // passive object, not a Service
+ , m_rpcServerHandler (*m_networkOPs, *m_resourceManager) // passive object, not a Service
#endif
, m_nodeStoreScheduler (*m_jobQueue, *m_jobQueue)
@@ -228,6 +228,11 @@ public:
return *m_loadManager;
}
+ Resource::Manager& getResourceManager ()
+ {
+ return *m_resourceManager;
+ }
+
TxQueue& getTxQueue ()
{
return *m_txQueue;
@@ -537,7 +542,7 @@ public:
{
m_wsPrivateDoor = WSDoor::New (*m_resourceManager,
getOPs(), getConfig ().WEBSOCKET_IP,
- getConfig ().WEBSOCKET_PORT, false,
+ getConfig ().WEBSOCKET_PORT, false, false,
m_wsSSLContext->get ());
if (m_wsPrivateDoor == nullptr)
@@ -557,7 +562,7 @@ public:
{
m_wsPublicDoor = WSDoor::New (*m_resourceManager,
getOPs(), getConfig ().WEBSOCKET_PUBLIC_IP,
- getConfig ().WEBSOCKET_PUBLIC_PORT, true,
+ getConfig ().WEBSOCKET_PUBLIC_PORT, true, false,
m_wsSSLContext->get ());
if (m_wsPublicDoor == nullptr)
@@ -570,6 +575,19 @@ public:
{
m_journal.info << "WebSocket public interface: disabled";
}
+ if (!getConfig ().WEBSOCKET_PROXY_IP.empty () && getConfig ().WEBSOCKET_PROXY_PORT)
+ {
+ m_wsProxyDoor = WSDoor::New (*m_resourceManager,
+ getOPs(), getConfig ().WEBSOCKET_PROXY_IP,
+ getConfig ().WEBSOCKET_PROXY_PORT, true, true,
+ m_wsSSLContext->get ());
+
+ if (m_wsProxyDoor == nullptr)
+ {
+ FatalError ("Could not open the WebSocket public interface.",
+ __FILE__, __LINE__);
+ }
+ }
//
//
@@ -744,6 +762,7 @@ public:
// once the WSDoor cancels its pending I/O correctly
//m_wsPublicDoor = nullptr;
//m_wsPrivateDoor = nullptr;
+ //m_wsProxyDoor = nullptr;
// VFALCO TODO Try to not have to do this early, by using observers to
// eliminate LoadManager's dependency inversions.
@@ -898,6 +917,7 @@ private:
ScopedPointer m_rpcDoor;
ScopedPointer m_wsPublicDoor;
ScopedPointer m_wsPrivateDoor;
+ ScopedPointer m_wsProxyDoor;
WaitableEvent m_stop;
};
diff --git a/src/ripple_app/main/Application.h b/src/ripple_app/main/Application.h
index 78f27809f3..12e5e11618 100644
--- a/src/ripple_app/main/Application.h
+++ b/src/ripple_app/main/Application.h
@@ -102,6 +102,7 @@ public:
virtual TransactionMaster& getMasterTransaction () = 0;
virtual TxQueue& getTxQueue () = 0;
virtual LocalCredentials& getLocalCredentials () = 0;
+ virtual Resource::Manager& getResourceManager () = 0;
virtual DatabaseCon* getRpcDB () = 0;
virtual DatabaseCon* getTxnDB () = 0;
diff --git a/src/ripple_app/main/LoadManager.cpp b/src/ripple_app/main/LoadManager.cpp
index a3f4202f59..8ab9c5cc41 100644
--- a/src/ripple_app/main/LoadManager.cpp
+++ b/src/ripple_app/main/LoadManager.cpp
@@ -74,13 +74,6 @@ public:
typedef LockType::ScopedLockType ScopedLockType;
LockType mLock;
- BlackList mBlackList;
-
- int mCreditRate; // credits gained/lost per second
- int mCreditLimit; // the most credits a source can have
- int mDebitWarn; // when a source drops below this, we warn
- int mDebitLimit; // when a source drops below this, we cut it off (should be negative)
-
bool mArmed;
int mDeadLock; // Detect server deadlocks
@@ -94,52 +87,10 @@ public:
, Thread ("loadmgr")
, m_journal (journal)
, mLock (this, "LoadManagerImp", __FILE__, __LINE__)
- , mCreditRate (100)
- , mCreditLimit (500)
- , mDebitWarn (-500)
- , mDebitLimit (-1000)
, mArmed (false)
, mDeadLock (0)
, mCosts (LT_MAX)
{
- /** Flags indicating the type of load.
-
- Utilization may include any combination of:
-
- - CPU
- - Storage space
- - Network transfer
- */
- // VFALCO NOTE These flags are not used...
- enum
- {
- flagDisk = 1,
- flagCpu = 2,
- flagNet = 4
- };
-
- // VFALCO TODO Replace this with a function that uses a simple switch statement...
- //
- addCost (Cost (LT_InvalidRequest, -10, flagCpu | flagNet));
- addCost (Cost (LT_RequestNoReply, -1, flagCpu | flagDisk));
- addCost (Cost (LT_InvalidSignature, -100, flagCpu));
- addCost (Cost (LT_UnwantedData, -5, flagCpu | flagNet));
- addCost (Cost (LT_BadData, -20, flagCpu));
-
- addCost (Cost (LT_RPCInvalid, -10, flagCpu | flagNet));
- addCost (Cost (LT_RPCReference, -10, flagCpu | flagNet));
- addCost (Cost (LT_RPCException, -20, flagCpu | flagNet));
- addCost (Cost (LT_RPCBurden, -50, flagCpu | flagNet));
-
- // VFALCO NOTE Why do these supposedly "good" load types still have a negative cost?
- //
- addCost (Cost (LT_NewTrusted, -10, 0));
- addCost (Cost (LT_NewTransaction, -2, 0));
- addCost (Cost (LT_NeededData, -10, 0));
-
- addCost (Cost (LT_RequestData, -5, flagDisk | flagNet));
- addCost (Cost (LT_CheapQuery, -1, flagCpu));
-
UptimeTimer::getInstance ().beginManualUpdates ();
}
@@ -154,6 +105,7 @@ public:
//
// Stoppable
//
+ //--------------------------------------------------------------------------
void onPrepare ()
{
@@ -180,136 +132,6 @@ public:
//--------------------------------------------------------------------------
- void canonicalize (LoadSource& source, int now) const
- {
- if (source.mLastUpdate != now)
- {
- if (source.mLastUpdate < now)
- {
- source.mBalance += mCreditRate * (now - source.mLastUpdate);
-
- if (source.mBalance > mCreditLimit)
- {
- source.mBalance = mCreditLimit;
- source.mLogged = false;
- }
- }
-
- source.mLastUpdate = now;
- }
- }
-
- bool shouldWarn (LoadSource& source)
- {
- {
- ScopedLockType sl (mLock, __FILE__, __LINE__);
-
- int now = UptimeTimer::getInstance ().getElapsedSeconds ();
- canonicalize (source, now);
-
- if (source.isPrivileged () || (source.mBalance > mDebitWarn) || (source.mLastWarning == now))
- return false;
-
- source.mLastWarning = now;
- }
- mBlackList.doWarning(source.getCostName ());
- logWarning (source.getName ());
- return true;
- }
-
- bool shouldCutoff (LoadSource& source)
- {
- bool bLogged;
- {
- ScopedLockType sl (mLock, __FILE__, __LINE__);
- int now = UptimeTimer::getInstance ().getElapsedSeconds ();
- canonicalize (source, now);
-
- if (source.isPrivileged () || (source.mBalance > mDebitLimit))
- return false;
-
- bLogged = source.mLogged;
- source.mLogged = true;
- }
-
- mBlackList.doDisconnect (source.getName ());
-
- if (!bLogged)
- logDisconnect (source.getName ());
- return true;
- }
-
- bool shouldAllow (LoadSource& source)
- {
- return mBlackList.isAllowed (source.getCostName ());
- }
-
- bool applyLoadCharge (LoadSource& source, LoadType loadType) const
- {
- // FIXME: Scale by category
- Cost cost = mCosts[static_cast (loadType)];
-
- return adjust (source, cost.m_cost);
- }
-
- bool adjust (LoadSource& source, int credits) const
- {
- // return: true = need to warn/cutoff
-
- // We do it this way in case we want to add exponential decay later
- int now = UptimeTimer::getInstance ().getElapsedSeconds ();
-
- ScopedLockType sl (mLock, __FILE__, __LINE__);
- canonicalize (source, now);
- source.mBalance += credits;
-
- if (source.mBalance > mCreditLimit)
- source.mBalance = mCreditLimit;
-
- if (source.isPrivileged ()) // privileged sources never warn/cutoff
- return false;
-
- if ( (source.mBalance >= mDebitWarn) ||
- ((source.mBalance >= mDebitLimit) && (source.mLastWarning == now)))
- return false;
-
- return true;
- }
-
- void logWarning (const std::string& source) const
- {
- if (source.empty ())
- m_journal.debug << "Load warning from empty source";
- else
- m_journal.info << "Load warning: " << source;
- }
-
- void logDisconnect (const std::string& source) const
- {
- if (source.empty ())
- m_journal.info << "Disconnect for empty source";
- else
- m_journal.warning << "Disconnect for: " << source;
- }
-
- Json::Value getBlackList (int threshold)
- {
- Json::Value ret(Json::objectValue);
-
- BOOST_FOREACH(const BlackList::BlackListEntry& entry, mBlackList.getBlackList(threshold))
- {
- ret[entry.first] = entry.second;
- }
- return ret;
- }
-
- // VFALCO TODO Implement this and stop accessing the vector directly
- //Cost const& getCost (LoadType loadType) const;
- int getCost (LoadType t) const
- {
- return mCosts [static_cast (t)].getCost ();
- }
-
void resetDeadlockDetector ()
{
ScopedLockType sl (mLock, __FILE__, __LINE__);
@@ -337,11 +159,6 @@ public:
#endif
}
- void addCost (const Cost& c)
- {
- mCosts [static_cast (c.getLoadType ())] = c;
- }
-
// VFALCO NOTE Where's the thread object? It's not a data member...
//
void run ()
diff --git a/src/ripple_app/main/LoadManager.h b/src/ripple_app/main/LoadManager.h
index 43d5347ed0..bf713ffa40 100644
--- a/src/ripple_app/main/LoadManager.h
+++ b/src/ripple_app/main/LoadManager.h
@@ -72,23 +72,6 @@ public:
time passes it will produce log warnings.
*/
virtual void resetDeadlockDetector () = 0;
-
- /** Update an endpoint to reflect an imposed load.
-
- The balance of the endpoint is adjusted based on the heuristic cost
- of the indicated load.
-
- @return `true` if the endpoint should be warned or punished.
- */
- virtual bool applyLoadCharge (LoadSource& sourceToAdjust, LoadType loadToImpose) const = 0;
-
- // VFALCO TODO Eliminate these two functions and just make applyLoadCharge()
- // return a LoadSource::Disposition
- //
- virtual bool shouldWarn (LoadSource&) = 0;
- virtual bool shouldCutoff (LoadSource&) = 0;
-
- virtual Json::Value getBlackList(int threshold = (BlackList::mCreditLimit / 2)) = 0;
};
#endif
diff --git a/src/ripple_app/main/RPCHTTPServer.cpp b/src/ripple_app/main/RPCHTTPServer.cpp
index af3a749cf0..805de65322 100644
--- a/src/ripple_app/main/RPCHTTPServer.cpp
+++ b/src/ripple_app/main/RPCHTTPServer.cpp
@@ -24,6 +24,7 @@ class RPCHTTPServerImp
, public HTTP::Handler
{
public:
+ Resource::Manager& m_resourceManager;
Journal m_journal;
JobQueue& m_jobQueue;
NetworkOPs& m_networkOPs;
@@ -34,12 +35,14 @@ public:
RPCHTTPServerImp (Stoppable& parent,
Journal journal,
JobQueue& jobQueue,
- NetworkOPs& networkOPs)
+ NetworkOPs& networkOPs,
+ Resource::Manager& resourceManager)
: RPCHTTPServer (parent)
+ , m_resourceManager (resourceManager)
, m_journal (journal)
, m_jobQueue (jobQueue)
, m_networkOPs (networkOPs)
- , m_deprecatedHandler (networkOPs)
+ , m_deprecatedHandler (networkOPs, resourceManager)
, m_server (*this, journal)
{
if (getConfig ().RPC_SECURE == 0)
@@ -186,6 +189,16 @@ public:
Config::Role const role (getConfig ().getAdminRole (jvRequest, remoteAddress));
+ Resource::Consumer usage;
+
+ if (role == Config::ADMIN)
+ usage = m_resourceManager.newAdminEndpoint(remoteAddress);
+ else
+ usage = m_resourceManager.newInboundEndpoint(IPAddress::from_string(remoteAddress));
+
+ if (usage.disconnect ())
+ return createResponse (503, "Server is overloaded");
+
// Parse id now so errors from here on will have the id
//
// VFALCO NOTE Except that "id" isn't included in the following errors...
@@ -241,11 +254,12 @@ public:
RPCHandler rpcHandler (&m_networkOPs);
- LoadType loadType = LT_RPCReference;
+ Resource::Charge loadType = Resource::feeReferenceRPC;
Json::Value const result (rpcHandler.doRpcCommand (
- strMethod, params, role, &loadType));
- // VFALCO NOTE We discard loadType since there is no endpoint to punish
+ strMethod, params, role, loadType));
+
+ usage.charge (loadType);
m_journal.debug << "Reply: " << result;
@@ -267,8 +281,9 @@ RPCHTTPServer::RPCHTTPServer (Stoppable& parent)
RPCHTTPServer* RPCHTTPServer::New (Stoppable& parent,
Journal journal,
JobQueue& jobQueue,
- NetworkOPs& networkOPs)
+ NetworkOPs& networkOPs,
+ Resource::Manager& resourceManager)
{
- return new RPCHTTPServerImp (parent, journal, jobQueue, networkOPs);
+ return new RPCHTTPServerImp (parent, journal, jobQueue, networkOPs, resourceManager);
}
diff --git a/src/ripple_app/main/RPCHTTPServer.h b/src/ripple_app/main/RPCHTTPServer.h
index 10dbb32b88..914032bfa3 100644
--- a/src/ripple_app/main/RPCHTTPServer.h
+++ b/src/ripple_app/main/RPCHTTPServer.h
@@ -27,7 +27,7 @@ protected:
public:
static RPCHTTPServer* New (Stoppable& parent,
- Journal journal, JobQueue& jobQueue, NetworkOPs& networkOPs);
+ Journal journal, JobQueue& jobQueue, NetworkOPs& networkOPs, Resource::Manager& resourceManager);
virtual ~RPCHTTPServer () { }
diff --git a/src/ripple_app/main/RippleMain.cpp b/src/ripple_app/main/RippleMain.cpp
index 62a702a7b4..66ed1b19b7 100644
--- a/src/ripple_app/main/RippleMain.cpp
+++ b/src/ripple_app/main/RippleMain.cpp
@@ -60,9 +60,8 @@ void startServer ()
RPCHandler rhHandler (&getApp().getOPs ());
- // VFALCO TODO Clean up this magic number
- LoadType loadType = LT_RPCReference;
- Json::Value jvResult = rhHandler.doCommand (jvCommand, Config::ADMIN, &loadType);
+ Resource::Charge loadType = Resource::feeReferenceRPC;
+ Json::Value jvResult = rhHandler.doCommand (jvCommand, Config::ADMIN, loadType);
if (!getConfig ().QUIET)
Log::out() << "Result: " << jvResult;
diff --git a/src/ripple_app/misc/NetworkOPs.cpp b/src/ripple_app/misc/NetworkOPs.cpp
index f95b28c09e..0b2f569cac 100644
--- a/src/ripple_app/misc/NetworkOPs.cpp
+++ b/src/ripple_app/misc/NetworkOPs.cpp
@@ -567,6 +567,14 @@ void NetworkOPsImp::processClusterTimer ()
node.set_nodename(it->second.getName());
}
+ Resource::Gossip gossip = getApp().getResourceManager().exportConsumers();
+ BOOST_FOREACH (Resource::Gossip::Item const& item, gossip.items)
+ {
+ protocol::TMLoadSource& node = *cluster.add_loadsources();
+ node.set_name (item.address);
+ node.set_cost (item.balance);
+ }
+
PackedMessage::pointer message = boost::make_shared(cluster, protocol::mtCLUSTER);
getApp().getPeers().relayMessageCluster (NULL, message);
diff --git a/src/ripple_app/peers/Peer.cpp b/src/ripple_app/peers/Peer.cpp
index 91300eccb6..e55220f9d7 100644
--- a/src/ripple_app/peers/Peer.cpp
+++ b/src/ripple_app/peers/Peer.cpp
@@ -76,7 +76,6 @@ public:
, mCluster (false)
, mPeerId (peerID)
, mPrivate (false)
- , mLoad (std::string(), std::string())
, mMinLedger (0)
, mMaxLedger (0)
, mActivityTimer (io_service)
@@ -99,7 +98,6 @@ private:
uint256 mCookieHash;
uint64 mPeerId;
bool mPrivate; // Keep peer IP private.
- LoadSource mLoad;
uint32 mMinLedger, mMaxLedger;
uint256 mClosedLedgerHash;
@@ -165,11 +163,10 @@ public:
void charge (Resource::Charge const& fee)
{
- m_usage.charge (fee);
+ if ((m_usage.charge (fee) == Resource::drop) && m_usage.disconnect ())
+ detach ("resource", false);
}
- void applyLoadCharge (LoadType);
-
Json::Value getJson ();
bool isConnected () const
{
@@ -308,6 +305,7 @@ private:
}
else
{
+ bool valid = false;
if (m_socket->getFlags ().set (MultiSocket::Flag::proxy) && m_isInbound)
{
@@ -332,11 +330,7 @@ private:
else
m_usage = m_resourceManager.newOutboundEndpoint (m_remoteAddress);
- getApp ().getPeers ().peerConnected(m_remoteAddress, m_isInbound);
-
- // Must compute mCookieHash before receiving a hello.
- sendHello ();
- startReadHeader ();
+ valid = true;
WriteLog (lsINFO, Peer) << "Peer: PROXY handshake from " << mIpPort.first;
}
@@ -380,12 +374,25 @@ private:
else
m_usage = m_resourceManager.newOutboundEndpoint (m_remoteAddress);
- getApp ().getPeers ().peerConnected(m_remoteAddress, m_isInbound);
-
- // Must compute mCookieHash before receiving a hello.
- sendHello ();
- startReadHeader ();
+ valid = true;
}
+
+ if (valid)
+ {
+ if (m_usage.disconnect ())
+ {
+ detach ("resource", true);
+ }
+ else
+ {
+ getApp ().getPeers ().peerConnected(m_remoteAddress, m_isInbound);
+
+ // Must compute mCookieHash before receiving a hello.
+ sendHello ();
+ startReadHeader ();
+ }
+ }
+
}
}
@@ -469,7 +476,6 @@ void PeerImp::handleWrite (const boost::system::error_code& error, size_t bytes_
void PeerImp::setIpPort (const std::string& strIP, int iPort)
{
mIpPort = make_pair (strIP, iPort);
- mLoad.rename (strIP + lexicalCast(iPort), strIP);
WriteLog (lsDEBUG, Peer) << "Peer: Set: "
<< addressToString (this) << "> "
@@ -1163,16 +1169,10 @@ void PeerImp::recvHello (protocol::TMHello& packet)
if (getApp().getUNL ().nodeInCluster (mNodePublic, mNodeName))
{
mCluster = true;
- mLoad.setPrivileged ();
- if (!mNodeName.empty())
- mLoad.rename (mNodeName, mNodeName);
WriteLog (lsINFO, Peer) << "Cluster connection to \"" << (mNodeName.empty () ? getIP () : mNodeName)
<< "\" established";
}
- if (isOutbound ())
- mLoad.setOutbound ();
-
if (mClientConnect)
{
// If we connected due to scan, no longer need to scan.
@@ -1268,7 +1268,6 @@ static void checkTransaction (Job&, int flags, SerializedTransaction::pointer st
{
getApp().getHashRouter ().setFlag (stx->getTransactionID (), SF_BAD);
Peer::charge (peer, Resource::feeInvalidSignature);
- Peer::applyLoadCharge (peer, LT_InvalidSignature);
return;
}
else
@@ -1282,7 +1281,6 @@ static void checkTransaction (Job&, int flags, SerializedTransaction::pointer st
{
getApp().getHashRouter ().setFlag (stx->getTransactionID (), SF_BAD);
Peer::charge (peer, Resource::feeInvalidRequest);
- Peer::applyLoadCharge (peer, LT_InvalidRequest);
}
#endif
@@ -1310,7 +1308,6 @@ void PeerImp::recvTransaction (protocol::TMTransaction& packet, Application::Sco
if (isSetBit (flags, SF_BAD))
{
charge (Resource::feeInvalidSignature);
- applyLoadCharge (LT_InvalidSignature);
return;
}
@@ -1375,7 +1372,6 @@ static void checkPropose (Job& job, boost::shared_ptr pa
WriteLog (lsWARNING, Peer) << "proposal with previous ledger fails signature check: " <<
(p ? p->getIP () : std::string ("???"));
Peer::charge (peer, Resource::feeInvalidSignature);
- Peer::applyLoadCharge (peer, LT_InvalidSignature);
return;
}
else
@@ -1420,7 +1416,6 @@ void PeerImp::recvPropose (const boost::shared_ptr& pack
{
WriteLog (lsWARNING, Peer) << "Received proposal is malformed";
charge (Resource::feeInvalidSignature);
- applyLoadCharge (LT_InvalidSignature);
return;
}
@@ -1428,7 +1423,6 @@ void PeerImp::recvPropose (const boost::shared_ptr& pack
{
WriteLog (lsWARNING, Peer) << "Received proposal is malformed";
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -1490,7 +1484,6 @@ void PeerImp::recvHaveTxSet (protocol::TMHaveTransactionSet& packet)
if (packet.hash ().size () != (256 / 8))
{
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -1507,7 +1500,6 @@ void PeerImp::recvHaveTxSet (protocol::TMHaveTransactionSet& packet)
if (!getApp().getOPs ().hasTXSet (shared_from_this (), hash, packet.status ()))
{
charge (Resource::feeUnwantedData);
- applyLoadCharge (LT_UnwantedData);
}
}
@@ -1524,7 +1516,6 @@ static void checkValidation (Job&, SerializedValidation::pointer val, bool isTru
{
WriteLog (lsWARNING, Peer) << "Validation is invalid";
Peer::charge (peer, Resource::feeInvalidRequest);
- Peer::applyLoadCharge (peer, LT_InvalidRequest);
return;
}
@@ -1563,7 +1554,6 @@ static void checkValidation (Job&, SerializedValidation::pointer val, bool isTru
{
WriteLog (lsWARNING, Peer) << "Exception processing validation";
Peer::charge (peer, Resource::feeInvalidRequest);
- Peer::applyLoadCharge (peer, LT_InvalidRequest);
}
#endif
@@ -1578,7 +1568,6 @@ void PeerImp::recvValidation (const boost::shared_ptr& p
{
WriteLog (lsWARNING, Peer) << "Too small validation from peer";
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -1595,7 +1584,6 @@ void PeerImp::recvValidation (const boost::shared_ptr& p
{
WriteLog (lsTRACE, Peer) << "Validation is more than two minutes old";
charge (Resource::feeUnwantedData);
- applyLoadCharge (LT_UnwantedData);
return;
}
@@ -1619,7 +1607,6 @@ void PeerImp::recvValidation (const boost::shared_ptr& p
{
WriteLog (lsWARNING, Peer) << "Exception processing validation";
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
}
#endif
@@ -1630,7 +1617,6 @@ void PeerImp::recvCluster (protocol::TMCluster& packet)
if (!mCluster)
{
charge (Resource::feeUnwantedData);
- applyLoadCharge(LT_UnwantedData);
return;
}
@@ -1649,6 +1635,23 @@ void PeerImp::recvCluster (protocol::TMCluster& packet)
getApp().getUNL().nodeUpdate(nodePub, s);
}
+ int loadSources = packet.loadsources().size();
+ if (loadSources != 0)
+ {
+ Resource::Gossip gossip;
+ gossip.items.reserve (loadSources);
+ for (int i = 0; i < packet.loadsources().size(); ++i)
+ {
+ protocol::TMLoadSource const& node = packet.loadsources (i);
+ Resource::Gossip::Item item;
+ item.address = IPAddress::from_string (node.name());
+ item.balance = node.cost();
+ if (item.address != IPAddress())
+ gossip.items.push_back(item);
+ }
+ m_resourceManager.importConsumers (mNodeName, gossip);
+ }
+
getApp().getFeeTrack().setClusterFee(getApp().getUNL().getClusterFee());
}
@@ -1926,7 +1929,6 @@ void PeerImp::recvProofWork (protocol::TMProofWork& packet)
if (packet.response ().size () != (256 / 8))
{
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -1946,7 +1948,6 @@ void PeerImp::recvProofWork (protocol::TMProofWork& packet)
if (r != powTOOEASY)
{
charge (Resource::feeBadProofOfWork);
- applyLoadCharge (LT_BadPoW);
}
return;
@@ -1968,7 +1969,6 @@ void PeerImp::recvProofWork (protocol::TMProofWork& packet)
if ((packet.challenge ().size () != (256 / 8)) || (packet.target ().size () != (256 / 8)))
{
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -1980,7 +1980,6 @@ void PeerImp::recvProofWork (protocol::TMProofWork& packet)
if (!pow->isValid ())
{
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -2078,7 +2077,6 @@ void PeerImp::recvGetLedger (protocol::TMGetLedger& packet, Application::ScopedL
if ((!packet.has_ledgerhash () || packet.ledgerhash ().size () != 32))
{
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
WriteLog (lsWARNING, Peer) << "invalid request for TX candidate set data";
return;
}
@@ -2115,7 +2113,6 @@ void PeerImp::recvGetLedger (protocol::TMGetLedger& packet, Application::ScopedL
WriteLog (lsERROR, Peer) << "We do not have the map our peer wants " << getIP ();
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -2144,7 +2141,6 @@ void PeerImp::recvGetLedger (protocol::TMGetLedger& packet, Application::ScopedL
if (packet.ledgerhash ().size () != 32)
{
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
WriteLog (lsWARNING, Peer) << "Invalid request";
return;
}
@@ -2201,7 +2197,6 @@ void PeerImp::recvGetLedger (protocol::TMGetLedger& packet, Application::ScopedL
else
{
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
WriteLog (lsWARNING, Peer) << "Can't figure out what ledger they want";
return;
}
@@ -2209,7 +2204,6 @@ void PeerImp::recvGetLedger (protocol::TMGetLedger& packet, Application::ScopedL
if ((!ledger) || (packet.has_ledgerseq () && (packet.ledgerseq () != ledger->getLedgerSeq ())))
{
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
if (ShouldLog (lsWARNING, Peer))
{
@@ -2290,7 +2284,6 @@ void PeerImp::recvGetLedger (protocol::TMGetLedger& packet, Application::ScopedL
{
WriteLog (lsWARNING, Peer) << "Can't find map or empty request";
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -2304,7 +2297,6 @@ void PeerImp::recvGetLedger (protocol::TMGetLedger& packet, Application::ScopedL
{
WriteLog (lsWARNING, Peer) << "Request for invalid node: " << logMe;
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -2366,7 +2358,6 @@ void PeerImp::recvLedger (const boost::shared_ptr& packe
{
WriteLog (lsWARNING, Peer) << "Ledger/TXset data with no nodes";
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -2383,7 +2374,6 @@ void PeerImp::recvLedger (const boost::shared_ptr& packe
{
WriteLog (lsINFO, Peer) << "Unable to route TX/ledger data reply";
charge (Resource::feeUnwantedData);
- applyLoadCharge (LT_UnwantedData);
}
return;
@@ -2395,7 +2385,6 @@ void PeerImp::recvLedger (const boost::shared_ptr& packe
{
WriteLog (lsWARNING, Peer) << "TX candidate reply with invalid hash size";
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -2415,7 +2404,6 @@ void PeerImp::recvLedger (const boost::shared_ptr& packe
{
WriteLog (lsWARNING, Peer) << "LedgerData request with invalid node ID";
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -2428,7 +2416,6 @@ void PeerImp::recvLedger (const boost::shared_ptr& packe
if (san.isInvalid ())
{
charge (Resource::feeUnwantedData);
- applyLoadCharge (LT_UnwantedData);
}
return;
@@ -2443,7 +2430,6 @@ void PeerImp::recvLedger (const boost::shared_ptr& packe
else
{
charge (Resource::feeUnwantedData);
- applyLoadCharge (LT_UnwantedData);
}
}
@@ -2589,33 +2575,6 @@ void PeerImp::sendGetPeers ()
sendPacket (packet, true);
}
-void PeerImp::applyLoadCharge (LoadType loadType)
-{
- // IMPLEMENTATION IS INCOMPLETE
-
- // VFALCO TODO This needs to completed before open sourcing.
-
- if (getApp().getLoadManager ().applyLoadCharge (mLoad, loadType))
- {
- if (mCluster)
- {
- WriteLog (lsWARNING, Peer) << "aLC: " << getDisplayName() << " load from cluster";
- }
- else if (getApp().getLoadManager ().shouldCutoff(mLoad))
- {
- WriteLog (lsWARNING, Peer) << "aLC: " << getDisplayName() << " should cutoff";
- }
- else if (getApp().getLoadManager ().shouldWarn (mLoad))
- {
- WriteLog (lsWARNING, Peer) << "aLC: " << getDisplayName() << " load warning";
- }
- else
- {
- WriteLog (lsWARNING, Peer) << "aLC: " << getDisplayName() << " cannot figure out";
- }
- }
-}
-
void PeerImp::doProofOfWork (Job&, boost::weak_ptr peer, ProofOfWork::pointer pow)
{
if (peer.expired ())
@@ -2658,7 +2617,6 @@ void PeerImp::doFetchPack (const boost::shared_ptr&
{
WriteLog (lsWARNING, Peer) << "FetchPack hash size malformed";
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -2671,7 +2629,6 @@ void PeerImp::doFetchPack (const boost::shared_ptr&
{
WriteLog (lsINFO, Peer) << "Peer requests fetch pack for ledger we don't have: " << hash;
charge (Resource::feeRequestNoReply);
- applyLoadCharge (LT_RequestNoReply);
return;
}
@@ -2679,7 +2636,6 @@ void PeerImp::doFetchPack (const boost::shared_ptr&
{
WriteLog (lsWARNING, Peer) << "Peer requests fetch pack from open ledger: " << hash;
charge (Resource::feeInvalidRequest);
- applyLoadCharge (LT_InvalidRequest);
return;
}
@@ -2689,7 +2645,6 @@ void PeerImp::doFetchPack (const boost::shared_ptr&
{
WriteLog (lsINFO, Peer) << "Peer requests fetch pack for ledger whose predecessor we don't have: " << hash;
charge (Resource::feeRequestNoReply);
- applyLoadCharge (LT_RequestNoReply);
return;
}
@@ -2818,15 +2773,3 @@ void Peer::charge (boost::weak_ptr & peer, Resource::Charge const& fee)
if (p != nullptr)
p->charge (fee);
}
-
-void Peer::applyLoadCharge (boost::weak_ptr & peerToPunish,
- LoadType loadThatWasImposed)
-{
- Peer::pointer p = peerToPunish.lock ();
-
- if (p != nullptr)
- {
- p->applyLoadCharge (loadThatWasImposed);
- }
-}
-
diff --git a/src/ripple_app/peers/Peer.h b/src/ripple_app/peers/Peer.h
index f494b9624b..79db345646 100644
--- a/src/ripple_app/peers/Peer.h
+++ b/src/ripple_app/peers/Peer.h
@@ -76,8 +76,6 @@ public:
*/
virtual void charge (Resource::Charge const& fee) = 0;
static void charge (boost::weak_ptr & peer, Resource::Charge const& fee);
- virtual void applyLoadCharge (LoadType) = 0;
- static void applyLoadCharge (boost::weak_ptr & peerTOCharge, LoadType loadThatWasImposed);
virtual Json::Value getJson () = 0;
diff --git a/src/ripple_app/peers/Peers.cpp b/src/ripple_app/peers/Peers.cpp
index bd826c6bb3..cb6ff94060 100644
--- a/src/ripple_app/peers/Peers.cpp
+++ b/src/ripple_app/peers/Peers.cpp
@@ -208,7 +208,6 @@ public:
PeerFinder::PeerID (peer->getNodePublic()) == id)
{
peer->charge (Resource::feeUnwantedData);
- peer->applyLoadCharge (LT_UnwantedData);
break;
}
}
diff --git a/src/ripple_app/rpc/RPCHandler.cpp b/src/ripple_app/rpc/RPCHandler.cpp
index 568a04d5af..94f4953f05 100644
--- a/src/ripple_app/rpc/RPCHandler.cpp
+++ b/src/ripple_app/rpc/RPCHandler.cpp
@@ -575,7 +575,7 @@ Json::Value RPCHandler::accountFromString (Ledger::ref lrLedger, RippleAddress&
return Json::Value (Json::objectValue);
}
-Json::Value RPCHandler::doAccountCurrencies (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doAccountCurrencies (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
Ledger::pointer lpLedger;
Json::Value jvResult = lookupLedger (params, lpLedger);
@@ -641,7 +641,7 @@ Json::Value RPCHandler::doAccountCurrencies (Json::Value params, LoadType* loadT
// ledger_hash :
// ledger_index :
// }
-Json::Value RPCHandler::doAccountInfo (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doAccountInfo (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
Ledger::pointer lpLedger;
Json::Value jvResult = lookupLedger (params, lpLedger);
@@ -682,13 +682,13 @@ Json::Value RPCHandler::doAccountInfo (Json::Value params, LoadType* loadType, A
return jvResult;
}
-Json::Value RPCHandler::doBlackList (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doBlackList (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
masterLockHolder.unlock();
if (params.isMember("threshold"))
- return getApp().getLoadManager().getBlackList(params["threshold"].asInt());
+ return getApp().getResourceManager().getJson(params["threshold"].asInt());
else
- return getApp().getLoadManager().getBlackList();
+ return getApp().getResourceManager().getJson();
}
// {
@@ -696,7 +696,7 @@ Json::Value RPCHandler::doBlackList (Json::Value params, LoadType* loadType, App
// port:
// }
// XXX Might allow domain for manual connections.
-Json::Value RPCHandler::doConnect (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doConnect (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
if (getConfig ().RUN_STANDALONE)
return "cannot connect in standalone mode";
@@ -717,7 +717,7 @@ Json::Value RPCHandler::doConnect (Json::Value params, LoadType* loadType, Appli
// {
// key:
// }
-Json::Value RPCHandler::doDataDelete (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doDataDelete (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
if (!params.isMember ("key"))
return rpcError (rpcINVALID_PARAMS);
@@ -743,7 +743,7 @@ Json::Value RPCHandler::doDataDelete (Json::Value params, LoadType* loadType, Ap
// {
// key:
// }
-Json::Value RPCHandler::doDataFetch (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doDataFetch (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
if (!params.isMember ("key"))
return rpcError (rpcINVALID_PARAMS);
@@ -767,7 +767,7 @@ Json::Value RPCHandler::doDataFetch (Json::Value params, LoadType* loadType, App
// key:
// value:
// }
-Json::Value RPCHandler::doDataStore (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doDataStore (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
if (!params.isMember ("key")
|| !params.isMember ("value"))
@@ -828,7 +828,7 @@ Json::Value RPCHandler::doNicknameInfo (Json::Value params)
// 'account_index' : // optional
// }
// XXX This would be better if it took the ledger.
-Json::Value RPCHandler::doOwnerInfo (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doOwnerInfo (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
if (!params.isMember ("account") && !params.isMember ("ident"))
return rpcError (rpcINVALID_PARAMS);
@@ -853,7 +853,7 @@ Json::Value RPCHandler::doOwnerInfo (Json::Value params, LoadType* loadType, App
return ret;
}
-Json::Value RPCHandler::doPeers (Json::Value, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doPeers (Json::Value, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
Json::Value jvResult (Json::objectValue);
@@ -864,12 +864,12 @@ Json::Value RPCHandler::doPeers (Json::Value, LoadType* loadType, Application::S
return jvResult;
}
-Json::Value RPCHandler::doPing (Json::Value, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doPing (Json::Value, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
return Json::Value (Json::objectValue);
}
-Json::Value RPCHandler::doPrint (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doPrint (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
masterLockHolder.unlock ();
@@ -887,7 +887,7 @@ Json::Value RPCHandler::doPrint (Json::Value params, LoadType* loadType, Applica
// issuer is the offering account
// --> submit: 'submit|true|false': defaults to false
// Prior to running allow each to have a credit line of what they will be getting from the other account.
-Json::Value RPCHandler::doProfile (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doProfile (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
/* need to fix now that sharedOfferCreate is gone
int iArgs = params.size();
@@ -979,7 +979,7 @@ Json::Value RPCHandler::doProfile (Json::Value params, LoadType* loadType, Appli
// difficulty: // optional
// secret: // optional
// }
-Json::Value RPCHandler::doProofCreate (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doProofCreate (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
masterLockHolder.unlock ();
// XXX: Add ability to create proof with arbitrary time
@@ -1024,7 +1024,7 @@ Json::Value RPCHandler::doProofCreate (Json::Value params, LoadType* loadType, A
// {
// token:
// }
-Json::Value RPCHandler::doProofSolve (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doProofSolve (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
masterLockHolder.unlock ();
@@ -1054,7 +1054,7 @@ Json::Value RPCHandler::doProofSolve (Json::Value params, LoadType* loadType, Ap
// difficulty: // optional
// secret: // optional
// }
-Json::Value RPCHandler::doProofVerify (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doProofVerify (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
masterLockHolder.unlock ();
// XXX Add ability to check proof against arbitrary time
@@ -1124,7 +1124,7 @@ Json::Value RPCHandler::doProofVerify (Json::Value params, LoadType* loadType, A
// ledger_hash :
// ledger_index :
// }
-Json::Value RPCHandler::doAccountLines (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doAccountLines (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
Ledger::pointer lpLedger;
Json::Value jvResult = lookupLedger (params, lpLedger);
@@ -1215,6 +1215,7 @@ Json::Value RPCHandler::doAccountLines (Json::Value params, LoadType* loadType,
}
}
+ loadType = Resource::feeMediumBurdenRPC;
}
else
{
@@ -1242,7 +1243,7 @@ static void offerAdder (Json::Value& jvLines, SLE::ref offer)
// ledger_hash :
// ledger_index :
// }
-Json::Value RPCHandler::doAccountOffers (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doAccountOffers (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
Ledger::pointer lpLedger;
Json::Value jvResult = lookupLedger (params, lpLedger);
@@ -1287,6 +1288,7 @@ Json::Value RPCHandler::doAccountOffers (Json::Value params, LoadType* loadType,
if (!bUnlocked)
masterLockHolder.unlock ();
+ loadType = Resource::feeMediumBurdenRPC;
return jvResult;
}
@@ -1301,7 +1303,7 @@ Json::Value RPCHandler::doAccountOffers (Json::Value params, LoadType* loadType,
// "limit" : integer, // Optional.
// "proof" : boolean // Defaults to false.
// }
-Json::Value RPCHandler::doBookOffers (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doBookOffers (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
if (getApp().getJobQueue ().getJobCountGE (jtCLIENT) > 200)
{
@@ -1394,6 +1396,7 @@ Json::Value RPCHandler::doBookOffers (Json::Value params, LoadType* loadType, Ap
const Json::Value jvMarker = params.isMember ("marker") ? params["marker"] : Json::Value (Json::nullValue);
mNetOps->getBookPage (lpLedger, uTakerPaysCurrencyID, uTakerPaysIssuerID, uTakerGetsCurrencyID, uTakerGetsIssuerID, raTakerID.getAccountID (), bProof, iLimit, jvMarker, jvResult);
+ loadType = Resource::feeMediumBurdenRPC;
return jvResult;
}
@@ -1402,7 +1405,7 @@ Json::Value RPCHandler::doBookOffers (Json::Value params, LoadType* loadType, Ap
// {
// random:
// }
-Json::Value RPCHandler::doRandom (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doRandom (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
masterLockHolder.unlock ();
uint256 uRandom;
@@ -1423,7 +1426,7 @@ Json::Value RPCHandler::doRandom (Json::Value params, LoadType* loadType, Applic
}
}
-Json::Value RPCHandler::doPathFind (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doPathFind (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
Ledger::pointer lpLedger = mNetOps->getClosedLedger();
masterLockHolder.unlock();
@@ -1438,6 +1441,7 @@ Json::Value RPCHandler::doPathFind (Json::Value params, LoadType* loadType, Appl
if (sSubCommand == "create")
{
+ loadType = Resource::feeHighBurdenRPC;
mInfoSub->clearPathRequest ();
PathRequest::pointer request = boost::make_shared (mInfoSub);
Json::Value result = request->doCreate (lpLedger, params);
@@ -1481,7 +1485,7 @@ Json::Value RPCHandler::doPathFind (Json::Value params, LoadType* loadType, Appl
// - Allows clients to verify path exists.
// - Return canonicalized path.
// - From a trusted server, allows clients to use path without manipulation.
-Json::Value RPCHandler::doRipplePathFind (Json::Value params, LoadType* loadType, Application::ScopedLockType& masterLockHolder)
+Json::Value RPCHandler::doRipplePathFind (Json::Value params, Resource::Charge& loadType, Application::ScopedLockType& masterLockHolder)
{
int jc = getApp().getJobQueue ().getJobCountGE (jtCLIENT);
@@ -1490,6 +1494,7 @@ Json::Value RPCHandler::doRipplePathFind (Json::Value params, LoadType* loadType
WriteLog (lsDEBUG, RPCHandler) << "Too busy for RPF: " << jc;
return rpcError (rpcTOO_BUSY);
}
+ loadType = Resource::feeHighBurdenRPC;
RippleAddress raSrc;
RippleAddress raDst;
@@ -1562,7 +1567,7 @@ Json::Value RPCHandler::doRipplePathFind (Json::Value params, LoadType* loadType
}
}
- *loadType = LT_RPCBurden;
+ loadType = Resource::feeHighBurdenRPC;
Ledger::pointer lSnapShot = boost::make_shared (boost::ref (*lpLedger), false);
masterLockHolder.unlock (); // As long as we have a locked copy of the ledger, we can unlock.
@@ -1730,9 +1735,9 @@ Json::Value RPCHandler::doRipplePathFind (Json::Value params, LoadType* loadType
// tx_json: