aboutsummaryrefslogtreecommitdiff
path: root/src/node/warnings.cpp
diff options
context:
space:
mode:
authorAva Chow <github@achow101.com>2024-06-17 17:09:18 -0400
committerAva Chow <github@achow101.com>2024-06-17 17:09:18 -0400
commitddf2ebd4659e926c5c6ee6726511b0b88bf7c2e0 (patch)
treeb58d747b2676dff61342636a0faf742847981214 /src/node/warnings.cpp
parentd97ddbe797f5b8b3bca0ee71b692e542b8990195 (diff)
parent260f8da71a35232d859d7705861fc1a88bfbbe81 (diff)
downloadbitcoin-ddf2ebd4659e926c5c6ee6726511b0b88bf7c2e0.tar.xz
Merge bitcoin/bitcoin#30058: Encapsulate warnings in generalized node::Warnings and remove globals
260f8da71a35232d859d7705861fc1a88bfbbe81 refactor: remove warnings globals (stickies-v) 9c4b0b7ce459765fa1a63b410c3423b90f0d2a5f node: update uiInterface whenever warnings updated (stickies-v) b071ad9770b7ae7fc718dcbfdc8f62dffbf6cfee introduce and use the generalized `node::Warnings` interface (stickies-v) 20e616f86444d00712ac7eb840666e2b0378af4a move-only: move warnings from common to node (stickies-v) bed29c481aebeb2b0160450c63c03cc68fb89bc6 refactor: remove unnecessary AppendWarning helper function (stickies-v) Pull request description: This PR: - moves warnings from common to the node library and into the node namespace (as suggested in https://github.com/bitcoin/bitcoin/pull/29845#discussion_r1570069541) - generalizes the warnings interface to `Warnings::Set()` and `Warnings::Unset()` methods, instead of having a separate function and globals for each warning. As a result, this simplifies the `kernel::Notifications` interface. - removes warnings.cpp from the kernel library - removes warning globals - adds testing for the warning logic Behaviour change introduced: - the `-alertnotify` command is executed for all `KernelNotifications::warningSet` calls, which now also covers the `LARGE_WORK_INVALID_CHAIN` warning - the GUI is updated automatically whenever a warning is (un)set, covering some code paths where it previously wouldn't be, e.g. when `node::AbortNode()` is called, or for the `LARGE_WORK_INVALID_CHAIN` warning Some discussion points: - ~is `const std::string& id` the best way to refer to warnings? Enums are an obvious alternative, but since we need to define warnings across libraries, strings seem like a straightforward solution.~ _edit: updated approach to use `node::Warning` and `kernel::Warning` enums._ ACKs for top commit: achow101: ACK 260f8da71a35232d859d7705861fc1a88bfbbe81 ryanofsky: Code review ACK 260f8da71a35232d859d7705861fc1a88bfbbe81. Only change since last review was rebasing TheCharlatan: Re-ACK 260f8da71a35232d859d7705861fc1a88bfbbe81 Tree-SHA512: a3fcedaee0d3ad64e9c111aeb30665162f98e0e72acd6a70b76ff2ddf4f0a34da4f97ce353c322a1668ca6ee4d8a81cc6e6d170c5bbeb7a43cffdaf66646b588
Diffstat (limited to 'src/node/warnings.cpp')
-rw-r--r--src/node/warnings.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/node/warnings.cpp b/src/node/warnings.cpp
new file mode 100644
index 0000000000..b99c845900
--- /dev/null
+++ b/src/node/warnings.cpp
@@ -0,0 +1,68 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// Copyright (c) 2009-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.
+
+#include <config/bitcoin-config.h> // IWYU pragma: keep
+
+#include <node/warnings.h>
+
+#include <common/system.h>
+#include <node/interface_ui.h>
+#include <sync.h>
+#include <univalue.h>
+#include <util/translation.h>
+
+#include <utility>
+#include <vector>
+
+namespace node {
+Warnings::Warnings()
+{
+ // Pre-release build warning
+ if (!CLIENT_VERSION_IS_RELEASE) {
+ m_warnings.insert(
+ {Warning::PRE_RELEASE_TEST_BUILD,
+ _("This is a pre-release test build - use at your own risk - do not use for mining or merchant applications")});
+ }
+}
+bool Warnings::Set(warning_type id, bilingual_str message)
+{
+ LOCK(m_mutex);
+ const auto& [_, inserted]{m_warnings.insert({id, std::move(message)})};
+ if (inserted) uiInterface.NotifyAlertChanged();
+ return inserted;
+}
+
+bool Warnings::Unset(warning_type id)
+{
+ auto success{WITH_LOCK(m_mutex, return m_warnings.erase(id))};
+ if (success) uiInterface.NotifyAlertChanged();
+ return success;
+}
+
+std::vector<bilingual_str> Warnings::GetMessages() const
+{
+ LOCK(m_mutex);
+ std::vector<bilingual_str> messages;
+ messages.reserve(m_warnings.size());
+ for (const auto& [id, msg] : m_warnings) {
+ messages.push_back(msg);
+ }
+ return messages;
+}
+
+UniValue GetWarningsForRpc(const Warnings& warnings, bool use_deprecated)
+{
+ if (use_deprecated) {
+ const auto all_messages{warnings.GetMessages()};
+ return all_messages.empty() ? "" : all_messages.back().original;
+ }
+
+ UniValue messages{UniValue::VARR};
+ for (auto&& message : warnings.GetMessages()) {
+ messages.push_back(std::move(message.original));
+ }
+ return messages;
+}
+} // namespace node