Skip to content

Commit c77f2f0

Browse files
committed
Migrate -prune setting from QSettings to settings.json
1 parent df20563 commit c77f2f0

File tree

4 files changed

+77
-39
lines changed

4 files changed

+77
-39
lines changed

src/qt/bitcoin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ void BitcoinApplication::parameterSetup()
339339

340340
void BitcoinApplication::InitPruneSetting(int64_t prune_MiB)
341341
{
342-
optionsModel->SetPruneTargetGB(PruneMiBtoGB(prune_MiB), true);
342+
optionsModel->SetPruneTargetGB(PruneMiBtoGB(prune_MiB));
343343
}
344344

345345
void BitcoinApplication::requestInitialize()

src/qt/optionsmodel.cpp

Lines changed: 68 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ const char* SettingName(OptionsModel::OptionID option)
4444
case OptionsModel::MapPortNatpmp: return "natpmp";
4545
case OptionsModel::Listen: return "listen";
4646
case OptionsModel::Server: return "server";
47+
case OptionsModel::PruneSize: return "prune";
48+
case OptionsModel::Prune: return "prune";
4749
case OptionsModel::ProxyIP: return "proxy";
4850
case OptionsModel::ProxyPort: return "proxy";
4951
case OptionsModel::ProxyUse: return "proxy";
@@ -62,13 +64,45 @@ void UpdateSetting(interfaces::Node& node, OptionsModel::OptionID option, const
6264
// fixed in later releases by https://github.com/bitcoin/bitcoin/pull/24498.
6365
if (value.isNum() &&
6466
(option == OptionsModel::DatabaseCache ||
65-
option == OptionsModel::ThreadsScriptVerif)) {
67+
option == OptionsModel::ThreadsScriptVerif ||
68+
option == OptionsModel::Prune ||
69+
option == OptionsModel::PruneSize)) {
6670
node.updateSetting(SettingName(option), value.getValStr());
6771
} else {
6872
node.updateSetting(SettingName(option), value);
6973
}
7074
}
7175

