diff --git a/src/console_commands.cpp b/src/console_commands.cpp index ae59325..b50f378 100644 --- a/src/console_commands.cpp +++ b/src/console_commands.cpp @@ -76,7 +76,7 @@ typedef struct cmd { cmdfunc *func; } cmd; -static cmdfunc do_help, do_status, do_loglevel, do_addpeers, do_droppeers, do_showpeers, do_showbans, do_outpeers, do_inpeers, do_exit; +static cmdfunc do_help, do_status, do_loglevel, do_addpeers, do_droppeers, do_showpeers, do_showworkers, do_showbans, do_outpeers, do_inpeers, do_exit; #ifdef WITH_RANDOMX static cmdfunc do_start_mining, do_stop_mining; @@ -89,6 +89,7 @@ static cmd cmds[] = { { STRCONST("addpeers"), "", "add peer", do_addpeers }, { STRCONST("droppeers"), "", "disconnect all peers", do_droppeers }, { STRCONST("peers"), "", "show all peers", do_showpeers }, + { STRCONST("workers"), "", "show all connected workers", do_showworkers }, { STRCONST("bans"), "", "show all banned IPs", do_showbans }, { STRCONST("outpeers"), "", "set maximum number of outgoing connections", do_outpeers }, { STRCONST("inpeers"), "", "set maximum number of incoming connections", do_inpeers }, @@ -158,6 +159,14 @@ static int do_showpeers(p2pool* m_pool, const char* /* args */) return 0; } +static int do_showworkers(p2pool* m_pool, const char* /* args */) +{ + if (m_pool->stratum_server()) { + m_pool->stratum_server()->show_workers(); + } + return 0; +} + static int do_showbans(p2pool* m_pool, const char* /* args */) { if (m_pool->stratum_server()) { diff --git a/src/log.h b/src/log.h index 1554953..9b87cdc 100644 --- a/src/log.h +++ b/src/log.h @@ -184,7 +184,10 @@ INT_ENTRY(unsigned long) template struct BasedValue { - explicit FORCEINLINE BasedValue(T value) : m_value(value) {} + explicit FORCEINLINE BasedValue(T value) : m_value(value) + { + static_assert(std::is_integral::value, "Must be an integer type here"); + } T m_value; }; @@ -192,7 +195,7 @@ struct BasedValue template struct Stream::Entry> { - static FORCEINLINE void put(BasedValue&& data, Stream* wrapper) + static FORCEINLINE void put(BasedValue data, Stream* wrapper) { wrapper->writeInt(data.m_value); } @@ -356,7 +359,7 @@ struct XMRAmount template<> struct log::Stream::Entry { - static NOINLINE void put(XMRAmount&& value, Stream* wrapper) + static NOINLINE void put(XMRAmount value, Stream* wrapper) { constexpr uint64_t denomination = 1000000000000ULL; @@ -375,7 +378,7 @@ template<> struct log::Stream::Entry template<> struct log::Stream::Entry { // cppcheck-suppress constParameter - static NOINLINE void put(const NetworkType& value, Stream* wrapper) + static NOINLINE void put(NetworkType value, Stream* wrapper) { switch (value) { case NetworkType::Invalid: *wrapper << "invalid"; break; @@ -386,6 +389,31 @@ template<> struct log::Stream::Entry } }; +struct Duration +{ + explicit FORCEINLINE Duration(uint64_t data) : m_data(data) {} + + uint64_t m_data; +}; + +template<> struct log::Stream::Entry +{ + static NOINLINE void put(Duration value, Stream* wrapper) + { + const uint64_t uptime = value.m_data; + + const int64_t s = uptime % 60; + const int64_t m = (uptime / 60) % 60; + const int64_t h = (uptime / 3600) % 24; + const int64_t d = uptime / 86400; + + if (d > 0) { + *wrapper << d << "d "; + } + *wrapper << h << "h " << m << "m " << s << 's'; + } +}; + void put_rawip(const raw_ip& value, Stream* wrapper); template<> struct log::Stream::Entry diff --git a/src/p2p_server.cpp b/src/p2p_server.cpp index 5d25a9e..58e9700 100644 --- a/src/p2p_server.cpp +++ b/src/p2p_server.cpp @@ -855,25 +855,10 @@ uint64_t P2PServer::get_random64() void P2PServer::print_status() { - const int64_t uptime = seconds_since_epoch() - m_pool->start_time(); - - const int64_t s = uptime % 60; - const int64_t m = (uptime / 60) % 60; - const int64_t h = (uptime / 3600) % 24; - const int64_t d = uptime / 86400; - - char buf[log::Stream::BUF_SIZE + 1]; - log::Stream s1(buf); - - if (d > 0) { - s1 << d << "d "; - } - s1 << h << "h " << m << "m " << s << 's'; - LOGINFO(0, "status" << "\nConnections = " << m_numConnections << " (" << m_numIncomingConnections << " incoming)" << "\nPeer list size = " << m_peerList.size() << - "\nUptime = " << log::const_buf(buf, s1.m_pos) + "\nUptime = " << log::Duration(seconds_since_epoch() - m_pool->start_time()) ); } diff --git a/src/stratum_server.cpp b/src/stratum_server.cpp index 5ed00e2..f8a9e85 100644 --- a/src/stratum_server.cpp +++ b/src/stratum_server.cpp @@ -441,6 +441,21 @@ void StratumServer::print_status() print_stratum_status(); } +void StratumServer::show_workers() +{ + const uint64_t cur_time = seconds_since_epoch(); + + MutexLock lock(m_clientsListLock); + + for (StratumClient* c = static_cast(m_connectedClientsList->m_next); c != m_connectedClientsList; c = static_cast(c->m_next)) { + LOGINFO(0, static_cast(c->m_addrString) + << '\t' << (c->m_rpcId ? " " : "*") << log::Duration(cur_time - c->m_connectedTime) + << '\t' << c->m_customDiff + << '\t' << c->m_customUser + ); + } +} + void StratumServer::reset_share_counters() { m_cumulativeHashesAtLastShare = 0; diff --git a/src/stratum_server.h b/src/stratum_server.h index 17551c3..a5ab2c5 100644 --- a/src/stratum_server.h +++ b/src/stratum_server.h @@ -73,6 +73,7 @@ public: uint64_t get_random64(); void print_status() override; + void show_workers(); void reset_share_counters();