From mboxrd@z Thu Jan 1 00:00:00 1970 From: lhh@sourceware.org Date: 12 Dec 2007 21:41:33 -0000 Subject: [Cluster-devel] cluster/rgmanager ChangeLog src/daemons/groups ... Message-ID: <20071212214133.18210.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-12-12 21:41:32 Modified files: rgmanager : ChangeLog rgmanager/src/daemons: groups.c slang_event.c rgmanager/src/resources: default_event_script.sl Log message: Misc. minor central processing bugfixes Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/ChangeLog.diff?cvsroot=cluster&r1=1.63&r2=1.64 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/groups.c.diff?cvsroot=cluster&r1=1.41&r2=1.42 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/slang_event.c.diff?cvsroot=cluster&r1=1.2&r2=1.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/default_event_script.sl.diff?cvsroot=cluster&r1=1.1&r2=1.2 --- cluster/rgmanager/ChangeLog 2007/12/12 15:27:34 1.63 +++ cluster/rgmanager/ChangeLog 2007/12/12 21:41:32 1.64 @@ -1,5 +1,12 @@ 2007-12-12 Lon Hohberger * Misc changes; add missing ds.h + * src/resources/default*.sl: Make clusvcadm -r go to a different + node. Don't notice() that we're starting a service if it's + disabled. + * src/daemons/groups.c: Make clustat not interfere with startup + when central processing is enabled + * src/daemons/slang_event.c: Make clusvcadm correctly report + service owner after relocate/restart/enable requests. 2007-11-30 Lon Hohberger * Commit RIND / S-Lang script engine [untested] --- cluster/rgmanager/src/daemons/groups.c 2007/11/30 21:36:28 1.41 +++ cluster/rgmanager/src/daemons/groups.c 2007/12/12 21:41:32 1.42 @@ -1126,48 +1126,6 @@ } -#if 0 -/** - Send the state of the transition master to a given file descriptor. - - @param fd File descriptor to send state to - @param rgname Resource group name whose state we want to send. - @see send_rg_states - */ -void -send_master_state(msgctx_t *ctx) -{ - rg_state_msg_t msg, *msgp = &msg; - event_master_t master; - rg_state_t *rs = &msg.rsm_state; - - strncpy(rs->rs_name, "internal:CentralProcessor", - sizeof(rs->rs_name)); - rs->rs_last_owner = 0; - rs->rs_restarts = 0; - - if (event_master_info_cached(&master) < 0) { - rs->rs_owner = 0; - rs->rs_transition = master.m_master_time; - rs->rs_state = RG_STATE_UNINITIALIZED; - } else { - rs->rs_owner = master.m_nodeid; - rs->rs_transition = master.m_master_time; - rs->rs_state = RG_STATE_STARTED; - } - - msgp->rsm_hdr.gh_magic = GENERIC_HDR_MAGIC; - msgp->rsm_hdr.gh_length = sizeof(msg); - msgp->rsm_hdr.gh_command = RG_STATUS; - - swab_rg_state_msg_t(msgp); - - if (msg_send(ctx, msgp, sizeof(msg)) < 0) - perror("msg_send"); -} -#endif - - /** Send status from a thread because we don't want rgmanager's main thread to block in the case of DLM issues @@ -1183,6 +1141,14 @@ free(arg); + if (central_events_enabled()) { + /* Never call get_rg_state() (distributed) if + central events are enabled, otherwise we + might overwrite the rg state with 'stopped' + when it should be 'disabled' (e.g. autostart="0") */ + fast = 1; + } + /* See if we have a slot... */ if (rg_inc_status() < 0) { /* Too many outstanding status checks. try again later. */ @@ -1327,6 +1293,7 @@ resource_node_t *curr; rg_state_t svcblk; char rg[64]; + struct dlm_lksb lockp; /* Only one status thread@a time, please! */ if (pthread_mutex_trylock(&status_mutex) != 0) @@ -1340,7 +1307,13 @@ /* Local check - no one will make us take a service */ if (get_rg_state_local(rg, &svcblk) < 0) { - continue; + if (rg_lock(rg, &lockp) != 0) + continue; + if (get_rg_state(rg, &svcblk) < 0) { + rg_unlock(&lockp); + continue; + } + rg_unlock(&lockp); } if (svcblk.rs_owner != my_id() || --- cluster/rgmanager/src/daemons/slang_event.c 2007/12/07 00:53:44 1.2 +++ cluster/rgmanager/src/daemons/slang_event.c 2007/12/12 21:41:32 1.3 @@ -487,7 +487,7 @@ char *svcname = NULL; int *pref_list = NULL, pref_list_len = 0; int *illegal_list = NULL, illegal_list_len = 0; - int nargs, t, x, ret = -1; + int nargs, t, newowner = 0, ret = -1; nargs = SLang_Num_Function_Args; @@ -528,8 +528,10 @@ /* TODO: Meat of function goes here */ ret = service_op_start(svcname, pref_list, - pref_list_len, &x); ; + pref_list_len, &newowner); + if (ret == 0 && newowner > 0) + ret = newowner; out: if (svcname) free(svcname); @@ -1123,7 +1125,17 @@ /* XXX Send response code to caller - that 0 should be the new service owner, if there is one */ if (ctx) { - send_ret(ctx, name, _user_return, request, 0); + if (_user_return > 0) { + /* sl_start_service() squashes return code and + node ID into one value. <0 = error, >0 = + success, return-value == node id running + service */ + send_ret(ctx, name, 0, request, _user_return); + } else { + /* return value < 0 ... pass directly back; + don't transpose */ + send_ret(ctx, name, _user_return, request, 0); + } msg_close(ctx); msg_free_ctx(ctx); } --- cluster/rgmanager/src/resources/default_event_script.sl 2007/11/30 21:36:29 1.1 +++ cluster/rgmanager/src/resources/default_event_script.sl 2007/12/12 21:41:32 1.2 @@ -192,7 +192,8 @@ } (owner, state) = service_status(services[x]); - if ((service_state == "started") and (owner < 0)) { + if ((service_state == "started") and (owner < 0) and + (state == "stopped")) { info("Dependency met; starting ", services[x]); nodes = allowed_nodes(services[x]); ()=move_or_start(services[x], nodes); @@ -245,6 +246,10 @@ if (user_target > 0) { for (x = 0; x < length(nodes); x++) { + % + % Put the preferred node@the front of the + % list for a user-relocate operation + % if (nodes[x] == user_target) { reordered = union(user_target, nodes); nodes = reordered; @@ -262,6 +267,13 @@ if (service_stop(service_name) < 0) { return ERR_ABORT; } + + % + % The current owner shouldn't be the default + % for a relocate operation + % + reordered = subtract(nodes, owner); + nodes = union(reordered, owner); } ret = move_or_start(service_name, nodes); @@ -275,7 +287,10 @@ ret = service_stop(service_name); } + + % % todo - migrate + % return ret; }