osaf/services/saf/avsv/avd/avd_csi.c         |  77 ++++++++++++++-------------
 osaf/services/saf/avsv/avd/avd_sgproc.c      |  14 +++++
 osaf/services/saf/avsv/avd/include/avd_csi.h |   1 +
 3 files changed, 55 insertions(+), 37 deletions(-)


Problem:
Amf rejects csi addition if previous csi addition is in progress.

Analysis:
Amfd can allow csi addition in sequence but can delay applying
subsequent csi addition.

Fix:
Next csi addition is delayed until the previous csi addition is finished.

diff --git a/osaf/services/saf/avsv/avd/avd_csi.c 
b/osaf/services/saf/avsv/avd/avd_csi.c
--- a/osaf/services/saf/avsv/avd/avd_csi.c
+++ b/osaf/services/saf/avsv/avd/avd_csi.c
@@ -441,12 +441,8 @@ static SaAisErrorT csi_ccb_completed_cre
                        t_sisu = avd_si->list_of_sisu;
                        while(t_sisu) {
                                if (t_sisu->csi_add_rem == true) {
-                                       LOG_WA("CSI create of '%s' rejected: 
pending assignment for '%s'", 
+                                       LOG_NO("CSI create of '%s' in queue: 
pending assignment for '%s'", 
                                                        
opdata->objectName.value, t_sisu->su->name.value);
-                                       if (avd_cb->avail_state_avd == 
SA_AMF_HA_ACTIVE) {
-                                               rc = SA_AIS_ERR_BAD_OPERATION;
-                                               goto done;
-                                       }
                                }
                                t_sisu = t_sisu->si_next;
                        }/*  while(t_sisu) */
@@ -626,7 +622,7 @@ static SaAisErrorT csi_ccb_completed_del
                        t_sisu = csi->si->list_of_sisu;
                        while(t_sisu) {
                                if (t_sisu->csi_add_rem == true) {
-                                       LOG_WA("CSI remove of '%s' rejected: 
pending assignment for '%s'", 
+                                       LOG_NO("CSI remove of '%s' rejected: 
pending assignment for '%s'", 
                                                        csi->name.value, 
t_sisu->su->name.value);
                                        if (avd_cb->avail_state_avd == 
SA_AMF_HA_ACTIVE) {
                                                rc = SA_AIS_ERR_BAD_OPERATION;
@@ -793,42 +789,33 @@ static void csi_ccb_apply_modify_hdlr(st
         TRACE_LEAVE();
 }
 
-/*****************************************************************************
- * Function: csi_ccb_apply_create_hdlr
- * 
- * Purpose: This routine handles create operations on SaAmfCSI objects.
- * 
+/**
+ * @brief       Assign csi to component as per compcsi configurations.
  *
- * Input  : Ccb Util Oper Data. 
- *              
- * Returns: None.
- *  
- * NOTES  : None.
- *              
- *      
- **************************************************************************/
-static void csi_ccb_apply_create_hdlr(struct CcbUtilOperationData *opdata)
+ * @param[in]   csi pointer.
+ *
+ * @return      OK if csi is assigned else NO_OP.
+ */
+SaAisErrorT csi_assign_hdlr(AVD_CSI *csi)
 {
-        AVD_CSI *csi = NULL;
         AVD_COMP *t_comp;
        AVD_SU_SI_REL *t_sisu;
        SaBoolT first_sisu = true;
        AVD_COMP_CSI_REL *compcsi;
        AVD_COMPCS_TYPE *cst;
+       SaAisErrorT rc = SA_AIS_ERR_NO_OP;
 
-        TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, 
opdata->objectName.value);
-
-
-       if ((csi = avd_csi_get (&opdata->objectName)) == NULL) {
-               /* this check is added because, some times there is possibility 
that before getting ccb apply callback
-                * we might get compcsi create checkpoint and csi will be 
created as part of checkpoint processing
-                */
-               csi = csi_create(&opdata->objectName);
-       } 
-       csi_get_attr_and_add_to_model(csi, opdata->param.create.attrValues, 
opdata->param.create.parentName);
-
-       if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE)
-               goto done;
+       /* Check whether csi assignment is already in progress and if yes, then 
return.
+          This csi will be assigned after the undergoing csi assignment gets 
over.*/
+       if (csi->si->list_of_sisu != NULL) {
+               for(t_sisu = csi->si->list_of_sisu; t_sisu != NULL; t_sisu = 
t_sisu->si_next) {
+                       if (t_sisu->csi_add_rem == true) {
+                               LOG_NO("CSI create '%s' delayed: pending 
assignment for '%s'",
+                                               csi->name.value, 
t_sisu->su->name.value);
+                               goto done;
+                       }
+               }
+       }
 
        /* Check whether si has been assigned to any SU. */
        if (NULL != csi->si->list_of_sisu) {
@@ -886,7 +873,7 @@ static void csi_ccb_apply_create_hdlr(st
                        }
                        if (NULL == t_comp) {
                                LOG_ER("Compcsi doesn't exist or 
MaxActiveCSI/MaxStandbyCSI have reached for csi '%s'",
-                                               opdata->objectName.value);
+                                               csi->name.value);
                                goto done;
                        }
 
@@ -907,6 +894,7 @@ static void csi_ccb_apply_create_hdlr(st
                                        avd_susi_delete(avd_cb, t_sisu, true);
                                        goto done;
                                }
+                               rc = SA_AIS_OK;
 
                        }
                        t_sisu->csi_add_rem = true;
@@ -922,17 +910,32 @@ static void csi_ccb_apply_create_hdlr(st
                csi->si->sg_of_si->si_func(avd_cb, csi->si);
        }
 done:
+       return rc;
        TRACE_LEAVE();
 }
 
 static void csi_ccb_apply_cb(CcbUtilOperationData_t *opdata)
 {
+       AVD_CSI *csi = NULL;
 
        TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, 
opdata->objectName.value);
 
        switch (opdata->operationType) {
        case CCBUTIL_CREATE:
-                csi_ccb_apply_create_hdlr(opdata);
+               if ((csi = avd_csi_get (&opdata->objectName)) == NULL) {
+                       /* This check is added because, some times there is
+                          possibility that before getting ccb apply callback
+                          we might get compcsi create checkpoint and csi will
+                          be created as part of checkpoint processing */
+                       csi = csi_create(&opdata->objectName);
+               }
+               csi_get_attr_and_add_to_model(csi,
+                               opdata->param.create.attrValues,
+                               opdata->param.create.parentName);
+
+               if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE)
+                       goto done;
+               csi_assign_hdlr(csi);
                break;
         case CCBUTIL_MODIFY:
                 csi_ccb_apply_modify_hdlr(opdata);
@@ -944,7 +947,7 @@ static void csi_ccb_apply_cb(CcbUtilOper
                osafassert(0);
                break;
        }
-
+done:
        TRACE_LEAVE();
 }
 
diff --git a/osaf/services/saf/avsv/avd/avd_sgproc.c 
b/osaf/services/saf/avsv/avd/avd_sgproc.c
--- a/osaf/services/saf/avsv/avd/avd_sgproc.c
+++ b/osaf/services/saf/avsv/avd/avd_sgproc.c
@@ -808,6 +808,20 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
                                        }
                                        t_sisu = t_sisu->si_next;
                                }/* while(t_sisu) */
