34 #include <boost/algorithm/string.hpp>
48 : m_context(context), m_last_server_count(0), m_disable_rrdtool(false) {
54 Path data_dir = props->get_str(
"Hypertable.DataDirectory");
73 HT_INFOF(
"Created monitoring dir %s",dir.c_str());
76 HT_INFOF(
"rangeservers monitoring stats dir %s exists ",dir.c_str());
80 lock_guard<mutex> lock(
m_mutex);
82 RangeServerMap::iterator iter =
m_server_map.find(location);
85 (*iter).second->system_info = make_shared<StatsSystem>(system_info);
91 m_server_map[location]->system_info = make_shared<StatsSystem>(system_info);
96 lock_guard<mutex> lock(
m_mutex);
98 RangeServerMap::iterator iter =
m_server_map.find(location);
105 struct LtRangeServerStatistics {
107 if (boost::algorithm::starts_with(s1.
location,
"rs") &&
108 boost::algorithm::starts_with(s2.
location,
"rs")) {
109 int id1 = atoi(s1.
location.c_str()+2);
110 int id2 = atoi(s2.
location.c_str()+2);
119 lock_guard<mutex> lock(
m_mutex);
121 RangeServerMap::iterator iter;
122 double numerator, denominator;
123 int32_t server_count = 0;
133 for (
size_t i = 0; i < stats.size(); i++) {
134 memset(&rrd_data, 0,
sizeof(rrd_data));
138 HT_ERRORF(
"Statistics received for '%s' but not registered for "
139 "Monitoring", stats[i].location.c_str());
144 (*iter).second->fetch_timestamp = stats[i].fetch_timestamp;
145 (*iter).second->fetch_error = stats[i].fetch_error;
150 if (rsc->is_recovering())
151 (*iter).second->fetch_error_msg =
"Recovering...";
153 (*iter).second->fetch_error_msg = stats[i].fetch_error_msg;
159 server_set.insert(stats[i].location.c_str());
162 if ((*iter).second->stats) {
164 if (stats[i].stats->query_cache_accesses > (*iter).second->stats->query_cache_accesses) {
165 numerator = (double)stats[i].stats->query_cache_hits -
166 (
double)(*iter).second->stats->query_cache_hits;
167 denominator = (double)stats[i].stats->query_cache_accesses -
168 (
double)(*iter).second->stats->query_cache_accesses;
172 if (stats[i].stats->block_cache_accesses > (*iter).second->stats->block_cache_accesses) {
173 numerator = (double)stats[i].stats->block_cache_hits -
174 (
double)(*iter).second->stats->block_cache_hits;
175 denominator = (double)stats[i].stats->block_cache_accesses -
176 (
double)(*iter).second->stats->block_cache_accesses;
180 double elapsed_time = (double)(stats[i].fetch_timestamp - (*iter).second->fetch_timestamp)/1000000000.0;
182 rrd_data.
scan_rate = stats[i].stats->scan_count/elapsed_time;
183 rrd_data.
update_rate = stats[i].stats->update_count /elapsed_time;
184 rrd_data.
sync_rate = stats[i].stats->sync_count/elapsed_time;
185 rrd_data.
cell_read_rate = stats[i].stats->scanned_cells /elapsed_time;
186 rrd_data.
cell_write_rate = stats[i].stats->updated_cells /elapsed_time;
187 rrd_data.
byte_read_rate = stats[i].stats->scanned_bytes /elapsed_time;
188 rrd_data.
byte_write_rate = stats[i].stats->updated_bytes /elapsed_time;
191 rrd_data.
timestamp = stats[i].stats_timestamp / 1000000000LL;
192 rrd_data.
range_count = stats[i].stats->range_count;
194 rrd_data.
file_count = stats[i].stats->file_count;
196 rrd_data.
qcache_fill = stats[i].stats->query_cache_max_memory -
197 stats[i].stats->query_cache_available_memory;
199 rrd_data.
bcache_fill = stats[i].stats->block_cache_max_memory -
200 stats[i].stats->block_cache_available_memory;
202 numerator = denominator = 0.0;
203 for (
size_t j=0; j<stats[i].stats->system.fs_stat.size(); j++) {
204 numerator += stats[i].stats->system.fs_stat[j].total
205 - stats[i].stats->system.fs_stat[j].avail;
206 denominator += stats[i].stats->system.fs_stat[j].total;
208 if (denominator != 0.0)
211 for (
size_t j=0; j<stats[i].stats->system.disk_stat.size(); j++) {
212 rrd_data.
disk_read_bytes += (int64_t)stats[i].stats->system.disk_stat[j].read_rate;
213 rrd_data.
disk_write_bytes += (int64_t)stats[i].stats->system.disk_stat[j].write_rate;
214 rrd_data.
disk_read_iops += (int64_t)stats[i].stats->system.disk_stat[j].reads_rate;
215 rrd_data.
disk_write_iops += (int64_t)stats[i].stats->system.disk_stat[j].writes_rate;
218 rrd_data.
vm_size = (int64_t)stats[i].stats->system.proc_stat.vm_size * 1024*1024;
219 rrd_data.
vm_resident = (int64_t)stats[i].stats->system.proc_stat.vm_resident * 1024*1024;
220 rrd_data.
page_in = (int64_t)stats[i].stats->system.swap_stat.page_in;
221 rrd_data.
page_out = (int64_t)stats[i].stats->system.swap_stat.page_out;
222 rrd_data.
heap_size = (int64_t)stats[i].stats->system.proc_stat.heap_size;
223 rrd_data.
heap_slack = (int64_t)stats[i].stats->system.proc_stat.heap_slack;
224 rrd_data.
tracked_memory = (int64_t)stats[i].stats->tracked_memory;
225 rrd_data.
net_rx_rate = (int64_t)stats[i].stats->system.net_stat.rx_rate;
226 rrd_data.
net_tx_rate = (int64_t)stats[i].stats->system.net_stat.tx_rate;
227 rrd_data.
load_average = stats[i].stats->system.loadavg_stat.loadavg[0];
228 rrd_data.
cpu_user = stats[i].stats->cpu_user;
229 rrd_data.
cpu_sys = stats[i].stats->cpu_sys;
244 (*iter).second->stats = stats[i].stats;
245 (*iter).second->fetch_error = stats[i].fetch_error;
246 (*iter).second->fetch_error_msg = stats[i].fetch_error_msg;
247 (*iter).second->fetch_timestamp = stats[i].fetch_timestamp;
254 for (
auto server : server_set)
255 md5_update(&md5_ctx, (
const unsigned char *)server, strlen(server));
256 unsigned char server_set_digest[16];
264 if (iter->second.disk_used != 0)
265 iter->second.compression_ratio =
266 (double)iter->second.disk_used / iter->second.compression_ratio;
268 iter->second.compression_ratio = 1.0;
269 if (iter->second.cell_count != 0) {
270 iter->second.average_key_size /= iter->second.cell_count;
271 iter->second.average_value_size /= iter->second.cell_count;
274 iter->second.average_key_size = 0.0;
275 iter->second.average_value_size = 0.0;
280 std::vector<RangeServerStatistics> stats_vec;
281 struct LtRangeServerStatistics comp;
284 stats_vec.push_back(*(*iter).second);
285 sort(stats_vec.begin(), stats_vec.end(), comp);
289 TableStatMap::iterator ts_iter;
290 TableStatMap::iterator prev_iter;
298 HT_INFOF(
"Statistics server set mismatch, using previous "
299 "statistics. last_server_count=%d, server_count=%d",
301 ts_iter->second.scan_rate = prev_iter->second.scan_rate;
302 ts_iter->second.update_rate = prev_iter->second.update_rate;
303 ts_iter->second.cell_read_rate = prev_iter->second.cell_read_rate;
304 ts_iter->second.cell_write_rate = prev_iter->second.cell_write_rate;
305 ts_iter->second.byte_read_rate = prev_iter->second.byte_read_rate;
306 ts_iter->second.byte_write_rate = prev_iter->second.byte_write_rate;
307 ts_iter->second.disk_read_rate = prev_iter->second.disk_read_rate;
312 double elapsed_time = (double)(ts_iter->second.fetch_timestamp - prev_iter->second.fetch_timestamp) / 1000000000.0;
313 ts_iter->second.scan_rate = (ts_iter->second.scans - prev_iter->second.scans) / elapsed_time;
314 ts_iter->second.update_rate = (ts_iter->second.updates - prev_iter->second.updates) / elapsed_time;
315 ts_iter->second.cell_read_rate = (ts_iter->second.cells_read - prev_iter->second.cells_read) / elapsed_time;
316 ts_iter->second.cell_write_rate = (ts_iter->second.cells_written - prev_iter->second.cells_written) / elapsed_time;
317 ts_iter->second.byte_read_rate = (ts_iter->second.bytes_read - prev_iter->second.bytes_read) / elapsed_time;
318 ts_iter->second.byte_write_rate = (ts_iter->second.bytes_written - prev_iter->second.bytes_written) / elapsed_time;
319 ts_iter->second.disk_read_rate = (ts_iter->second.disk_bytes_read - prev_iter->second.disk_bytes_read) / elapsed_time;
323 String table_file_name = ts_iter->first;
328 slash_pos = table_file_name.rfind(
"/");
329 if (slash_pos != string::npos) {
330 dir = table_file_name.substr(0,slash_pos+1);
352 TableStatMap::iterator iter;
354 for (
size_t i=0; i<table_stats.size(); i++) {
358 table_data = iter->second;
360 memset(&table_data, 0,
sizeof(table_data));
363 table_data.
range_count += table_stats[i].range_count;
365 table_data.
cell_count += table_stats[i].cell_count;
366 table_data.
file_count += table_stats[i].file_count;
367 table_data.
scans += table_stats[i].scans;
368 table_data.
cells_read += table_stats[i].cells_scanned;
369 table_data.
bytes_read += table_stats[i].bytes_scanned;
371 table_data.
updates += table_stats[i].updates;
374 table_data.
disk_used += table_stats[i].disk_used;
377 table_data.
compression_ratio += (double)table_stats[i].disk_used / table_stats[i].compression_ratio;
378 table_data.
memory_used += table_stats[i].memory_used;
391 int32_t multiplier = 1;
393 if (server_timestamp < stats->fetch_timestamp) {
402 if (skew < stats->fetch_duration)
412 stats->
clock_skew = (skew / 1000000L) * multiplier;
429 HT_DEBUGF(
"Creating rrd file %s", filename.c_str());
431 std::vector<String> args;
432 args.push_back((
String)
"create");
433 args.push_back(filename);
434 args.push_back(step);
435 args.push_back((
String)
"DS:range_count:GAUGE:600:0:U");
436 args.push_back((
String)
"DS:scanner_count:GAUGE:600:0:U");
437 args.push_back((
String)
"DS:file_count:GAUGE:600:0:U");
438 args.push_back((
String)
"DS:scan_rate:GAUGE:600:0:U");
439 args.push_back((
String)
"DS:update_rate:GAUGE:600:0:U");
440 args.push_back((
String)
"DS:sync_rate:GAUGE:600:0:U");
441 args.push_back((
String)
"DS:cell_read_rate:GAUGE:600:0:U");
442 args.push_back((
String)
"DS:cell_write_rate:GAUGE:600:0:U");
443 args.push_back((
String)
"DS:byte_read_rate:GAUGE:600:0:U");
444 args.push_back((
String)
"DS:byte_write_rate:GAUGE:600:0:U");
445 args.push_back((
String)
"DS:qcache_hit_pct:GAUGE:600:0:100");
446 args.push_back((
String)
"DS:qcache_max_mem:GAUGE:600:0:U");
447 args.push_back((
String)
"DS:qcache_fill:GAUGE:600:0:U");
448 args.push_back((
String)
"DS:bcache_hit_pct:GAUGE:600:0:100");
449 args.push_back((
String)
"DS:bcache_max_mem:GAUGE:600:0:U");
450 args.push_back((
String)
"DS:bcache_fill:GAUGE:600:0:U");
451 args.push_back((
String)
"DS:disk_used_pct:GAUGE:600:0:100");
452 args.push_back((
String)
"DS:disk_read_bytes:GAUGE:600:0:U");
453 args.push_back((
String)
"DS:disk_write_bytes:GAUGE:600:0:U");
454 args.push_back((
String)
"DS:disk_read_iops:GAUGE:600:0:U");
455 args.push_back((
String)
"DS:disk_write_iops:GAUGE:600:0:U");
456 args.push_back((
String)
"DS:vm_size:GAUGE:600:0:U");
457 args.push_back((
String)
"DS:vm_resident:GAUGE:600:0:U");
458 args.push_back((
String)
"DS:page_in:GAUGE:600:0:U");
459 args.push_back((
String)
"DS:page_out:GAUGE:600:0:U");
460 args.push_back((
String)
"DS:heap_size:GAUGE:600:0:U");
461 args.push_back((
String)
"DS:heap_slack:GAUGE:600:0:U");
462 args.push_back((
String)
"DS:tracked_memory:GAUGE:600:0:U");
463 args.push_back((
String)
"DS:net_rx_rate:GAUGE:600:0:U");
464 args.push_back((
String)
"DS:net_tx_rate:GAUGE:600:0:U");
465 args.push_back((
String)
"DS:loadavg:GAUGE:600:0:U");
466 args.push_back((
String)
"DS:cpu_user:GAUGE:600:0:U");
467 args.push_back((
String)
"DS:cpu_sys:GAUGE:600:0:U");
469 args.push_back((
String)
"RRA:AVERAGE:.5:1:2880");
470 args.push_back((
String)
"RRA:AVERAGE:.5:10:2880");
471 args.push_back((
String)
"RRA:AVERAGE:.5:60:1448");
472 args.push_back((
String)
"RRA:AVERAGE:.5:720:2190");
473 args.push_back((
String)
"RRA:MAX:.5:10:2880");
474 args.push_back((
String)
"RRA:MAX:.5:720:2190");
493 HT_DEBUGF(
"Creating rrd file %s", filename.c_str());
495 std::vector<String> args;
496 args.push_back((
String)
"create");
497 args.push_back(filename);
498 args.push_back(step);
499 args.push_back((
String)
"DS:range_count:GAUGE:600:0:U");
500 args.push_back((
String)
"DS:scanner_count:GAUGE:600:0:U");
501 args.push_back((
String)
"DS:scan_rate:GAUGE:600:0:U");
502 args.push_back((
String)
"DS:update_rate:GAUGE:600:0:U");
503 args.push_back((
String)
"DS:cell_read_rate:GAUGE:600:0:U");
504 args.push_back((
String)
"DS:cell_write_rate:GAUGE:600:0:U");
505 args.push_back((
String)
"DS:byte_read_rate:GAUGE:600:0:U");
506 args.push_back((
String)
"DS:byte_write_rate:GAUGE:600:0:U");
507 args.push_back((
String)
"DS:disk_read_rate:GAUGE:600:0:U");
508 args.push_back((
String)
"DS:disk_used:GAUGE:600:0:U");
509 args.push_back((
String)
"DS:compression_ratio:GAUGE:600:0:U");
510 args.push_back((
String)
"DS:memory_used:GAUGE:600:0:U");
511 args.push_back((
String)
"DS:memory_allocated:GAUGE:600:0:U");
512 args.push_back((
String)
"DS:shadow_cache_memory:GAUGE:600:0:U");
513 args.push_back((
String)
"DS:block_index_memory:GAUGE:600:0:U");
514 args.push_back((
String)
"DS:bloom_filter_memory:GAUGE:600:0:U");
515 args.push_back((
String)
"DS:bloom_filter_access:GAUGE:600:0:U");
516 args.push_back((
String)
"DS:bloom_filter_maybes:GAUGE:600:0:U");
518 args.push_back((
String)
"RRA:AVERAGE:.5:1:2880");
519 args.push_back((
String)
"RRA:AVERAGE:.5:10:2880");
520 args.push_back((
String)
"RRA:AVERAGE:.5:60:1448");
521 args.push_back((
String)
"RRA:AVERAGE:.5:720:2190");
522 args.push_back((
String)
"RRA:MAX:.5:10:2880");
523 args.push_back((
String)
"RRA:MAX:.5:720:2190");
529 std::vector<String> args;
532 args.push_back((
String)
"update");
533 args.push_back(filename);
535 update =
format(
"%llu:%d:%d:%.2f:%.2f:%.2f:%.2f:%.2f:%.2f:%.2f:%lld:%.2f:%lld:%lld:%lld:%lld:%lld:%lld:%lld",
556 HT_DEBUGF(
"table update=\"%s\"", update.c_str());
558 args.push_back(update);
564 std::vector<String> args;
567 args.push_back((
String)
"update");
568 args.push_back(filename);
570 update =
format(
"%llu:%d:%d:%lld:%.2f:%.2f:%.2f:%.2f:%.2f:%.2f:%.2f:%.2f:%lld:%lld:%.2f:%lld:%lld:%.2f:%lld:%lld:%lld:%lld:%lld:%lld:%lld:%lld:%lld:%lld:%lld:%.2f:%.2f:%.2f:%.2f:%.2f",
606 HT_DEBUGF(
"update=\"%s\"", update.c_str());
608 args.push_back(update);
614 const char *rs_json_header =
"{\"RangeServerSummary\": {\n \"servers\": [\n";
615 const char *rs_json_footer=
"\n ]\n}}\n";
616 const char *rs_entry_format =
617 "{\"order\": \"%d\", \"location\": \"%s\", \"version\": \"%s\", \"hostname\": \"%s\", \"ip\": \"%s\", \"arch\": \"%s\","
618 " \"cores\": \"%d\", \"skew\": \"%d\", \"os\": \"%s\", \"osVersion\": \"%s\","
619 " \"vendor\": \"%s\", \"vendorVersion\": \"%s\", \"ram\": \"%.2f\","
620 " \"disk\": \"%.2f\", \"diskUsePct\": \"%u\", \"rangeCount\": \"%llu\","
621 " \"lastContact\": \"%s\", \"lastError\": \"%s\"}";
623 const char *master_json_header =
"{\"MasterSummary\": {\"version\": \"%s\", \"name\": \"%s\", \"state\": [\n";
624 const char *master_json_footer =
"\n]}}\n";
625 const char *state_variable_format =
"{\"name\": \"%s\", \"value\": \"%s\"}";
627 const char *table_json_header =
"{\"TableSummary\": {\n \"tables\": [\n";
628 const char *table_json_footer=
"\n ]\n}}\n";
629 const char *table_entry_format =
630 "{\"id\": \"%s\",\"name\": \"%s\",\"rangecount\": \"%u\", \"cellcount\": \"%llu\", \"filecount\": \"%llu\", \"disk\": \"%llu\","
631 " \"memory\": \"%llu\", \"average_key_size\": \"%.1f\", \"average_value_size\": \"%.1f\", \"compression_ratio\": \"%.3f\"}";
640 std::vector<SystemVariable::Spec> specs;
643 for (
size_t i = 0; i<specs.size(); i++) {
644 entry =
format(state_variable_format,
646 specs[i].value ?
"true" :
"false");
648 contents +=
String(
" ") + entry;
650 contents +=
String(
",\n ") + entry;
652 contents += master_json_footer;
664 unsigned disk_use_pct;
667 uint64_t range_count;
670 for (
size_t i=0; i<stats.size(); i++) {
671 if (stats[i].stats) {
672 double numerator=0.0, denominator=0.0;
673 ram = stats[i].stats->system.mem_stat.ram / 1000.0;
676 for (
size_t j=0; j<stats[i].stats->system.fs_stat.size(); j++) {
677 numerator += stats[i].stats->system.fs_stat[j].total -
678 stats[i].stats->system.fs_stat[j].avail;
679 denominator += stats[i].stats->system.fs_stat[j].total;
680 disk += stats[i].stats->system.fs_stat[j].total;
682 disk /= 1000000000.0;
683 disk_use_pct = (unsigned)((numerator/denominator)*100.0);
684 time_t contact = (time_t)(stats[i].fetch_timestamp / 1000000000LL);
686 ctime_r(&contact, buf);
688 boost::trim(contact_time);
689 range_count = stats[i].stats->range_count;
690 version_string = stats[i].stats->version.c_str();
696 contact_time =
String(
"N/A");
700 if (stats[i].fetch_error == 0)
703 error_str = stats[i].fetch_error_msg;
704 if (error_str.empty())
708 entry =
format(rs_entry_format,
710 stats[i].location.c_str(),
712 stats[i].system_info->net_info.host_name.c_str(),
713 stats[i].system_info->net_info.primary_addr.c_str(),
714 stats[i].system_info->os_info.arch.c_str(),
715 stats[i].system_info->cpu_info.total_cores,
717 stats[i].system_info->os_info.name.c_str(),
718 stats[i].system_info->os_info.version.c_str(),
719 stats[i].system_info->os_info.vendor.c_str(),
720 stats[i].system_info->os_info.vendor_version.c_str(),
725 contact_time.c_str(),
729 str +=
String(
",\n ") + entry;
731 str +=
String(
" ") + entry;
734 str += rs_json_footer;
752 TableStatMap::iterator ts_iter;
756 table_id = ts_iter->first;
757 table_data = ts_iter->second;
760 table_name = tn_iter->second;
766 entry =
format(table_entry_format,
769 (unsigned)table_data.range_count,
770 (
Llu)table_data.cell_count,
771 (
Llu)table_data.file_count,
772 (
Llu)table_data.disk_used,
773 (
Llu)table_data.memory_used,
774 table_data.average_key_size,
775 table_data.average_value_size,
776 table_data.compression_ratio);
778 str +=
String(
",\n ") + entry;
780 str +=
String(
" ") + entry;
784 str += table_json_footer;
796 String s_table_id(table_id);
797 String s_table_name(table_name);
798 boost::trim_if(s_table_name, boost::is_any_of(
"/"));
810 String cmd =
"env LD_LIBRARY_PATH= DYLD_LIBRARY_PATH= rrdtool";
812 for (
auto &s : command) {
818 HT_DEBUGF(
"run_rrdtool: %s", cmd.c_str());
820 int ret = ::system(cmd.c_str());
822 HT_WARNF(
"Monitor: failed to invoke `rrdtool`; make sure it's properly "
823 "installed and in your $PATH (command returned status %d)", ret);
uint64_t memory_allocated
String cluster_name
Name of cluster.
void invalidate_id_mapping(const String &table_id)
void create_rangeserver_rrd(const String &filename)
#define HT_WARNF(msg,...)
void add_server(const String &location, const StatsSystem &system_info)
TableNameMap m_table_name_map
void dump_rangeserver_summary_json(std::vector< RangeServerStatistics > &stats)
std::shared_ptr< RangeServerConnection > RangeServerConnectionPtr
std::string String
A String is simply a typedef to std::string.
Compatibility class for boost::filesystem::path.
RangeServerMap m_server_map
String format(const char *fmt,...)
Returns a String using printf like format facilities Vanilla snprintf is about 1.5x faster than this...
void change_id_mapping(const String &table_id, const String &table_name)
uint64_t shadow_cache_memory
long long unsigned int Llu
Shortcut for printf formats.
Po::typed_value< String > * str(String *v=0)
TableStatMap m_table_stat_map
static ssize_t write(const String &fname, const std::string &contents)
Writes a String buffer to a file; the file is overwritten if it already exists.
static bool exists(const String &fname)
Checks if a file or directory exists.
SystemStatePtr system_state
System state entity.
static bool mkdirs(const String &dirname)
Creates a directory (with all parent directories, if required)
TableStatMap m_prev_table_stat_map
NameIdMapperPtr m_namemap_ptr
void md5_update(md5_context *ctx, const unsigned char *input, int ilen)
Adds data to the MD5 process buffer.
void md5_starts(md5_context *ctx)
Initialize and setup a MD5 context structure.
Compatibility class for boost::filesystem::path.
std::set< const char *, LtCstr > CstrSet
STL Set managing c-style strings.
PropertiesPtr props
Configuration properties.
File system utility functions.
const char * get_text(int error)
Returns a descriptive error message.
void add(std::vector< RangeServerStatistics > &stats)
std::shared_ptr< Properties > PropertiesPtr
void update_table_rrd(const String &filename, struct table_rrd_data &rrd_data)
Logging routines and macros.
uint64_t bloom_filter_maybes
Compatibility Macros for C/C++.
int32_t m_last_server_count
void dump_table_summary_json()
double average_value_size
Monitoring(Context *context)
Constructor.
void compute_clock_skew(int64_t server_timestamp, RangeServerStatistics *stats)
void update_rangeserver_rrd(const String &filename, struct rangeserver_rrd_data &rrd_data)
MD5 context structure; this structure is used to store the internal state of the md5 algorithm...
Collects, serializes and deserializes system-wide statistics.
#define HT_DEBUGF(msg,...)
void create_table_rrd(const String &filename)
uint64_t table_stats_timestamp
long long int Lld
Shortcut for printf formats.
uint64_t block_index_memory
void drop_server(const String &location)
void dump_master_summary_json()
#define HT_INFOF(msg,...)
void md5_finish(md5_context *ctx, unsigned char output[16])
Retrieve the final MD5 digest.
unsigned char m_last_server_set_digest[16]
Execution context for the Master.
uint64_t bloom_filter_memory
String m_monitoring_table_dir
#define HT_ERRORF(msg,...)
void run_rrdtool(std::vector< String > &command)
int32_t m_monitoring_interval
static bool rename(const String &oldpath, const String &newpath)
Renames a file or directory.
void create_dir(const String &dir)
void add_table_stats(std::vector< StatsTable > &table_stats, int64_t fetch_timestamp)
Error codes, Exception handling, error logging.
#define HT_THROW(_code_, _msg_)
const char * version_string()
Declarations for Context.
String m_monitoring_rs_dir
RangeServerConnectionManagerPtr rsc_manager
const char * code_to_string(int var_code)
Converts variable code to variable string.
uint64_t bloom_filter_accesses