1/*
2 * thr_info.h
3 *
4 * Copyright (C) 2008-2014 Aerospike, Inc.
5 *
6 * Portions may be licensed to Aerospike, Inc. under one or more contributor
7 * license agreements.
8 *
9 * This program is free software: you can redistribute it and/or modify it under
10 * the terms of the GNU Affero General Public License as published by the Free
11 * Software Foundation, either version 3 of the License, or (at your option) any
12 * later version.
13 *
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
17 * details.
18 *
19 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see http://www.gnu.org/licenses/
21 */
22
23#pragma once
24
25#include <stdbool.h>
26#include <stddef.h>
27#include <stdint.h>
28
29#include "dynbuf.h"
30
31#include "base/proto.h"
32#include "base/security.h"
33#include "base/transaction.h"
34
35#define MAX_INFO_THREADS 256
36
37typedef int (*as_info_get_tree_fn) (char *name, char *subtree, cf_dyn_buf *db);
38typedef int (*as_info_get_value_fn) (char *name, cf_dyn_buf *db);
39typedef int (*as_info_command_fn) (char *name, char *parameters, cf_dyn_buf *db);
40
41// Sets a static value - set to 0 to remove a previous value.
42extern int as_info_set_buf(const char *name, const uint8_t *value, size_t value_sz, bool def);
43extern int as_info_set(const char *name, const char *value, bool def);
44
45// For dynamic items - you will get called when the name is requested. The
46// dynbuf will be fully set up for you - just add the information you want to
47// return.
48extern int as_info_set_dynamic(const char *name, as_info_get_value_fn gv_fn, bool def);
49
50// For tree items - you will get called when the name is requested, and it will
51// have the name you registered (name) and the subtree portion (value). The
52// dynbuf will be fully set up for you - just add the information you want to
53// return
54extern int as_info_set_tree(char *name, as_info_get_tree_fn gv_fn);
55
56// For commands - you will be called with the parameters.
57extern int as_info_set_command(const char *name, as_info_command_fn command_fn, as_sec_perm required_perm);
58
59int as_info_parameter_get(char *param_str, char *param, char *value, int *value_len);
60
61typedef struct as_info_transaction_s {
62 as_file_handle *fd_h;
63 as_proto *proto;
64 uint64_t start_time;
65} as_info_transaction;
66
67// Processes an info request that comes in from the network, sends the response.
68extern void as_info(as_info_transaction *it);
69
70// Processes a pure puffer request without any info header stuff.
71extern int as_info_buffer(uint8_t *req_buf, size_t req_buf_len, cf_dyn_buf *rsp);
72
73// The info unit uses the fabric to communicate with the other members of the
74// cluster so it needs to register for different messages and create listener
75// threads, etc.
76extern int as_info_init();
77
78// Needed by heartbeat:
79
80char *as_info_bind_to_string(const cf_serv_cfg *cfg, cf_sock_owner owner);
81
82// Needed by ticker:
83
84int as_info_queue_get_size();
85void info_log_with_datestamp(void (*log_fn)(void));
86uint32_t process_cpu(void);
87void sys_cpu_info(uint32_t* user_pct, uint32_t* kernel_pct);
88void sys_mem_info(uint64_t *free_mem, uint32_t *free_pct);
89
90extern bool g_mstats_enabled;
91
92// Needed by main():
93extern uint64_t g_start_sec;
94