+                               if (t_sisu == NULL) {
+                                       /* Since csi assignment is over, 
walkthrough other
+                                          unassigned CSIs for assignment. */
+                                       for (csi = susi->si->list_of_csi; csi; 
csi = 
+                                                       
csi->si_list_of_csi_next) {
+                                               if (csi->list_compcsi == NULL) {
+                                                       /* Assign this csi and 
when the assignment
+                                                          will be over for 
this csi, then other
+                                                          unassigned CSIs will 
be taken.*/
+                                                       if 
(csi_assign_hdlr(csi) == SA_AIS_OK)
+                                                               goto done;
+                                               }
+                                       }
+                               }
                                /* Comsume this message. */
                                goto done;
                        }
diff --git a/osaf/services/saf/avsv/avd/include/avd_csi.h 
b/osaf/services/saf/avsv/avd/include/avd_csi.h
--- a/osaf/services/saf/avsv/avd/include/avd_csi.h
+++ b/osaf/services/saf/avsv/avd/include/avd_csi.h
@@ -160,5 +160,6 @@ extern void avd_csi_delete(struct avd_cs
 extern void csi_cmplt_delete(struct avd_csi_tag *csi, SaBoolT ckpt);
 extern AVD_CSI *csi_create(const SaNameT *csi_name);
 extern bool csi_assignment_validate(struct avd_sg_tag *sg);
+extern SaAisErrorT csi_assign_hdlr(AVD_CSI *csi);
 
 #endif

------------------------------------------------------------------------------
Is your legacy SCM system holding you back? Join Perforce May 7 to find out:
• 3 signs your SCM is hindering your productivity
• Requirements for releasing software faster
• Expert tips and advice for migrating your SCM now
http://p.sf.net/sfu/perforce
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to