From mboxrd@z Thu Jan 1 00:00:00 1970 From: lhh@sourceware.org Date: 10 Mar 2007 00:20:58 -0000 Subject: [Cluster-devel] cluster/rgmanager include/res-ocf.h include/re ... Message-ID: <20070310002058.2480.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Changes by: lhh at sourceware.org 2007-03-10 00:20:55 Modified files: rgmanager/include: res-ocf.h resgroup.h reslist.h rgmanager/src/clulib: rg_strings.c rgmanager/src/daemons: groups.c restree.c rg_state.c rg_thread.c test.c rgmanager/src/resources: Makefile lvm.sh vm.sh rgmanager/src/utils: clusvcadm.c Log message: Strings cleanup. Enable vm.sh live migration. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/include/res-ocf.h.diff?cvsroot=cluster&r1=1.1&r2=1.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/include/resgroup.h.diff?cvsroot=cluster&r1=1.17&r2=1.18 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/include/reslist.h.diff?cvsroot=cluster&r1=1.16&r2=1.17 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/clulib/rg_strings.c.diff?cvsroot=cluster&r1=1.6&r2=1.7 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/groups.c.diff?cvsroot=cluster&r1=1.27&r2=1.28 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/restree.c.diff?cvsroot=cluster&r1=1.25&r2=1.26 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/rg_state.c.diff?cvsroot=cluster&r1=1.28&r2=1.29 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/rg_thread.c.diff?cvsroot=cluster&r1=1.17&r2=1.18 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/test.c.diff?cvsroot=cluster&r1=1.7&r2=1.8 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/Makefile.diff?cvsroot=cluster&r1=1.16&r2=1.17 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/lvm.sh.diff?cvsroot=cluster&r1=1.2&r2=1.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/vm.sh.diff?cvsroot=cluster&r1=1.1&r2=1.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/utils/clusvcadm.c.diff?cvsroot=cluster&r1=1.16&r2=1.17 --- cluster/rgmanager/include/res-ocf.h 2004/08/13 15:36:50 1.1 +++ cluster/rgmanager/include/res-ocf.h 2007/03/10 00:20:54 1.2 @@ -45,4 +45,22 @@ #define OCF_RA_NOT_RUNNING 7 #define OCF_RA_MAX 7 +/* + Resource operations - not ocf-specified + */ +#define RS_START (0) +#define RS_STOP (1) +#define RS_STATUS (2) +#define RS_RESINFO (3) +#define RS_RESTART (4) +#define RS_RELOAD (5) +#define RS_CONDRESTART (6) +#define RS_RECOVER (7) +#define RS_CONDSTART (8) /** Start if flagged with RF_NEEDSTART */ +#define RS_CONDSTOP (9) /** STOP if flagged with RF_NEEDSTOP */ +#define RS_MONITOR (10) +#define RS_META_DATA (11) +#define RS_VALIDATE (12) +#define RS_MIGRATE (13) + #endif --- cluster/rgmanager/include/resgroup.h 2006/12/14 22:18:07 1.17 +++ cluster/rgmanager/include/resgroup.h 2007/03/10 00:20:54 1.18 @@ -81,9 +81,7 @@ #define RG_MIGRATE 22 #define RG_NONE 999 -extern const char *rg_req_strings[]; - -#define rg_req_str(req) (rg_req_strings[req]) +const char *rg_req_str(int req); int handle_relocate_req(char *svcName, int request, int preferred_target, int *new_owner); @@ -107,9 +105,8 @@ #define DEFAULT_CHECK_INTERVAL 10 -extern const char *rg_state_strings[]; - -#define rg_state_str(state) (rg_state_strings[state - RG_STATE_BASE]) +const char *rg_state_str(int val); +const char *agent_op_str(int val); int rg_status(const char *resgroupname); int group_op(char *rgname, int op); @@ -175,7 +172,7 @@ #define RG_YES 1 #define RG_NO 2 -char *rg_strerror(int val); +const char *rg_strerror(int val); /* --- cluster/rgmanager/include/reslist.h 2007/01/26 21:42:24 1.16 +++ cluster/rgmanager/include/reslist.h 2007/03/10 00:20:54 1.17 @@ -40,25 +40,6 @@ #define RES_STARTED (1) #define RES_FAILED (2) -/* - Resource operations - */ -#define RS_START (0) -#define RS_STOP (1) -#define RS_STATUS (2) -#define RS_RESINFO (3) -#define RS_RESTART (4) -#define RS_RELOAD (5) -#define RS_CONDRESTART (6) -#define RS_RECOVER (7) -#define RS_CONDSTART (8) /** Start if flagged with RF_NEEDSTART */ -#define RS_CONDSTOP (9) /** STOP if flagged with RF_NEEDSTOP */ -#define RS_MONITOR (10) -#define RS_META_DATA (11) -#define RS_VALIDATE (12) -#define RS_MIGRATE (13) - - #ifndef SHAREDIR #define SHAREDIR "/usr/share/rgmanager" #endif --- cluster/rgmanager/src/clulib/rg_strings.c 2006/12/14 22:18:07 1.6 +++ cluster/rgmanager/src/clulib/rg_strings.c 2007/03/10 00:20:54 1.7 @@ -16,9 +16,16 @@ Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include -struct { int val; char *str; } rg_error_strings[] = { +struct string_val { + int val; + char *str; +}; + + +const struct string_val rg_error_strings[] = { { RG_ERUN, "Service is already running" }, { RG_EQUORUM, "Operation requires quorum" }, { RG_EINVAL, "Invalid operation for resource" }, @@ -36,53 +43,107 @@ }; -char *rg_strerror(int err) +const struct string_val rg_req_strings[] = { + {RG_SUCCESS, "success" }, + {RG_FAIL, "fail"}, + {RG_START, "start"}, + {RG_STOP, "stop"}, + {RG_STATUS, "status"}, + {RG_DISABLE, "disable"}, + {RG_STOP_RECOVER, "stop (recovery)"}, + {RG_START_RECOVER, "start (recovery)"}, + {RG_RESTART, "restart"}, + {RG_EXITING, "exiting"}, + {RG_INIT, "initialize"}, + {RG_ENABLE, "enable"}, + {RG_STATUS_NODE, "status inquiry"}, + {RG_RELOCATE, "relocate"}, + {RG_CONDSTOP, "conditional stop"}, + {RG_CONDSTART, "conditional start"}, + {RG_START_REMOTE,"remote start"}, + {RG_STOP_USER, "user stop"}, + {RG_STOP_EXITING, "stop (shutdown)"}, + {RG_LOCK, "locking"}, + {RG_UNLOCK, "unlocking"}, + {RG_QUERY_LOCK, "lock status inquiry"}, + {RG_MIGRATE, "migrate"}, + {RG_NONE, "none"}, + {0, NULL} +}; + + +const struct string_val rg_state_strings[] = { + {RG_STATE_STOPPED, "stopped"}, + {RG_STATE_STARTING, "starting"}, + {RG_STATE_STARTED, "started"}, + {RG_STATE_STOPPING, "stopping"}, + {RG_STATE_FAILED, "failed"}, + {RG_STATE_UNINITIALIZED, "uninitialized"}, + {RG_STATE_CHECK, "checking"}, + {RG_STATE_ERROR, "recoverable"}, + {RG_STATE_RECOVER, "recovering"}, + {RG_STATE_DISABLED, "disabled"}, + {RG_STATE_MIGRATE, "migrating"}, + {0, NULL} +}; + + +const struct string_val agent_ops[] = { + {RS_START, "start"}, + {RS_STOP, "stop"}, + {RS_STATUS, "status"}, + {RS_RESINFO, "resinfo"}, + {RS_RESTART, "restart"}, + {RS_RELOAD, "reload"}, + {RS_CONDRESTART, "condrestart"}, /* Unused */ + {RS_RECOVER, "recover"}, + {RS_CONDSTART, "condstart"}, + {RS_CONDSTOP, "condstop"}, + {RS_MONITOR, "monitor"}, + {RS_META_DATA, "meta-data"}, /* printenv */ + {RS_VALIDATE, "validate-all"}, + {RS_MIGRATE, "migrate"}, + {0 , NULL} +}; + + +static inline const char * +rg_search_table(const struct string_val *table, int val) { int x; - for (x = 0; rg_error_strings[x].str != NULL; x++) { - if (rg_error_strings[x].val == err) { - return rg_error_strings[x].str; + for (x = 0; table[x].str != NULL; x++) { + if (table[x].val == val) { + return table[x].str; } } return "Unknown"; } + + +const char * +rg_strerror(int val) +{ + return rg_search_table(rg_error_strings, val); +} +const char * +rg_state_str(int val) +{ + return rg_search_table(rg_state_strings, val); +} -const char *rg_state_strings[] = { - "stopped", - "starting", - "started", - "stopping", - "failed", - "uninitialized", - "checking", - "recoverable", - "recovering", - "disabled", - "" -}; -const char *rg_req_strings[] = { - "success", - "fail", - "start", - "stop", - "status", - "disable", - "stop (recovery)", - "start (recovery)", - "restart", - "exiting", - "initialize", - "enable", - "status inquiry", - "relocate", - "conditional stop", - "conditional start", - "remote start", - "user stop", - "" -}; +const char * +rg_req_str(int val) +{ + return rg_search_table(rg_req_strings, val); +} + +const char * +agent_op_str(int val) +{ + return rg_search_table(agent_ops, val); +} --- cluster/rgmanager/src/daemons/groups.c 2007/02/21 20:49:17 1.27 +++ cluster/rgmanager/src/daemons/groups.c 2007/03/10 00:20:54 1.28 @@ -36,7 +36,6 @@ #define cn_svccount cn_address.cna_address[0] /* Theses are uint8_t size */ #define cn_svcexcl cn_address.cna_address[1] -extern char *res_ops[]; static int config_version = 0; static resource_t *_resources = NULL; static resource_rule_t *_rules = NULL; @@ -734,9 +733,10 @@ int group_migrate(char *groupname, int target) { + resource_node_t *rn = NULL, *tmp; resource_t *res; char *tgt_name; - int ret = RG_ENOSERVICE; + int ret = RG_ENOSERVICE, x = 0; cluster_member_list_t *membership; membership = member_list(); @@ -746,15 +746,26 @@ pthread_rwlock_rdlock(&resource_lock); tgt_name = memb_id_to_name(membership, target); + if (!tgt_name) { + ret = RG_EINVAL; + goto out; + } + res = find_root_by_ref(&_resources, groupname); if (!res) goto out; - if (!tgt_name) { - ret = RG_EINVAL; + list_do(&_tree, tmp) { + if (tmp->rn_resource == res) { + rn = tmp; + break; + } + } while (!list_done(&_tree, tmp)); + + if (!rn) goto out; - } - ret = res_exec(res, res_ops[RG_MIGRATE], tgt_name); + + ret = res_exec(rn, agent_op_str(RS_MIGRATE), tgt_name); out: pthread_rwlock_unlock(&resource_lock); @@ -1009,7 +1020,8 @@ } if (svcblk.rs_owner != my_id() || - svcblk.rs_state != RG_STATE_STARTED) + (svcblk.rs_state != RG_STATE_STARTED && + svcblk.rs_state != RG_STATE_MIGRATE)) continue; rt_enqueue_request(rg, RG_STATUS, --- cluster/rgmanager/src/daemons/restree.c 2007/02/22 16:37:28 1.25 +++ cluster/rgmanager/src/daemons/restree.c 2007/03/10 00:20:54 1.26 @@ -60,23 +60,6 @@ time_t get_time(char *action, int depth, resource_node_t *node); -const char *res_ops[] = { - "start", - "stop", - "status", - "resinfo", - "restart", - "reload", - "condrestart", /* Unused */ - "recover", - "condstart", - "condstop", - "monitor", - "meta-data", /* printenv */ - "validate-all", - "migrate" -}; - const char *ocf_errors[] = { "success", // 0 @@ -97,14 +80,13 @@ const char * ocf_strerror(int ret) { - if (ret < OCF_RA_MAX) + if (ret >= 0 && ret < OCF_RA_MAX) return ocf_errors[ret]; return "unspecified"; } - /** Destroys an environment variable array. @@ -360,7 +342,7 @@ #endif #if 0 printf("Exec of script %s, action %s type %s\n", - res->r_rule->rr_agent, res_ops[op], + res->r_rule->rr_agent, agent_op_str(op), res->r_rule->rr_type); #endif @@ -705,7 +687,7 @@ #if 0 printf("%s children of %s type %s (level %d)\n", - res_ops[op], + agent_op_str(op), node->rn_resource->r_rule->rr_type, rule->rr_childtypes[x].rc_name, l); #endif @@ -748,7 +730,7 @@ /* printf("%s children of %s type %s (default level)\n", - res_ops[op], + agent_op_str(op), node->rn_resource->r_rule->rr_type, rule->rr_childtypes[x].rc_name); */ @@ -856,7 +838,7 @@ return 0; node->rn_actions[idx].ra_last = now; - if ((x = res_exec(node, res_ops[RS_STATUS], NULL, + if ((x = res_exec(node, agent_op_str(RS_STATUS), NULL, node->rn_actions[idx].ra_depth)) == 0) return 0; @@ -864,7 +846,7 @@ return x; /* Strange/failed status. Try to recover inline. */ - if ((x = res_exec(node, res_ops[RS_RECOVER], NULL, 0)) == 0) + if ((x = res_exec(node, agent_op_str(RS_RECOVER), NULL, 0)) == 0) return 0; return x; @@ -969,7 +951,7 @@ me = !first || (node->rn_resource == first); /* - printf("begin %s: %s %s [0x%x]\n", res_ops[op], + printf("begin %s: %s %s [0x%x]\n", agent_op_str(op), node->rn_resource->r_rule->rr_type, primary_attr_value(node->rn_resource), node->rn_flags); @@ -1014,7 +996,7 @@ if (me && (op == RS_START)) { node->rn_flags &= ~RF_NEEDSTART; - rv = res_exec(node, res_ops[op], NULL, 0); + rv = res_exec(node, agent_op_str(op), NULL, 0); if (rv != 0) { node->rn_state = RES_FAILED; return rv; @@ -1044,7 +1026,7 @@ /* Stop should occur after children have stopped */ if (me && (op == RS_STOP)) { node->rn_flags &= ~RF_NEEDSTOP; - rv = res_exec(node, res_ops[op], NULL, 0); + rv = res_exec(node, agent_op_str(op), NULL, 0); if (rv != 0) { node->rn_state = RES_FAILED; @@ -1058,7 +1040,7 @@ } /* - printf("end %s: %s %s\n", res_ops[op], + printf("end %s: %s %s\n", agent_op_str(op), node->rn_resource->r_rule->rr_type, primary_attr_value(node->rn_resource)); */ --- cluster/rgmanager/src/daemons/rg_state.c 2007/02/20 19:54:42 1.28 +++ cluster/rgmanager/src/daemons/rg_state.c 2007/03/10 00:20:54 1.29 @@ -866,6 +866,10 @@ rg_unlock(&lockp); ret = group_migrate(svcName, target); + + if (ret) + svc_fail(svcName); + return ret; } --- cluster/rgmanager/src/daemons/rg_thread.c 2006/12/14 20:11:04 1.17 +++ cluster/rgmanager/src/daemons/rg_thread.c 2007/03/10 00:20:54 1.18 @@ -163,7 +163,7 @@ char myname[256]; resthread_t *myself; request_t *req; - uint32_t ret = RG_FAIL, error = 0; + int ret = RG_EFAIL, error = 0; rg_inc_threads(); @@ -274,7 +274,7 @@ /* * Bad news. */ - ret = RG_FAIL; + ret = RG_EFAIL; } break; @@ -289,7 +289,7 @@ if (error == 0) ret = RG_SUCCESS; else - ret = RG_FAIL; + ret = RG_EFAIL; break; case RG_CONDSTOP: @@ -321,7 +321,7 @@ /* * Bad news. */ - ret = RG_FAIL; + ret = RG_EFAIL; } break; @@ -340,7 +340,7 @@ /* * Bad news. */ - ret = RG_FAIL; + ret = RG_EFAIL; } pthread_mutex_lock(&my_queue_mutex); @@ -368,7 +368,7 @@ /* * Bad news. */ - ret = RG_FAIL; + ret = RG_EFAIL; } break; @@ -393,7 +393,7 @@ /* * Bad news. */ - ret = RG_FAIL; + ret = RG_EFAIL; } break; --- cluster/rgmanager/src/daemons/test.c 2007/02/20 19:56:18 1.7 +++ cluster/rgmanager/src/daemons/test.c 2007/03/10 00:20:54 1.8 @@ -111,7 +111,7 @@ dep_t *depends = NULL; resource_rule_t *rulelist = NULL, *currule; resource_t *reslist = NULL, *curres; - resource_node_t *tree = NULL; + resource_node_t *tree = NULL, *tmp, *rn = NULL; int ccsfd, ret = 0, rules = 0; fprintf(stderr,"Running in test mode.\n"); @@ -179,6 +179,13 @@ goto out; } + list_do(&tree, tmp) { + if (tmp->rn_resource == curres) { + rn = tmp; + break; + } + } while (!list_done(&tree, tmp)); + if (!strcmp(argv[1], "start")) { printf("Starting %s...\n", argv[3]); @@ -198,6 +205,23 @@ } printf("Stop of %s complete\n", argv[3]); goto out; + } else if (!strcmp(argv[1], "migrate")) { + printf("Migrating %s to %s...\n", argv[3], argv[4]); + + #if 0 + if (!group_migratory(curres)) { + printf("No can do\n"); + ret = -1; + goto out; + } + #endif + + if (res_exec(rn, "migrate", argv[4], 0)) { + ret = -1; + goto out; + } + printf("Migration of %s complete\n", argv[3]); + goto out; } else if (!strcmp(argv[1], "status")) { printf("Checking status of %s...\n", argv[3]); --- cluster/rgmanager/src/resources/Makefile 2007/02/15 22:51:03 1.16 +++ cluster/rgmanager/src/resources/Makefile 2007/03/10 00:20:54 1.17 @@ -20,7 +20,7 @@ RESOURCES=fs.sh service.sh ip.sh nfsclient.sh nfsexport.sh \ script.sh netfs.sh clusterfs.sh smb.sh \ apache.sh openldap.sh samba.sh mysql.sh \ - postgres-8.sh tomcat-5.sh lvm.sh + postgres-8.sh tomcat-5.sh lvm.sh vm.sh METADATA=apache.metadata openldap.metadata samba.metadata \ mysql.metadata postgres-8.metadata tomcat-5.metadata --- cluster/rgmanager/src/resources/lvm.sh 2007/02/15 22:51:03 1.2 +++ cluster/rgmanager/src/resources/lvm.sh 2007/03/10 00:20:54 1.3 @@ -163,7 +163,7 @@ # # Check if device is active # - if [[ ! $(lvs -o attr --noheadings vg/mirror) =~ ....a. ]]; then + if [[ ! $(lvs -o attr --noheadings $lv_path) =~ ....a. ]]; then return $OCF_ERR_GENERIC fi --- cluster/rgmanager/src/resources/vm.sh 2006/10/23 22:47:01 1.1 +++ cluster/rgmanager/src/resources/vm.sh 2007/03/10 00:20:54 1.2 @@ -367,14 +367,15 @@ { declare target=$1 - # XXX TODO - return 1 + xm migrate $OCF_RESKEY_name $target + return $? } # # A Resource group is abstract, but the OCF RA API doesn't allow for abstract # resources, so here it is. # + case $1 in start) start --- cluster/rgmanager/src/utils/clusvcadm.c 2007/03/10 00:19:01 1.16 +++ cluster/rgmanager/src/utils/clusvcadm.c 2007/03/10 00:20:54 1.17 @@ -265,13 +265,13 @@ break; case 'r': /* RELOCATE */ - actionstr = "trying to relocate"; + actionstr = "relocate"; action = RG_RELOCATE; svcname = optarg; break; case 'M': /* MIGRATE */ - actionstr = "trying to migrate"; + actionstr = "migrate"; action = RG_MIGRATE; svcname = optarg; break; @@ -359,9 +359,9 @@ msg_open(MSG_SOCKET, 0, RG_PORT, &ctx, 5); } else { if (!svctarget) - printf("Trying to relocate %s", svcname); + printf("Trying to %s %s", actionstr, svcname); else - printf("Trying to relocate %s to %s", svcname, + printf("Trying to %s %s to %s", actionstr, svcname, nodename); printf("..."); fflush(stdout); @@ -392,12 +392,13 @@ swab_SmMessageSt(&msg); printf("%s\n", rg_strerror(msg.sm_data.d_ret)); - if (msg.sm_data.d_ret == RG_ERUN) return 0; + if (msg.sm_data.d_ret) + return msg.sm_data.d_ret; switch (action) { - case RG_MIGRATE: + /*case RG_MIGRATE:*/ case RG_RELOCATE: case RG_START: case RG_ENABLE: