osaf/libs/common/glsv/include/gld_api.h | 6 +
osaf/libs/common/glsv/include/gld_cb.h | 2 +
osaf/services/saf/glsv/gld/gld_amf.c | 9 ++
osaf/services/saf/glsv/gld/gld_api.c | 111 ++++++++++++++++++-------------
4 files changed, 80 insertions(+), 48 deletions(-)
Add support for configuring the system with more than two OpenSAF 2N SUs. In
particular, this means that all OpenSAF directors must support starting up
and running without (initially) getting any assignment from AMF. Locking of
an OpenSAF 2N SU is currently not supported on a system configured with more
than two OpenSAF 2N SUs.
diff --git a/osaf/libs/common/glsv/include/gld_api.h
b/osaf/libs/common/glsv/include/gld_api.h
--- a/osaf/libs/common/glsv/include/gld_api.h
+++ b/osaf/libs/common/glsv/include/gld_api.h
@@ -17,7 +17,13 @@
#ifndef GLD_API_H
#define GLD_API_H
+
+#include <stdint.h>
+#include "saAmf.h"
+
uint32_t gld_se_lib_init(NCS_LIB_REQ_INFO *req_info);
+uint32_t initialize_for_assignment(GLSV_GLD_CB *cb,
+ SaAmfHAStateT ha_state);
uint32_t gld_se_lib_destroy(NCS_LIB_REQ_INFO *req_info);
void gld_process_mbx(SYSF_MBX *mbx);
diff --git a/osaf/libs/common/glsv/include/gld_cb.h
b/osaf/libs/common/glsv/include/gld_cb.h
--- a/osaf/libs/common/glsv/include/gld_cb.h
+++ b/osaf/libs/common/glsv/include/gld_cb.h
@@ -18,6 +18,7 @@
#ifndef GLD_CB_H
#define GLD_CB_H
+#include <stdbool.h>
#include "gld_tmr.h"
#include "saImmOi.h"
@@ -110,6 +111,7 @@ typedef struct glsv_gld_cb_tag {
SaSelectionObjectT imm_sel_obj; /*Selection object to wait for
IMM events */
bool is_impl_set;
+ bool fully_initialized;
} GLSV_GLD_CB;
#define GLD_CB_NULL ((GLSV_GLD_CB *)0)
diff --git a/osaf/services/saf/glsv/gld/gld_amf.c
b/osaf/services/saf/glsv/gld/gld_amf.c
--- a/osaf/services/saf/glsv/gld/gld_amf.c
+++ b/osaf/services/saf/glsv/gld/gld_amf.c
@@ -74,10 +74,19 @@ gld_amf_CSI_set_callback(SaInvocationT i
GLSV_GLD_CB *gld_cb;
SaAisErrorT error = SA_AIS_OK;
V_DEST_RL mds_role;
+ uint32_t rc;
TRACE_ENTER2("component name %s haState %d", compName->value, haState);
gld_cb = m_GLSV_GLD_RETRIEVE_GLD_CB;
if (gld_cb != NULL) {
+ if ((rc = initialize_for_assignment(gld_cb, haState)) !=
+ NCSCC_RC_SUCCESS) {
+ LOG_ER("initialize_for_assignment FAILED %u",
(unsigned) rc);
+ error = SA_AIS_ERR_FAILED_OPERATION;
+ saAmfResponse(gld_cb->amf_hdl, invocation, error);
+ m_GLSV_GLD_GIVEUP_GLD_CB;
+ goto end;
+ }
if (gld_cb->ha_state == SA_AMF_HA_ACTIVE && haState ==
SA_AMF_HA_QUIESCED) {
mds_role = SA_AMF_HA_QUIESCED;
diff --git a/osaf/services/saf/glsv/gld/gld_api.c
b/osaf/services/saf/glsv/gld/gld_api.c
--- a/osaf/services/saf/glsv/gld/gld_api.c
+++ b/osaf/services/saf/glsv/gld/gld_api.c
@@ -25,9 +25,11 @@
******************************************************************************/
#include "gld.h"
-#include "gld_imm.h"
#include <poll.h>
#include <string.h>
+#include <stdlib.h>
+#include "gld_imm.h"
+
uint32_t gl_gld_hdl;
void gld_main_process(SYSF_MBX *mbx);
@@ -145,49 +147,10 @@ uint32_t gld_se_lib_init(NCS_LIB_REQ_INF
}
TRACE_1("AMF Initialize success");
- /* Bind to MDS */
- if (gld_mds_init(gld_cb) != NCSCC_RC_SUCCESS) {
- saAmfFinalize(gld_cb->amf_hdl);
- m_MMGR_FREE_GLSV_GLD_CB(gld_cb);
- TRACE_2("MDS Install failed");
- res = NCSCC_RC_FAILURE;
- goto end;
- } else
- TRACE_1("MDS Install success");
-
- /* Initialise with the MBCSV service */
- if (glsv_gld_mbcsv_register(gld_cb) != NCSCC_RC_SUCCESS) {
- TRACE_2("GLD mbcsv init failed");
- gld_mds_shut(gld_cb);
- saAmfFinalize(gld_cb->amf_hdl);
- m_MMGR_FREE_GLSV_GLD_CB(gld_cb);
- res = NCSCC_RC_FAILURE;
- goto end;
-
- } else {
- TRACE_1("GLD mbcsv init success");
-
- }
-
- /* register glsv with imm */
- amf_error = gld_imm_init(gld_cb);
- if (amf_error != SA_AIS_OK) {
- glsv_gld_mbcsv_unregister(gld_cb);
- gld_mds_shut(gld_cb);
- saAmfFinalize(gld_cb->amf_hdl);
- m_MMGR_FREE_GLSV_GLD_CB(gld_cb);
- LOG_ER("Imm Init Failed %u\n", amf_error);
- res = NCSCC_RC_FAILURE;
- goto end;
- }
-
/* TASK CREATION AND INITIALIZING THE MAILBOX */
if ((m_NCS_IPC_CREATE(&gld_cb->mbx) != NCSCC_RC_SUCCESS) ||
(m_NCS_IPC_ATTACH(&gld_cb->mbx) != NCSCC_RC_SUCCESS)) {
LOG_ER("Failure in task initiation");
- saImmOiFinalize(gld_cb->immOiHandle);
- glsv_gld_mbcsv_unregister(gld_cb);
- gld_mds_shut(gld_cb);
saAmfFinalize(gld_cb->amf_hdl);
m_NCS_IPC_RELEASE(&gld_cb->mbx, NULL);
m_MMGR_FREE_GLSV_GLD_CB(gld_cb);
@@ -203,9 +166,6 @@ uint32_t gld_se_lib_init(NCS_LIB_REQ_INF
LOG_ER("AMF Registration Failed");
m_NCS_EDU_HDL_FLUSH(&gld_cb->edu_hdl);
m_NCS_IPC_RELEASE(&gld_cb->mbx, NULL);
- saImmOiFinalize(gld_cb->immOiHandle);
- glsv_gld_mbcsv_unregister(gld_cb);
- gld_mds_shut(gld_cb);
saAmfFinalize(gld_cb->amf_hdl);
m_MMGR_FREE_GLSV_GLD_CB(gld_cb);
res = NCSCC_RC_FAILURE;
@@ -233,18 +193,66 @@ uint32_t gld_se_lib_init(NCS_LIB_REQ_INF
saAmfComponentUnregister(gld_cb->amf_hdl, &gld_cb->comp_name,
(SaNameT *)NULL);
m_NCS_EDU_HDL_FLUSH(&gld_cb->edu_hdl);
m_NCS_IPC_RELEASE(&gld_cb->mbx, NULL);
- saImmOiFinalize(gld_cb->immOiHandle);
- glsv_gld_mbcsv_unregister(gld_cb);
- gld_mds_shut(gld_cb);
saAmfFinalize(gld_cb->amf_hdl);
m_MMGR_FREE_GLSV_GLD_CB(gld_cb);
} else
TRACE_1("AMF Health Check started");
+
+ if ((res = initialize_for_assignment(gld_cb, gld_cb->ha_state)) !=
+ NCSCC_RC_SUCCESS) {
+ LOG_ER("initialize_for_assignment FAILED %u", (unsigned) res);
+ exit(EXIT_FAILURE);
+ }
+
end:
TRACE_LEAVE();
return (res);
}
+uint32_t initialize_for_assignment(GLSV_GLD_CB *cb, SaAmfHAStateT ha_state)
+{
+ TRACE_ENTER2("ha_state = %d", (int) ha_state);
+ uint32_t rc = NCSCC_RC_SUCCESS;
+ SaAisErrorT amf_error;
+ if (cb->fully_initialized || ha_state == SA_AMF_HA_QUIESCED) {
+ goto done;
+ }
+
+ /* Bind to MDS */
+ if (gld_mds_init(cb) != NCSCC_RC_SUCCESS) {
+ TRACE_2("MDS Install failed");
+ rc = NCSCC_RC_FAILURE;
+ goto done;
+ } else {
+ TRACE_1("MDS Install success");
+ }
+
+ /* Initialise with the MBCSV service */
+ if (glsv_gld_mbcsv_register(cb) != NCSCC_RC_SUCCESS) {
+ TRACE_2("GLD mbcsv init failed");
+ gld_mds_shut(cb);
+ rc = NCSCC_RC_FAILURE;
+ goto done;
+ } else {
+ TRACE_1("GLD mbcsv init success");
+ }
+
+ /* register glsv with imm */
+ amf_error = gld_imm_init(cb);
+ if (amf_error != SA_AIS_OK) {
+ glsv_gld_mbcsv_unregister(cb);
+ gld_mds_shut(cb);
+ LOG_ER("Imm Init Failed %u\n", (unsigned) amf_error);
+ rc = NCSCC_RC_FAILURE;
+ goto done;
+ }
+
+ cb->fully_initialized = true;
+done:
+ TRACE_LEAVE2("rc = %u", rc);
+ return rc;
+}
+
/****************************************************************************
* Name : gld_se_lib_destroy
*
@@ -338,6 +346,11 @@ uint32_t gld_cb_init(GLSV_GLD_CB *gld_cb
/* Initialize the next resource id */
gld_cb->nxt_rsc_id = 1;
+
+ gld_cb->ha_state = SA_AMF_HA_QUIESCED;
+ gld_cb->mbcsv_sel_obj = -1;
+ gld_cb->imm_sel_obj = -1;
+ gld_cb->fully_initialized = false;
end:
TRACE_LEAVE();
return rc;
@@ -504,14 +517,14 @@ void gld_main_process(SYSF_MBX *mbx)
fds[FD_TERM].events = POLLIN;
fds[FD_AMF].fd = amf_sel_obj;
fds[FD_AMF].events = POLLIN;
- fds[FD_MBCSV].fd = gld_cb->mbcsv_sel_obj;
- fds[FD_MBCSV].events = POLLIN;
fds[FD_MBX].fd = mbx_fd.rmv_obj;
fds[FD_MBX].events = POLLIN;
fds[FD_IMM].fd = gld_cb->imm_sel_obj;
fds[FD_IMM].events = POLLIN;
while (1) {
+ fds[FD_MBCSV].fd = gld_cb->mbcsv_sel_obj;
+ fds[FD_MBCSV].events = POLLIN;
if ((gld_cb->immOiHandle != 0) && (gld_cb->is_impl_set ==
true)){
fds[FD_IMM].fd = gld_cb->imm_sel_obj;
fds[FD_IMM].events = POLLIN;
@@ -581,7 +594,9 @@ void gld_main_process(SYSF_MBX *mbx)
** close resource requests. That is needed
since the IMM OI
** is used in context of these functions.
*/
+ saImmOiFinalize(gld_cb->immOiHandle);
gld_cb->immOiHandle = 0;
+ gld_cb->imm_sel_obj = -1;
gld_cb->is_impl_set = false;
gld_imm_reinit_bg(gld_cb);
} else if (error != SA_AIS_OK) {
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel