forked from EOSIO/taurus-node
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
158 lines (142 loc) · 5.39 KB
/
main.cpp
File metadata and controls
158 lines (142 loc) · 5.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <appbase/application.hpp>
#include <eosio/chain_plugin/chain_plugin.hpp>
#include <eosio/http_plugin/http_plugin.hpp>
#include <eosio/net_plugin/net_plugin.hpp>
#include <eosio/producer_plugin/producer_plugin.hpp>
#include <eosio/resource_monitor_plugin/resource_monitor_plugin.hpp>
#include <eosio/version/version.hpp>
#include <fc/log/logger.hpp>
#include <fc/log/logger_config.hpp>
#include <fc/exception/exception.hpp>
#include <boost/dll/runtime_symbol_info.hpp>
#include <boost/exception/diagnostic_information.hpp>
#include "config.hpp"
using namespace appbase;
using namespace eosio;
using namespace eosio::chain;
namespace detail {
void configure_logging(const bfs::path& config_path)
{
try {
try {
if( fc::exists( config_path ) ) {
fc::configure_logging( config_path );
} else {
auto cfg = fc::logging_config::default_config();
}
} catch (...) {
elog("Error reloading logging.json");
throw;
}
} catch (const fc::exception& e) {
elog("{e}", ("e",e.to_detail_string()));
} catch (const boost::exception& e) {
elog("{e}", ("e",boost::diagnostic_information(e)));
} catch (const std::exception& e) {
elog("{e}", ("e",e.what()));
} catch (...) {
// empty
}
}
} // namespace detail
void logging_conf_handler()
{
auto config_path = app().get_logging_conf();
if( fc::exists( config_path ) ) {
ilog( "Received HUP. Reloading logging configuration from {p}.", ("p", config_path.string()) );
} else {
ilog( "Received HUP. No log config found at {p}, setting to default.", ("p", config_path.string()) );
}
::detail::configure_logging( config_path );
}
void initialize_logging()
{
auto config_path = app().get_logging_conf();
if(fc::exists(config_path))
fc::configure_logging(config_path); // intentionally allowing exceptions to escape
else {
auto cfg = fc::logging_config::default_config();
}
app().set_sighup_callback(logging_conf_handler);
}
enum return_codes {
OTHER_FAIL = -2,
INITIALIZE_FAIL = -1,
SUCCESS = 0,
BAD_ALLOC = 1,
DATABASE_DIRTY = 2,
FIXED_REVERSIBLE = SUCCESS,
EXTRACTED_GENESIS = SUCCESS,
NODE_MANAGEMENT_SUCCESS = 5
};
int main(int argc, char** argv)
{
try {
app().set_version(eosio::nodeos::config::version);
app().set_version_string(eosio::version::version_client());
app().set_full_version_string(eosio::version::version_full());
auto root = fc::app_path();
app().set_default_data_dir(root / "eosio" / nodeos::config::node_executable_name / "data" );
app().set_default_config_dir(root / "eosio" / nodeos::config::node_executable_name / "config" );
http_plugin::set_defaults({
/* .default_unix_socket_path = */ "",
/* .default_http_port = */ 8888
});
if(!app().initialize<chain_plugin, net_plugin, producer_plugin, resource_monitor_plugin>(argc, argv)) {
const auto& opts = app().get_options();
if( opts.count("help") || opts.count("version") || opts.count("full-version") || opts.count("print-default-config") ) {
return SUCCESS;
}
return INITIALIZE_FAIL;
}
if (auto resmon_plugin = app().find_plugin<resource_monitor_plugin>()) {
resmon_plugin->monitor_directory(app().data_dir());
} else {
elog("resource_monitor_plugin failed to initialize");
return INITIALIZE_FAIL;
}
initialize_logging();
ilog( "{name} version {ver} {fv}",
("name", nodeos::config::node_executable_name)("ver", app().version_string())
("fv", app().version_string() == app().full_version_string() ? "" : app().full_version_string()) );
ilog("{name} using configuration file {c}", ("name", nodeos::config::node_executable_name)("c", app().full_config_file_path().string()));
ilog("{name} data directory is {d}", ("name", nodeos::config::node_executable_name)("d", app().data_dir().string()));
app().startup();
app().set_thread_priority_max();
app().exec();
} catch( const extract_genesis_state_exception& e ) {
return EXTRACTED_GENESIS;
} catch( const fixed_reversible_db_exception& e ) {
return FIXED_REVERSIBLE;
} catch( const node_management_success& e ) {
return NODE_MANAGEMENT_SUCCESS;
} catch (const std_exception_wrapper& e) {
try {
std::rethrow_exception(e.get_inner_exception());
} catch (const std::system_error&i) {
if (chainbase::db_error_code::dirty == i.code().value()) {
elog("Database dirty flag set (likely due to unclean shutdown): replay required" );
return DATABASE_DIRTY;
}
} catch (...) { }
elog( "{e}", ("e",e.to_detail_string()));
return OTHER_FAIL;
} catch( const fc::exception& e ) {
elog( "{e}", ("e", e.to_detail_string()));
return OTHER_FAIL;
} catch( const boost::interprocess::bad_alloc& e ) {
elog("bad alloc");
return BAD_ALLOC;
} catch( const boost::exception& e ) {
elog("{e}", ("e",boost::diagnostic_information(e)));
return OTHER_FAIL;
} catch( const std::exception& e ) {
elog("{e}", ("e",e.what()));
return OTHER_FAIL;
} catch( ... ) {
elog("unknown exception");
return OTHER_FAIL;
}
ilog("{name} successfully exiting", ("name", nodeos::config::node_executable_name));
return SUCCESS;
}