mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-05-17 23:56:39 +00:00
Merge bitcoin/bitcoin#24407: fees: make the class FeeFilterRounder thread-safe
8173f160e085186c9bcc7f3506205c309ee66af6 style: rename variables to match coding style (Vasil Dimov) 8b4ad203d06c5ded6ecebbd7277b29a442d88bcf fees: make FeeFilterRounder::feeset const (Vasil Dimov) e7a5bf6be79e341e037305a4c2d8a1a510a8d709 fees: make the class FeeFilterRounder thread-safe (Vasil Dimov) Pull request description: Make the class `FeeFilterRounder` thread-safe so that its methods can be called concurrently by different threads on the same object. Currently it has just one method (`round()`). The second commit is optional, but it improves readability, showing that the `feeset` member will never be changed, thus does not need protection from concurrent access. ACKs for top commit: jonatack: re-ACK 8173f160e085186c9bcc7f3506205c309ee66af6 laanwj: Code review ACK 8173f160e085186c9bcc7f3506205c309ee66af6 promag: Code review ACK 8173f160e085186c9bcc7f3506205c309ee66af6 Tree-SHA512: 94b809997c485c0d114fa702d0406b980be8eaaebcfefa56808ed670aa943959c2f16cfd0ef72b4752fe2a409a23af1b4b7f2f236e51212957759569e3bbbefd
This commit is contained in:
commit
0bac04b758
@ -1011,20 +1011,36 @@ void CBlockPolicyEstimator::FlushUnconfirmed()
|
|||||||
LogPrint(BCLog::ESTIMATEFEE, "Recorded %u unconfirmed txs from mempool in %gs\n", num_entries, Ticks<SecondsDouble>(endclear - startclear));
|
LogPrint(BCLog::ESTIMATEFEE, "Recorded %u unconfirmed txs from mempool in %gs\n", num_entries, Ticks<SecondsDouble>(endclear - startclear));
|
||||||
}
|
}
|
||||||
|
|
||||||
FeeFilterRounder::FeeFilterRounder(const CFeeRate& minIncrementalFee)
|
static std::set<double> MakeFeeSet(const CFeeRate& min_incremental_fee,
|
||||||
|
double max_filter_fee_rate,
|
||||||
|
double fee_filter_spacing)
|
||||||
{
|
{
|
||||||
CAmount minFeeLimit = std::max(CAmount(1), minIncrementalFee.GetFeePerK() / 2);
|
std::set<double> fee_set;
|
||||||
feeset.insert(0);
|
|
||||||
for (double bucketBoundary = minFeeLimit; bucketBoundary <= MAX_FILTER_FEERATE; bucketBoundary *= FEE_FILTER_SPACING) {
|
const CAmount min_fee_limit{std::max(CAmount(1), min_incremental_fee.GetFeePerK() / 2)};
|
||||||
feeset.insert(bucketBoundary);
|
fee_set.insert(0);
|
||||||
|
for (double bucket_boundary = min_fee_limit;
|
||||||
|
bucket_boundary <= max_filter_fee_rate;
|
||||||
|
bucket_boundary *= fee_filter_spacing) {
|
||||||
|
|
||||||
|
fee_set.insert(bucket_boundary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return fee_set;
|
||||||
|
}
|
||||||
|
|
||||||
|
FeeFilterRounder::FeeFilterRounder(const CFeeRate& minIncrementalFee)
|
||||||
|
: m_fee_set{MakeFeeSet(minIncrementalFee, MAX_FILTER_FEERATE, FEE_FILTER_SPACING)}
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
CAmount FeeFilterRounder::round(CAmount currentMinFee)
|
CAmount FeeFilterRounder::round(CAmount currentMinFee)
|
||||||
{
|
{
|
||||||
std::set<double>::iterator it = feeset.lower_bound(currentMinFee);
|
std::set<double>::iterator it = m_fee_set.lower_bound(currentMinFee);
|
||||||
if ((it != feeset.begin() && insecure_rand.rand32() % 3 != 0) || it == feeset.end()) {
|
if (it == m_fee_set.end() ||
|
||||||
it--;
|
(it != m_fee_set.begin() &&
|
||||||
|
WITH_LOCK(m_insecure_rand_mutex, return insecure_rand.rand32()) % 3 != 0)) {
|
||||||
|
--it;
|
||||||
}
|
}
|
||||||
return static_cast<CAmount>(*it);
|
return static_cast<CAmount>(*it);
|
||||||
}
|
}
|
||||||
|
@ -299,14 +299,15 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
/** Create new FeeFilterRounder */
|
/** Create new FeeFilterRounder */
|
||||||
explicit FeeFilterRounder(const CFeeRate& minIncrementalFee);
|
explicit FeeFilterRounder(const CFeeRate& min_incremental_fee);
|
||||||
|
|
||||||
/** Quantize a minimum fee for privacy purpose before broadcast. Not thread-safe due to use of FastRandomContext */
|
/** Quantize a minimum fee for privacy purpose before broadcast. */
|
||||||
CAmount round(CAmount currentMinFee);
|
CAmount round(CAmount currentMinFee);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::set<double> feeset;
|
const std::set<double> m_fee_set;
|
||||||
FastRandomContext insecure_rand;
|
Mutex m_insecure_rand_mutex;
|
||||||
|
FastRandomContext insecure_rand GUARDED_BY(m_insecure_rand_mutex);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BITCOIN_POLICY_FEES_H
|
#endif // BITCOIN_POLICY_FEES_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user