diff options
author | ismaelsadeeq <ask4ismailsadiq@gmail.com> | 2023-06-08 13:14:11 +0100 |
---|---|---|
committer | ismaelsadeeq <ask4ismailsadiq@gmail.com> | 2023-06-14 21:42:41 +0100 |
commit | 5b886f2b436eaa8c2b7de58dc4644dc6223040da (patch) | |
tree | d90cd994354e574e296cd110a066fce18728a4cb /src | |
parent | 681ecac5c2d462920cd32636eec15599a9bcf424 (diff) |
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.cpp | 8 | ||||
-rw-r--r-- | src/policy/fees.cpp | 6 | ||||
-rw-r--r-- | src/policy/fees.h | 9 |
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; |