Ack, code review only/Thanks HansN
-----Original Message-----
From: [email protected] [mailto:[email protected]]
Sent: den 13 februari 2015 07:11
To: Hans Nordebäck; [email protected]
Cc: [email protected]
Subject: [PATCH 1 of 1] amfnd: issue remove cbk for assigning csi after
successful assignment [#1046]
osaf/services/saf/amf/amfnd/comp.cc | 56 ++++++++++++++++++++----
osaf/services/saf/amf/amfnd/include/avnd_comp.h | 5 ++
osaf/services/saf/amf/amfnd/sidb.cc | 1 +
3 files changed, 52 insertions(+), 10 deletions(-)
A user locks a SI and a component faults with comp_restart recovery during
remove callback on standby SU. After this when user tries to unlock SI, unlock
operation gets timed out.
When AMFND gets removal of assignment on standby SU (having three comps),
because of lock operation on SI, it issues removal callback to comp1. While
comp1 is handling removal callback another healthy component, which is still
assigned for a CSI of this SI, faults with comp_restart recovery. When comp2
gets repaired, AMF reassigns CSIs to it. In the meantime, when comp1 responds
for the removal callback AMFND does not issue removal callback to the CSI of
comp2 as it is in assigning state.
AMFND goes on and finishes removal in comp3. After successful reassignments in
comp2, AMFND does not issue removal callback to comp2. Due to this, AMFD did
not get response from AMFND for successful removal of SI.
Patch fixes the problem by issuing removal callback for a assigning CSI after
successful assignment.
diff --git a/osaf/services/saf/amf/amfnd/comp.cc
b/osaf/services/saf/amf/amfnd/comp.cc
--- a/osaf/services/saf/amf/amfnd/comp.cc
+++ b/osaf/services/saf/amf/amfnd/comp.cc
@@ -1558,6 +1558,18 @@ uint32_t avnd_comp_csi_assign_done(AVND_
rc = avnd_su_si_oper_done(cb, comp->su,
m_AVND_SU_IS_ALL_SI(comp->su) ? NULL : csi->si);
}
}
+
+ /*
+ If this CSI was in assigning state due to component restart
and that time removal
+ request came from AMFD, AMFND waits for the completion of
assignment.
+ After successful assignment, AMFND will start removal of CSI.
+ */
+ if ((csi->pending_removal == true) &&
+ ((csi->si->curr_assign_state ==
AVND_SU_SI_ASSIGN_STATE_REMOVING) ||
+ (csi->si->curr_assign_state ==
AVND_SU_SI_ASSIGN_STATE_REMOVED))) {
+ rc = avnd_comp_csi_remove(cb, csi->comp, csi);
+ csi->pending_removal = false;
+ }
} else { /* assign all the csis belonging to the next
rank in one shot */
/* get the first csi-record for this comp */
curr_csi =
m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&comp->csi_list));
@@ -1579,6 +1591,19 @@ done:
TRACE_LEAVE2("%u", rc);
return rc;
}
+
+static bool all_csis_in_si_removed(const AVND_SU_SI_REC *si) {
+ AVND_COMP_CSI_REC *csi;
+ for (csi = (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_FIRST(&si->csi_list);
+ csi;
+ csi = (AVND_COMP_CSI_REC
*)m_NCS_DBLIST_FIND_NEXT(&csi->si_dll_node))
+{
+
+ if (csi->curr_assign_state !=
AVND_COMP_CSI_ASSIGN_STATE_REMOVED)
+ return false;
+ }
+ return true;
+}
/**
* @brief Checks if all csis of all the sis in this su are in removed
state
*
@@ -1679,18 +1704,29 @@ uint32_t avnd_comp_csi_remove_done(AVND_
goto done;
}
else {
- curr_csi = (AVND_COMP_CSI_REC
*)m_NCS_DBLIST_FIND_PREV(&csi->si_dll_node);
-
- /* assign the csi */
- if (curr_csi)
- rc = avnd_comp_csi_remove(cb, curr_csi->comp,
curr_csi);
- else
- /* all csis belonging to the si are removed */
+ for (curr_csi = (AVND_COMP_CSI_REC
*)m_NCS_DBLIST_FIND_LAST(&csi->si->csi_list);
+ curr_csi;
+ curr_csi = (AVND_COMP_CSI_REC
*)m_NCS_DBLIST_FIND_PREV(&curr_csi->si_dll_node)) {
+ if
(m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVED(curr_csi))
+ continue;
+ else if
(m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(curr_csi))
+ break;
+ else if
(m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(curr_csi)) {
+ TRACE("'%s' is getting assigned, remove
it after assignment",
+ curr_csi->name.value);
+ curr_csi->pending_removal = true;
+ break;
+ }
+ else {
+ rc = avnd_comp_csi_remove(cb,
curr_csi->comp, curr_csi);
+ break;
+ }
+ }
+
+ /* all csis belonging to the si are removed */
+ if (all_csis_in_si_removed(csi->si) == true)
rc = avnd_su_si_oper_done(cb, comp->su,
m_AVND_SU_IS_ALL_SI(comp->su) ?
NULL : csi->si);
-
- if (NCSCC_RC_SUCCESS != rc)
- goto done;
}
} else {
/* Issue remove callback with TARGET_ALL for CSIs belonging to
prv rank.*/ diff --git a/osaf/services/saf/amf/amfnd/include/avnd_comp.h
b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
--- a/osaf/services/saf/amf/amfnd/include/avnd_comp.h
+++ b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
@@ -187,6 +187,11 @@ typedef struct avnd_comp_csi_rec {
SaNameT su_name; /* For Checkpointing */
AVSV_SUSI_ACT single_csi_add_rem_in_si; /* To detect whether single csi
removal is going on.*/
+ bool pending_removal; /*Flag is used when AMFND gets removal of
assignments from AMFD
+ when a CSI is still in assigning state. In such
case, AMFND can issue
+ removal callback only after CSI gets assigned.
AMFND will mark this flag
+ so that it can start removal after CSI is
assigned.
+ */
} AVND_COMP_CSI_REC;
#define AVND_COMP_CSI_REC_NULL ((AVND_COMP_CSI_REC *)0) diff --git
a/osaf/services/saf/amf/amfnd/sidb.cc b/osaf/services/saf/amf/amfnd/sidb.cc
--- a/osaf/services/saf/amf/amfnd/sidb.cc
+++ b/osaf/services/saf/amf/amfnd/sidb.cc
@@ -423,6 +423,7 @@ AVND_COMP_CSI_REC *avnd_su_si_csi_rec_ad
csi_rec->comp_name = comp->name;
csi_rec->si_name = si_rec->name;
csi_rec->su_name = su->name;
+ csi_rec->pending_removal = false;
return csi_rec;
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel