mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-25 13:35:54 +00:00
Merge branch 'develop' into feature-keyvadb
Conflicts: src/cpp/ripple/ripple_TransactionAcquire.cpp
This commit is contained in:
@@ -503,10 +503,7 @@ void LedgerMaster::resumeAcquiring ()
|
|||||||
if (nextLedger)
|
if (nextLedger)
|
||||||
acquireMissingLedger (nextLedger, nextLedger->getParentHash (), nextLedger->getLedgerSeq () - 1);
|
acquireMissingLedger (nextLedger, nextLedger->getParentHash (), nextLedger->getLedgerSeq () - 1);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
mCompleteLedgers.clearValue (prevMissing);
|
|
||||||
WriteLog (lsINFO, LedgerMaster) << "We have a gap at: " << prevMissing + 1;
|
WriteLog (lsINFO, LedgerMaster) << "We have a gap at: " << prevMissing + 1;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ SETUP_LOG (InboundLedger)
|
|||||||
#define LEDGER_TIMEOUT_AGGRESSIVE 6 // how many timeouts before we get aggressive
|
#define LEDGER_TIMEOUT_AGGRESSIVE 6 // how many timeouts before we get aggressive
|
||||||
|
|
||||||
InboundLedger::InboundLedger (uint256 const& hash, uint32 seq)
|
InboundLedger::InboundLedger (uint256 const& hash, uint32 seq)
|
||||||
: PeerSet (hash, LEDGER_ACQUIRE_TIMEOUT)
|
: PeerSet (hash, LEDGER_ACQUIRE_TIMEOUT, false)
|
||||||
, mHaveBase (false)
|
, mHaveBase (false)
|
||||||
, mHaveState (false)
|
, mHaveState (false)
|
||||||
, mHaveTransactions (false)
|
, mHaveTransactions (false)
|
||||||
@@ -138,7 +138,7 @@ bool InboundLedger::tryLocal ()
|
|||||||
return mComplete;
|
return mComplete;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InboundLedger::onTimer (bool progress)
|
void InboundLedger::onTimer (bool progress, boost::recursive_mutex::scoped_lock&)
|
||||||
{
|
{
|
||||||
mRecentTXNodes.clear ();
|
mRecentTXNodes.clear ();
|
||||||
mRecentASNodes.clear ();
|
mRecentASNodes.clear ();
|
||||||
@@ -844,7 +844,7 @@ std::vector<InboundLedger::neededHash_t> InboundLedger::getNeededHashes ()
|
|||||||
if (!mHaveTransactions)
|
if (!mHaveTransactions)
|
||||||
{
|
{
|
||||||
TransactionStateSF filter (mLedger->getLedgerSeq ());
|
TransactionStateSF filter (mLedger->getLedgerSeq ());
|
||||||
std::vector<uint256> v = mLedger->getNeededAccountStateHashes (4, &filter);
|
std::vector<uint256> v = mLedger->getNeededTransactionHashes (4, &filter);
|
||||||
BOOST_FOREACH (uint256 const & h, v)
|
BOOST_FOREACH (uint256 const & h, v)
|
||||||
{
|
{
|
||||||
ret.push_back (std::make_pair (protocol::TMGetObjectByHash::otTRANSACTION_NODE, h));
|
ret.push_back (std::make_pair (protocol::TMGetObjectByHash::otTRANSACTION_NODE, h));
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
void done ();
|
void done ();
|
||||||
|
|
||||||
void onTimer (bool progress);
|
void onTimer (bool progress, boost::recursive_mutex::scoped_lock& peerSetLock);
|
||||||
|
|
||||||
void newPeer (Peer::ref peer)
|
void newPeer (Peer::ref peer)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ InboundLedger::pointer InboundLedgers::findCreate (uint256 const& hash, uint32 s
|
|||||||
ptr->addPeers ();
|
ptr->addPeers ();
|
||||||
ptr->setTimer (); // Cannot call in constructor
|
ptr->setTimer (); // Cannot call in constructor
|
||||||
}
|
}
|
||||||
else
|
else if (ptr->isComplete ())
|
||||||
{
|
{
|
||||||
Ledger::pointer ledger = ptr->getLedger ();
|
Ledger::pointer ledger = ptr->getLedger ();
|
||||||
ledger->setClosed ();
|
ledger->setClosed ();
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ std::string StopSustain ()
|
|||||||
return "Terminating monitor";
|
return "Terminating monitor";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DoSustain ()
|
std::string DoSustain (std::string logFile)
|
||||||
{
|
{
|
||||||
int childCount = 0;
|
int childCount = 0;
|
||||||
pManager = getpid ();
|
pManager = getpid ();
|
||||||
@@ -72,7 +72,9 @@ std::string DoSustain ()
|
|||||||
while (kill (pChild, 0) == 0);
|
while (kill (pChild, 0) == 0);
|
||||||
|
|
||||||
rename ("core", boost::str (boost::format ("core.%d") % static_cast<int> (pChild)).c_str ());
|
rename ("core", boost::str (boost::format ("core.%d") % static_cast<int> (pChild)).c_str ());
|
||||||
rename ("debug.log", boost::str (boost::format ("debug.log.%d") % static_cast<int> (pChild)).c_str ());
|
if (!logFile.empty())
|
||||||
|
rename (logFile.c_str(),
|
||||||
|
boost::str (boost::format ("%s.%d") % logFile % static_cast<int> (pChild)).c_str ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,7 +84,7 @@ bool HaveSustain ()
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
std::string DoSustain ()
|
std::string DoSustain (std::string)
|
||||||
{
|
{
|
||||||
return std::string ();
|
return std::string ();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,6 @@
|
|||||||
//
|
//
|
||||||
extern bool HaveSustain ();
|
extern bool HaveSustain ();
|
||||||
extern std::string StopSustain ();
|
extern std::string StopSustain ();
|
||||||
extern std::string DoSustain ();
|
extern std::string DoSustain (std::string logFile);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -40,15 +40,9 @@ JobType Job::getType () const
|
|||||||
|
|
||||||
void Job::doJob ()
|
void Job::doJob ()
|
||||||
{
|
{
|
||||||
m_loadEvent->start ();
|
m_loadEvent->reName (mName);
|
||||||
|
|
||||||
mJob (*this);
|
mJob (*this);
|
||||||
|
|
||||||
// VFALCO TODO Isn't there a way to construct the load event with
|
|
||||||
// the proper name? This way the load event object
|
|
||||||
// can have the invariant "name is always set"
|
|
||||||
//
|
|
||||||
m_loadEvent->reName (mName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Job::rename (std::string const& newName)
|
void Job::rename (std::string const& newName)
|
||||||
@@ -61,6 +55,11 @@ int Job::getLimit () const
|
|||||||
return m_limit;
|
return m_limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LoadEvent& Job::peekEvent() const
|
||||||
|
{
|
||||||
|
return *m_loadEvent;
|
||||||
|
}
|
||||||
|
|
||||||
const char* Job::toString (JobType t)
|
const char* Job::toString (JobType t)
|
||||||
{
|
{
|
||||||
switch (t)
|
switch (t)
|
||||||
@@ -131,6 +130,9 @@ const char* Job::toString (JobType t)
|
|||||||
case jtTXN_PROC:
|
case jtTXN_PROC:
|
||||||
return "processTransaction";
|
return "processTransaction";
|
||||||
|
|
||||||
|
case jtTXN_DATA:
|
||||||
|
return "fetchTxnData";
|
||||||
|
|
||||||
case jtOB_SETUP:
|
case jtOB_SETUP:
|
||||||
return "orderBookSetup";
|
return "orderBookSetup";
|
||||||
|
|
||||||
@@ -143,6 +145,9 @@ const char* Job::toString (JobType t)
|
|||||||
case jtHO_WRITE:
|
case jtHO_WRITE:
|
||||||
return "nodeWrite";
|
return "nodeWrite";
|
||||||
|
|
||||||
|
case jtSWEEP:
|
||||||
|
return "sweep";
|
||||||
|
|
||||||
default:
|
default:
|
||||||
assert (false);
|
assert (false);
|
||||||
return "unknown";
|
return "unknown";
|
||||||
|
|||||||
@@ -17,20 +17,21 @@ enum JobType
|
|||||||
jtPUBOLDLEDGER = 2, // An old ledger has been accepted
|
jtPUBOLDLEDGER = 2, // An old ledger has been accepted
|
||||||
jtVALIDATION_ut = 3, // A validation from an untrusted source
|
jtVALIDATION_ut = 3, // A validation from an untrusted source
|
||||||
jtPROOFWORK = 4, // A proof of work demand from another server
|
jtPROOFWORK = 4, // A proof of work demand from another server
|
||||||
jtPROPOSAL_ut = 5, // A proposal from an untrusted source
|
jtTRANSACTION_l = 5, // A local transaction
|
||||||
jtLEDGER_DATA = 6, // Received data for a ledger we're acquiring
|
jtPROPOSAL_ut = 6, // A proposal from an untrusted source
|
||||||
jtUPDATE_PF = 7, // Update pathfinding requests
|
jtLEDGER_DATA = 7, // Received data for a ledger we're acquiring
|
||||||
jtCLIENT = 8, // A websocket command from the client
|
jtUPDATE_PF = 8, // Update pathfinding requests
|
||||||
jtTRANSACTION = 9, // A transaction received from the network
|
jtCLIENT = 9, // A websocket command from the client
|
||||||
jtPUBLEDGER = 10, // Publish a fully-accepted ledger
|
jtTRANSACTION = 10, // A transaction received from the network
|
||||||
jtWAL = 11, // Write-ahead logging
|
jtPUBLEDGER = 11, // Publish a fully-accepted ledger
|
||||||
jtVALIDATION_t = 12, // A validation from a trusted source
|
jtTXN_DATA = 12, // Fetch a proposed set
|
||||||
jtWRITE = 13, // Write out hashed objects
|
jtWAL = 13, // Write-ahead logging
|
||||||
jtTRANSACTION_l = 14, // A local transaction
|
jtVALIDATION_t = 14, // A validation from a trusted source
|
||||||
jtPROPOSAL_t = 15, // A proposal from a trusted source
|
jtWRITE = 15, // Write out hashed objects
|
||||||
jtSWEEP = 16, // Sweep for stale structures
|
jtPROPOSAL_t = 16, // A proposal from a trusted source
|
||||||
jtADMIN = 17, // An administrative operation
|
jtSWEEP = 17, // Sweep for stale structures
|
||||||
jtDEATH = 18, // job of death, used internally
|
jtADMIN = 18, // An administrative operation
|
||||||
|
jtDEATH = 19, // job of death, used internally
|
||||||
|
|
||||||
// special types not dispatched by the job pool
|
// special types not dispatched by the job pool
|
||||||
jtPEER = 24,
|
jtPEER = 24,
|
||||||
@@ -81,6 +82,8 @@ public:
|
|||||||
|
|
||||||
int getLimit () const;
|
int getLimit () const;
|
||||||
|
|
||||||
|
LoadEvent& peekEvent() const;
|
||||||
|
|
||||||
// These comparison operators make the jobs sort in priority order in the job set
|
// These comparison operators make the jobs sort in priority order in the job set
|
||||||
bool operator< (const Job& j) const;
|
bool operator< (const Job& j) const;
|
||||||
bool operator> (const Job& j) const;
|
bool operator> (const Job& j) const;
|
||||||
|
|||||||
@@ -44,7 +44,9 @@ void JobQueue::addLimitJob (JobType type, const std::string& name, int limit, co
|
|||||||
if (type != jtCLIENT) // FIXME: Workaround incorrect client shutdown ordering
|
if (type != jtCLIENT) // FIXME: Workaround incorrect client shutdown ordering
|
||||||
assert (mThreadCount != 0); // do not add jobs to a queue with no threads
|
assert (mThreadCount != 0); // do not add jobs to a queue with no threads
|
||||||
|
|
||||||
mJobSet.insert (Job (type, name, limit, ++mLastJob, mJobLoads[type], jobFunc));
|
std::pair< std::set <Job>::iterator, bool > it =
|
||||||
|
mJobSet.insert (Job (type, name, limit, ++mLastJob, mJobLoads[type], jobFunc));
|
||||||
|
it.first->peekEvent().start(); // start timing how long it stays in the queue
|
||||||
++mJobCounts[type].first;
|
++mJobCounts[type].first;
|
||||||
mJobCond.notify_one ();
|
mJobCond.notify_one ();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1272,15 +1272,6 @@ NetworkOPs::getAccountTxs (const RippleAddress& account, int32 minLedger, int32
|
|||||||
ledger->pendSave(false);
|
ledger->pendSave(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rawMeta.getLength() == 0)
|
|
||||||
{ // Work around a bug that could leave the metadata missing
|
|
||||||
uint32 seq = static_cast<uint32>(db->getBigInt("AccountTransactions.LedgerSeq"));
|
|
||||||
WriteLog(lsWARNING, NetworkOPs) << "Recovering ledger " << seq << ", txn " << txn->getID();
|
|
||||||
Ledger::pointer ledger = getLedgerBySeq(seq);
|
|
||||||
if (ledger)
|
|
||||||
ledger->pendSave(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
TransactionMetaSet::pointer meta = boost::make_shared<TransactionMetaSet> (txn->getID (), txn->getLedger (), rawMeta.getData ());
|
TransactionMetaSet::pointer meta = boost::make_shared<TransactionMetaSet> (txn->getID (), txn->getLedger (), rawMeta.getData ());
|
||||||
ret.push_back (std::pair<Transaction::pointer, TransactionMetaSet::pointer> (txn, meta));
|
ret.push_back (std::pair<Transaction::pointer, TransactionMetaSet::pointer> (txn, meta));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -299,7 +299,7 @@ int rippleMain (int argc, char** argv)
|
|||||||
if (HaveSustain () &&
|
if (HaveSustain () &&
|
||||||
!iResult && !vm.count ("parameters") && !vm.count ("fg") && !vm.count ("standalone") && !vm.count ("unittest"))
|
!iResult && !vm.count ("parameters") && !vm.count ("fg") && !vm.count ("standalone") && !vm.count ("unittest"))
|
||||||
{
|
{
|
||||||
std::string logMe = DoSustain ();
|
std::string logMe = DoSustain (theConfig.DEBUG_LOGFILE.c_str());
|
||||||
|
|
||||||
if (!logMe.empty ())
|
if (!logMe.empty ())
|
||||||
Log (lsWARNING) << logMe;
|
Log (lsWARNING) << logMe;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
class InboundLedger;
|
class InboundLedger;
|
||||||
|
|
||||||
PeerSet::PeerSet (uint256 const& hash, int interval)
|
PeerSet::PeerSet (uint256 const& hash, int interval, bool txnData)
|
||||||
: mHash (hash)
|
: mHash (hash)
|
||||||
, mTimerInterval (interval)
|
, mTimerInterval (interval)
|
||||||
, mTimeouts (0)
|
, mTimeouts (0)
|
||||||
@@ -14,6 +14,7 @@ PeerSet::PeerSet (uint256 const& hash, int interval)
|
|||||||
, mFailed (false)
|
, mFailed (false)
|
||||||
, mProgress (true)
|
, mProgress (true)
|
||||||
, mAggressive (false)
|
, mAggressive (false)
|
||||||
|
, mTxnData (txnData)
|
||||||
, mTimer (getApp().getIOService ())
|
, mTimer (getApp().getIOService ())
|
||||||
{
|
{
|
||||||
mLastAction = UptimeTimer::getInstance ().getElapsedSeconds ();
|
mLastAction = UptimeTimer::getInstance ().getElapsedSeconds ();
|
||||||
@@ -53,12 +54,12 @@ void PeerSet::invokeOnTimer ()
|
|||||||
{
|
{
|
||||||
++mTimeouts;
|
++mTimeouts;
|
||||||
WriteLog (lsWARNING, InboundLedger) << "Timeout(" << mTimeouts << ") pc=" << mPeers.size () << " acquiring " << mHash;
|
WriteLog (lsWARNING, InboundLedger) << "Timeout(" << mTimeouts << ") pc=" << mPeers.size () << " acquiring " << mHash;
|
||||||
onTimer (false);
|
onTimer (false, sl);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mProgress = false;
|
mProgress = false;
|
||||||
onTimer (true);
|
onTimer (true, sl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isDone ())
|
if (!isDone ())
|
||||||
@@ -74,16 +75,24 @@ void PeerSet::TimerEntry (boost::weak_ptr<PeerSet> wptr, const boost::system::er
|
|||||||
|
|
||||||
if (ptr)
|
if (ptr)
|
||||||
{
|
{
|
||||||
int jc = getApp().getJobQueue ().getJobCountTotal (jtLEDGER_DATA);
|
if (ptr->mTxnData)
|
||||||
|
|
||||||
if (jc > 4)
|
|
||||||
{
|
{
|
||||||
WriteLog (lsDEBUG, InboundLedger) << "Deferring PeerSet timer due to load";
|
getApp().getJobQueue ().addLimitJob (jtTXN_DATA, "timerEntry", 2,
|
||||||
ptr->setTimer ();
|
BIND_TYPE (&PeerSet::TimerJobEntry, P_1, ptr));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
getApp().getJobQueue ().addLimitJob (jtLEDGER_DATA, "timerEntry", 2,
|
{
|
||||||
BIND_TYPE (&PeerSet::TimerJobEntry, P_1, ptr));
|
int jc = getApp().getJobQueue ().getJobCountTotal (jtLEDGER_DATA);
|
||||||
|
|
||||||
|
if (jc > 4)
|
||||||
|
{
|
||||||
|
WriteLog (lsDEBUG, InboundLedger) << "Deferring PeerSet timer due to load";
|
||||||
|
ptr->setTimer ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
getApp().getJobQueue ().addLimitJob (jtLEDGER_DATA, "timerEntry", 2,
|
||||||
|
BIND_TYPE (&PeerSet::TimerJobEntry, P_1, ptr));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,11 +67,11 @@ private:
|
|||||||
|
|
||||||
// VFALCO TODO try to make some of these private
|
// VFALCO TODO try to make some of these private
|
||||||
protected:
|
protected:
|
||||||
PeerSet (uint256 const& hash, int interval);
|
PeerSet (uint256 const& hash, int interval, bool txnData);
|
||||||
virtual ~PeerSet () { }
|
virtual ~PeerSet () { }
|
||||||
|
|
||||||
virtual void newPeer (Peer::ref) = 0;
|
virtual void newPeer (Peer::ref) = 0;
|
||||||
virtual void onTimer (bool progress) = 0;
|
virtual void onTimer (bool progress, boost::recursive_mutex::scoped_lock&) = 0;
|
||||||
virtual boost::weak_ptr<PeerSet> pmDowncast () = 0;
|
virtual boost::weak_ptr<PeerSet> pmDowncast () = 0;
|
||||||
|
|
||||||
void setComplete ()
|
void setComplete ()
|
||||||
@@ -95,6 +95,7 @@ protected:
|
|||||||
bool mFailed;
|
bool mFailed;
|
||||||
bool mProgress;
|
bool mProgress;
|
||||||
bool mAggressive;
|
bool mAggressive;
|
||||||
|
bool mTxnData;
|
||||||
int mLastAction;
|
int mLastAction;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ SETUP_LOG (TransactionAcquire)
|
|||||||
typedef std::map<uint160, LedgerProposal::pointer>::value_type u160_prop_pair;
|
typedef std::map<uint160, LedgerProposal::pointer>::value_type u160_prop_pair;
|
||||||
typedef std::map<uint256, DisputedTx::pointer>::value_type u256_lct_pair;
|
typedef std::map<uint256, DisputedTx::pointer>::value_type u256_lct_pair;
|
||||||
|
|
||||||
TransactionAcquire::TransactionAcquire (uint256 const& hash) : PeerSet (hash, TX_ACQUIRE_TIMEOUT), mHaveRoot (false)
|
TransactionAcquire::TransactionAcquire (uint256 const& hash)
|
||||||
|
: PeerSet (hash, TX_ACQUIRE_TIMEOUT, true)
|
||||||
|
, mHaveRoot (false)
|
||||||
{
|
{
|
||||||
mMap = boost::make_shared<SHAMap> (smtTRANSACTION, hash);
|
mMap = boost::make_shared<SHAMap> (smtTRANSACTION, hash);
|
||||||
}
|
}
|
||||||
@@ -46,23 +48,30 @@ void TransactionAcquire::done ()
|
|||||||
getApp().getIOService ().post (BIND_TYPE (&TACompletionHandler, mHash, map));
|
getApp().getIOService ().post (BIND_TYPE (&TACompletionHandler, mHash, map));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransactionAcquire::onTimer (bool progress)
|
void TransactionAcquire::onTimer (bool progress, boost::recursive_mutex::scoped_lock& psl)
|
||||||
{
|
{
|
||||||
bool aggressive = false;
|
bool aggressive = false;
|
||||||
|
|
||||||
if (getTimeouts () > 10)
|
if (getTimeouts () > 10)
|
||||||
{
|
{
|
||||||
WriteLog (lsWARNING, TransactionAcquire) << "Ten timeouts on TX set " << getHash ();
|
WriteLog (lsWARNING, TransactionAcquire) << "Ten timeouts on TX set " << getHash ();
|
||||||
|
psl.unlock();
|
||||||
{
|
{
|
||||||
Application::ScopedLockType lock (getApp().getMasterLock (), __FILE__, __LINE__);
|
Application::ScopedLockType lock (getApp().getMasterLock (), __FILE__, __LINE__);
|
||||||
|
|
||||||
if (getApp().getOPs ().stillNeedTXSet (mHash))
|
if (getApp().getOPs ().stillNeedTXSet (mHash))
|
||||||
{
|
{
|
||||||
WriteLog (lsWARNING, TransactionAcquire) << "Still need it";
|
boost::recursive_mutex::scoped_lock sl (getApp().getMasterLock ());
|
||||||
mTimeouts = 0;
|
|
||||||
aggressive = true;
|
if (getApp().getOPs ().stillNeedTXSet (mHash))
|
||||||
}
|
{
|
||||||
|
WriteLog (lsWARNING, TransactionAcquire) << "Still need it";
|
||||||
|
mTimeouts = 0;
|
||||||
|
aggressive = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
psl.lock();
|
||||||
|
|
||||||
if (!aggressive)
|
if (!aggressive)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ private:
|
|||||||
SHAMap::pointer mMap;
|
SHAMap::pointer mMap;
|
||||||
bool mHaveRoot;
|
bool mHaveRoot;
|
||||||
|
|
||||||
void onTimer (bool progress);
|
void onTimer (bool progress, boost::recursive_mutex::scoped_lock& peerSetLock);
|
||||||
void newPeer (Peer::ref peer)
|
void newPeer (Peer::ref peer)
|
||||||
{
|
{
|
||||||
trigger (peer);
|
trigger (peer);
|
||||||
|
|||||||
Reference in New Issue
Block a user