2
Copyright (c) 2014 Red Hat, Inc. <http://www.redhat.com>
3
This file is part of GlusterFS.
5
This file is licensed to you under your choice of the GNU Lesser
6
General Public License, version 3 or any later version (LGPLv3 or
7
later), or the GNU General Public License, version 2 (GPLv2), in all
8
cases as published by the Free Software Foundation.
11
#include <glusterfs/statedump.h>
13
#include "glusterd-shd-svc.h"
14
#include "glusterd-quotad-svc.h"
15
#include "glusterd-locks.h"
16
#include "glusterd-messages.h"
18
#define GLUSTERD_DUMP_PEERS(head, member, xpeers) \
20
glusterd_peerinfo_t *_peerinfo = NULL; \
24
key = xpeers ? "glusterd.xaction_peer" : "glusterd.peer"; \
27
cds_list_for_each_entry_rcu(_peerinfo, head, member) \
29
glusterd_dump_peer(_peerinfo, key, index, xpeers); \
31
glusterd_dump_peer_rpcstat(_peerinfo, key, index); \
39
glusterd_dump_peer(glusterd_peerinfo_t *peerinfo, char *input_key, int index,
42
char subkey[GF_DUMP_MAX_BUF_LEN + 11] = "";
43
char key[GF_DUMP_MAX_BUF_LEN] = "";
45
strncpy(key, input_key, sizeof(key) - 1);
47
snprintf(subkey, sizeof(subkey), "%s%d", key, index);
49
gf_proc_dump_build_key(key, subkey, "uuid");
50
gf_proc_dump_write(key, "%s", uuid_utoa(peerinfo->uuid));
52
gf_proc_dump_build_key(key, subkey, "hostname");
53
gf_proc_dump_write(key, "%s", peerinfo->hostname);
55
gf_proc_dump_build_key(key, subkey, "port");
56
gf_proc_dump_write(key, "%d", peerinfo->port);
58
gf_proc_dump_build_key(key, subkey, "state");
59
gf_proc_dump_write(key, "%d", peerinfo->state);
61
gf_proc_dump_build_key(key, subkey, "quorum-action");
62
gf_proc_dump_write(key, "%d", peerinfo->quorum_action);
64
gf_proc_dump_build_key(key, subkey, "quorum-contrib");
65
gf_proc_dump_write(key, "%d", peerinfo->quorum_contrib);
67
gf_proc_dump_build_key(key, subkey, "detaching");
68
gf_proc_dump_write(key, "%d", peerinfo->detaching);
70
gf_proc_dump_build_key(key, subkey, "locked");
71
gf_proc_dump_write(key, "%d", peerinfo->locked);
75
glusterd_dump_peer_rpcstat(glusterd_peerinfo_t *peerinfo, char *input_key,
78
rpc_clnt_connection_t *conn = NULL;
80
rpc_clnt_t *rpc = NULL;
81
char rpcsvc_peername[RPCSVC_PEER_STRLEN] = "";
82
char subkey[GF_DUMP_MAX_BUF_LEN + 11] = "";
83
char key[GF_DUMP_MAX_BUF_LEN] = "";
85
strncpy(key, input_key, sizeof(key) - 1);
87
/* Dump the rpc connection statistics */
91
snprintf(subkey, sizeof(subkey), "%s%d", key, index);
92
ret = rpcsvc_transport_peername(conn->trans, (char *)&rpcsvc_peername,
93
sizeof(rpcsvc_peername));
95
gf_proc_dump_build_key(key, subkey, "rpc.peername");
96
gf_proc_dump_write(key, "%s", rpcsvc_peername);
98
gf_proc_dump_build_key(key, subkey, "rpc.connected");
99
gf_proc_dump_write(key, "%d", (conn->status == RPC_STATUS_CONNECTED));
101
gf_proc_dump_build_key(key, subkey, "rpc.total-bytes-read");
102
gf_proc_dump_write(key, "%" PRIu64, conn->trans->total_bytes_read);
104
gf_proc_dump_build_key(key, subkey, "rpc.total-bytes-written");
105
gf_proc_dump_write(key, "%" PRIu64, conn->trans->total_bytes_write);
107
gf_proc_dump_build_key(key, subkey, "rpc.ping_msgs_sent");
108
gf_proc_dump_write(key, "%" PRIu64, conn->pingcnt);
110
gf_proc_dump_build_key(key, subkey, "rpc.msgs_sent");
111
gf_proc_dump_write(key, "%" PRIu64, conn->msgcnt);
116
glusterd_dump_client_details(glusterd_conf_t *conf)
118
rpc_transport_t *xprt = NULL;
119
char key[GF_DUMP_MAX_BUF_LEN] = "";
120
char subkey[50] = "";
123
pthread_mutex_lock(&conf->xprt_lock);
125
list_for_each_entry(xprt, &conf->xprt_list, list)
127
snprintf(subkey, sizeof(subkey), "glusterd.client%d", index);
129
gf_proc_dump_build_key(key, subkey, "identifier");
130
gf_proc_dump_write(key, "%s", xprt->peerinfo.identifier);
132
gf_proc_dump_build_key(key, subkey, "volname");
133
gf_proc_dump_write(key, "%s", xprt->peerinfo.volname);
135
gf_proc_dump_build_key(key, subkey, "max-op-version");
136
gf_proc_dump_write(key, "%u", xprt->peerinfo.max_op_version);
138
gf_proc_dump_build_key(key, subkey, "min-op-version");
139
gf_proc_dump_write(key, "%u", xprt->peerinfo.min_op_version);
143
pthread_mutex_unlock(&conf->xprt_lock);
146
/* The following function is just for dumping mgmt_v3_lock dictionary, any other
147
* dict passed to this API will not work */
150
glusterd_dict_mgmt_v3_lock_statedump(dict_t *dict)
154
data_pair_t *trav = NULL;
155
char key[GF_DUMP_MAX_BUF_LEN] = "";
156
char dump[64 * 1024] = "";
159
gf_msg_callingfn("glusterd", GF_LOG_WARNING, EINVAL, GD_MSG_DICT_EMPTY,
163
for (trav = dict->members_list; trav; trav = trav->next) {
164
if (strstr(trav->key, "debug.last-success-bt") != NULL) {
165
ret = snprintf(&dump[dumplen], sizeof(dump) - dumplen, "\n\t%s:%s",
166
trav->key, trav->value->data);
169
&dump[dumplen], sizeof(dump) - dumplen, "\n\t%s:%s", trav->key,
170
uuid_utoa(((glusterd_mgmt_v3_lock_obj *)(trav->value->data))
173
if ((ret == -1) || !ret)
179
gf_proc_dump_build_key(key, "glusterd", "mgmt_v3_lock");
180
gf_proc_dump_write(key, "%s", dump);
188
glusterd_dump_priv(xlator_t *this)
190
glusterd_conf_t *priv = NULL;
191
struct pmap_registry *pmap = NULL;
192
struct pmap_ports *tmp_port = NULL;
193
char key[GF_DUMP_MAX_BUF_LEN] = "";
195
priv = this->private;
201
gf_proc_dump_build_key(key, "xlator.glusterd", "priv");
202
gf_proc_dump_add_section("%s", key);
204
pthread_mutex_lock(&priv->mutex);
206
gf_proc_dump_build_key(key, "glusterd", "my-uuid");
207
gf_proc_dump_write(key, "%s", uuid_utoa(priv->uuid));
209
gf_proc_dump_build_key(key, "glusterd", "working-directory");
210
gf_proc_dump_write(key, "%s", priv->workdir);
212
gf_proc_dump_build_key(key, "glusterd", "max-op-version");
213
gf_proc_dump_write(key, "%d", GD_OP_VERSION_MAX);
215
gf_proc_dump_build_key(key, "glusterd", "min-op-version");
216
gf_proc_dump_write(key, "%d", GD_OP_VERSION_MIN);
218
gf_proc_dump_build_key(key, "glusterd", "current-op-version");
219
gf_proc_dump_write(key, "%d", priv->op_version);
221
gf_proc_dump_build_key(key, "glusterd", "ping-timeout");
222
gf_proc_dump_write(key, "%ld", priv->ping_timeout);
224
gf_proc_dump_build_key(key, "glusterd", "nfs.online");
225
gf_proc_dump_write(key, "%d", priv->nfs_svc.online);
227
gf_proc_dump_build_key(key, "glusterd", "quotad.online");
228
gf_proc_dump_write(key, "%d", priv->quotad_svc.online);
230
gf_proc_dump_build_key(key, "glusterd", "bitd.online");
231
gf_proc_dump_write(key, "%d", priv->bitd_svc.online);
233
gf_proc_dump_build_key(key, "glusterd", "scrub.online");
234
gf_proc_dump_write(key, "%d", priv->scrub_svc.online);
236
/* Dump peer details */
237
GLUSTERD_DUMP_PEERS(&priv->peers, uuid_list, _gf_false);
240
/* Dump brick name and port associated with it */
241
cds_list_for_each_entry(tmp_port, &pmap->ports, port_list)
243
gf_proc_dump_build_key(key, "glusterd", "brick_port");
244
gf_proc_dump_write(key, "%d", tmp_port->port);
245
gf_proc_dump_build_key(key, "glusterd", "brickname");
246
gf_proc_dump_write(key, "%s", tmp_port->brickname);
250
/* Dump client details */
251
glusterd_dump_client_details(priv);
253
/* Dump mgmt_v3_lock from the dictionary if any */
254
glusterd_dict_mgmt_v3_lock_statedump(priv->mgmt_v3_lock);
255
dict_dump_to_statedump(priv->opts, "options", "glusterd");
257
pthread_mutex_unlock(&priv->mutex);