osaf/services/saf/avsv/avd/avd_csi.c         |  46 ++++++++++++++++++++-------
 osaf/services/saf/avsv/avd/avd_sgproc.c      |  17 ++++++++++
 osaf/services/saf/avsv/avd/include/avd_csi.h |   1 +
 3 files changed, 51 insertions(+), 13 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 are delayed till the first csi addition procers if
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_WA("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) */
@@ -794,20 +790,20 @@ static void csi_ccb_apply_modify_hdlr(st
 }
 
 /*****************************************************************************
- * Function: csi_ccb_apply_create_hdlr
+ * Function: csi_create_assign_hdlr
  * 
- * Purpose: This routine handles create operations on SaAmfCSI objects.
+ * Purpose: This routine creates Csi if doesn't exist and then assign the csi.
  * 
  *
- * Input  : Ccb Util Oper Data. 
+ * Input  : Ccb Util Oper Data and Csi. 
  *              
- * Returns: None.
+ * Returns: OK or NO OP.
  *  
- * NOTES  : None.
+ * NOTES  : If the opdata is NULL, csi should be passed as arguement.
  *              
  *      
  **************************************************************************/
-static void csi_ccb_apply_create_hdlr(struct CcbUtilOperationData *opdata)
+SaAisErrorT csi_create_assign_hdlr(struct CcbUtilOperationData *opdata, 
AVD_CSI *avd_csi)
 {
         AVD_CSI *csi = NULL;
         AVD_COMP *t_comp;
@@ -815,8 +811,15 @@ static void csi_ccb_apply_create_hdlr(st
        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 (opdata == NULL) {
+               /* This csi should be assigned now.*/
+               csi = avd_csi;
+               osafassert(csi != NULL);
+               goto csi_assign;
+       }
+       TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, 
opdata->objectName.value);
 
 
        if ((csi = avd_csi_get (&opdata->objectName)) == NULL) {
@@ -827,8 +830,23 @@ static void csi_ccb_apply_create_hdlr(st
        } 
        csi_get_attr_and_add_to_model(csi, opdata->param.create.attrValues, 
opdata->param.create.parentName);
 
+csi_assign:
+
        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 (NULL != csi->si->list_of_sisu) {
+               t_sisu = csi->si->list_of_sisu;
+               while(t_sisu) {
+                       if (t_sisu->csi_add_rem == true) {
+                               LOG_WA("CSI create '%s' delayed: pending 
assignment for '%s'",
+                                               opdata->objectName.value, 
t_sisu->su->name.value);
+                               goto done;
+                       }
+                       t_sisu = t_sisu->si_next;
+               }/*  while(t_sisu) */
+       }
 
        /* Check whether si has been assigned to any SU. */
        if (NULL != csi->si->list_of_sisu) {
@@ -907,6 +925,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,6 +941,7 @@ static void csi_ccb_apply_create_hdlr(st
                csi->si->sg_of_si->si_func(avd_cb, csi->si);
        }
 done:
+       return rc;
        TRACE_LEAVE();
 }
 
@@ -932,7 +952,7 @@ static void csi_ccb_apply_cb(CcbUtilOper
 
        switch (opdata->operationType) {
        case CCBUTIL_CREATE:
-                csi_ccb_apply_create_hdlr(opdata);
+               csi_create_assign_hdlr(opdata, NULL);
                break;
         case CCBUTIL_MODIFY:
                 csi_ccb_apply_modify_hdlr(opdata);
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
@@ -533,6 +533,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
        AVD_AVND *node;
        AVD_SU *su, *temp_su;
        AVD_SU_SI_REL *susi;
+       SaAisErrorT rc = SA_AIS_ERR_NO_OP;
        bool q_flag = false, qsc_flag = false, all_su_unassigned = true, 
all_csi_rem = true;
 
        TRACE_ENTER2("id:%u, node:%x, act:%u, '%s', '%s', ha:%u, err:%u, 
single:%u",
@@ -798,6 +799,22 @@ 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. */
+                                       AVD_CSI *temp_csi;
+                                       for (temp_csi = susi->si->list_of_csi; 
temp_csi; temp_csi = 
+                                                       
temp_csi->si_list_of_csi_next) {
+                                               if (temp_csi->list_compcsi == 
NULL) {
+                                                       rc = 
csi_create_assign_hdlr(NULL, temp_csi);
+                                                       /* Get going for this 
csi and when the assignment
+                                                          will be over for 
this csi, then other 
+                                                          unassigned CSIs will 
be taken. */
+                                                       if (rc == 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_create_assign_hdlr(struct CcbUtilOperationData *opdata, 
AVD_CSI *csi);
 
 #endif

------------------------------------------------------------------------------
Start Your Social Network Today - Download eXo Platform
Build your Enterprise Intranet with eXo Platform Software
Java Based Open Source Intranet - Social, Extensible, Cloud Ready
Get Started Now And Turn Your Intranet Into A Collaboration Platform
http://p.sf.net/sfu/ExoPlatform
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to