break;
}
- ctdb->status.count.req_call++;
+ ctdb->status.node.req_call++;
ctdb_request_call(ctdb, hdr);
break;
case CTDB_REPLY_CALL:
- ctdb->status.count.reply_call++;
+ ctdb->status.node.reply_call++;
ctdb_reply_call(ctdb, hdr);
break;
case CTDB_REPLY_ERROR:
- ctdb->status.count.reply_error++;
+ ctdb->status.node.reply_error++;
ctdb_reply_error(ctdb, hdr);
break;
break;
}
- ctdb->status.count.req_dmaster++;
+ ctdb->status.node.req_dmaster++;
ctdb_request_dmaster(ctdb, hdr);
break;
break;
}
- ctdb->status.count.reply_dmaster++;
+ ctdb->status.node.reply_dmaster++;
ctdb_reply_dmaster(ctdb, hdr);
break;
case CTDB_REQ_MESSAGE:
- ctdb->status.count.req_message++;
+ ctdb->status.node.req_message++;
ctdb_request_message(ctdb, hdr);
break;
case CTDB_REQ_FINISHED:
- ctdb->status.count.req_finished++;
+ ctdb->status.node.req_finished++;
ctdb_request_finished(ctdb, hdr);
break;
case CTDB_REQ_CONTROL:
- ctdb->status.count.req_control++;
+ ctdb->status.node.req_control++;
ctdb_request_control(ctdb, hdr);
break;
case CTDB_REPLY_CONTROL:
- ctdb->status.count.reply_control++;
+ ctdb->status.node.reply_control++;
ctdb_reply_control(ctdb, hdr);
break;
{
switch (opcode) {
case CTDB_CONTROL_PROCESS_EXISTS: {
- pid_t pid;
- int32_t ret;
- CHECK_CONTROL_DATA_SIZE(sizeof(pid));
- pid = *(pid_t *)indata.dptr;
- ret = kill(pid, 0);
- DEBUG(5,("process_exists on %u:%u gave %d\n",
- ctdb->vnn, pid, ret));
- return ret;
+ CHECK_CONTROL_DATA_SIZE(sizeof(pid_t));
+ ctdb->status.controls.process_exists++;
+ return kill(*(pid_t *)indata.dptr, 0);
}
case CTDB_CONTROL_SET_DEBUG: {
case CTDB_CONTROL_STATUS: {
CHECK_CONTROL_DATA_SIZE(0);
+ ctdb->status.controls.status++;
outdata->dptr = (uint8_t *)&ctdb->status;
outdata->dsize = sizeof(ctdb->status);
return 0;
case CTDB_CONTROL_CONFIG: {
CHECK_CONTROL_DATA_SIZE(0);
+ ctdb->status.controls.get_config++;
outdata->dptr = (uint8_t *)ctdb;
outdata->dsize = sizeof(*ctdb);
return 0;
case CTDB_CONTROL_PING:
CHECK_CONTROL_DATA_SIZE(0);
+ ctdb->status.controls.ping++;
return ctdb->num_clients;
case CTDB_CONTROL_GET_DBNAME: {
}
case CTDB_CONTROL_DB_ATTACH:
+ ctdb->status.controls.attach++;
return ctdb_control_db_attach(ctdb, indata, outdata);
case CTDB_CONTROL_SET_CALL: {
struct ctdb_control_set_call *sc =
(struct ctdb_control_set_call *)indata.dptr;
+ ctdb->status.controls.set_call++;
CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_control_set_call));
return ctdb_daemon_set_call(ctdb, sc->db_id, sc->fn, sc->id);
}
case CTDB_CONTROL_TRAVERSE_START:
CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_traverse_start));
+ ctdb->status.controls.traverse_start++;
return ctdb_control_traverse_start(ctdb, indata, outdata, srcnode);
case CTDB_CONTROL_TRAVERSE_ALL:
+ ctdb->status.controls.traverse_all++;
return ctdb_control_traverse_all(ctdb, indata, outdata);
case CTDB_CONTROL_TRAVERSE_DATA:
+ ctdb->status.controls.traverse_data++;
return ctdb_control_traverse_data(ctdb, indata, outdata);
case CTDB_CONTROL_REGISTER_SRVID:
+ ctdb->status.controls.register_srvid++;
return daemon_register_message_handler(ctdb, client_id, srvid);
case CTDB_CONTROL_DEREGISTER_SRVID:
+ ctdb->status.controls.deregister_srvid++;
return daemon_deregister_message_handler(ctdb, client_id, srvid);
case CTDB_CONTROL_ENABLE_SEQNUM:
+ ctdb->status.controls.enable_seqnum++;
CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
return ctdb_ltdb_enable_seqnum(ctdb, *(uint32_t *)indata.dptr);
case CTDB_CONTROL_UPDATE_SEQNUM:
+ ctdb->status.controls.update_seqnum++;
CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
return ctdb_ltdb_update_seqnum(ctdb, *(uint32_t *)indata.dptr, srcnode);
case CTDB_CONTROL_SET_SEQNUM_FREQUENCY:
+ ctdb->status.controls.set_seqnum_frequency++;
CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
return ctdb_ltdb_set_seqnum_frequency(ctdb, *(uint32_t *)indata.dptr);
*/
static void show_status(struct ctdb_status *s)
{
+ TALLOC_CTX *tmp_ctx = talloc_new(NULL);
+ int i;
+ const char *prefix=NULL;
+ size_t preflen=0;
+ const struct {
+ const char *name;
+ uint32_t offset;
+ } fields[] = {
+#define STATUS_FIELD(n) { #n, offsetof(struct ctdb_status, n) }
+ STATUS_FIELD(client_packets_sent),
+ STATUS_FIELD(client_packets_recv),
+ STATUS_FIELD(node_packets_sent),
+ STATUS_FIELD(node_packets_recv),
+ STATUS_FIELD(node.req_call),
+ STATUS_FIELD(node.reply_call),
+ STATUS_FIELD(node.req_dmaster),
+ STATUS_FIELD(node.reply_dmaster),
+ STATUS_FIELD(node.reply_error),
+ STATUS_FIELD(node.req_message),
+ STATUS_FIELD(node.req_finished),
+ STATUS_FIELD(node.req_control),
+ STATUS_FIELD(node.reply_control),
+ STATUS_FIELD(client.req_call),
+ STATUS_FIELD(client.req_message),
+ STATUS_FIELD(client.req_finished),
+ STATUS_FIELD(client.req_connect_wait),
+ STATUS_FIELD(client.req_shutdown),
+ STATUS_FIELD(client.req_control),
+ STATUS_FIELD(controls.status),
+ STATUS_FIELD(controls.get_config),
+ STATUS_FIELD(controls.ping),
+ STATUS_FIELD(controls.attach),
+ STATUS_FIELD(controls.set_call),
+ STATUS_FIELD(controls.process_exists),
+ STATUS_FIELD(controls.traverse_start),
+ STATUS_FIELD(controls.traverse_all),
+ STATUS_FIELD(controls.traverse_data),
+ STATUS_FIELD(controls.update_seqnum),
+ STATUS_FIELD(controls.enable_seqnum),
+ STATUS_FIELD(controls.set_seqnum_frequency),
+ STATUS_FIELD(controls.register_srvid),
+ STATUS_FIELD(controls.deregister_srvid),
+ STATUS_FIELD(total_calls),
+ STATUS_FIELD(pending_calls),
+ STATUS_FIELD(lockwait_calls),
+ STATUS_FIELD(traverse_calls),
+ STATUS_FIELD(pending_lockwait_calls),
+ STATUS_FIELD(max_hop_count),
+ };
printf("CTDB version %u\n", CTDB_VERSION);
- printf(" client_packets_sent %u\n", s->client_packets_sent);
- printf(" client_packets_recv %u\n", s->client_packets_recv);
- printf(" req_call %u\n", s->client.req_call);
- printf(" req_message %u\n", s->client.req_message);
- printf(" req_finished %u\n", s->client.req_finished);
- printf(" req_connect_wait %u\n", s->client.req_connect_wait);
- printf(" req_shutdown %u\n", s->client.req_shutdown);
- printf(" req_control %u\n", s->client.req_control);
- printf(" node_packets_sent %u\n", s->node_packets_sent);
- printf(" node_packets_recv %u\n", s->node_packets_recv);
- printf(" req_call %u\n", s->count.req_call);
- printf(" reply_call %u\n", s->count.reply_call);
- printf(" req_dmaster %u\n", s->count.req_dmaster);
- printf(" reply_dmaster %u\n", s->count.reply_dmaster);
- printf(" reply_error %u\n", s->count.reply_error);
- printf(" req_message %u\n", s->count.req_message);
- printf(" req_finished %u\n", s->count.req_finished);
- printf(" total_calls %u\n", s->total_calls);
- printf(" pending_calls %u\n", s->pending_calls);
- printf(" lockwait_calls %u\n", s->lockwait_calls);
- printf(" traverse_calls %u\n", s->traverse_calls);
- printf(" pending_lockwait_calls %u\n", s->pending_lockwait_calls);
- printf(" max_hop_count %u\n", s->max_hop_count);
- printf(" max_call_latency %.6f sec\n", s->max_call_latency);
- printf(" max_lockwait_latency %.6f sec\n", s->max_lockwait_latency);
+ for (i=0;i<ARRAY_SIZE(fields);i++) {
+ if (strchr(fields[i].name, '.')) {
+ preflen = strcspn(fields[i].name, ".")+1;
+ if (!prefix || strncmp(prefix, fields[i].name, preflen) != 0) {
+ prefix = fields[i].name;
+ printf(" %*.*s\n", preflen-1, preflen-1, fields[i].name);
+ }
+ } else {
+ preflen = 0;
+ }
+ printf(" %*s%-22s%*s%10u\n",
+ preflen?4:0, "",
+ fields[i].name+preflen,
+ preflen?0:4, "",
+ *(uint32_t *)(fields[i].offset+(uint8_t *)s));
+ }
+ printf(" %-30s %.6f sec\n", "max_call_latency", s->max_call_latency);
+ printf(" %-30s %.6f sec\n", "max_lockwait_latency", s->max_lockwait_latency);
+ talloc_free(tmp_ctx);
}
/*