aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorismaelsadeeq <ask4ismailsadiq@gmail.com>2023-06-08 13:14:11 +0100
committerismaelsadeeq <ask4ismailsadiq@gmail.com>2023-06-14 21:42:41 +0100
commit5b886f2b436eaa8c2b7de58dc4644dc6223040da (patch)
treed90cd994354e574e296cd110a066fce18728a4cb /src
parent681ecac5c2d462920cd32636eec15599a9bcf424 (diff)
downloadbitcoin-5b886f2b436eaa8c2b7de58dc4644dc6223040da.tar.xz
tx fees, policy: periodically flush fee estimates to fee_estimates.dat
This reduces chances of having old estimates in fee_estimates.dat.
Diffstat (limited to 'src')
-rw-r--r--src/init.cpp8
-rw-r--r--src/policy/fees.cpp6
-rw-r--r--src/policy/fees.h9
3 files changed, 22 insertions, 1 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 38e1dbb4a2..72deb392f7 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -1253,7 +1253,13 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
assert(!node.fee_estimator);
// Don't initialize fee estimation with old data if we don't relay transactions,
// as they would never get updated.
- if (!ignores_incoming_txs) node.fee_estimator = std::make_unique<CBlockPolicyEstimator>(FeeestPath(args));
+ if (!ignores_incoming_txs) {
+ node.fee_estimator = std::make_unique<CBlockPolicyEstimator>(FeeestPath(args));
+
+ // Flush estimates to disk periodically
+ CBlockPolicyEstimator* fee_estimator = node.fee_estimator.get();
+ node.scheduler->scheduleEvery([fee_estimator] { fee_estimator->FlushFeeEstimates(); }, FEE_FLUSH_INTERVAL);
+ }
// Check port numbers
for (const std::string port_option : {
diff --git a/src/policy/fees.cpp b/src/policy/fees.cpp
index ae226f7011..7bbc9b5e89 100644
--- a/src/policy/fees.cpp
+++ b/src/policy/fees.cpp
@@ -903,10 +903,16 @@ CFeeRate CBlockPolicyEstimator::estimateSmartFee(int confTarget, FeeCalculation
void CBlockPolicyEstimator::Flush() {
FlushUnconfirmed();
+ FlushFeeEstimates();
+}
+void CBlockPolicyEstimator::FlushFeeEstimates()
+{
AutoFile est_file{fsbridge::fopen(m_estimation_filepath, "wb")};
if (est_file.IsNull() || !Write(est_file)) {
LogPrintf("Failed to write fee estimates to %s. Continue anyway.\n", fs::PathToString(m_estimation_filepath));
+ } else {
+ LogPrintf("Flushed fee estimates to %s.\n", fs::PathToString(m_estimation_filepath.filename()));
}
}
diff --git a/src/policy/fees.h b/src/policy/fees.h
index 775a72a764..a6c45839b9 100644
--- a/src/policy/fees.h
+++ b/src/policy/fees.h
@@ -14,12 +14,17 @@
#include <util/fs.h>
#include <array>
+#include <chrono>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>
+
+// How often to flush fee estimates to fee_estimates.dat.
+static constexpr std::chrono::hours FEE_FLUSH_INTERVAL{1};
+
class AutoFile;
class CTxMemPoolEntry;
class TxConfirmStats;
@@ -239,6 +244,10 @@ public:
void Flush()
EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);
+ /** Record current fee estimations. */
+ void FlushFeeEstimates()
+ EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);
+
private:
mutable Mutex m_cs_fee_estimator;