Don't use stale validiations.

This commit is contained in:
JoelKatz
2012-06-20 13:26:32 -07:00
parent a022f8304d
commit 58dcc8b9c1
7 changed files with 46 additions and 14 deletions

View File

@@ -2,12 +2,21 @@
#include "ValidationCollection.h"
#include "Application.h"
#include "LedgerTiming.h"
#include "Log.h"
bool ValidationCollection::addValidation(SerializedValidation::pointer val)
{
if(theApp->getUNL().nodeInUNL(val->getSignerPublic()))
val->setTrusted();
bool isTrusted = false;
if (theApp->getUNL().nodeInUNL(val->getSignerPublic()))
{
uint64 now = theApp->getOPs().getNetworkTimeNC();
uint64 valClose = val->getCloseTime();
if ((now > valClose) && (now < (valClose + 2 * LEDGER_INTERVAL)))
isTrusted = true;
else
Log(lsWARNING) << "Received stale validation";
}
uint256 hash = val->getLedgerHash();
uint160 node = val->getSignerPublic().getNodeID();
@@ -16,6 +25,12 @@ bool ValidationCollection::addValidation(SerializedValidation::pointer val)
boost::mutex::scoped_lock sl(mValidationLock);
if (!mValidations[hash].insert(std::make_pair(node, val)).second)
return false;
if (isTrusted)
{
boost::unordered_map<uint160, SerializedValidation::pointer>::iterator it = mCurrentValidations.find(node);
if ((it == mCurrentValidations.end()) || (val->getCloseTime() >= it->second->getCloseTime()))
mCurrentValidations[node] = val;
}
}
Log(lsINFO) << "Val for " << hash.GetHex() << " from " << node.GetHex() << " added " <<
@@ -34,16 +49,24 @@ ValidationSet ValidationCollection::getValidations(const uint256& ledger)
return ret;
}
void ValidationCollection::getValidationCount(const uint256& ledger, int& trusted, int &untrusted)
void ValidationCollection::getValidationCount(const uint256& ledger, bool currentOnly, int& trusted, int &untrusted)
{
trusted = untrusted = 0;
boost::mutex::scoped_lock sl(mValidationLock);
boost::unordered_map<uint256, ValidationSet>::iterator it = mValidations.find(ledger);
uint64 now = theApp->getOPs().getNetworkTimeNC();
if (it != mValidations.end())
{
for (ValidationSet::iterator vit = it->second.begin(), end = it->second.end(); vit != end; ++vit)
{
if (vit->second->isTrusted())
bool trusted = vit->second->isTrusted();
if (trusted && currentOnly)
{
uint64 closeTime = vit->second->getCloseTime();
if ((now < closeTime) || (now > (closeTime + 2 * LEDGER_INTERVAL)))
trusted = false;
}
if (trusted)
++trusted;
else
++untrusted;