76+
//! Convert enabled/size values to bitcoin -prune setting.
77+
static util::SettingsValue PruneSetting(bool prune_enabled, int prune_size_gb)
78+
{
79+
assert(!prune_enabled || prune_size_gb >= 1); // PruneSizeGB and ParsePruneSizeGB never return less
80+
return prune_enabled ? PruneGBtoMiB(prune_size_gb) : 0;
81+
}
82+
83+
//! Get pruning enabled value to show in GUI from bitcoin -prune setting.
84+
static bool PruneEnabled(const util::SettingsValue& prune_setting)
85+
{
86+
// -prune=1 setting is manual pruning mode, so disabled for purposes of the gui
87+
return SettingToInt(prune_setting, 0) > 1;
88+
}
89+
90+
//! Get pruning size value to show in GUI from bitcoin -prune setting. If
91+
//! pruning is not enabled, just show default recommended pruning size (2GB).
92+
static int PruneSizeGB(const util::SettingsValue& prune_setting)
93+
{
94+
int value = SettingToInt(prune_setting, 0);
95+
return value > 1 ? PruneMiBtoGB(value) : DEFAULT_PRUNE_TARGET_GB;
96+
}
97+
98+
//! Parse pruning size value provided by user in GUI or loaded from QSettings
99+
//! (windows registry key or qt .conf file). Smallest value that the GUI can
100+
//! display is 1 GB, so round up if anything less is parsed.
101+
static int ParsePruneSizeGB(const QVariant& prune_size)
102+
{
103+
return std::max(1, prune_size.toInt());
104+
}
105+
72106
struct ProxySetting {
73107
bool is_set;
74108
QString ip;
@@ -91,6 +125,7 @@ void OptionsModel::addOverriddenOption(const std::string &option)
91125
bool OptionsModel::Init(bilingual_str& error)
92126
{
93127
// Initialize display settings from stored settings.
128+
m_prune_size_gb = PruneSizeGB(node().getPersistentSetting("prune"));
94129
ProxySetting proxy = ParseProxyString(SettingToString(node().getPersistentSetting("proxy"), GetDefaultProxyAddress().toStdString()));
95130
m_proxy_ip = proxy.ip;
96131
m_proxy_port = proxy.port;
@@ -150,7 +185,7 @@ bool OptionsModel::Init(bilingual_str& error)
150185
// These are shared with the core or have a command-line parameter
151186
// and we want command-line parameters to overwrite the GUI settings.
152187
for (OptionID option : {DatabaseCache, ThreadsScriptVerif, SpendZeroConfChange, ExternalSignerPath, MapPortUPnP,
153-
MapPortNatpmp, Listen, Server, ProxyUse, ProxyUseTor}) {
188+
MapPortNatpmp, Listen, Server, Prune, ProxyUse, ProxyUseTor}) {
154189
std::string setting = SettingName(option);
155190
if (node().isSettingIgnored(setting)) addOverriddenOption("-" + setting);
156191
try {
@@ -169,11 +204,6 @@ bool OptionsModel::Init(bilingual_str& error)
169204
// by command-line and show this in the UI.
170205

171206
// Main
172-
if (!settings.contains("bPrune"))
173-
settings.setValue("bPrune", false);
174-
if (!settings.contains("nPruneSize"))
175-
settings.setValue("nPruneSize", DEFAULT_PRUNE_TARGET_GB);
176-
SetPruneEnabled(settings.value("bPrune").toBool());
177207
if (!settings.contains("strDataDir"))
178208
settings.setValue("strDataDir", GUIUtil::getDefaultDataDirectory());
179209

@@ -282,29 +312,27 @@ static const QString GetDefaultProxyAddress()
282312
return QString("%1:%2").arg(DEFAULT_GUI_PROXY_HOST).arg(DEFAULT_GUI_PROXY_PORT);
283313
}
284314

285-
void OptionsModel::SetPruneEnabled(bool prune, bool force)
315+
void OptionsModel::SetPruneTargetGB(int prune_target_gb)
286316
{
287-
QSettings settings;
288-
settings.setValue("bPrune", prune);
289-
const int64_t prune_target_mib = PruneGBtoMiB(settings.value("nPruneSize").toInt());
290-
std::string prune_val = prune ? ToString(prune_target_mib) : "0";
291-
if (force) {
292-
gArgs.ForceSetArg("-prune", prune_val);
293-
return;
294-
}
295-
if (!gArgs.SoftSetArg("-prune", prune_val)) {
296-
addOverriddenOption("-prune");
297-
}
298-
}
299-
300-
void OptionsModel::SetPruneTargetGB(int prune_target_gb, bool force)
301-
{
302-
const bool prune = prune_target_gb > 0;
303-
if (prune) {
304-
QSettings settings;
305-
settings.setValue("nPruneSize", prune_target_gb);
317+
const util::SettingsValue cur_value = node().getPersistentSetting("prune");
318+
const util::SettingsValue new_value = PruneSetting(prune_target_gb > 0, prune_target_gb);
319+
320+
m_prune_size_gb = prune_target_gb;
321+
322+
// Force setting to take effect. It is still safe to change the value at
323+
// this point because this function is only called after the intro screen is
324+
// shown, before the node starts.
325+
node().forceSetting("prune", new_value);
326+
327+
// Update settings.json if value configured in intro screen is different
328+
// from saved value. Avoid writing settings.json if bitcoin.conf value
329+
// doesn't need to be overridden.
330+
if (PruneEnabled(cur_value) != PruneEnabled(new_value) ||
331+
PruneSizeGB(cur_value) != PruneSizeGB(new_value)) {
332+
// Call UpdateSetting() instead of setOption() to avoid setting
333+
// RestartRequired flag
334+
UpdateSetting(node(), Prune, new_value);
306335
}
307-
SetPruneEnabled(prune, force);
308336
}
309337

310338
// read QSettings values and return them
@@ -395,9 +423,9 @@ QVariant OptionsModel::getOption(OptionID option) const
395423
case EnablePSBTControls:
396424
return settings.value("enable_psbt_controls");
397425
case Prune:
398-
return settings.value("bPrune");
426+
return PruneEnabled(setting());
399427
case PruneSize:
400-
return settings.value("nPruneSize");
428+
return m_prune_size_gb;
401429
case DatabaseCache:
402430
return qlonglong(SettingToInt(setting(), nDefaultDbCache));
403431
case ThreadsScriptVerif:
@@ -550,15 +578,18 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value)
550578
settings.setValue("enable_psbt_controls", m_enable_psbt_controls);
551579
break;
552580
case Prune:
553-
if (settings.value("bPrune") != value) {
554-
settings.setValue("bPrune", value);
581+
if (changed()) {
582+
update(PruneSetting(value.toBool(), m_prune_size_gb));
555583
setRestartRequired(true);
556584
}
557585
break;
558586
case PruneSize:
559-
if (settings.value("nPruneSize") != value) {
560-
settings.setValue("nPruneSize", value);
561-
setRestartRequired(true);
587+
if (changed()) {
588+
m_prune_size_gb = ParsePruneSizeGB(value);
589+
if (getOption(Prune).toBool()) {
590+
update(PruneSetting(true, m_prune_size_gb));
591+
setRestartRequired(true);
592+
}
562593
}
563594
break;
564595
case DatabaseCache:
@@ -673,6 +704,8 @@ void OptionsModel::checkAndMigrate()
673704
migrate_setting(MapPortNatpmp, "fUseNatpmp");
674705
migrate_setting(Listen, "fListen");
675706
migrate_setting(Server, "server");
707+
migrate_setting(PruneSize, "nPruneSize");
708+
migrate_setting(Prune, "bPrune");
676709
migrate_setting(ProxyIP, "addrProxy");
677710
migrate_setting(ProxyUse, "fUseProxy");
678711
migrate_setting(ProxyIPTor, "addrSeparateProxyTor");

src/qt/optionsmodel.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ class OptionsModel : public QAbstractListModel
9999
const QString& getOverriddenByCommandLine() { return strOverriddenByCommandLine; }
100100

101101
/* Explicit setters */
102-
void SetPruneEnabled(bool prune, bool force = false);
103-
void SetPruneTargetGB(int prune_target_gb, bool force = false);
102+
void SetPruneTargetGB(int prune_target_gb);
104103

105104
/* Restart flag helper */
106105
void setRestartRequired(bool fRequired);
@@ -125,6 +124,7 @@ class OptionsModel : public QAbstractListModel
125124
//! In-memory settings for display. These are stored persistently by the
126125
//! bitcoin node but it's also nice to store them in memory to prevent them
127126
//! getting cleared when enable/disable toggles are used in the GUI.
127+
int m_prune_size_gb;
128128
QString m_proxy_ip;
129129
QString m_proxy_port;
130130
QString m_onion_ip;

src/qt/test/optiontests.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ void OptionTests::migrateSettings()
3737
settings.setValue("nThreadsScriptVerif", 12);
3838
settings.setValue("fUseUPnP", false);
3939
settings.setValue("fListen", false);
40+
settings.setValue("bPrune", true);
41+
settings.setValue("nPruneSize", 3);
4042
settings.setValue("fUseProxy", true);
4143
settings.setValue("addrProxy", "proxy:123");
4244
settings.setValue("fUseSeparateProxyTor", true);
@@ -51,6 +53,8 @@ void OptionTests::migrateSettings()
5153
QVERIFY(!settings.contains("nThreadsScriptVerif"));
5254
QVERIFY(!settings.contains("fUseUPnP"));
5355
QVERIFY(!settings.contains("fListen"));
56+
QVERIFY(!settings.contains("bPrune"));
57+
QVERIFY(!settings.contains("nPruneSize"));
5458
QVERIFY(!settings.contains("fUseProxy"));
5559
QVERIFY(!settings.contains("addrProxy"));
5660
QVERIFY(!settings.contains("fUseSeparateProxyTor"));
@@ -62,7 +66,8 @@ void OptionTests::migrateSettings()
6266
" \"listen\": false,\n"
6367
" \"onion\": \"onion:234\",\n"
6468
" \"par\": \"12\",\n"
65-
" \"proxy\": \"proxy:123\"\n"
69+
" \"proxy\": \"proxy:123\",\n"
70+
" \"prune\": \"2861\"\n"
6671
"}\n");
6772
}
6873

0 commit comments

Comments
 (0)