Track cluster load and local load separately.

This commit is contained in:
JoelKatz
2013-07-09 10:07:49 -07:00
parent e4c02aa122
commit cc8af2275d
7 changed files with 52 additions and 8 deletions

View File

@@ -43,9 +43,12 @@ public:
virtual Json::Value getJson (uint64 baseFee, uint32 referenceFeeUnits) = 0; virtual Json::Value getJson (uint64 baseFee, uint32 referenceFeeUnits) = 0;
virtual void setClusterFee (uint32) = 0;
virtual uint32 getClusterFee () = 0;
virtual bool raiseLocalFee () = 0; virtual bool raiseLocalFee () = 0;
virtual bool lowerLocalFee () = 0; virtual bool lowerLocalFee () = 0;
virtual bool isLoaded () = 0; virtual bool isLoadedLocal () = 0;
virtual bool isLoadedCluster () = 0;
}; };
#endif #endif

View File

@@ -80,7 +80,19 @@ public:
return std::max (mLocalTxnLoadFee, mRemoteTxnLoadFee); return std::max (mLocalTxnLoadFee, mRemoteTxnLoadFee);
} }
bool isLoaded () void setClusterFee (uint32 fee)
{
boost::mutex::scoped_lock sl (mLock);
mClusterTxnLoadFee = fee;
}
uint32 getClusterFee ()
{
boost::mutex::scoped_lock sl (mLock);
return mClusterTxnLoadFee;
}
bool isLoadedLocal ()
{ {
// VFALCO TODO This could be replaced with a SharedData and // VFALCO TODO This could be replaced with a SharedData and
// using a read/write lock instead of a critical section. // using a read/write lock instead of a critical section.
@@ -92,6 +104,18 @@ public:
return (raiseCount != 0) || (mLocalTxnLoadFee != lftNormalFee); return (raiseCount != 0) || (mLocalTxnLoadFee != lftNormalFee);
} }
bool isLoadedCluster ()
{
// VFALCO TODO This could be replaced with a SharedData and
// using a read/write lock instead of a critical section.
//
// NOTE This applies to all the locking in this class.
//
//
boost::mutex::scoped_lock sl (mLock);
return (raiseCount != 0) || (mLocalTxnLoadFee != lftNormalFee) || (mClusterTxnLoadFee != lftNormalFee);
}
void setRemoteFee (uint32 f) void setRemoteFee (uint32 f)
{ {
boost::mutex::scoped_lock sl (mLock); boost::mutex::scoped_lock sl (mLock);
@@ -181,6 +205,7 @@ private:
uint32 mLocalTxnLoadFee; // Scale factor, lftNormalFee = normal fee uint32 mLocalTxnLoadFee; // Scale factor, lftNormalFee = normal fee
uint32 mRemoteTxnLoadFee; // Scale factor, lftNormalFee = normal fee uint32 mRemoteTxnLoadFee; // Scale factor, lftNormalFee = normal fee
uint32 mClusterTxnLoadFee; // Scale factor, lftNormalFee = normal fee
int raiseCount; int raiseCount;
boost::mutex mLock; boost::mutex mLock;

View File

@@ -2183,7 +2183,7 @@ void NetworkOPs::makeFetchPack (Job&, boost::weak_ptr<Peer> wPeer,
return; return;
} }
if (getApp().getFeeTrack ().isLoaded ()) if (getApp().getFeeTrack ().isLoadedLocal ())
{ {
WriteLog (lsINFO, NetworkOPs) << "Too busy to make fetch pack"; WriteLog (lsINFO, NetworkOPs) << "Too busy to make fetch pack";
return; return;

View File

@@ -60,7 +60,7 @@ RPCHandler::RPCHandler (NetworkOPs* netOps, InfoSub::pointer infoSub) : mNetOps
Json::Value RPCHandler::transactionSign (Json::Value params, bool bSubmit, bool bFailHard, ScopedLock& mlh) Json::Value RPCHandler::transactionSign (Json::Value params, bool bSubmit, bool bFailHard, ScopedLock& mlh)
{ {
if (getApp().getFeeTrack().isLoaded() && (mRole != ADMIN)) if (getApp().getFeeTrack().isLoadedCluster() && (mRole != ADMIN))
return rpcError(rpcTOO_BUSY); return rpcError(rpcTOO_BUSY);
Json::Value jvResult; Json::Value jvResult;

View File

@@ -7,6 +7,7 @@ enum MessageType
mtERROR_MSG = 2; mtERROR_MSG = 2;
mtPING = 3; mtPING = 3;
mtPROOFOFWORK = 4; mtPROOFOFWORK = 4;
mtCLUSTER = 5;
// network presence detection // network presence detection
mtGET_CONTACTS = 10; mtGET_CONTACTS = 10;
@@ -76,6 +77,21 @@ message TMHello
optional bool testNet = 13; // Running as testnet. optional bool testNet = 13; // Running as testnet.
} }
// The status of a node in our cluster
message TMClusterNode
{
required bytes publicKey = 1;
optional string nodeName = 2;
optional uint32 nodeLoad = 3;
optional uint32 lastHeard = 4;
}
// The status of all nodes in the cluster
message TMCluster
{
repeated TMClusterNode clusterNodes = 1;
}
// A transaction can have only one input and one output. // A transaction can have only one input and one output.
// If you want to send an amount that is greater than any single address of yours // If you want to send an amount that is greater than any single address of yours

View File

@@ -867,7 +867,7 @@ bool serverOkay (std::string& reason)
if (!getApp().getLedgerMaster().isCaughtUp(reason)) if (!getApp().getLedgerMaster().isCaughtUp(reason))
return false; return false;
if (getApp().getFeeTrack ().isLoaded ()) if (getApp().getFeeTrack ().isLoadedLocal ())
{ {
reason = "Too much load"; reason = "Too much load";
return false; return false;

View File

@@ -1274,7 +1274,7 @@ void PeerImp::recvPropose (const boost::shared_ptr<protocol::TMProposeSet>& pack
} }
bool isTrusted = getApp().getUNL ().nodeInUNL (signerPublic); bool isTrusted = getApp().getUNL ().nodeInUNL (signerPublic);
if (!isTrusted && getApp().getFeeTrack ().isLoaded ()) if (!isTrusted && getApp().getFeeTrack ().isLoadedLocal ())
{ {
WriteLog (lsDEBUG, Peer) << "Dropping untrusted proposal due to load"; WriteLog (lsDEBUG, Peer) << "Dropping untrusted proposal due to load";
return; return;
@@ -1388,7 +1388,7 @@ void PeerImp::recvValidation (const boost::shared_ptr<protocol::TMValidation>& p
} }
bool isTrusted = getApp().getUNL ().nodeInUNL (val->getSignerPublic ()); bool isTrusted = getApp().getUNL ().nodeInUNL (val->getSignerPublic ());
if (isTrusted || !getApp().getFeeTrack ().isLoaded ()) if (isTrusted || !getApp().getFeeTrack ().isLoadedLocal ())
getApp().getJobQueue ().addJob (isTrusted ? jtVALIDATION_t : jtVALIDATION_ut, "recvValidation->checkValidation", getApp().getJobQueue ().addJob (isTrusted ? jtVALIDATION_t : jtVALIDATION_ut, "recvValidation->checkValidation",
BIND_TYPE (&checkValidation, P_1, val, signingHash, isTrusted, mCluster, packet, BIND_TYPE (&checkValidation, P_1, val, signingHash, isTrusted, mCluster, packet,
boost::weak_ptr<Peer> (shared_from_this ()))); boost::weak_ptr<Peer> (shared_from_this ())));
@@ -2286,7 +2286,7 @@ void PeerImp::doProofOfWork (Job&, boost::weak_ptr <Peer> peer, ProofOfWork::poi
void PeerImp::doFetchPack (const boost::shared_ptr<protocol::TMGetObjectByHash>& packet) void PeerImp::doFetchPack (const boost::shared_ptr<protocol::TMGetObjectByHash>& packet)
{ {
// VFALCO TODO Invert this dependency using an observer and shared state object. // VFALCO TODO Invert this dependency using an observer and shared state object.
if (getApp().getFeeTrack ().isLoaded ()) if (getApp().getFeeTrack ().isLoadedLocal ())
{ {
WriteLog (lsINFO, Peer) << "Too busy to make fetch pack"; WriteLog (lsINFO, Peer) << "Too busy to make fetch pack";
return; return;