@@ -44,6 +44,8 @@ const char* SettingName(OptionsModel::OptionID option)
44
44
case OptionsModel::MapPortNatpmp: return " natpmp" ;
45
45
case OptionsModel::Listen: return " listen" ;
46
46
case OptionsModel::Server: return " server" ;
47
+ case OptionsModel::PruneSize: return " prune" ;
48
+ case OptionsModel::Prune: return " prune" ;
47
49
case OptionsModel::ProxyIP: return " proxy" ;
48
50
case OptionsModel::ProxyPort: return " proxy" ;
49
51
case OptionsModel::ProxyUse: return " proxy" ;
@@ -62,13 +64,45 @@ void UpdateSetting(interfaces::Node& node, OptionsModel::OptionID option, const
62
64
// fixed in later releases by https://github.com/bitcoin/bitcoin/pull/24498.
63
65
if (value.isNum () &&
64
66
(option == OptionsModel::DatabaseCache ||
65
- option == OptionsModel::ThreadsScriptVerif)) {
67
+ option == OptionsModel::ThreadsScriptVerif ||
68
+ option == OptionsModel::Prune ||
69
+ option == OptionsModel::PruneSize)) {
66
70
node.updateSetting (SettingName (option), value.getValStr ());
67
71
} else {
68
72
node.updateSetting (SettingName (option), value);
69
73
}
70
74
}
71
75
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
+
72
106
struct ProxySetting {
73
107
bool is_set;
74
108
QString ip;
@@ -91,6 +125,7 @@ void OptionsModel::addOverriddenOption(const std::string &option)
91
125
bool OptionsModel::Init (bilingual_str& error)
92
126
{
93
127
// Initialize display settings from stored settings.
128
+ m_prune_size_gb = PruneSizeGB (node ().getPersistentSetting (" prune" ));
94
129
ProxySetting proxy = ParseProxyString (SettingToString (node ().getPersistentSetting (" proxy" ), GetDefaultProxyAddress ().toStdString ()));
95
130
m_proxy_ip = proxy.ip ;
96
131
m_proxy_port = proxy.port ;
@@ -150,7 +185,7 @@ bool OptionsModel::Init(bilingual_str& error)
150
185
// These are shared with the core or have a command-line parameter
151
186
// and we want command-line parameters to overwrite the GUI settings.
152
187
for (OptionID option : {DatabaseCache, ThreadsScriptVerif, SpendZeroConfChange, ExternalSignerPath, MapPortUPnP,
153
- MapPortNatpmp, Listen, Server, ProxyUse, ProxyUseTor}) {
188
+ MapPortNatpmp, Listen, Server, Prune, ProxyUse, ProxyUseTor}) {
154
189
std::string setting = SettingName (option);
155
190
if (node ().isSettingIgnored (setting)) addOverriddenOption (" -" + setting);
156
191
try {
@@ -169,11 +204,6 @@ bool OptionsModel::Init(bilingual_str& error)
169
204
// by command-line and show this in the UI.
170
205
171
206
// 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 ());
177
207
if (!settings.contains (" strDataDir" ))
178
208
settings.setValue (" strDataDir" , GUIUtil::getDefaultDataDirectory ());
179
209
@@ -282,29 +312,27 @@ static const QString GetDefaultProxyAddress()
282
312
return QString (" %1:%2" ).arg (DEFAULT_GUI_PROXY_HOST).arg (DEFAULT_GUI_PROXY_PORT);
283
313
}
284
314
285
- void OptionsModel::SetPruneEnabled ( bool prune, bool force )
315
+ void OptionsModel::SetPruneTargetGB ( int prune_target_gb )
286
316
{
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);
306
335
}
307
- SetPruneEnabled (prune, force);
308
336
}
309
337
310
338
// read QSettings values and return them
@@ -395,9 +423,9 @@ QVariant OptionsModel::getOption(OptionID option) const
395
423
case EnablePSBTControls:
396
424
return settings.value (" enable_psbt_controls" );
397
425
case Prune:
398
- return settings. value ( " bPrune " );
426
+ return PruneEnabled ( setting () );
399
427
case PruneSize:
400
- return settings. value ( " nPruneSize " ) ;
428
+ return m_prune_size_gb ;
401
429
case DatabaseCache:
402
430
return qlonglong (SettingToInt (setting (), nDefaultDbCache));
403
431
case ThreadsScriptVerif:
@@ -550,15 +578,18 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value)
550
578
settings.setValue (" enable_psbt_controls" , m_enable_psbt_controls);
551
579
break ;
552
580
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) );
555
583
setRestartRequired (true );
556
584
}
557
585
break ;
558
586
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
+ }
562
593
}
563
594
break ;
564
595
case DatabaseCache:
@@ -673,6 +704,8 @@ void OptionsModel::checkAndMigrate()
673
704
migrate_setting (MapPortNatpmp, " fUseNatpmp" );
674
705
migrate_setting (Listen, " fListen" );
675
706
migrate_setting (Server, " server" );
707
+ migrate_setting (PruneSize, " nPruneSize" );
708
+ migrate_setting (Prune, " bPrune" );
676
709
migrate_setting (ProxyIP, " addrProxy" );
677
710
migrate_setting (ProxyUse, " fUseProxy" );
678
711
migrate_setting (ProxyIPTor, " addrSeparateProxyTor" );
0 commit comments