Merge #13128: policy: Add Clang thread safety annotations for variables guarded by cs_feeEstimator
dae1423e5a
Add locking annotations to feeStats, shortStats and longStats (practicalswift)764e42fee2
scripted-diff: Rename from cs_feeEstimator to m_cs_fee_estimator (practicalswift)9a789d4dc6
policy: Add Clang thread safety annotations for variables guarded by cs_feeEstimator (practicalswift) Pull request description: * Add Clang thread safety annotations for variables guarded by `cs_feeEstimator` * ~~Add missing `cs_feeEstimator` locks~~ Tree-SHA512: 24b1d876ad53524ee8989b9658ac1a1b2766ebb3b27a1f84601d207e74d090e33738b814afac2a1f5bcd37565abcb361c6e5adae212840ff1ca32c3c42953391
This commit is contained in:
commit
1ac7d599f9
2 changed files with 29 additions and 28 deletions
|
@ -511,7 +511,7 @@ void TxConfirmStats::removeTx(unsigned int entryHeight, unsigned int nBestSeenHe
|
||||||
// of no harm to try to remove them again.
|
// of no harm to try to remove them again.
|
||||||
bool CBlockPolicyEstimator::removeTx(uint256 hash, bool inBlock)
|
bool CBlockPolicyEstimator::removeTx(uint256 hash, bool inBlock)
|
||||||
{
|
{
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(m_cs_fee_estimator);
|
||||||
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, inBlock);
|
feeStats->removeTx(pos->second.blockHeight, nBestSeenHeight, pos->second.bucketIndex, inBlock);
|
||||||
|
@ -548,7 +548,7 @@ CBlockPolicyEstimator::~CBlockPolicyEstimator()
|
||||||
|
|
||||||
void CBlockPolicyEstimator::processTransaction(const CTxMemPoolEntry& entry, bool validFeeEstimate)
|
void CBlockPolicyEstimator::processTransaction(const CTxMemPoolEntry& entry, bool validFeeEstimate)
|
||||||
{
|
{
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(m_cs_fee_estimator);
|
||||||
unsigned int txHeight = entry.GetHeight();
|
unsigned int txHeight = entry.GetHeight();
|
||||||
uint256 hash = entry.GetTx().GetHash();
|
uint256 hash = entry.GetTx().GetHash();
|
||||||
if (mapMemPoolTxs.count(hash)) {
|
if (mapMemPoolTxs.count(hash)) {
|
||||||
|
@ -615,7 +615,7 @@ bool CBlockPolicyEstimator::processBlockTx(unsigned int nBlockHeight, const CTxM
|
||||||
void CBlockPolicyEstimator::processBlock(unsigned int nBlockHeight,
|
void CBlockPolicyEstimator::processBlock(unsigned int nBlockHeight,
|
||||||
std::vector<const CTxMemPoolEntry*>& entries)
|
std::vector<const CTxMemPoolEntry*>& entries)
|
||||||
{
|
{
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(m_cs_fee_estimator);
|
||||||
if (nBlockHeight <= nBestSeenHeight) {
|
if (nBlockHeight <= nBestSeenHeight) {
|
||||||
// Ignore side chains and re-orgs; assuming they are random
|
// Ignore side chains and re-orgs; assuming they are random
|
||||||
// they don't affect the estimate.
|
// they don't affect the estimate.
|
||||||
|
@ -693,7 +693,7 @@ CFeeRate CBlockPolicyEstimator::estimateRawFee(int confTarget, double successThr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(m_cs_fee_estimator);
|
||||||
// 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 > stats->GetMaxConfirms())
|
if (confTarget <= 0 || (unsigned int)confTarget > stats->GetMaxConfirms())
|
||||||
return CFeeRate(0);
|
return CFeeRate(0);
|
||||||
|
@ -710,6 +710,7 @@ CFeeRate CBlockPolicyEstimator::estimateRawFee(int confTarget, double successThr
|
||||||
|
|
||||||
unsigned int CBlockPolicyEstimator::HighestTargetTracked(FeeEstimateHorizon horizon) const
|
unsigned int CBlockPolicyEstimator::HighestTargetTracked(FeeEstimateHorizon horizon) const
|
||||||
{
|
{
|
||||||
|
LOCK(m_cs_fee_estimator);
|
||||||
switch (horizon) {
|
switch (horizon) {
|
||||||
case FeeEstimateHorizon::SHORT_HALFLIFE: {
|
case FeeEstimateHorizon::SHORT_HALFLIFE: {
|
||||||
return shortStats->GetMaxConfirms();
|
return shortStats->GetMaxConfirms();
|
||||||
|
@ -819,7 +820,7 @@ double CBlockPolicyEstimator::estimateConservativeFee(unsigned int doubleTarget,
|
||||||
*/
|
*/
|
||||||
CFeeRate CBlockPolicyEstimator::estimateSmartFee(int confTarget, FeeCalculation *feeCalc, bool conservative) const
|
CFeeRate CBlockPolicyEstimator::estimateSmartFee(int confTarget, FeeCalculation *feeCalc, bool conservative) const
|
||||||
{
|
{
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(m_cs_fee_estimator);
|
||||||
|
|
||||||
if (feeCalc) {
|
if (feeCalc) {
|
||||||
feeCalc->desiredTarget = confTarget;
|
feeCalc->desiredTarget = confTarget;
|
||||||
|
@ -899,7 +900,7 @@ CFeeRate CBlockPolicyEstimator::estimateSmartFee(int confTarget, FeeCalculation
|
||||||
bool CBlockPolicyEstimator::Write(CAutoFile& fileout) const
|
bool CBlockPolicyEstimator::Write(CAutoFile& fileout) const
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(m_cs_fee_estimator);
|
||||||
fileout << 149900; // version required to read: 0.14.99 or later
|
fileout << 149900; // version required to read: 0.14.99 or later
|
||||||
fileout << CLIENT_VERSION; // version that wrote the file
|
fileout << CLIENT_VERSION; // version that wrote the file
|
||||||
fileout << nBestSeenHeight;
|
fileout << nBestSeenHeight;
|
||||||
|
@ -924,7 +925,7 @@ bool CBlockPolicyEstimator::Write(CAutoFile& fileout) const
|
||||||
bool CBlockPolicyEstimator::Read(CAutoFile& filein)
|
bool CBlockPolicyEstimator::Read(CAutoFile& filein)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(m_cs_fee_estimator);
|
||||||
int nVersionRequired, nVersionThatWrote;
|
int nVersionRequired, nVersionThatWrote;
|
||||||
filein >> nVersionRequired >> nVersionThatWrote;
|
filein >> nVersionRequired >> nVersionThatWrote;
|
||||||
if (nVersionRequired > CLIENT_VERSION)
|
if (nVersionRequired > CLIENT_VERSION)
|
||||||
|
@ -983,7 +984,7 @@ bool CBlockPolicyEstimator::Read(CAutoFile& filein)
|
||||||
|
|
||||||
void CBlockPolicyEstimator::FlushUnconfirmed() {
|
void CBlockPolicyEstimator::FlushUnconfirmed() {
|
||||||
int64_t startclear = GetTimeMicros();
|
int64_t startclear = GetTimeMicros();
|
||||||
LOCK(cs_feeEstimator);
|
LOCK(m_cs_fee_estimator);
|
||||||
size_t num_entries = mapMemPoolTxs.size();
|
size_t num_entries = mapMemPoolTxs.size();
|
||||||
// Remove every entry in mapMemPoolTxs
|
// Remove every entry in mapMemPoolTxs
|
||||||
while (!mapMemPoolTxs.empty()) {
|
while (!mapMemPoolTxs.empty()) {
|
||||||
|
|
|
@ -228,10 +228,12 @@ public:
|
||||||
unsigned int HighestTargetTracked(FeeEstimateHorizon horizon) const;
|
unsigned int HighestTargetTracked(FeeEstimateHorizon horizon) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
unsigned int nBestSeenHeight;
|
mutable CCriticalSection m_cs_fee_estimator;
|
||||||
unsigned int firstRecordedHeight;
|
|
||||||
unsigned int historicalFirst;
|
unsigned int nBestSeenHeight GUARDED_BY(m_cs_fee_estimator);
|
||||||
unsigned int historicalBest;
|
unsigned int firstRecordedHeight GUARDED_BY(m_cs_fee_estimator);
|
||||||
|
unsigned int historicalFirst GUARDED_BY(m_cs_fee_estimator);
|
||||||
|
unsigned int historicalBest GUARDED_BY(m_cs_fee_estimator);
|
||||||
|
|
||||||
struct TxStatsInfo
|
struct TxStatsInfo
|
||||||
{
|
{
|
||||||
|
@ -241,34 +243,32 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
// map of txids to information about that transaction
|
// map of txids to information about that transaction
|
||||||
std::map<uint256, TxStatsInfo> mapMemPoolTxs;
|
std::map<uint256, TxStatsInfo> mapMemPoolTxs GUARDED_BY(m_cs_fee_estimator);
|
||||||
|
|
||||||
/** Classes to track historical data on transaction confirmations */
|
/** Classes to track historical data on transaction confirmations */
|
||||||
std::unique_ptr<TxConfirmStats> feeStats;
|
std::unique_ptr<TxConfirmStats> feeStats PT_GUARDED_BY(m_cs_fee_estimator);
|
||||||
std::unique_ptr<TxConfirmStats> shortStats;
|
std::unique_ptr<TxConfirmStats> shortStats PT_GUARDED_BY(m_cs_fee_estimator);
|
||||||
std::unique_ptr<TxConfirmStats> longStats;
|
std::unique_ptr<TxConfirmStats> longStats PT_GUARDED_BY(m_cs_fee_estimator);
|
||||||
|
|
||||||
unsigned int trackedTxs;
|
unsigned int trackedTxs GUARDED_BY(m_cs_fee_estimator);
|
||||||
unsigned int untrackedTxs;
|
unsigned int untrackedTxs GUARDED_BY(m_cs_fee_estimator);
|
||||||
|
|
||||||
std::vector<double> buckets; // The upper-bound of the range for the bucket (inclusive)
|
std::vector<double> buckets GUARDED_BY(m_cs_fee_estimator); // The upper-bound of the range for the bucket (inclusive)
|
||||||
std::map<double, unsigned int> bucketMap; // Map of bucket upper-bound to index into all vectors by bucket
|
std::map<double, unsigned int> bucketMap GUARDED_BY(m_cs_fee_estimator); // Map of bucket upper-bound to index into all vectors by bucket
|
||||||
|
|
||||||
mutable CCriticalSection cs_feeEstimator;
|
|
||||||
|
|
||||||
/** Process a transaction confirmed in a block*/
|
/** Process a transaction confirmed in a block*/
|
||||||
bool processBlockTx(unsigned int nBlockHeight, const CTxMemPoolEntry* entry);
|
bool processBlockTx(unsigned int nBlockHeight, const CTxMemPoolEntry* entry) EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
|
||||||
|
|
||||||
/** Helper for estimateSmartFee */
|
/** Helper for estimateSmartFee */
|
||||||
double estimateCombinedFee(unsigned int confTarget, double successThreshold, bool checkShorterHorizon, EstimationResult *result) const;
|
double estimateCombinedFee(unsigned int confTarget, double successThreshold, bool checkShorterHorizon, EstimationResult *result) const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
|
||||||
/** Helper for estimateSmartFee */
|
/** Helper for estimateSmartFee */
|
||||||
double estimateConservativeFee(unsigned int doubleTarget, EstimationResult *result) const;
|
double estimateConservativeFee(unsigned int doubleTarget, EstimationResult *result) const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
|
||||||
/** Number of blocks of data recorded while fee estimates have been running */
|
/** Number of blocks of data recorded while fee estimates have been running */
|
||||||
unsigned int BlockSpan() const;
|
unsigned int BlockSpan() const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
|
||||||
/** Number of blocks of recorded fee estimate data represented in saved data file */
|
/** Number of blocks of recorded fee estimate data represented in saved data file */
|
||||||
unsigned int HistoricalBlockSpan() const;
|
unsigned int HistoricalBlockSpan() const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
|
||||||
/** Calculation of highest target that reasonable estimate can be provided for */
|
/** Calculation of highest target that reasonable estimate can be provided for */
|
||||||
unsigned int MaxUsableEstimate() const;
|
unsigned int MaxUsableEstimate() const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
|
||||||
};
|
};
|
||||||
|
|
||||||
class FeeFilterRounder
|
class FeeFilterRounder
|
||||||
|
|
Loading…
Add table
Reference in a new issue