Ack, code review only. Some minor comments below. /Thanks HansN

-----Original Message-----
From: praveen.malv...@oracle.com [mailto:praveen.malv...@oracle.com] 
Sent: den 6 januari 2015 06:35
To: Hans Feldt; nagendr...@oracle.com
Cc: opensaf-devel@lists.sourceforge.net
Subject: [devel] [PATCH 1 of 1] amfd: assign only one csi per NPI component for 
PI SU [#1237]

 osaf/services/saf/amf/amfd/comp.cc        |  23 +++++++++++++++++++++++
 osaf/services/saf/amf/amfd/include/comp.h |   2 +-
 osaf/services/saf/amf/amfd/sgproc.cc      |   3 ++-
 osaf/services/saf/amf/amfd/su.cc          |   7 ++++++-
 4 files changed, 32 insertions(+), 3 deletions(-)


Unlock of SU having NPI comp hangs, if more than one CSIs are configured for 
NPI component.

AMFD creates compcsi object for all the CSIs of same SI or different SI which 
can go to the single component. When AMFND gets the assignment messages from 
AMFD, it assigns one CSI to NPI component. Since other CSIs remain unassigned, 
AMFND never responds to AMFD.
This is the reason of hanging of unlock operation.

While creating comp-csi objects, AMFD should not assign more than one CSis to a 
single NPI component.

diff --git a/osaf/services/saf/amf/amfd/comp.cc 
b/osaf/services/saf/amf/amfd/comp.cc
--- a/osaf/services/saf/amf/amfd/comp.cc
+++ b/osaf/services/saf/amf/amfd/comp.cc
@@ -1574,3 +1574,26 @@ bool comp_is_preinstantiable(const AVD_C
                        (category == 
AVSV_COMP_TYPE_PROXIED_LOCAL_PRE_INSTANTIABLE) ||
                        (category == AVSV_COMP_TYPE_EXTERNAL_PRE_INSTANTIABLE));
 }
+
+/**
+ * @brief  Returns true if the component is assigned any CSI. 
+          Note:comp->assign_flag is not always reliable to 
+ *         check if a component is assigned or not as this flag 
+           is always reset before going for new assignments. 
+ * @param comp.
+ * @return true/false.
+ */
+
+bool is_comp_assigned_any_csi(AVD_COMP *comp) {
+       for (AVD_SI *si = comp->su->sg_of_su->list_of_si; si != NULL; si = 
si->sg_list_of_si_next) {
+               for (AVD_CSI *csi = si->list_of_csi; csi; csi = 
csi->si_list_of_csi_next) {
+                       for (AVD_COMP_CSI_REL *compcsi = csi->list_compcsi; 
compcsi; compcsi = compcsi->csi_csicomp_next) {
+                               if (compcsi->comp == comp)
+                                       return true;
+                       }
+               }
+       }
+       return false;
+
+}
diff --git a/osaf/services/saf/amf/amfd/include/comp.h 
b/osaf/services/saf/amf/amfd/include/comp.h
--- a/osaf/services/saf/amf/amfd/include/comp.h
+++ b/osaf/services/saf/amf/amfd/include/comp.h
@@ -237,5 +237,5 @@ extern AVD_COMPCS_TYPE * avd_compcstype_  extern void 
avd_compcstype_constructor(void);  extern AVD_COMP 
*avd_comp_get_or_create(const SaNameT *dn);  bool comp_is_preinstantiable(const 
AVD_COMP *comp);
-
+extern bool is_comp_assigned_any_csi(AVD_COMP *comp);
 #endif
diff --git a/osaf/services/saf/amf/amfd/sgproc.cc 
b/osaf/services/saf/amf/amfd/sgproc.cc
--- a/osaf/services/saf/amf/amfd/sgproc.cc
+++ b/osaf/services/saf/amf/amfd/sgproc.cc
@@ -137,7 +137,8 @@ uint32_t avd_new_assgn_susi(AVD_CL_CB *c
                        /* Assign to only those comps, which have assignment. 
Those comps, which could not have assignment 
                           before, cann't find compcsi here also.*/
                        while (l_comp != NULL) { 
-                               if (true == l_comp->assign_flag) {
+                               AVD_COMP_TYPE *comptype = 
comptype_db->find(Amf::to_string(&l_comp->saAmfCompType));
[HansN]    check comptype for 0, or osafassert(comptype)
+                               if ((true == l_comp->assign_flag) && 
(comptype->saAmfCtCompCategory 
+!= SA_AMF_COMP_LOCAL)) {
                                        if (NULL != (cst = 
avd_compcstype_find_match(&l_csi->saAmfCSType, l_comp))) {
                                                if (SA_AMF_HA_ACTIVE == 
ha_state) {
                                                        if 
(cst->saAmfCompNumCurrActiveCSIs < cst->saAmfCompNumMaxActiveCSIs) { diff --git 
a/osaf/services/saf/amf/amfd/su.cc b/osaf/services/saf/amf/amfd/su.cc
--- a/osaf/services/saf/amf/amfd/su.cc
+++ b/osaf/services/saf/amf/amfd/su.cc
@@ -2043,7 +2043,12 @@ void AVD_SU::reset_all_comps_assign_flag
 AVD_COMP *AVD_SU::find_unassigned_comp_that_provides_cstype(const SaNameT 
*cstype) {
        AVD_COMP *l_comp = list_of_comp;
        while (l_comp != NULL) {
-               if (l_comp->assign_flag == false) {
+               bool npi_not_assigned = true;
[HansN] maybe bool npi_is_assigned = false is easier to read?
+               AVD_COMP_TYPE *comptype = 
comptype_db->find(Amf::to_string(&l_comp->saAmfCompType));
[HansN]    check comptype for 0, or osafassert(comptype)
+               if ((comptype->saAmfCtCompCategory == SA_AMF_COMP_LOCAL) && 
is_comp_assigned_any_csi(l_comp))
+                       npi_not_assigned = false;
+               
+               if ((l_comp->assign_flag == false) && (npi_not_assigned == 
true)) {
                        AVD_COMPCS_TYPE *cst = 
avd_compcstype_find_match(cstype, l_comp);
                        if (cst != NULL)
                                break;

------------------------------------------------------------------------------
Dive into the World of Parallel Programming! The Go Parallel Website, sponsored 
by Intel and developed in partnership with Slashdot Media, is your hub for all 
things parallel software development, from weekly thought leadership blogs to 
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net 
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to