mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-08 10:31:50 -05:00
Migrate -prune setting from QSettings to settings.json
This commit is contained in:
parent
f067e19433
commit
9a016a3c07
4 changed files with 76 additions and 38 deletions
|
@ -344,7 +344,7 @@ void BitcoinApplication::parameterSetup()
|
||||||
|
|
||||||
void BitcoinApplication::InitPruneSetting(int64_t prune_MiB)
|
void BitcoinApplication::InitPruneSetting(int64_t prune_MiB)
|
||||||
{
|
{
|
||||||
optionsModel->SetPruneTargetGB(PruneMiBtoGB(prune_MiB), true);
|
optionsModel->SetPruneTargetGB(PruneMiBtoGB(prune_MiB));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BitcoinApplication::requestInitialize()
|
void BitcoinApplication::requestInitialize()
|
||||||
|
|
|
@ -45,6 +45,8 @@ static const char* SettingName(OptionsModel::OptionID option)
|
||||||
case OptionsModel::MapPortNatpmp: return "natpmp";
|
case OptionsModel::MapPortNatpmp: return "natpmp";
|
||||||
case OptionsModel::Listen: return "listen";
|
case OptionsModel::Listen: return "listen";
|
||||||
case OptionsModel::Server: return "server";
|
case OptionsModel::Server: return "server";
|
||||||
|
case OptionsModel::PruneSize: return "prune";
|
||||||
|
case OptionsModel::Prune: return "prune";
|
||||||
case OptionsModel::ProxyIP: return "proxy";
|
case OptionsModel::ProxyIP: return "proxy";
|
||||||
case OptionsModel::ProxyPort: return "proxy";
|
case OptionsModel::ProxyPort: return "proxy";
|
||||||
case OptionsModel::ProxyUse: return "proxy";
|
case OptionsModel::ProxyUse: return "proxy";
|
||||||
|
@ -60,7 +62,9 @@ static void UpdateRwSetting(interfaces::Node& node, OptionsModel::OptionID optio
|
||||||
{
|
{
|
||||||
if (value.isNum() &&
|
if (value.isNum() &&
|
||||||
(option == OptionsModel::DatabaseCache ||
|
(option == OptionsModel::DatabaseCache ||
|
||||||
option == OptionsModel::ThreadsScriptVerif)) {
|
option == OptionsModel::ThreadsScriptVerif ||
|
||||||
|
option == OptionsModel::Prune ||
|
||||||
|
option == OptionsModel::PruneSize)) {
|
||||||
// Write certain old settings as strings, even though they are numbers,
|
// Write certain old settings as strings, even though they are numbers,
|
||||||
// because Bitcoin 22.x releases try to read these specific settings as
|
// because Bitcoin 22.x releases try to read these specific settings as
|
||||||
// strings in addOverriddenOption() calls at startup, triggering
|
// strings in addOverriddenOption() calls at startup, triggering
|
||||||
|
@ -74,6 +78,36 @@ static void UpdateRwSetting(interfaces::Node& node, OptionsModel::OptionID optio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Convert enabled/size values to bitcoin -prune setting.
|
||||||
|
static util::SettingsValue PruneSetting(bool prune_enabled, int prune_size_gb)
|
||||||
|
{
|
||||||
|
assert(!prune_enabled || prune_size_gb >= 1); // PruneSizeGB and ParsePruneSizeGB never return less
|
||||||
|
return prune_enabled ? PruneGBtoMiB(prune_size_gb) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Get pruning enabled value to show in GUI from bitcoin -prune setting.
|
||||||
|
static bool PruneEnabled(const util::SettingsValue& prune_setting)
|
||||||
|
{
|
||||||
|
// -prune=1 setting is manual pruning mode, so disabled for purposes of the gui
|
||||||
|
return SettingToInt(prune_setting, 0) > 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Get pruning size value to show in GUI from bitcoin -prune setting. If
|
||||||
|
//! pruning is not enabled, just show default recommended pruning size (2GB).
|
||||||
|
static int PruneSizeGB(const util::SettingsValue& prune_setting)
|
||||||
|
{
|
||||||
|
int value = SettingToInt(prune_setting, 0);
|
||||||
|
return value > 1 ? PruneMiBtoGB(value) : DEFAULT_PRUNE_TARGET_GB;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Parse pruning size value provided by user in GUI or loaded from QSettings
|
||||||
|
//! (windows registry key or qt .conf file). Smallest value that the GUI can
|
||||||
|
//! display is 1 GB, so round up if anything less is parsed.
|
||||||
|
static int ParsePruneSizeGB(const QVariant& prune_size)
|
||||||
|
{
|
||||||
|
return std::max(1, prune_size.toInt());
|
||||||
|
}
|
||||||
|
|
||||||
struct ProxySetting {
|
struct ProxySetting {
|
||||||
bool is_set;
|
bool is_set;
|
||||||
QString ip;
|
QString ip;
|
||||||
|
@ -96,6 +130,7 @@ void OptionsModel::addOverriddenOption(const std::string &option)
|
||||||
bool OptionsModel::Init(bilingual_str& error)
|
bool OptionsModel::Init(bilingual_str& error)
|
||||||
{
|
{
|
||||||
// Initialize display settings from stored settings.
|
// Initialize display settings from stored settings.
|
||||||
|
m_prune_size_gb = PruneSizeGB(node().getPersistentSetting("prune"));
|
||||||
ProxySetting proxy = ParseProxyString(SettingToString(node().getPersistentSetting("proxy"), GetDefaultProxyAddress().toStdString()));
|
ProxySetting proxy = ParseProxyString(SettingToString(node().getPersistentSetting("proxy"), GetDefaultProxyAddress().toStdString()));
|
||||||
m_proxy_ip = proxy.ip;
|
m_proxy_ip = proxy.ip;
|
||||||
m_proxy_port = proxy.port;
|
m_proxy_port = proxy.port;
|
||||||
|
@ -155,7 +190,7 @@ bool OptionsModel::Init(bilingual_str& error)
|
||||||
// These are shared with the core or have a command-line parameter
|
// These are shared with the core or have a command-line parameter
|
||||||
// and we want command-line parameters to overwrite the GUI settings.
|
// and we want command-line parameters to overwrite the GUI settings.
|
||||||
for (OptionID option : {DatabaseCache, ThreadsScriptVerif, SpendZeroConfChange, ExternalSignerPath, MapPortUPnP,
|
for (OptionID option : {DatabaseCache, ThreadsScriptVerif, SpendZeroConfChange, ExternalSignerPath, MapPortUPnP,
|
||||||
MapPortNatpmp, Listen, Server, ProxyUse, ProxyUseTor}) {
|
MapPortNatpmp, Listen, Server, Prune, ProxyUse, ProxyUseTor}) {
|
||||||
std::string setting = SettingName(option);
|
std::string setting = SettingName(option);
|
||||||
if (node().isSettingIgnored(setting)) addOverriddenOption("-" + setting);
|
if (node().isSettingIgnored(setting)) addOverriddenOption("-" + setting);
|
||||||
try {
|
try {
|
||||||
|
@ -175,11 +210,6 @@ bool OptionsModel::Init(bilingual_str& error)
|
||||||
// by command-line and show this in the UI.
|
// by command-line and show this in the UI.
|
||||||
|
|
||||||
// Main
|
// Main
|
||||||
if (!settings.contains("bPrune"))
|
|
||||||
settings.setValue("bPrune", false);
|
|
||||||
if (!settings.contains("nPruneSize"))
|
|
||||||
settings.setValue("nPruneSize", DEFAULT_PRUNE_TARGET_GB);
|
|
||||||
SetPruneEnabled(settings.value("bPrune").toBool());
|
|
||||||
if (!settings.contains("strDataDir"))
|
if (!settings.contains("strDataDir"))
|
||||||
settings.setValue("strDataDir", GUIUtil::getDefaultDataDirectory());
|
settings.setValue("strDataDir", GUIUtil::getDefaultDataDirectory());
|
||||||
|
|
||||||
|
@ -288,29 +318,27 @@ static const QString GetDefaultProxyAddress()
|
||||||
return QString("%1:%2").arg(DEFAULT_GUI_PROXY_HOST).arg(DEFAULT_GUI_PROXY_PORT);
|
return QString("%1:%2").arg(DEFAULT_GUI_PROXY_HOST).arg(DEFAULT_GUI_PROXY_PORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsModel::SetPruneEnabled(bool prune, bool force)
|
void OptionsModel::SetPruneTargetGB(int prune_target_gb)
|
||||||
{
|
{
|
||||||
QSettings settings;
|
const util::SettingsValue cur_value = node().getPersistentSetting("prune");
|
||||||
settings.setValue("bPrune", prune);
|
const util::SettingsValue new_value = PruneSetting(prune_target_gb > 0, prune_target_gb);
|
||||||
const int64_t prune_target_mib = PruneGBtoMiB(settings.value("nPruneSize").toInt());
|
|
||||||
std::string prune_val = prune ? ToString(prune_target_mib) : "0";
|
|
||||||
if (force) {
|
|
||||||
gArgs.ForceSetArg("-prune", prune_val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!gArgs.SoftSetArg("-prune", prune_val)) {
|
|
||||||
addOverriddenOption("-prune");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OptionsModel::SetPruneTargetGB(int prune_target_gb, bool force)
|
m_prune_size_gb = prune_target_gb;
|
||||||
{
|
|
||||||
const bool prune = prune_target_gb > 0;
|
// Force setting to take effect. It is still safe to change the value at
|
||||||
if (prune) {
|
// this point because this function is only called after the intro screen is
|
||||||
QSettings settings;
|
// shown, before the node starts.
|
||||||
settings.setValue("nPruneSize", prune_target_gb);
|
node().forceSetting("prune", new_value);
|
||||||
|
|
||||||
|
// Update settings.json if value configured in intro screen is different
|
||||||
|
// from saved value. Avoid writing settings.json if bitcoin.conf value
|
||||||
|
// doesn't need to be overridden.
|
||||||
|
if (PruneEnabled(cur_value) != PruneEnabled(new_value) ||
|
||||||
|
PruneSizeGB(cur_value) != PruneSizeGB(new_value)) {
|
||||||
|
// Call UpdateRwSetting() instead of setOption() to avoid setting
|
||||||
|
// RestartRequired flag
|
||||||
|
UpdateRwSetting(node(), Prune, new_value);
|
||||||
}
|
}
|
||||||
SetPruneEnabled(prune, force);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// read QSettings values and return them
|
// read QSettings values and return them
|
||||||
|
@ -401,9 +429,9 @@ QVariant OptionsModel::getOption(OptionID option) const
|
||||||
case EnablePSBTControls:
|
case EnablePSBTControls:
|
||||||
return settings.value("enable_psbt_controls");
|
return settings.value("enable_psbt_controls");
|
||||||
case Prune:
|
case Prune:
|
||||||
return settings.value("bPrune");
|
return PruneEnabled(setting());
|
||||||
case PruneSize:
|
case PruneSize:
|
||||||
return settings.value("nPruneSize");
|
return m_prune_size_gb;
|
||||||
case DatabaseCache:
|
case DatabaseCache:
|
||||||
return qlonglong(SettingToInt(setting(), nDefaultDbCache));
|
return qlonglong(SettingToInt(setting(), nDefaultDbCache));
|
||||||
case ThreadsScriptVerif:
|
case ThreadsScriptVerif:
|
||||||
|
@ -556,15 +584,18 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value)
|
||||||
settings.setValue("enable_psbt_controls", m_enable_psbt_controls);
|
settings.setValue("enable_psbt_controls", m_enable_psbt_controls);
|
||||||
break;
|
break;
|
||||||
case Prune:
|
case Prune:
|
||||||
if (settings.value("bPrune") != value) {
|
if (changed()) {
|
||||||
settings.setValue("bPrune", value);
|
update(PruneSetting(value.toBool(), m_prune_size_gb));
|
||||||
setRestartRequired(true);
|
setRestartRequired(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PruneSize:
|
case PruneSize:
|
||||||
if (settings.value("nPruneSize") != value) {
|
if (changed()) {
|
||||||
settings.setValue("nPruneSize", value);
|
m_prune_size_gb = ParsePruneSizeGB(value);
|
||||||
setRestartRequired(true);
|
if (getOption(Prune).toBool()) {
|
||||||
|
update(PruneSetting(true, m_prune_size_gb));
|
||||||
|
setRestartRequired(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DatabaseCache:
|
case DatabaseCache:
|
||||||
|
@ -674,6 +705,8 @@ void OptionsModel::checkAndMigrate()
|
||||||
migrate_setting(MapPortNatpmp, "fUseNatpmp");
|
migrate_setting(MapPortNatpmp, "fUseNatpmp");
|
||||||
migrate_setting(Listen, "fListen");
|
migrate_setting(Listen, "fListen");
|
||||||
migrate_setting(Server, "server");
|
migrate_setting(Server, "server");
|
||||||
|
migrate_setting(PruneSize, "nPruneSize");
|
||||||
|
migrate_setting(Prune, "bPrune");
|
||||||
migrate_setting(ProxyIP, "addrProxy");
|
migrate_setting(ProxyIP, "addrProxy");
|
||||||
migrate_setting(ProxyUse, "fUseProxy");
|
migrate_setting(ProxyUse, "fUseProxy");
|
||||||
migrate_setting(ProxyIPTor, "addrSeparateProxyTor");
|
migrate_setting(ProxyIPTor, "addrSeparateProxyTor");
|
||||||
|
|
|
@ -99,8 +99,7 @@ public:
|
||||||
const QString& getOverriddenByCommandLine() { return strOverriddenByCommandLine; }
|
const QString& getOverriddenByCommandLine() { return strOverriddenByCommandLine; }
|
||||||
|
|
||||||
/* Explicit setters */
|
/* Explicit setters */
|
||||||
void SetPruneEnabled(bool prune, bool force = false);
|
void SetPruneTargetGB(int prune_target_gb);
|
||||||
void SetPruneTargetGB(int prune_target_gb, bool force = false);
|
|
||||||
|
|
||||||
/* Restart flag helper */
|
/* Restart flag helper */
|
||||||
void setRestartRequired(bool fRequired);
|
void setRestartRequired(bool fRequired);
|
||||||
|
@ -125,6 +124,7 @@ private:
|
||||||
//! In-memory settings for display. These are stored persistently by the
|
//! In-memory settings for display. These are stored persistently by the
|
||||||
//! bitcoin node but it's also nice to store them in memory to prevent them
|
//! bitcoin node but it's also nice to store them in memory to prevent them
|
||||||
//! getting cleared when enable/disable toggles are used in the GUI.
|
//! getting cleared when enable/disable toggles are used in the GUI.
|
||||||
|
int m_prune_size_gb;
|
||||||
QString m_proxy_ip;
|
QString m_proxy_ip;
|
||||||
QString m_proxy_port;
|
QString m_proxy_port;
|
||||||
QString m_onion_ip;
|
QString m_onion_ip;
|
||||||
|
|
|
@ -36,6 +36,8 @@ void OptionTests::migrateSettings()
|
||||||
settings.setValue("nThreadsScriptVerif", 12);
|
settings.setValue("nThreadsScriptVerif", 12);
|
||||||
settings.setValue("fUseUPnP", false);
|
settings.setValue("fUseUPnP", false);
|
||||||
settings.setValue("fListen", false);
|
settings.setValue("fListen", false);
|
||||||
|
settings.setValue("bPrune", true);
|
||||||
|
settings.setValue("nPruneSize", 3);
|
||||||
settings.setValue("fUseProxy", true);
|
settings.setValue("fUseProxy", true);
|
||||||
settings.setValue("addrProxy", "proxy:123");
|
settings.setValue("addrProxy", "proxy:123");
|
||||||
settings.setValue("fUseSeparateProxyTor", true);
|
settings.setValue("fUseSeparateProxyTor", true);
|
||||||
|
@ -50,6 +52,8 @@ void OptionTests::migrateSettings()
|
||||||
QVERIFY(!settings.contains("nThreadsScriptVerif"));
|
QVERIFY(!settings.contains("nThreadsScriptVerif"));
|
||||||
QVERIFY(!settings.contains("fUseUPnP"));
|
QVERIFY(!settings.contains("fUseUPnP"));
|
||||||
QVERIFY(!settings.contains("fListen"));
|
QVERIFY(!settings.contains("fListen"));
|
||||||
|
QVERIFY(!settings.contains("bPrune"));
|
||||||
|
QVERIFY(!settings.contains("nPruneSize"));
|
||||||
QVERIFY(!settings.contains("fUseProxy"));
|
QVERIFY(!settings.contains("fUseProxy"));
|
||||||
QVERIFY(!settings.contains("addrProxy"));
|
QVERIFY(!settings.contains("addrProxy"));
|
||||||
QVERIFY(!settings.contains("fUseSeparateProxyTor"));
|
QVERIFY(!settings.contains("fUseSeparateProxyTor"));
|
||||||
|
@ -61,7 +65,8 @@ void OptionTests::migrateSettings()
|
||||||
" \"listen\": false,\n"
|
" \"listen\": false,\n"
|
||||||
" \"onion\": \"onion:234\",\n"
|
" \"onion\": \"onion:234\",\n"
|
||||||
" \"par\": \"12\",\n"
|
" \"par\": \"12\",\n"
|
||||||
" \"proxy\": \"proxy:123\"\n"
|
" \"proxy\": \"proxy:123\",\n"
|
||||||
|
" \"prune\": \"2861\"\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue