]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
added status all and debug all control operations
authorAndrew Tridgell <tridge@samba.org>
Sat, 28 Apr 2007 15:13:30 +0000 (17:13 +0200)
committerAndrew Tridgell <tridge@samba.org>
Sat, 28 Apr 2007 15:13:30 +0000 (17:13 +0200)
(This used to be ctdb commit 7f902f6c4270adc0543096c78415d335b88d6232)

ctdb/common/ctdb_call.c
ctdb/include/ctdb_private.h
ctdb/tools/ctdb_control.c

index 18172996ca2513a437eb71bffba89dc043c41a4b..cfbea14863d1e36b2fab603463be9816df8fb9ca 100644 (file)
@@ -729,12 +729,14 @@ struct ctdb_call_state *ctdb_daemon_call_send_remote(struct ctdb_db_context *ctd
                                           struct ctdb_req_call);
        CTDB_NO_MEMORY_NULL(ctdb, state->c);
        state->c->hdr.destnode  = header->dmaster;
-       /*
-          always sending the remote call straight to the lmaster
+
+#if 0
+       /*always sending the remote call straight to the lmaster
           improved performance slightly in some tests.
           worth investigating further in the future
-       state->c->hdr.destnode  = ctdb_lmaster(ctdb_db->ctdb, &(call->key));
        */
+       state->c->hdr.destnode  = ctdb_lmaster(ctdb_db->ctdb, &(call->key));
+#endif
 
 
        /* this limits us to 16k outstanding messages - not unreasonable */
index fa8d3debf469c4c2a597bb88523e5d49ac99092d..e2cc6bfe697c5d12f352c50ba21e0fab489d7e00 100644 (file)
@@ -157,6 +157,7 @@ struct ctdb_status {
        uint32_t pending_calls;
        uint32_t lockwait_calls;
        uint32_t pending_lockwait_calls;
+       uint32_t __last_uint32; /* hack for control_status_all */
        uint32_t max_redirect_count;
        double max_call_latency;
        double max_lockwait_latency;
index 41f6c4c774f50140054825dd54022a155d54ff2d..7809f1406fb851f03fb99c4bbcd4551af623fbe1 100644 (file)
@@ -35,8 +35,8 @@ static void usage(void)
        printf("\nControls:\n");
        printf("  ping\n");
        printf("  process-exists <vnn:pid>           see if a process exists\n");
-       printf("  status <vnn>                       show ctdb status on a node\n");
-       printf("  debug <vnn> <level>                set ctdb debug level on a node\n");
+       printf("  status <vnn|all>                   show ctdb status on a node\n");
+       printf("  debug <vnn|all> <level>            set ctdb debug level on a node\n");
        printf("  debuglevel                         display ctdb debug levels\n");
        printf("  getvnnmap <vnn>                    display ctdb vnnmap\n");
        printf("  setvnnmap <vnn> <generation> <numslots> <lmaster>*\n");
@@ -105,6 +105,41 @@ static void show_status(struct ctdb_status *s)
        printf(" max_lockwait_latency    %.6f sec\n", s->max_lockwait_latency);
 }
 
+/*
+  display remote ctdb status combined from all nodes
+ */
+static int control_status_all(struct ctdb_context *ctdb)
+{
+       int ret, i;
+       struct ctdb_status status;
+       ZERO_STRUCT(status);
+
+       for (i=0;i<ctdb->num_nodes;i++) {
+               struct ctdb_status s1;
+               int j;
+               uint32_t *v1 = (uint32_t *)&s1;
+               uint32_t *v2 = (uint32_t *)&status;
+               uint32_t num_ints = 
+                       offsetof(struct ctdb_status, __last_uint32) / sizeof(uint32_t);
+               ret = ctdb_status(ctdb, i, &s1);
+               if (ret != 0) {
+                       printf("Unable to get status from node %u\n", i);
+                       return ret;
+               }
+               for (j=0;j<num_ints;j++) {
+                       v2[j] += v1[j];
+               }
+               status.max_redirect_count = 
+                       MAX(status.max_redirect_count, s1.max_redirect_count);
+               status.max_call_latency = 
+                       MAX(status.max_call_latency, s1.max_call_latency);
+               status.max_lockwait_latency = 
+                       MAX(status.max_lockwait_latency, s1.max_lockwait_latency);
+       }
+       show_status(&status);
+       return 0;
+}
+
 /*
   display remote ctdb status
  */
@@ -117,6 +152,10 @@ static int control_status(struct ctdb_context *ctdb, int argc, const char **argv
                usage();
        }
 
+       if (strcmp(argv[0], "all") == 0) {
+               return control_status_all(ctdb);
+       }
+
        vnn = strtoul(argv[0], NULL, 0);
 
        ret = ctdb_status(ctdb, vnn, &status);
@@ -297,19 +336,31 @@ static int control_debuglevel(struct ctdb_context *ctdb, int argc, const char **
 static int control_debug(struct ctdb_context *ctdb, int argc, const char **argv)
 {
        int ret;
-       uint32_t vnn, level;
+       uint32_t vnn, level, i;
 
        if (argc < 2) {
                usage();
        }
 
-       vnn   = strtoul(argv[0], NULL, 0);
        level = strtoul(argv[1], NULL, 0);
 
+       if (strcmp(argv[0], "all") == 0) {
+               for (i=0;i<ctdb->num_nodes;i++) {
+                       ret = ctdb_set_debuglevel(ctdb, i, level);
+                       if (ret != 0) {
+                               printf("Unable to set debug level on node %u\n", i);
+                               break;
+                       }
+               }
+               return 0;
+       }
+
+       vnn = strtoul(argv[0], NULL, 0);
        ret = ctdb_set_debuglevel(ctdb, vnn, level);
        if (ret != 0) {
                printf("Unable to set debug level on node %u\n", vnn);
        }
+
        return 0;
 }