cluster: RHEL56 - rgmanager: Support convalesce w/ central_processing
Lon Hohberger
lon at fedoraproject.org
Fri Sep 24 22:21:05 UTC 2010
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=390e19b31e8783b4c80b6e044ec06978bdb20c1e
Commit: 390e19b31e8783b4c80b6e044ec06978bdb20c1e
Parent: 39919bc11779ca18490548199e977c8a93c627be
Author: Lon Hohberger <lhh at redhat.com>
AuthorDate: Thu Sep 9 10:58:17 2010 -0400
Committer: Lon Hohberger <lhh at redhat.com>
CommitterDate: Fri Sep 24 16:16:03 2010 -0400
rgmanager: Support convalesce w/ central_processing
Resolves: rhbz#605733
Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
rgmanager/include/event.h | 1 +
rgmanager/src/daemons/service_op.c | 84 +++++++++++++++++++++++
rgmanager/src/daemons/slang_event.c | 18 +++++-
rgmanager/src/resources/default_event_script.sl | 4 +
4 files changed, 106 insertions(+), 1 deletions(-)
diff --git a/rgmanager/include/event.h b/rgmanager/include/event.h
index 378ee4c..7e628d8 100644
--- a/rgmanager/include/event.h
+++ b/rgmanager/include/event.h
@@ -141,6 +141,7 @@ void set_transition_throttling(int nsecs);
int service_op_start(char *svcName, int *target_list, int target_list_len,
int *new_owner);
int service_op_stop(char *svcName, int do_disable, int event_type);
+int service_op_convalesce(char *svcName);
#endif
diff --git a/rgmanager/src/daemons/service_op.c b/rgmanager/src/daemons/service_op.c
index 8e1cc91..6b0db24 100644
--- a/rgmanager/src/daemons/service_op.c
+++ b/rgmanager/src/daemons/service_op.c
@@ -206,6 +206,90 @@ service_op_stop(char *svcName, int do_disable, int event_type)
}
+int
+service_op_convalesce(char *svcName)
+{
+ SmMessageSt msg;
+ int msg_ret;
+ msgctx_t ctx;
+ rg_state_t svcStatus;
+ int msgtarget = my_id();
+
+ /* Build the message header */
+ msg.sm_hdr.gh_magic = GENERIC_HDR_MAGIC;
+ msg.sm_hdr.gh_command = RG_ACTION_REQUEST;
+ msg.sm_hdr.gh_arg1 = RG_ACTION_MASTER;
+ msg.sm_hdr.gh_length = sizeof (SmMessageSt);
+
+ msg.sm_data.d_action = RG_CONVALESCE;
+
+ strncpy(msg.sm_data.d_svcName, svcName,
+ sizeof(msg.sm_data.d_svcName));
+ msg.sm_data.d_ret = 0;
+ msg.sm_data.d_svcOwner = 0;
+
+ /* Open a connection to the local node - it will decide what to
+ do in this case. XXX inefficient; should queue requests
+ locally and immediately forward requests otherwise */
+
+ if (get_service_state_internal(svcName, &svcStatus) < 0)
+ return RG_EFAIL;
+ if (svcStatus.rs_owner > 0) {
+ if (member_online(svcStatus.rs_owner)) {
+ msgtarget = svcStatus.rs_owner;
+ } else {
+ /* If the owner is not online,
+ mark the service as 'stopped' but
+ otherwise, do nothing.
+ */
+ return svc_stop(svcName, RG_STOP);
+ }
+ }
+
+ if (msg_open(MSG_CLUSTER, msgtarget, RG_PORT, &ctx, 2 * cluster_timeout)< 0) {
+ clulog(LOG_ERR,
+ "#58: Failed opening connection to member #%d\n",
+ my_id());
+ return -1;
+ }
+
+ /* Encode */
+ swab_SmMessageSt(&msg);
+
+ /* Send stop message to the other node */
+ if (msg_send(&ctx, &msg, sizeof (SmMessageSt)) <
+ (int)sizeof (SmMessageSt)) {
+ clulog(LOG_ERR, "Failed to send complete message\n");
+ msg_close(&ctx);
+ return -1;
+ }
+
+ /* Check the response */
+ do {
+ msg_ret = msg_receive(&ctx, &msg,
+ sizeof (SmMessageSt), 10);
+ if ((msg_ret == -1 && errno != ETIMEDOUT) ||
+ (msg_ret > 0)) {
+ break;
+ }
+ } while(1);
+
+ if (msg_ret != sizeof (SmMessageSt)) {
+ clulog(LOG_WARNING, "Strange response size: %d vs %d\n",
+ msg_ret, (int)sizeof(SmMessageSt));
+ return 0; /* XXX really UNKNOWN */
+ }
+
+ /* Got a valid response from other node. */
+ msg_close(&ctx);
+
+ /* Decode */
+ swab_SmMessageSt(&msg);
+
+ return msg.sm_data.d_ret;
+}
+
+
/*
TODO
service_op_migrate()
diff --git a/rgmanager/src/daemons/slang_event.c b/rgmanager/src/daemons/slang_event.c
index 086ac6b..08974ad 100644
--- a/rgmanager/src/daemons/slang_event.c
+++ b/rgmanager/src/daemons/slang_event.c
@@ -102,7 +102,8 @@ static int
_user_restart = RG_RESTART,
_user_migrate = RG_MIGRATE,
_user_freeze = RG_FREEZE,
- _user_unfreeze = RG_UNFREEZE;
+ _user_unfreeze = RG_UNFREEZE,
+ _user_convalesce = RG_CONVALESCE;
SLang_Intrin_Var_Type rgmanager_vars[] =
@@ -155,6 +156,7 @@ SLang_Intrin_Var_Type rgmanager_vars[] =
MAKE_VARIABLE("USER_MIGRATE", &_user_migrate, SLANG_INT_TYPE, 1),
MAKE_VARIABLE("USER_FREEZE", &_user_freeze, SLANG_INT_TYPE, 1),
MAKE_VARIABLE("USER_UNFREEZE", &_user_unfreeze,SLANG_INT_TYPE, 1),
+ MAKE_VARIABLE("USER_CONVALESCE",&_user_convalesce,SLANG_INT_TYPE, 1),
/* Errors */
MAKE_VARIABLE("rg_error", &_rg_err, SLANG_INT_TYPE, 1),
@@ -469,6 +471,18 @@ sl_service_property(char *svcName, char *prop)
/**
usage:
+ service_convalesce(name);
+ */
+static int
+sl_convalesce_service(const char *svcname)
+{
+ return service_op_convalesce(svcname);
+}
+
+
+/**
+ usage:
+
stop_service(name, disable_flag);
*/
int
@@ -999,6 +1013,8 @@ SLang_Intrin_Fun_Type rgmanager_slang[] =
SLANG_VOID_TYPE),
MAKE_INTRINSIC_S("service_domain_info", sl_domain_info, SLANG_VOID_TYPE),
MAKE_INTRINSIC_0("service_stop", sl_stop_service, SLANG_INT_TYPE),
+ MAKE_INTRINSIC_S((char *)"service_convalesce", sl_convalesce_service,
+ SLANG_INT_TYPE),
MAKE_INTRINSIC_0("service_start", sl_start_service, SLANG_INT_TYPE),
MAKE_INTRINSIC_S("service_status", sl_service_status,
SLANG_VOID_TYPE),
diff --git a/rgmanager/src/resources/default_event_script.sl b/rgmanager/src/resources/default_event_script.sl
index 25347eb..da6bc1f 100644
--- a/rgmanager/src/resources/default_event_script.sl
+++ b/rgmanager/src/resources/default_event_script.sl
@@ -593,6 +593,10 @@ define default_user_event_handler()
ret = service_unfreeze(service_name);
+ } else if (user_request == USER_CONVALESCE) {
+
+ ret = service_convalesce(service_name);
+
}
%
More information about the cluster-commits
mailing list