tools/ctdb: add PartiallyOnline state for "ctdb status" and "ctdb status -Y"
authorStefan Metzmacher <metze@samba.org>
Mon, 21 Dec 2009 12:30:45 +0000 (13:30 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 20 Jan 2010 10:11:00 +0000 (11:11 +0100)
This is based on the GET_IFACES control against each node.

metze

tools/ctdb.c

index 0aac3946e8596e451345a48099146ef1d2619f00..00bef821858d246d57a7161f9140466b2b0277ad 100644 (file)
@@ -502,19 +502,40 @@ static int control_status(struct ctdb_context *ctdb, int argc, const char **argv
        }
 
        if(options.machinereadable){
-               printf(":Node:IP:Disconnected:Banned:Disabled:Unhealthy:Stopped:Inactive:\n");
+               printf(":Node:IP:Disconnected:Banned:Disabled:Unhealthy:Stopped:Inactive:PartiallyOnline:\n");
                for(i=0;i<nodemap->num;i++){
+                       int partially_online = 0;
+                       int j;
+
                        if (nodemap->nodes[i].flags & NODE_FLAGS_DELETED) {
                                continue;
                        }
-                       printf(":%d:%s:%d:%d:%d:%d:%d:%d:\n", nodemap->nodes[i].pnn,
+                       if (nodemap->nodes[i].flags == 0) {
+                               struct ctdb_control_get_ifaces *ifaces;
+
+                               ret = ctdb_ctrl_get_ifaces(ctdb, TIMELIMIT(),
+                                                          nodemap->nodes[i].pnn,
+                                                          ctdb, &ifaces);
+                               if (ret == 0) {
+                                       for (j=0; j < ifaces->num; j++) {
+                                               if (ifaces->ifaces[j].link_state != 0) {
+                                                       continue;
+                                               }
+                                               partially_online = 1;
+                                               break;
+                                       }
+                                       talloc_free(ifaces);
+                               }
+                       }
+                       printf(":%d:%s:%d:%d:%d:%d:%d:%d:%d:\n", nodemap->nodes[i].pnn,
                                ctdb_addr_to_str(&nodemap->nodes[i].addr),
                               !!(nodemap->nodes[i].flags&NODE_FLAGS_DISCONNECTED),
                               !!(nodemap->nodes[i].flags&NODE_FLAGS_BANNED),
                               !!(nodemap->nodes[i].flags&NODE_FLAGS_PERMANENTLY_DISABLED),
                               !!(nodemap->nodes[i].flags&NODE_FLAGS_UNHEALTHY),
                               !!(nodemap->nodes[i].flags&NODE_FLAGS_STOPPED),
-                              !!(nodemap->nodes[i].flags&NODE_FLAGS_INACTIVE));
+                              !!(nodemap->nodes[i].flags&NODE_FLAGS_INACTIVE),
+                              partially_online);
                }
                return 0;
        }
@@ -539,6 +560,23 @@ static int control_status(struct ctdb_context *ctdb, int argc, const char **argv
                if (nodemap->nodes[i].flags & NODE_FLAGS_DELETED) {
                        continue;
                }
+               if (nodemap->nodes[i].flags == 0) {
+                       struct ctdb_control_get_ifaces *ifaces;
+
+                       ret = ctdb_ctrl_get_ifaces(ctdb, TIMELIMIT(),
+                                                  nodemap->nodes[i].pnn,
+                                                  ctdb, &ifaces);
+                       if (ret == 0) {
+                               for (j=0; j < ifaces->num; j++) {
+                                       if (ifaces->ifaces[j].link_state != 0) {
+                                               continue;
+                                       }
+                                       flags_str = talloc_strdup(ctdb, "PARTIALLYONLINE");
+                                       break;
+                               }
+                               talloc_free(ifaces);
+                       }
+               }
                for (j=0;j<ARRAY_SIZE(flag_names);j++) {
                        if (nodemap->nodes[i].flags & flag_names[j].flag) {
                                if (flags_str == NULL) {