Initialize TxConfirmStats in constructor
and change to storing as a pointer.
This commit is contained in:
parent
5ba81e54e0
commit
2332f19bef
2 changed files with 24 additions and 18 deletions
|
@ -14,8 +14,8 @@
|
||||||
#include "txmempool.h"
|
#include "txmempool.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
void TxConfirmStats::Initialize(std::vector<double>& defaultBuckets,
|
TxConfirmStats::TxConfirmStats(const std::vector<double>& defaultBuckets,
|
||||||
unsigned int maxConfirms, double _decay)
|
unsigned int maxConfirms, double _decay)
|
||||||
{
|
{
|
||||||
decay = _decay;
|
decay = _decay;
|
||||||
for (unsigned int i = 0; i < defaultBuckets.size(); i++) {
|
for (unsigned int i = 0; i < defaultBuckets.size(); i++) {
|
||||||
|
@ -294,7 +294,7 @@ bool CBlockPolicyEstimator::removeTx(uint256 hash)
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(cs_feeEstimator);
|
||||||
std::map<uint256, TxStatsInfo>::iterator pos = mapMemPoolTxs.find(hash);
|
std::map<uint256, TxStatsInfo>::iterator pos = mapMemPoolTxs.find(hash);
|
||||||
if (pos != mapMemPoolTxs.end()) {
|
if (pos != mapMemPoolTxs.end()) {
|
||||||
feeStats.removeTx(pos->second.blockHeight, nBestSeenHeight, pos->second.bucketIndex);
|
feeStats->removeTx(pos->second.blockHeight, nBestSeenHeight, pos->second.bucketIndex);
|
||||||
mapMemPoolTxs.erase(hash);
|
mapMemPoolTxs.erase(hash);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -312,7 +312,12 @@ CBlockPolicyEstimator::CBlockPolicyEstimator()
|
||||||
vfeelist.push_back(bucketBoundary);
|
vfeelist.push_back(bucketBoundary);
|
||||||
}
|
}
|
||||||
vfeelist.push_back(INF_FEERATE);
|
vfeelist.push_back(INF_FEERATE);
|
||||||
feeStats.Initialize(vfeelist, MAX_BLOCK_CONFIRMS, DEFAULT_DECAY);
|
feeStats = new TxConfirmStats(vfeelist, MAX_BLOCK_CONFIRMS, DEFAULT_DECAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
CBlockPolicyEstimator::~CBlockPolicyEstimator()
|
||||||
|
{
|
||||||
|
delete feeStats;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBlockPolicyEstimator::processTransaction(const CTxMemPoolEntry& entry, bool validFeeEstimate)
|
void CBlockPolicyEstimator::processTransaction(const CTxMemPoolEntry& entry, bool validFeeEstimate)
|
||||||
|
@ -346,7 +351,7 @@ void CBlockPolicyEstimator::processTransaction(const CTxMemPoolEntry& entry, boo
|
||||||
CFeeRate feeRate(entry.GetFee(), entry.GetTxSize());
|
CFeeRate feeRate(entry.GetFee(), entry.GetTxSize());
|
||||||
|
|
||||||
mapMemPoolTxs[hash].blockHeight = txHeight;
|
mapMemPoolTxs[hash].blockHeight = txHeight;
|
||||||
mapMemPoolTxs[hash].bucketIndex = feeStats.NewTx(txHeight, (double)feeRate.GetFeePerK());
|
mapMemPoolTxs[hash].bucketIndex = feeStats->NewTx(txHeight, (double)feeRate.GetFeePerK());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CBlockPolicyEstimator::processBlockTx(unsigned int nBlockHeight, const CTxMemPoolEntry* entry)
|
bool CBlockPolicyEstimator::processBlockTx(unsigned int nBlockHeight, const CTxMemPoolEntry* entry)
|
||||||
|
@ -370,7 +375,7 @@ bool CBlockPolicyEstimator::processBlockTx(unsigned int nBlockHeight, const CTxM
|
||||||
// Feerates are stored and reported as BTC-per-kb:
|
// Feerates are stored and reported as BTC-per-kb:
|
||||||
CFeeRate feeRate(entry->GetFee(), entry->GetTxSize());
|
CFeeRate feeRate(entry->GetFee(), entry->GetTxSize());
|
||||||
|
|
||||||
feeStats.Record(blocksToConfirm, (double)feeRate.GetFeePerK());
|
feeStats->Record(blocksToConfirm, (double)feeRate.GetFeePerK());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,7 +398,7 @@ void CBlockPolicyEstimator::processBlock(unsigned int nBlockHeight,
|
||||||
nBestSeenHeight = nBlockHeight;
|
nBestSeenHeight = nBlockHeight;
|
||||||
|
|
||||||
// Clear the current block state and update unconfirmed circular buffer
|
// Clear the current block state and update unconfirmed circular buffer
|
||||||
feeStats.ClearCurrent(nBlockHeight);
|
feeStats->ClearCurrent(nBlockHeight);
|
||||||
|
|
||||||
unsigned int countedTxs = 0;
|
unsigned int countedTxs = 0;
|
||||||
// Repopulate the current block states
|
// Repopulate the current block states
|
||||||
|
@ -403,7 +408,7 @@ void CBlockPolicyEstimator::processBlock(unsigned int nBlockHeight,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update all exponential averages with the current block state
|
// Update all exponential averages with the current block state
|
||||||
feeStats.UpdateMovingAverages();
|
feeStats->UpdateMovingAverages();
|
||||||
|
|
||||||
LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy after updating estimates for %u of %u txs in block, since last block %u of %u tracked, new mempool map size %u\n",
|
LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy after updating estimates for %u of %u txs in block, since last block %u of %u tracked, new mempool map size %u\n",
|
||||||
countedTxs, entries.size(), trackedTxs, trackedTxs + untrackedTxs, mapMemPoolTxs.size());
|
countedTxs, entries.size(), trackedTxs, trackedTxs + untrackedTxs, mapMemPoolTxs.size());
|
||||||
|
@ -417,10 +422,10 @@ CFeeRate CBlockPolicyEstimator::estimateFee(int confTarget) const
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(cs_feeEstimator);
|
||||||
// Return failure if trying to analyze a target we're not tracking
|
// Return failure if trying to analyze a target we're not tracking
|
||||||
// It's not possible to get reasonable estimates for confTarget of 1
|
// It's not possible to get reasonable estimates for confTarget of 1
|
||||||
if (confTarget <= 1 || (unsigned int)confTarget > feeStats.GetMaxConfirms())
|
if (confTarget <= 1 || (unsigned int)confTarget > feeStats->GetMaxConfirms())
|
||||||
return CFeeRate(0);
|
return CFeeRate(0);
|
||||||
|
|
||||||
double median = feeStats.EstimateMedianVal(confTarget, SUFFICIENT_FEETXS, MIN_SUCCESS_PCT, true, nBestSeenHeight);
|
double median = feeStats->EstimateMedianVal(confTarget, SUFFICIENT_FEETXS, MIN_SUCCESS_PCT, true, nBestSeenHeight);
|
||||||
|
|
||||||
if (median < 0)
|
if (median < 0)
|
||||||
return CFeeRate(0);
|
return CFeeRate(0);
|
||||||
|
@ -439,15 +444,15 @@ CFeeRate CBlockPolicyEstimator::estimateSmartFee(int confTarget, int *answerFoun
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(cs_feeEstimator);
|
||||||
|
|
||||||
// Return failure if trying to analyze a target we're not tracking
|
// Return failure if trying to analyze a target we're not tracking
|
||||||
if (confTarget <= 0 || (unsigned int)confTarget > feeStats.GetMaxConfirms())
|
if (confTarget <= 0 || (unsigned int)confTarget > feeStats->GetMaxConfirms())
|
||||||
return CFeeRate(0);
|
return CFeeRate(0);
|
||||||
|
|
||||||
// It's not possible to get reasonable estimates for confTarget of 1
|
// It's not possible to get reasonable estimates for confTarget of 1
|
||||||
if (confTarget == 1)
|
if (confTarget == 1)
|
||||||
confTarget = 2;
|
confTarget = 2;
|
||||||
|
|
||||||
while (median < 0 && (unsigned int)confTarget <= feeStats.GetMaxConfirms()) {
|
while (median < 0 && (unsigned int)confTarget <= feeStats->GetMaxConfirms()) {
|
||||||
median = feeStats.EstimateMedianVal(confTarget++, SUFFICIENT_FEETXS, MIN_SUCCESS_PCT, true, nBestSeenHeight);
|
median = feeStats->EstimateMedianVal(confTarget++, SUFFICIENT_FEETXS, MIN_SUCCESS_PCT, true, nBestSeenHeight);
|
||||||
}
|
}
|
||||||
} // Must unlock cs_feeEstimator before taking mempool locks
|
} // Must unlock cs_feeEstimator before taking mempool locks
|
||||||
|
|
||||||
|
@ -472,7 +477,7 @@ bool CBlockPolicyEstimator::Write(CAutoFile& fileout) const
|
||||||
fileout << 139900; // version required to read: 0.13.99 or later
|
fileout << 139900; // version required to read: 0.13.99 or later
|
||||||
fileout << CLIENT_VERSION; // version that wrote the file
|
fileout << CLIENT_VERSION; // version that wrote the file
|
||||||
fileout << nBestSeenHeight;
|
fileout << nBestSeenHeight;
|
||||||
feeStats.Write(fileout);
|
feeStats->Write(fileout);
|
||||||
}
|
}
|
||||||
catch (const std::exception&) {
|
catch (const std::exception&) {
|
||||||
LogPrintf("CBlockPolicyEstimator::Write(): unable to read policy estimator data (non-fatal)\n");
|
LogPrintf("CBlockPolicyEstimator::Write(): unable to read policy estimator data (non-fatal)\n");
|
||||||
|
@ -490,7 +495,7 @@ bool CBlockPolicyEstimator::Read(CAutoFile& filein)
|
||||||
if (nVersionRequired > CLIENT_VERSION)
|
if (nVersionRequired > CLIENT_VERSION)
|
||||||
return error("CBlockPolicyEstimator::Read(): up-version (%d) fee estimate file", nVersionRequired);
|
return error("CBlockPolicyEstimator::Read(): up-version (%d) fee estimate file", nVersionRequired);
|
||||||
filein >> nFileBestSeenHeight;
|
filein >> nFileBestSeenHeight;
|
||||||
feeStats.Read(filein);
|
feeStats->Read(filein);
|
||||||
nBestSeenHeight = nFileBestSeenHeight;
|
nBestSeenHeight = nFileBestSeenHeight;
|
||||||
// if nVersionThatWrote < 139900 then another TxConfirmStats (for priority) follows but can be ignored.
|
// if nVersionThatWrote < 139900 then another TxConfirmStats (for priority) follows but can be ignored.
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,13 +108,13 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Initialize the data structures. This is called by BlockPolicyEstimator's
|
* Create new TxConfirmStats. This is called by BlockPolicyEstimator's
|
||||||
* constructor with default values.
|
* constructor with default values.
|
||||||
* @param defaultBuckets contains the upper limits for the bucket boundaries
|
* @param defaultBuckets contains the upper limits for the bucket boundaries
|
||||||
* @param maxConfirms max number of confirms to track
|
* @param maxConfirms max number of confirms to track
|
||||||
* @param decay how much to decay the historical moving average per block
|
* @param decay how much to decay the historical moving average per block
|
||||||
*/
|
*/
|
||||||
void Initialize(std::vector<double>& defaultBuckets, unsigned int maxConfirms, double decay);
|
TxConfirmStats(const std::vector<double>& defaultBuckets, unsigned int maxConfirms, double decay);
|
||||||
|
|
||||||
/** Clear the state of the curBlock variables to start counting for the new block */
|
/** Clear the state of the curBlock variables to start counting for the new block */
|
||||||
void ClearCurrent(unsigned int nBlockHeight);
|
void ClearCurrent(unsigned int nBlockHeight);
|
||||||
|
@ -205,6 +205,7 @@ class CBlockPolicyEstimator
|
||||||
public:
|
public:
|
||||||
/** Create new BlockPolicyEstimator and initialize stats tracking classes with default values */
|
/** Create new BlockPolicyEstimator and initialize stats tracking classes with default values */
|
||||||
CBlockPolicyEstimator();
|
CBlockPolicyEstimator();
|
||||||
|
~CBlockPolicyEstimator();
|
||||||
|
|
||||||
/** Process all the transactions that have been included in a block */
|
/** Process all the transactions that have been included in a block */
|
||||||
void processBlock(unsigned int nBlockHeight,
|
void processBlock(unsigned int nBlockHeight,
|
||||||
|
@ -245,7 +246,7 @@ private:
|
||||||
std::map<uint256, TxStatsInfo> mapMemPoolTxs;
|
std::map<uint256, TxStatsInfo> mapMemPoolTxs;
|
||||||
|
|
||||||
/** Classes to track historical data on transaction confirmations */
|
/** Classes to track historical data on transaction confirmations */
|
||||||
TxConfirmStats feeStats;
|
TxConfirmStats* feeStats;
|
||||||
|
|
||||||
unsigned int trackedTxs;
|
unsigned int trackedTxs;
|
||||||
unsigned int untrackedTxs;
|
unsigned int untrackedTxs;
|
||||||
|
|
Loading…
Reference in a new issue