aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/epee/demo/demo_http_server/demo_http_server.cpp217
-rw-r--r--contrib/epee/demo/demo_http_server/demo_http_server.h103
-rw-r--r--contrib/epee/demo/demo_levin_server/demo_levin_server.cpp200
-rw-r--r--contrib/epee/demo/demo_levin_server/demo_levin_server.h76
-rw-r--r--contrib/epee/include/storages/activity_notifier.h132
-rw-r--r--contrib/epee/src/mlog.cpp6
-rw-r--r--external/easylogging++/easylogging++.h13
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.cpp24
-rw-r--r--src/p2p/net_node.h6
-rw-r--r--src/p2p/net_node.inl101
-rw-r--r--src/p2p/net_peerlist.h52
-rw-r--r--src/simplewallet/simplewallet.cpp18
-rw-r--r--src/wallet/api/wallet.cpp4
-rw-r--r--src/wallet/api/wallet_manager.cpp5
-rw-r--r--src/wallet/wallet2_api.h1
15 files changed, 202 insertions, 756 deletions
diff --git a/contrib/epee/demo/demo_http_server/demo_http_server.cpp b/contrib/epee/demo/demo_http_server/demo_http_server.cpp
deleted file mode 100644
index 85547e4c9..000000000
--- a/contrib/epee/demo/demo_http_server/demo_http_server.cpp
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the Andrey N. Sabelnikov nor the
-// names of its contributors may be used to endorse or promote products
-// derived from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
-// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-#include "stdafx.h"
-#include "console_handler.h"
-#include "demo_http_server.h"
-#include "net/http_client.h"
-#include "storages/http_abstract_invoke.h"
-
-
-template<class t_request, class t_response>
-bool communicate(const std::string url, t_request& req, t_response& rsp, const std::string& ip, const std::string& port, bool use_json, bool use_jrpc = false)
-{
- epee::net_utils::http::http_simple_client http_client;
- bool r = http_client.connect(ip, port, 1000);
- CHECK_AND_ASSERT_MES(r, false, "failed to connect");
- if(use_json)
- {
- if(use_jrpc)
- {
- epee::json_rpc::request<t_request> req_t = AUTO_VAL_INIT(req_t);
- req_t.jsonrpc = "2.0";
- req_t.id = epee::serialization::storage_entry(10);
- req_t.method = "command_example_1";
- req_t.params = req;
- epee::json_rpc::response<t_response, std::string> resp_t = AUTO_VAL_INIT(resp_t);
- if(!epee::net_utils::invoke_http_json_remote_command2("/request_json_rpc", req_t, resp_t, http_client))
- {
- return false;
- }
- rsp = resp_t.result;
- return true;
- }else
- return epee::net_utils::invoke_http_json_remote_command2(url, req, rsp, http_client);
- }
- else
- return epee::net_utils::invoke_http_bin_remote_command2(url, req, rsp, http_client);
-}
-
-
-int main(int argc, char* argv[])
-{
- TRY_ENTRY();
- string_tools::set_module_name_and_folder(argv[0]);
-
- //set up logging options
- log_space::get_set_log_detalisation_level(true, LOG_LEVEL_2);
- log_space::log_singletone::add_logger(LOGGER_CONSOLE, NULL, NULL);
- log_space::log_singletone::add_logger(LOGGER_FILE,
- log_space::log_singletone::get_default_log_file().c_str(),
- log_space::log_singletone::get_default_log_folder().c_str());
-
-
-
- LOG_PRINT("Demo server starting ...", LOG_LEVEL_0);
-
-
- demo::demo_http_server srv;
-
- start_default_console(&srv, "#");
-
- std::string bind_param = "0.0.0.0";
- std::string port = "83";
-
- if(!srv.init(port, bind_param))
- {
- LOG_ERROR("Failed to initialize srv!");
- return 1;
- }
-
- //log loop
- srv.run();
- size_t count = 0;
- while (!srv.is_stop())
- {
-
- demo::COMMAND_EXAMPLE_1::request req;
- req.sub = demo::get_test_data();
- demo::COMMAND_EXAMPLE_1::response rsp;
- bool r = false;
- if(count%2)
- {//invoke json
- r = communicate("/request_api_json_1", req, rsp, "127.0.0.1", port, true, true);
- }else{
- r = communicate("/request_api_bin_1", req, rsp, "127.0.0.1", port, false);
- }
- CHECK_AND_ASSERT_MES(r, false, "failed to invoke http request");
- CHECK_AND_ASSERT_MES(rsp.m_success, false, "wrong response");
- CHECK_AND_ASSERT_MES(rsp.subs.size()==1, false, "wrong response");
- CHECK_AND_ASSERT_MES(rsp.subs.front() == demo::get_test_data(), false, "wrong response");
- //misc_utils::sleep_no_w(1000);
- ++count;
- }
- bool r = srv.wait_stop();
- CHECK_AND_ASSERT_MES(r, 1, "failed to wait server stop");
- srv.deinit();
-
- LOG_PRINT("Demo server stoped.", LOG_LEVEL_0);
- return 1;
-
- CATCH_ENTRY_L0("main", 1);
-}
-
-/************************************************************************/
-/* */
-/************************************************************************/
-namespace demo
-{
- bool demo_http_server::init(const std::string& bind_port, const std::string& bind_ip)
- {
-
-
- //set self as callback handler
- m_net_server.get_config_object().m_phandler = this;
-
- //here set folder for hosting reqests
- m_net_server.get_config_object().m_folder = "";
-
- LOG_PRINT_L0("Binding on " << bind_ip << ":" << bind_port);
- return m_net_server.init_server(bind_port, bind_ip);
- }
-
- bool demo_http_server::run()
- {
- m_stop = false;
- //here you can set worker threads count
- int thrds_count = 4;
-
- //go to loop
- LOG_PRINT("Run net_service loop( " << thrds_count << " threads)...", LOG_LEVEL_0);
- if(!m_net_server.run_server(thrds_count, false))
- {
- LOG_ERROR("Failed to run net tcp server!");
- }
-
- return true;
- }
-
- bool demo_http_server::deinit()
- {
- return m_net_server.deinit_server();
- }
-
- bool demo_http_server::send_stop_signal()
- {
- m_stop = true;
- m_net_server.send_stop_signal();
- return true;
- }
-
- bool demo_http_server::on_requestr_uri_1(const net_utils::http::http_request_info& query_info,
- net_utils::http::http_response_info& response,
- const net_utils::connection_context_base& m_conn_context)
- {
- return true;
- }
-
-
- bool demo_http_server::on_requestr_uri_2(const net_utils::http::http_request_info& query_info,
- net_utils::http::http_response_info& response,
- const net_utils::connection_context_base& m_conn_context)
- {
- return true;
- }
-
-
- bool demo_http_server::on_hosting_request( const net_utils::http::http_request_info& query_info,
- net_utils::http::http_response_info& response,
- const net_utils::connection_context_base& m_conn_context)
- {
- //read file from filesystem here
- return true;
- }
-
- bool demo_http_server::on_request_api_1(const COMMAND_EXAMPLE_1::request& req, COMMAND_EXAMPLE_1::response& res, connection_context& ctxt)
- {
- CHECK_AND_ASSERT_MES(req.sub == demo::get_test_data(), false, "wrong request");
- res.m_success = true;
- res.subs.push_back(req.sub);
- return true;
- }
-
- bool demo_http_server::on_request_api_1_with_error(const COMMAND_EXAMPLE_1::request& req, COMMAND_EXAMPLE_1::response& res, epee::json_rpc::error& error_resp, connection_context& ctxt)
- {
- error_resp.code = 232432;
- error_resp.message = "bla bla bla";
- return false;
- }
-
- bool demo_http_server::on_request_api_2(const COMMAND_EXAMPLE_2::request& req, COMMAND_EXAMPLE_2::response& res, connection_context& ctxt)
- {
- return true;
- }
-}
diff --git a/contrib/epee/demo/demo_http_server/demo_http_server.h b/contrib/epee/demo/demo_http_server/demo_http_server.h
deleted file mode 100644
index 088ead548..000000000
--- a/contrib/epee/demo/demo_http_server/demo_http_server.h
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the Andrey N. Sabelnikov nor the
-// names of its contributors may be used to endorse or promote products
-// derived from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
-// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-
-
-#pragma once
-#include <boost/thread.hpp>
-#include <boost/bind.hpp>
-
-#include "net/http_server_cp2.h"
-#include "transport_defs.h"
-#include "net/http_server_handlers_map2.h"
-
-using namespace epee;
-
-namespace demo
-{
-
- class demo_http_server: public net_utils::http::i_http_server_handler<epee::net_utils::connection_context_base>
- {
- public:
- typedef epee::net_utils::connection_context_base connection_context;
-
- demo_http_server():m_stop(false){}
- bool run();
- bool init(const std::string& bind_port = "11112", const std::string& bind_ip = "0.0.0.0");
- bool deinit();
- bool send_stop_signal();
- bool is_stop(){return m_stop;}
- bool wait_stop(){return m_net_server.timed_wait_server_stop(100000);}
- private:
-
-
- CHAIN_HTTP_TO_MAP2(connection_context); //forward http requests to uri map
-
- BEGIN_URI_MAP2()
- MAP_URI2("/requestr_uri_1", on_requestr_uri_1)
- MAP_URI2("/requestr_uri_2", on_requestr_uri_1)
- //MAP_URI_AUTO_XML2("/request_api_xml_1", on_request_api_1, COMMAND_EXAMPLE_1)
- //MAP_URI_AUTO_XML2("/request_api_xml_2", on_request_api_2, COMMAND_EXAMPLE_2)
- MAP_URI_AUTO_JON2("/request_api_json_1", on_request_api_1, COMMAND_EXAMPLE_1)
- MAP_URI_AUTO_JON2("/request_api_json_2", on_request_api_2, COMMAND_EXAMPLE_2)
- MAP_URI_AUTO_BIN2("/request_api_bin_1", on_request_api_1, COMMAND_EXAMPLE_1)
- MAP_URI_AUTO_BIN2("/request_api_bin_2", on_request_api_2, COMMAND_EXAMPLE_2)
- BEGIN_JSON_RPC_MAP("/request_json_rpc")
- MAP_JON_RPC("command_example_1", on_request_api_1, COMMAND_EXAMPLE_1)
- MAP_JON_RPC("command_example_2", on_request_api_2, COMMAND_EXAMPLE_2)
- MAP_JON_RPC_WE("command_example_1_we", on_request_api_1_with_error, COMMAND_EXAMPLE_1)
- END_JSON_RPC_MAP()
- CHAIN_URI_MAP2(on_hosting_request)
- END_URI_MAP2()
-
-
-
- bool on_requestr_uri_1(const net_utils::http::http_request_info& query_info,
- net_utils::http::http_response_info& response,
- const net_utils::connection_context_base& m_conn_context);
-
-
- bool on_requestr_uri_2(const net_utils::http::http_request_info& query_info,
- net_utils::http::http_response_info& response,
- const net_utils::connection_context_base& m_conn_context);
-
-
-
-
- bool on_hosting_request( const net_utils::http::http_request_info& query_info,
- net_utils::http::http_response_info& response,
- const net_utils::connection_context_base& m_conn_context);
-
- bool on_request_api_1(const COMMAND_EXAMPLE_1::request& req, COMMAND_EXAMPLE_1::response& res, connection_context& ctxt);
- bool on_request_api_2(const COMMAND_EXAMPLE_2::request& req, COMMAND_EXAMPLE_2::response& res, connection_context& ctxt);
-
- bool on_request_api_1_with_error(const COMMAND_EXAMPLE_1::request& req, COMMAND_EXAMPLE_1::response& res, epee::json_rpc::error& error_resp, connection_context& ctxt);
-
- net_utils::boosted_http_server_custum_handling m_net_server;
- std::atomic<bool> m_stop;
- };
-}
-
diff --git a/contrib/epee/demo/demo_levin_server/demo_levin_server.cpp b/contrib/epee/demo/demo_levin_server/demo_levin_server.cpp
deleted file mode 100644
index a99a1f564..000000000
--- a/contrib/epee/demo/demo_levin_server/demo_levin_server.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the Andrey N. Sabelnikov nor the
-// names of its contributors may be used to endorse or promote products
-// derived from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
-// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-
-
-#include "stdafx.h"
-#include "demo_levin_server.h"
-#include "console_handler.h"
-
-
-template<class t_request>
-bool communicate(net_utils::boosted_levin_async_server& transport, int id, t_request& req, const std::string& ip, const std::string& port, bool use_async)
-{
- if(use_async)
- {
- //IMPORTANT: do not pass local parameters from stack by reference! connect_async returns immediately, and callback will call in any thread later
- transport.connect_async(ip, port, 10000, [&transport, id, req, ip, port](net_utils::connection_context_base& ctx, const boost::system::error_code& ec_)
- {
- if(!!ec_)
- {
- LOG_ERROR("Failed to connect to " << ip << ":" << port);
- }else
- {//connected ok!
-
- epee::net_utils::async_invoke_remote_command2<demo::COMMAND_EXAMPLE_1::response>(ctx.m_connection_id, id, req, transport.get_config_object(), [&transport, ip, port](int res_code, demo::COMMAND_EXAMPLE_1::response& rsp, net_utils::connection_context_base& ctx)
- {
- if(res_code < 0)
- {
- LOG_ERROR("Failed to invoke to " << ip << ":" << port);
- }else
- {//invoked ok
- CHECK_AND_ASSERT_MES(rsp.m_success, false, "wrong response");
- CHECK_AND_ASSERT_MES(rsp.subs.size()==1, false, "wrong response");
- CHECK_AND_ASSERT_MES(rsp.subs.front() == demo::get_test_data(), false, "wrong response");
- LOG_PRINT_GREEN("Client COMMAND_EXAMPLE_1 async invoked ok", LOG_LEVEL_0);
- }
- transport.get_config_object().close(ctx.m_connection_id);
- return true;
- });
- LOG_PRINT_GREEN("Client COMMAND_EXAMPLE_1 async invoke requested", LOG_LEVEL_0);
- }
- });
- }else
- {
- net_utils::connection_context_base ctx = AUTO_VAL_INIT(ctx);
- bool r = transport.connect(ip, port, 10000, ctx);
- CHECK_AND_ASSERT_MES(r, false, "failed to connect to " << ip << ":" << port);
- demo::COMMAND_EXAMPLE_1::response rsp = AUTO_VAL_INIT(rsp);
- LOG_PRINT_GREEN("Client COMMAND_EXAMPLE_1 sync invoke requested", LOG_LEVEL_0);
- r = epee::net_utils::invoke_remote_command2(ctx.m_connection_id, id, req, rsp, transport.get_config_object());
- CHECK_AND_ASSERT_MES(r, false, "failed to invoke levin request");
- CHECK_AND_ASSERT_MES(rsp.m_success, false, "wrong response");
- CHECK_AND_ASSERT_MES(rsp.subs.size()==1, false, "wrong response");
- CHECK_AND_ASSERT_MES(rsp.subs.front() == demo::get_test_data(), false, "wrong response");
- transport.get_config_object().close(ctx.m_connection_id);
- LOG_PRINT_GREEN("Client COMMAND_EXAMPLE_1 sync invoked ok", LOG_LEVEL_0);
- }
- return true;
-}
-
-
-int main(int argc, char* argv[])
-{
- TRY_ENTRY();
- string_tools::set_module_name_and_folder(argv[0]);
-
- //set up logging options
- log_space::get_set_log_detalisation_level(true, LOG_LEVEL_2);
- log_space::log_singletone::add_logger(LOGGER_CONSOLE, NULL, NULL);
- log_space::log_singletone::add_logger(LOGGER_FILE,
- log_space::log_singletone::get_default_log_file().c_str(),
- log_space::log_singletone::get_default_log_folder().c_str());
-
-
-
- LOG_PRINT("Demo server starting ...", LOG_LEVEL_0);
-
-
- demo::demo_levin_server srv;
-
- start_default_console(&srv, "#");
-
- std::string bind_param = "0.0.0.0";
- std::string port = "12345";
-
- if(!srv.init(port, bind_param))
- {
- LOG_ERROR("Failed to initialize srv!");
- return 1;
- }
-
- srv.run();
-
- size_t c = 1;
- while (!srv.is_stop())
- {
-
- demo::COMMAND_EXAMPLE_1::request req;
- req.sub = demo::get_test_data();
- bool r = communicate(srv.get_server(), demo::COMMAND_EXAMPLE_1::ID, req, "127.0.0.1", port, (c%2 == 0));
- misc_utils::sleep_no_w(1000);
- ++c;
- }
- bool r = srv.wait_stop();
- CHECK_AND_ASSERT_MES(r, 1, "failed to wait server stop");
-
-
- srv.deinit();
-
- LOG_PRINT("Demo server stoped.", LOG_LEVEL_0);
- return 1;
-
- CATCH_ENTRY_L0("main", 1);
-}
-
-/************************************************************************/
-/* */
-/************************************************************************/
-namespace demo
-{
- bool demo_levin_server::init(const std::string& bind_port, const std::string& bind_ip)
- {
- m_net_server.get_config_object().m_pcommands_handler = this;
- LOG_PRINT_L0("Binding on " << bind_ip << ":" << bind_port);
- return m_net_server.init_server(bind_port, bind_ip);
- }
-
- bool demo_levin_server::run()
- {
- m_stop = false;
- //here you can set worker threads count
- int thrds_count = 4;
- m_net_server.get_config_object().m_invoke_timeout = 10000;
- m_net_server.get_config_object().m_pcommands_handler = this;
-
- //go to loop
- LOG_PRINT("Run net_service loop( " << thrds_count << " threads)...", LOG_LEVEL_0);
- if(!m_net_server.run_server(thrds_count, false))
- {
- LOG_ERROR("Failed to run net tcp server!");
- }
-
- LOG_PRINT("net_service loop stopped.", LOG_LEVEL_0);
- return true;
- }
-
- bool demo_levin_server::deinit()
- {
- return m_net_server.deinit_server();
- }
-
- bool demo_levin_server::send_stop_signal()
- {
- m_net_server.send_stop_signal();
- return true;
- }
- int demo_levin_server::handle_command_1(int command, COMMAND_EXAMPLE_1::request& arg, COMMAND_EXAMPLE_1::response& rsp, const net_utils::connection_context_base& context)
- {
- CHECK_AND_ASSERT_MES(arg.sub == demo::get_test_data(), false, "wrong request");
- rsp.m_success = true;
- rsp.subs.push_back(arg.sub);
- LOG_PRINT_GREEN("Server COMMAND_EXAMPLE_1 ok", LOG_LEVEL_0);
- return 1;
- }
- int demo_levin_server::handle_command_2(int command, COMMAND_EXAMPLE_2::request& arg, COMMAND_EXAMPLE_2::response& rsp, const net_utils::connection_context_base& context)
- {
- return 1;
- }
- int demo_levin_server::handle_notify_1(int command, COMMAND_EXAMPLE_1::request& arg, const net_utils::connection_context_base& context)
- {
- return 1;
- }
- int demo_levin_server::handle_notify_2(int command, COMMAND_EXAMPLE_2::request& arg, const net_utils::connection_context_base& context)
- {
- return 1;
- }
-}
diff --git a/contrib/epee/demo/demo_levin_server/demo_levin_server.h b/contrib/epee/demo/demo_levin_server/demo_levin_server.h
deleted file mode 100644
index 5a6f68f2d..000000000
--- a/contrib/epee/demo/demo_levin_server/demo_levin_server.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the Andrey N. Sabelnikov nor the
-// names of its contributors may be used to endorse or promote products
-// derived from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
-// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-
-
-#pragma once
-#include <boost/thread.hpp>
-#include <boost/bind.hpp>
-
-#include "net/levin_server_cp2.h"
-#include "transport_defs.h"
-#include "storages/levin_abstract_invoke2.h"
-
-using namespace epee;
-
-namespace demo
-{
-
- class demo_levin_server: public levin::levin_commands_handler<>
- {
- public:
- bool run();
- bool init(const std::string& bind_port = "11112", const std::string& bind_ip = "0.0.0.0");
- bool deinit();
- bool send_stop_signal();
- bool is_stop(){return m_stop;}
- bool wait_stop(){return m_net_server.timed_wait_server_stop(100000);}
- net_utils::boosted_levin_async_server& get_server(){return m_net_server;}
- private:
-
-
- CHAIN_LEVIN_INVOKE_MAP(); //move levin_commands_handler interface invoke(...) callbacks into invoke map
- CHAIN_LEVIN_NOTIFY_STUB(); //move levin_commands_handler interface notify(...) callbacks into nothing
-
- BEGIN_INVOKE_MAP2(demo_levin_server)
- HANDLE_INVOKE_T2(COMMAND_EXAMPLE_1, &demo_levin_server::handle_command_1)
- HANDLE_INVOKE_T2(COMMAND_EXAMPLE_2, &demo_levin_server::handle_command_2)
- HANDLE_NOTIFY_T2(COMMAND_EXAMPLE_1, &demo_levin_server::handle_notify_1)
- HANDLE_NOTIFY_T2(COMMAND_EXAMPLE_2, &demo_levin_server::handle_notify_2)
- END_INVOKE_MAP2()
-
- //----------------- commands handlers ----------------------------------------------
- int handle_command_1(int command, COMMAND_EXAMPLE_1::request& arg, COMMAND_EXAMPLE_1::response& rsp, const net_utils::connection_context_base& context);
- int handle_command_2(int command, COMMAND_EXAMPLE_2::request& arg, COMMAND_EXAMPLE_2::response& rsp, const net_utils::connection_context_base& context);
- int handle_notify_1(int command, COMMAND_EXAMPLE_1::request& arg, const net_utils::connection_context_base& context);
- int handle_notify_2(int command, COMMAND_EXAMPLE_2::request& arg, const net_utils::connection_context_base& context);
- //----------------------------------------------------------------------------------
- net_utils::boosted_levin_async_server m_net_server;
- std::atomic<bool> m_stop;
-
- };
-}
-
diff --git a/contrib/epee/include/storages/activity_notifier.h b/contrib/epee/include/storages/activity_notifier.h
deleted file mode 100644
index 14b6ebbfb..000000000
--- a/contrib/epee/include/storages/activity_notifier.h
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the Andrey N. Sabelnikov nor the
-// names of its contributors may be used to endorse or promote products
-// derived from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
-// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-
-
-#pragma once
-
-#include "inmemtoxml.h"
-
-//#include "levin/levin_server.h"
-
-namespace epee
-{
-
-class activity_printer_base
-{
-public:
- activity_printer_base(){}
- virtual ~activity_printer_base(){}
-};
-
-template<class A>
-class notify_activity_printer: public activity_printer_base
-{
-public:
- notify_activity_printer(int level, A& arg, bool is_notify_mode = true):m_ref_arg(arg), m_level(level), m_is_notify_mode(is_notify_mode)
- {
- m_command_name = typeid(m_ref_arg).name();
- m_command_name.erase(0, 7);
- m_command_name.erase(m_command_name.size()-10, m_command_name.size()-1);
- if(level == log_space::get_set_log_detalisation_level())
- {
- LOG_PRINT(m_command_name, level);
- }
- else if(level+1 == log_space::get_set_log_detalisation_level())
- {
- LOG_PRINT(" -->>" << m_command_name, level);
- }
- else if(level+2 == log_space::get_set_log_detalisation_level())
- {
- LOG_PRINT(" -->>" << m_command_name << "\n" << StorageNamed::xml::get_t_as_xml(m_ref_arg), level);
- }
- }
-
- virtual ~notify_activity_printer()
- {
- if(m_is_notify_mode)
- {
- if(m_level+1 == log_space::get_set_log_detalisation_level())
- {
- LOG_PRINT(" <<--" << m_command_name, m_level);
- }
- }
- }
-protected:
- std::string m_command_name;
- A& m_ref_arg;
- int m_level;
- bool m_is_notify_mode;
-};
-
-template<class A, class R>
-class command_activity_printer: public notify_activity_printer<A>
-{
-public:
- command_activity_printer(int level, A& arg, R& rsp):notify_activity_printer(level, arg, false), m_ref_rsp(rsp)
- {
- }
-
- virtual ~command_activity_printer()
- {
- if(m_level+1 == log_space::get_set_log_detalisation_level())
- {
- LOG_PRINT(" <<--" << m_command_name, m_level);
- }
- else if(m_level+2 == log_space::get_set_log_detalisation_level())
- {
- LOG_PRINT(" <<--" << m_command_name << "\n" << StorageNamed::trace_as_xml(m_ref_rsp), m_level);
- }
- }
-private:
- R& m_ref_rsp;
-};
-
-template<class A, class R>
-activity_printer_base* create_activity_printer(int level, A& arg, R& rsp)
-{
- return new command_activity_printer<A, R>(level, arg, rsp);
-}
-
-template<class A>
-activity_printer_base* create_activity_printer(int level, A& arg)
-{
- return new notify_activity_printer<A>(level, arg);
-}
-
-}
-
-#define PRINT_COMMAND_ACTIVITY(level) boost::shared_ptr<activity_printer_base> local_activity_printer(create_activity_printer(level, in_struct, out_struct));
-#define PRINT_NOTIFY_ACTIVITY(level) boost::shared_ptr<activity_printer_base> local_activity_printer(create_activity_printer(level, in_struct));
-
-#define PRINT_ACTIVITY(level) \
-{std::string some_str = typeid(in_struct).name(); \
- some_str.erase(0, 7); \
- some_str.erase(some_str.size()-10, some_str.size()-1); \
- LOG_PRINT(some_str, level);}
-
-}
-
diff --git a/contrib/epee/src/mlog.cpp b/contrib/epee/src/mlog.cpp
index 37a15bbd5..f1d74a2a3 100644
--- a/contrib/epee/src/mlog.cpp
+++ b/contrib/epee/src/mlog.cpp
@@ -33,7 +33,6 @@
INITIALIZE_EASYLOGGINGPP
-//#define MLOG_BASE_FORMAT "%datetime{%Y-%M-%d %H:%m:%s.%g}\t%thread\t%level\t%logger\t%fbase:%line\t%msg"
#define MLOG_BASE_FORMAT "%datetime{%Y-%M-%d %H:%m:%s.%g}\t%thread\t%level\t%logger\t%loc\t%msg"
using namespace epee;
@@ -83,7 +82,10 @@ void mlog_configure(const std::string &filename_base, bool console)
el::Configurations c;
c.setGlobally(el::ConfigurationType::Filename, filename_base);
c.setGlobally(el::ConfigurationType::ToFile, "true");
- c.setGlobally(el::ConfigurationType::Format, MLOG_BASE_FORMAT);
+ const char *log_format = getenv("MONERO_LOG_FORMAT");
+ if (!log_format)
+ log_format = MLOG_BASE_FORMAT;
+ c.setGlobally(el::ConfigurationType::Format, log_format);
c.setGlobally(el::ConfigurationType::ToStandardOutput, console ? "true" : "false");
c.setGlobally(el::ConfigurationType::MaxLogFileSize, "104850000"); // 100 MB - 7600 bytes
el::Loggers::setDefaultConfigurations(c, true);
diff --git a/external/easylogging++/easylogging++.h b/external/easylogging++/easylogging++.h
index 688648452..3395c2cb2 100644
--- a/external/easylogging++/easylogging++.h
+++ b/external/easylogging++/easylogging++.h
@@ -104,8 +104,13 @@
#else
# define ELPP_OS_SOLARIS 0
#endif
+#if (defined(__DragonFly__))
+# define ELPP_OS_DRAGONFLY 1
+#else
+# define ELPP_OS_DRAGONFLY 0
+#endif
// Unix
-#if ((ELPP_OS_LINUX || ELPP_OS_MAC || ELPP_OS_FREEBSD || ELPP_OS_SOLARIS) && (!ELPP_OS_WINDOWS))
+#if ((ELPP_OS_LINUX || ELPP_OS_MAC || ELPP_OS_FREEBSD || ELPP_OS_SOLARIS || ELPP_OS_DRAGONFLY) && (!ELPP_OS_WINDOWS))
# define ELPP_OS_UNIX 1
#else
# define ELPP_OS_UNIX 0
@@ -1001,7 +1006,11 @@ namespace el {
public:
Mutex(void) {
# if ELPP_OS_UNIX
- pthread_mutex_init(&m_underlyingMutex, nullptr);
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(&m_underlyingMutex, &attr);
+ pthread_mutexattr_destroy(&attr);
# elif ELPP_OS_WINDOWS
InitializeCriticalSection(&m_underlyingMutex);
# endif // ELPP_OS_UNIX
diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index 343fd1fa4..7d548afed 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -441,7 +441,7 @@ void BlockchainLMDB::do_resize(uint64_t increase_size)
if (result)
throw0(DB_ERROR(lmdb_error("Failed to set new mapsize: ", result).c_str()));
- MINFO("LMDB Mapsize increased." << " Old: " << mei.me_mapsize / (1024 * 1024) << "MiB" << ", New: " << new_mapsize / (1024 * 1024) << "MiB");
+ MGINFO("LMDB Mapsize increased." << " Old: " << mei.me_mapsize / (1024 * 1024) << "MiB" << ", New: " << new_mapsize / (1024 * 1024) << "MiB");
mdb_txn_safe::allow_new_txns();
}
@@ -525,7 +525,7 @@ void BlockchainLMDB::check_and_resize_for_batch(uint64_t batch_num_blocks)
// size-based check
if (need_resize(threshold_size))
{
- LOG_PRINT_L0("[batch] DB resize needed");
+ MGINFO("[batch] DB resize needed");
do_resize(increase_size);
}
}
@@ -1172,7 +1172,7 @@ void BlockchainLMDB::open(const std::string& filename, const int mdb_flags)
{
if (*(const uint32_t*)v.mv_data > VERSION)
{
- MINFO("Existing lmdb database was made by a later version. We don't know how it will change yet.");
+ MWARNING("Existing lmdb database was made by a later version. We don't know how it will change yet.");
compatible = false;
}
#if VERSION > 0
@@ -2301,11 +2301,11 @@ void BlockchainLMDB::batch_commit()
if (! m_batch_transactions)
throw0(DB_ERROR("batch transactions not enabled"));
if (! m_batch_active)
- throw0(DB_ERROR("batch transaction not in progress"));
+ throw1(DB_ERROR("batch transaction not in progress"));
if (m_write_batch_txn == nullptr)
- throw0(DB_ERROR("batch transaction not in progress"));
+ throw1(DB_ERROR("batch transaction not in progress"));
if (m_writer != boost::this_thread::get_id())
- return; // batch txn owned by other thread
+ throw1(DB_ERROR("batch transaction owned by other thread"));
check_open();
@@ -2328,11 +2328,11 @@ void BlockchainLMDB::batch_stop()
if (! m_batch_transactions)
throw0(DB_ERROR("batch transactions not enabled"));
if (! m_batch_active)
- throw0(DB_ERROR("batch transaction not in progress"));
+ throw1(DB_ERROR("batch transaction not in progress"));
if (m_write_batch_txn == nullptr)
- throw0(DB_ERROR("batch transaction not in progress"));
+ throw1(DB_ERROR("batch transaction not in progress"));
if (m_writer != boost::this_thread::get_id())
- return; // batch txn owned by other thread
+ throw1(DB_ERROR("batch transaction owned by other thread"));
check_open();
LOG_PRINT_L3("batch transaction: committing...");
TIME_MEASURE_START(time1);
@@ -2354,9 +2354,11 @@ void BlockchainLMDB::batch_abort()
if (! m_batch_transactions)
throw0(DB_ERROR("batch transactions not enabled"));
if (! m_batch_active)
- throw0(DB_ERROR("batch transaction not in progress"));
+ throw1(DB_ERROR("batch transaction not in progress"));
+ if (m_write_batch_txn == nullptr)
+ throw1(DB_ERROR("batch transaction not in progress"));
if (m_writer != boost::this_thread::get_id())
- return; // batch txn owned by other thread
+ throw1(DB_ERROR("batch transaction owned by other thread"));
check_open();
// for destruction of batch transaction
m_write_txn = nullptr;
diff --git a/src/p2p/net_node.h b/src/p2p/net_node.h
index cc6a486d3..f5309b1c3 100644
--- a/src/p2p/net_node.h
+++ b/src/p2p/net_node.h
@@ -227,6 +227,11 @@ namespace nodetool
bool set_rate_down_limit(const boost::program_options::variables_map& vm, int64_t limit);
bool set_rate_limit(const boost::program_options::variables_map& vm, int64_t limit);
+ bool has_too_many_connections(const uint32_t ip);
+
+ bool check_connection_and_handshake_with_peer(const net_address& na, uint64_t last_seen_stamp);
+ bool gray_peerlist_housekeeping();
+
void kill() { ///< will be called e.g. from deinit()
_info("Killing the net_node");
is_closing = true;
@@ -287,6 +292,7 @@ namespace nodetool
epee::math_helper::once_a_time_seconds<P2P_DEFAULT_HANDSHAKE_INTERVAL> m_peer_handshake_idle_maker_interval;
epee::math_helper::once_a_time_seconds<1> m_connections_maker_interval;
epee::math_helper::once_a_time_seconds<60*30, false> m_peerlist_store_interval;
+ epee::math_helper::once_a_time_seconds<60> m_gray_peerlist_housekeeping_interval;
std::string m_bind_ip;
std::string m_port;
diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl
index 34a3f9363..99ce94eb4 100644
--- a/src/p2p/net_node.inl
+++ b/src/p2p/net_node.inl
@@ -926,6 +926,50 @@ namespace nodetool
return true;
}
+ template<class t_payload_net_handler>
+ bool node_server<t_payload_net_handler>::check_connection_and_handshake_with_peer(const net_address& na, uint64_t last_seen_stamp)
+ {
+ LOG_PRINT_L1("Connecting to " << epee::string_tools::get_ip_string_from_int32(na.ip) << ":"
+ << epee::string_tools::num_to_string_fast(na.port) << "(last_seen: "
+ << (last_seen_stamp ? epee::misc_utils::get_time_interval_string(time(NULL) - last_seen_stamp):"never")
+ << ")...");
+
+ typename net_server::t_connection_context con = AUTO_VAL_INIT(con);
+ bool res = m_net_server.connect(epee::string_tools::get_ip_string_from_int32(na.ip),
+ epee::string_tools::num_to_string_fast(na.port),
+ m_config.m_net_config.connection_timeout,
+ con);
+
+ if (!res) {
+ bool is_priority = is_priority_node(na);
+
+ LOG_PRINT_CC_PRIORITY_NODE(is_priority, con, "Connect failed to "
+ << epee::string_tools::get_ip_string_from_int32(na.ip)
+ << ":" << epee::string_tools::num_to_string_fast(na.port));
+
+ return false;
+ }
+
+ peerid_type pi = AUTO_VAL_INIT(pi);
+ res = do_handshake_with_peer(pi, con, true);
+
+ if (!res) {
+ bool is_priority = is_priority_node(na);
+
+ LOG_PRINT_CC_PRIORITY_NODE(is_priority, con, "Failed to HANDSHAKE with peer "
+ << epee::string_tools::get_ip_string_from_int32(na.ip)
+ << ":" << epee::string_tools::num_to_string_fast(na.port));
+
+ return false;
+ }
+
+ m_net_server.get_config_object().close(con.m_connection_id);
+
+ LOG_DEBUG_CC(con, "CONNECTION HANDSHAKED OK AND CLOSED.");
+
+ return true;
+ }
+
#undef LOG_PRINT_CC_PRIORITY_NODE
//-----------------------------------------------------------------------------------
@@ -1097,6 +1141,7 @@ namespace nodetool
{
m_peer_handshake_idle_maker_interval.do_call(boost::bind(&node_server<t_payload_net_handler>::peer_sync_idle_maker, this));
m_connections_maker_interval.do_call(boost::bind(&node_server<t_payload_net_handler>::connections_maker, this));
+ m_gray_peerlist_housekeeping_interval.do_call(boost::bind(&node_server<t_payload_net_handler>::gray_peerlist_housekeeping, this));
m_peerlist_store_interval.do_call(boost::bind(&node_server<t_payload_net_handler>::store_config, this));
return true;
}
@@ -1456,6 +1501,14 @@ namespace nodetool
drop_connection(context);
return 1;
}
+
+ if(has_too_many_connections(context.m_remote_ip))
+ {
+ LOG_PRINT_CCONTEXT_L1("CONNECTION FROM " << epee::string_tools::get_ip_string_from_int32(context.m_remote_ip) << " REFUSED, too many connections from the same address");
+ drop_connection(context);
+ return 1;
+ }
+
//associate peer_id with this connection
context.peer_id = arg.node_data.peer_id;
@@ -1674,4 +1727,52 @@ namespace nodetool
return true;
}
+
+ template<class t_payload_net_handler>
+ bool node_server<t_payload_net_handler>::has_too_many_connections(const uint32_t ip)
+ {
+ const uint8_t max_connections = 1;
+ uint8_t count = 0;
+
+ m_net_server.get_config_object().foreach_connection([&](const p2p_connection_context& cntxt)
+ {
+ if (cntxt.m_is_income && cntxt.m_remote_ip == ip) {
+ count++;
+
+ if (count > max_connections) {
+ return false;
+ }
+ }
+
+ return true;
+ });
+
+ return count > max_connections;
+ }
+
+ template<class t_payload_net_handler>
+ bool node_server<t_payload_net_handler>::gray_peerlist_housekeeping()
+ {
+ peerlist_entry pe = AUTO_VAL_INIT(pe);
+
+ if (!m_peerlist.get_random_gray_peer(pe)) {
+ return false;
+ }
+
+ bool success = check_connection_and_handshake_with_peer(pe.adr, pe.last_seen);
+
+ if (!success) {
+ m_peerlist.remove_from_peer_gray(pe);
+
+ LOG_PRINT_L2("PEER EVICTED FROM GRAY PEER LIST IP address: " << epee::string_tools::get_ip_string_from_int32(pe.adr.ip) << " Peer ID: " << std::hex << pe.id);
+
+ return true;
+ }
+
+ m_peerlist.set_peer_just_seen(pe.id, pe.adr);
+
+ LOG_PRINT_L2("PEER PROMOTED TO WHITE PEER LIST IP address: " << epee::string_tools::get_ip_string_from_int32(pe.adr.ip) << " Peer ID: " << std::hex << pe.id);
+
+ return true;
+ }
}
diff --git a/src/p2p/net_peerlist.h b/src/p2p/net_peerlist.h
index fa69abd6e..4797eb82b 100644
--- a/src/p2p/net_peerlist.h
+++ b/src/p2p/net_peerlist.h
@@ -81,6 +81,8 @@ namespace nodetool
bool set_peer_just_seen(peerid_type peer, const net_address& addr);
bool set_peer_unreachable(const peerlist_entry& pr);
bool is_ip_allowed(uint32_t ip);
+ bool get_random_gray_peer(peerlist_entry& pe);
+ bool remove_from_peer_gray(const peerlist_entry& pe);
private:
@@ -285,9 +287,11 @@ namespace nodetool
{
if(!vl.last_seen)
continue;
- bs_head.push_back(vl);
- if(cnt++ > depth)
+
+ if(cnt++ >= depth)
break;
+
+ bs_head.push_back(vl);
}
return true;
}
@@ -394,6 +398,50 @@ namespace nodetool
return true;
}
//--------------------------------------------------------------------------------------------------
+ inline
+ bool peerlist_manager::get_random_gray_peer(peerlist_entry& pe)
+ {
+ TRY_ENTRY();
+
+ CRITICAL_REGION_LOCAL(m_peerlist_lock);
+
+ if (m_peers_gray.empty()) {
+ return false;
+ }
+
+ size_t x = crypto::rand<size_t>() % (m_peers_gray.size() + 1);
+ size_t res = (x * x * x) / (m_peers_gray.size() * m_peers_gray.size()); //parabola \/
+
+ LOG_PRINT_L3("Random gray peer index=" << res << "(x="<< x << ", max_index=" << m_peers_gray.size() << ")");
+
+ peers_indexed::index<by_time>::type& by_time_index = m_peers_gray.get<by_time>();
+ pe = *epee::misc_utils::move_it_backward(--by_time_index.end(), res);
+
+ return true;
+
+ CATCH_ENTRY_L0("peerlist_manager::get_random_gray_peer()", false);
+ return true;
+ }
+ //--------------------------------------------------------------------------------------------------
+ inline
+ bool peerlist_manager::remove_from_peer_gray(const peerlist_entry& pe)
+ {
+ TRY_ENTRY();
+
+ CRITICAL_REGION_LOCAL(m_peerlist_lock);
+
+ peers_indexed::index_iterator<by_addr>::type iterator = m_peers_gray.get<by_addr>().find(pe.adr);
+
+ if (iterator != m_peers_gray.get<by_addr>().end()) {
+ m_peers_gray.erase(iterator);
+ }
+
+ return true;
+
+ CATCH_ENTRY_L0("peerlist_manager::remove_from_peer_gray()", false);
+ return true;
+ }
+ //--------------------------------------------------------------------------------------------------
}
BOOST_CLASS_VERSION(nodetool::peerlist_manager, CURRENT_PEERLIST_STORAGE_ARCHIVE_VER)
diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp
index 68781dd73..50509040c 100644
--- a/src/simplewallet/simplewallet.cpp
+++ b/src/simplewallet/simplewallet.cpp
@@ -1958,7 +1958,7 @@ bool simple_wallet::print_ring_members(const std::vector<tools::wallet2::pending
return false;
}
// available for RPC version 1.4 or higher
- if (version < 0x10004)
+ if (version < MAKE_CORE_RPC_VERSION(1, 4))
return true;
std::string err;
uint64_t blockchain_height = get_daemon_blockchain_height(err);
@@ -2317,9 +2317,9 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
LOG_ERROR("RPC error: " << e.to_string());
fail_msg_writer() << tr("RPC error: ") << e.what();
}
- catch (const tools::error::get_random_outs_error&)
+ catch (const tools::error::get_random_outs_error &e)
{
- fail_msg_writer() << tr("failed to get random outputs to mix");
+ fail_msg_writer() << tr("failed to get random outputs to mix: ") << e.what();
}
catch (const tools::error::not_enough_money& e)
{
@@ -2495,9 +2495,9 @@ bool simple_wallet::sweep_unmixable(const std::vector<std::string> &args_)
LOG_ERROR("RPC error: " << e.to_string());
fail_msg_writer() << tr("RPC error: ") << e.what();
}
- catch (const tools::error::get_random_outs_error&)
+ catch (const tools::error::get_random_outs_error &e)
{
- fail_msg_writer() << tr("failed to get random outputs to mix");
+ fail_msg_writer() << tr("failed to get random outputs to mix: ") << e.what();
}
catch (const tools::error::not_enough_money& e)
{
@@ -2756,9 +2756,9 @@ bool simple_wallet::sweep_all(const std::vector<std::string> &args_)
LOG_ERROR("RPC error: " << e.to_string());
fail_msg_writer() << tr("RPC error: ") << e.what();
}
- catch (const tools::error::get_random_outs_error&)
+ catch (const tools::error::get_random_outs_error &e)
{
- fail_msg_writer() << tr("failed to get random outputs to mix");
+ fail_msg_writer() << tr("failed to get random outputs to mix: ") << e.what();
}
catch (const tools::error::not_enough_money& e)
{
@@ -3041,9 +3041,9 @@ bool simple_wallet::submit_transfer(const std::vector<std::string> &args_)
LOG_ERROR("Unknown RPC error: " << e.to_string());
fail_msg_writer() << tr("RPC error: ") << e.what();
}
- catch (const tools::error::get_random_outs_error&)
+ catch (const tools::error::get_random_outs_error &e)
{
- fail_msg_writer() << tr("failed to get random outputs to mix");
+ fail_msg_writer() << tr("failed to get random outputs to mix: ") << e.what();
}
catch (const tools::error::not_enough_money& e)
{
diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp
index 5f7d8e522..52ecc2e6a 100644
--- a/src/wallet/api/wallet.cpp
+++ b/src/wallet/api/wallet.cpp
@@ -834,8 +834,8 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const
} catch (const tools::error::wallet_rpc_error& e) {
m_errorString = tr("RPC error: ") + e.to_string();
m_status = Status_Error;
- } catch (const tools::error::get_random_outs_error&) {
- m_errorString = tr("failed to get random outputs to mix");
+ } catch (const tools::error::get_random_outs_error &e) {
+ m_errorString = (boost::format(tr("failed to get random outputs to mix: %s")) % e.what()).str();
m_status = Status_Error;
} catch (const tools::error::not_enough_money& e) {
diff --git a/src/wallet/api/wallet_manager.cpp b/src/wallet/api/wallet_manager.cpp
index 12bce0285..904338a72 100644
--- a/src/wallet/api/wallet_manager.cpp
+++ b/src/wallet/api/wallet_manager.cpp
@@ -448,6 +448,11 @@ void WalletManagerFactory::setLogLevel(int level)
mlog_set_log_level(level);
}
+void WalletManagerFactory::setLogCategories(const std::string &categories)
+{
+ mlog_set_categories(categories.c_str());
+}
+
}
diff --git a/src/wallet/wallet2_api.h b/src/wallet/wallet2_api.h
index 5a13205c5..78caddc0b 100644
--- a/src/wallet/wallet2_api.h
+++ b/src/wallet/wallet2_api.h
@@ -708,6 +708,7 @@ struct WalletManagerFactory
static WalletManager * getWalletManager();
static void setLogLevel(int level);
+ static void setLogCategories(const std::string &categories);
};