mempool: Introduce (still-unused) MemPoolLimits

They live as a CTxMemPool member.

[META] These limits will be used in subsequent commits to replace calls
       to gArgs.
This commit is contained in:
Carl Dong 2022-03-17 22:09:05 -04:00
parent 716bb5fbd3
commit 9333427014
7 changed files with 61 additions and 1 deletions

View File

@ -173,6 +173,7 @@ BITCOIN_CORE_H = \
kernel/checks.h \ kernel/checks.h \
kernel/coinstats.h \ kernel/coinstats.h \
kernel/context.h \ kernel/context.h \
kernel/mempool_limits.h \
kernel/mempool_options.h \ kernel/mempool_options.h \
key.h \ key.h \
key_io.h \ key_io.h \

View File

@ -0,0 +1,26 @@
// Copyright (c) 2022 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_KERNEL_MEMPOOL_LIMITS_H
#define BITCOIN_KERNEL_MEMPOOL_LIMITS_H
#include <policy/policy.h>
#include <cstdint>
namespace kernel {
/**
* Options struct containing limit options for a CTxMemPool. Default constructor
* populates the struct with sane default values which can be modified.
*
* Most of the time, this struct should be referenced as CTxMemPool::Limits.
*/
struct MemPoolLimits {
int64_t ancestor_count{DEFAULT_ANCESTOR_LIMIT};
int64_t ancestor_size_vbytes{DEFAULT_ANCESTOR_SIZE_LIMIT_KVB * 1'000};
int64_t descendant_count{DEFAULT_DESCENDANT_LIMIT};
int64_t descendant_size_vbytes{DEFAULT_DESCENDANT_SIZE_LIMIT_KVB * 1'000};
};
} // namespace kernel
#endif // BITCOIN_KERNEL_MEMPOOL_LIMITS_H

View File

@ -4,6 +4,8 @@
#ifndef BITCOIN_KERNEL_MEMPOOL_OPTIONS_H #ifndef BITCOIN_KERNEL_MEMPOOL_OPTIONS_H
#define BITCOIN_KERNEL_MEMPOOL_OPTIONS_H #define BITCOIN_KERNEL_MEMPOOL_OPTIONS_H
#include <kernel/mempool_limits.h>
#include <chrono> #include <chrono>
#include <cstdint> #include <cstdint>
@ -29,6 +31,7 @@ struct MemPoolOptions {
int check_ratio{0}; int check_ratio{0};
int64_t max_size_bytes{DEFAULT_MAX_MEMPOOL_SIZE_MB * 1'000'000}; int64_t max_size_bytes{DEFAULT_MAX_MEMPOOL_SIZE_MB * 1'000'000};
std::chrono::seconds expiry{std::chrono::hours{DEFAULT_MEMPOOL_EXPIRY_HOURS}}; std::chrono::seconds expiry{std::chrono::hours{DEFAULT_MEMPOOL_EXPIRY_HOURS}};
MemPoolLimits limits{};
}; };
} // namespace kernel } // namespace kernel

View File

@ -4,12 +4,27 @@
#include <mempool_args.h> #include <mempool_args.h>
#include <kernel/mempool_limits.h>
#include <kernel/mempool_options.h> #include <kernel/mempool_options.h>
#include <util/system.h> #include <util/system.h>
using kernel::MemPoolLimits;
using kernel::MemPoolOptions; using kernel::MemPoolOptions;
namespace {
void ApplyArgsManOptions(const ArgsManager& argsman, MemPoolLimits& mempool_limits)
{
mempool_limits.ancestor_count = argsman.GetIntArg("-limitancestorcount", mempool_limits.ancestor_count);
if (auto vkb = argsman.GetIntArg("-limitancestorsize")) mempool_limits.ancestor_size_vbytes = *vkb * 1'000;
mempool_limits.descendant_count = argsman.GetIntArg("-limitdescendantcount", mempool_limits.descendant_count);
if (auto vkb = argsman.GetIntArg("-limitdescendantsize")) mempool_limits.descendant_size_vbytes = *vkb * 1'000;
}
}
void ApplyArgsManOptions(const ArgsManager& argsman, MemPoolOptions& mempool_opts) void ApplyArgsManOptions(const ArgsManager& argsman, MemPoolOptions& mempool_opts)
{ {
mempool_opts.check_ratio = argsman.GetIntArg("-checkmempool", mempool_opts.check_ratio); mempool_opts.check_ratio = argsman.GetIntArg("-checkmempool", mempool_opts.check_ratio);
@ -17,4 +32,6 @@ void ApplyArgsManOptions(const ArgsManager& argsman, MemPoolOptions& mempool_opt
if (auto mb = argsman.GetIntArg("-maxmempool")) mempool_opts.max_size_bytes = *mb * 1'000'000; if (auto mb = argsman.GetIntArg("-maxmempool")) mempool_opts.max_size_bytes = *mb * 1'000'000;
if (auto hours = argsman.GetIntArg("-mempoolexpiry")) mempool_opts.expiry = std::chrono::hours{*hours}; if (auto hours = argsman.GetIntArg("-mempoolexpiry")) mempool_opts.expiry = std::chrono::hours{*hours};
ApplyArgsManOptions(argsman, mempool_opts.limits);
} }

View File

@ -10,6 +10,13 @@ namespace kernel {
struct MemPoolOptions; struct MemPoolOptions;
}; };
/**
* Overlay the options set in \p argsman on top of corresponding members in \p mempool_opts.
*
* @param[in] argsman The ArgsManager in which to check set options.
* @param[in,out] mempool_opts The MemPoolOptions to modify according to \p argsman.
*/
void ApplyArgsManOptions(const ArgsManager& argsman, kernel::MemPoolOptions& mempool_opts); void ApplyArgsManOptions(const ArgsManager& argsman, kernel::MemPoolOptions& mempool_opts);
#endif // BITCOIN_MEMPOOL_ARGS_H #endif // BITCOIN_MEMPOOL_ARGS_H

View File

@ -455,7 +455,8 @@ CTxMemPool::CTxMemPool(const Options& opts)
: m_check_ratio{opts.check_ratio}, : m_check_ratio{opts.check_ratio},
minerPolicyEstimator{opts.estimator}, minerPolicyEstimator{opts.estimator},
m_max_size_bytes{opts.max_size_bytes}, m_max_size_bytes{opts.max_size_bytes},
m_expiry{opts.expiry} m_expiry{opts.expiry},
m_limits{opts.limits}
{ {
_clear(); //lock free clear _clear(); //lock free clear
} }

View File

@ -14,6 +14,7 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <kernel/mempool_limits.h>
#include <kernel/mempool_options.h> #include <kernel/mempool_options.h>
#include <coins.h> #include <coins.h>
@ -569,6 +570,10 @@ public:
const int64_t m_max_size_bytes; const int64_t m_max_size_bytes;
const std::chrono::seconds m_expiry; const std::chrono::seconds m_expiry;
using Limits = kernel::MemPoolLimits;
const Limits m_limits;
/** Create a new CTxMemPool. /** Create a new CTxMemPool.
* Sanity checks will be off by default for performance, because otherwise * Sanity checks will be off by default for performance, because otherwise
* accepting transactions becomes O(N^2) where N is the number of transactions * accepting transactions becomes O(N^2) where N is the number of transactions