mirror of
https://github.com/SChernykh/p2pool.git
synced 2024-11-17 00:07:47 +00:00
Added pool stats
This commit is contained in:
parent
295cbda449
commit
533cc202d2
7 changed files with 82 additions and 25 deletions
|
@ -146,22 +146,32 @@ void ConsoleCommands::run()
|
|||
|
||||
do {
|
||||
std::getline(std::cin, command);
|
||||
if (stopped || std::cin.eof()) {
|
||||
|
||||
if (std::cin.eof()) {
|
||||
LOGINFO(1, "EOF, stopping");
|
||||
return;
|
||||
}
|
||||
|
||||
int i;
|
||||
for (i=0; cmds[i].name.len; i++) {
|
||||
if (!strncmp(command.c_str(), cmds[i].name.str, cmds[i].name.len)) {
|
||||
const char *args = command.c_str() + cmds[i].name.len + 1;
|
||||
int rc = cmds[i].func(m_pool, args);
|
||||
if ( rc )
|
||||
if (stopped) {
|
||||
LOGINFO(1, "stopping");
|
||||
return;
|
||||
}
|
||||
|
||||
cmd* c = cmds;
|
||||
for (; c->name.len; ++c) {
|
||||
if (!strncmp(command.c_str(), c->name.str, c->name.len)) {
|
||||
const char *args = command.c_str() + c->name.len + 1;
|
||||
if (c->func(m_pool, args)) {
|
||||
LOGINFO(1, "exit requested, stopping");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!cmds[i].name.len)
|
||||
|
||||
if (!c->name.len) {
|
||||
LOGWARN(0, "Unknown command " << command);
|
||||
}
|
||||
} while (true);
|
||||
}
|
||||
|
||||
|
|
|
@ -438,6 +438,7 @@ void p2pool::update_block_template()
|
|||
}
|
||||
m_blockTemplate->update(m_minerData, *m_mempool, &m_params->m_wallet);
|
||||
stratum_on_block();
|
||||
api_update_pool_stats();
|
||||
}
|
||||
|
||||
void p2pool::download_block_headers(uint64_t current_height)
|
||||
|
@ -778,6 +779,28 @@ void p2pool::api_update_network_stats()
|
|||
});
|
||||
}
|
||||
|
||||
void p2pool::api_update_pool_stats()
|
||||
{
|
||||
if (!m_api) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint64_t t;
|
||||
const difficulty_type diff = m_sideChain->difficulty();
|
||||
const uint64_t hashrate = udiv128(diff.hi, diff.lo, m_sideChain->block_time(), &t);
|
||||
const uint64_t miners = m_sideChain->miner_count();
|
||||
const difficulty_type total_hashes = m_sideChain->total_hashes();
|
||||
|
||||
m_api->set(p2pool_api::Category::POOL, "stats",
|
||||
[hashrate, miners, &total_hashes](log::Stream& s)
|
||||
{
|
||||
s << "{\"pool_list\":[\"pplns\"],\"pool_statistics\":{\"hashRate\":" << hashrate
|
||||
<< ",\"miners\":" << miners
|
||||
<< ",\"totalHashes\":" << total_hashes
|
||||
<< ",\"lastBlockFoundTime\":0,\"lastBlockFound\":0}}";
|
||||
});
|
||||
}
|
||||
|
||||
static void on_signal(uv_signal_t* handle, int signum)
|
||||
{
|
||||
p2pool* pool = reinterpret_cast<p2pool*>(handle->data);
|
||||
|
|
|
@ -114,6 +114,7 @@ private:
|
|||
uint32_t parse_block_headers_range(const char* data, size_t size);
|
||||
|
||||
void api_update_network_stats();
|
||||
void api_update_pool_stats();
|
||||
|
||||
std::atomic<uint32_t> m_serversStarted{ 0 };
|
||||
StratumServer* m_stratumServer = nullptr;
|
||||
|
|
|
@ -59,20 +59,10 @@ p2pool_api::p2pool_api(const std::string& api_path) : m_apiPath(api_path)
|
|||
uv_mutex_init_checked(&m_dumpDataLock);
|
||||
|
||||
m_networkPath = m_apiPath + "network/";
|
||||
m_poolPath = m_apiPath + "pool/";
|
||||
|
||||
#ifdef _MSC_VER
|
||||
result = _mkdir(m_networkPath.c_str());
|
||||
#else
|
||||
result = mkdir(m_networkPath.c_str(), 0775);
|
||||
#endif
|
||||
|
||||
if (result < 0) {
|
||||
result = errno;
|
||||
if (result != EEXIST) {
|
||||
LOGERR(1, "mkdir(" << m_networkPath << ") failed, error " << result);
|
||||
panic();
|
||||
}
|
||||
}
|
||||
create_dir(m_networkPath);
|
||||
create_dir(m_poolPath);
|
||||
}
|
||||
|
||||
p2pool_api::~p2pool_api()
|
||||
|
@ -80,6 +70,23 @@ p2pool_api::~p2pool_api()
|
|||
uv_mutex_destroy(&m_dumpDataLock);
|
||||
}
|
||||
|
||||
void p2pool_api::create_dir(const std::string& path)
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
int result = _mkdir(path.c_str());
|
||||
#else
|
||||
int result = mkdir(path.c_str(), 0775);
|
||||
#endif
|
||||
|
||||
if (result < 0) {
|
||||
result = errno;
|
||||
if (result != EEXIST) {
|
||||
LOGERR(1, "mkdir(" << path << ") failed, error " << result);
|
||||
panic();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void p2pool_api::on_stop()
|
||||
{
|
||||
uv_close(reinterpret_cast<uv_handle_t*>(&m_dumpToFileAsync), nullptr);
|
||||
|
@ -95,7 +102,8 @@ void p2pool_api::dump_to_file_async_internal(const Category& category, const cha
|
|||
std::string path;
|
||||
|
||||
switch (category) {
|
||||
case Category::NETWORK: path = m_networkPath + filename;
|
||||
case Category::NETWORK: path = m_networkPath + filename; break;
|
||||
case Category::POOL: path = m_poolPath + filename; break;
|
||||
}
|
||||
|
||||
{
|
||||
|
|
|
@ -30,6 +30,7 @@ public:
|
|||
|
||||
enum class Category {
|
||||
NETWORK,
|
||||
POOL,
|
||||
};
|
||||
|
||||
void on_stop();
|
||||
|
@ -38,6 +39,8 @@ public:
|
|||
void set(const Category& category, const char* filename, T&& callback) { dump_to_file_async_internal(category, filename, DumpFileCallback<T>(std::move(callback))); }
|
||||
|
||||
private:
|
||||
void create_dir(const std::string& path);
|
||||
|
||||
static void on_dump_to_file(uv_async_t* async) { reinterpret_cast<p2pool_api*>(async->data)->dump_to_file(); }
|
||||
|
||||
struct DumpFileWork {
|
||||
|
@ -75,6 +78,7 @@ private:
|
|||
|
||||
std::string m_apiPath;
|
||||
std::string m_networkPath;
|
||||
std::string m_poolPath;
|
||||
|
||||
uv_mutex_t m_dumpDataLock;
|
||||
std::unordered_map<std::string, std::vector<char>> m_dumpData;
|
||||
|
|
|
@ -663,6 +663,16 @@ void SideChain::print_status()
|
|||
);
|
||||
}
|
||||
|
||||
difficulty_type SideChain::total_hashes() const
|
||||
{
|
||||
return m_chainTip ? m_chainTip->m_cumulativeDifficulty : difficulty_type();
|
||||
}
|
||||
|
||||
uint64_t SideChain::miner_count() const
|
||||
{
|
||||
return m_chainTip ? m_chainTip->m_outputs.size() : 0;
|
||||
}
|
||||
|
||||
bool SideChain::split_reward(uint64_t reward, const std::vector<MinerShare>& shares, std::vector<uint64_t>& rewards)
|
||||
{
|
||||
const size_t num_shares = shares.size();
|
||||
|
@ -1448,9 +1458,7 @@ void SideChain::prune_old_blocks()
|
|||
}), v.end());
|
||||
|
||||
if (v.empty()) {
|
||||
auto old_it = it;
|
||||
++it;
|
||||
m_blocksByHeight.erase(old_it);
|
||||
it = m_blocksByHeight.erase(it);
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
|
|
|
@ -64,6 +64,9 @@ public:
|
|||
uint64_t chain_window_size() const { return m_chainWindowSize; }
|
||||
NetworkType network_type() const { return m_networkType; }
|
||||
const difficulty_type& difficulty() const { return m_curDifficulty; }
|
||||
difficulty_type total_hashes() const;
|
||||
uint64_t block_time() const { return m_targetBlockTime; }
|
||||
uint64_t miner_count() const;
|
||||
|
||||
static bool split_reward(uint64_t reward, const std::vector<MinerShare>& shares, std::vector<uint64_t>& rewards);
|
||||
|
||||
|
|
Loading…
Reference in a new issue