ack, code review only/Thanks HansN
On 09/08/2016 02:01 PM, Minh Hon Chau wrote: > osaf/libs/common/amf/include/amf_db_template.h | 11 +++++++++++ > osaf/services/saf/amf/amfnd/clc.cc | 6 ++++++ > osaf/services/saf/amf/amfnd/term.cc | 16 ++-------------- > 3 files changed, 19 insertions(+), 14 deletions(-) > > > During cluster shutting down phase, if both controllers do not shutdown > fast enough and active controller goes down first, then a possibility of > sc failover happens. In this situation, avnd_last_step_clean() gets called > twice, a coredump is generated. It most likely because deleting record in > nodeid_mdsdest_db and hctypedb but those container still own the key. Thus, > the second call of avnd_last_step_clean() cause coredump. > > Patch ensure deletion of nodeid_mdsdest_db and hctypedb is the last step > before exit > > diff --git a/osaf/libs/common/amf/include/amf_db_template.h > b/osaf/libs/common/amf/include/amf_db_template.h > --- a/osaf/libs/common/amf/include/amf_db_template.h > +++ b/osaf/libs/common/amf/include/amf_db_template.h > @@ -73,6 +73,7 @@ class AmfDb { > public: > unsigned int insert(const Key &key, T *obj); > void erase(const Key &key); > + void deleteAll(); > T *find(const Key &name); > T *findNext(const Key &name); > > @@ -120,6 +121,16 @@ void AmfDb<Key, T>::erase(const Key &key > > // > template <typename Key, typename T> > +void AmfDb<Key, T>::deleteAll() { > + for (const auto& it: db) { > + delete it.second; > + } > + db.clear(); > +} > + > + > +// > +template <typename Key, typename T> > T *AmfDb<Key, T>::find(const Key &key) { > typename AmfDbMap::iterator it = db.find(key); > if (it == db.end()) > diff --git a/osaf/services/saf/amf/amfnd/clc.cc > b/osaf/services/saf/amf/amfnd/clc.cc > --- a/osaf/services/saf/amf/amfnd/clc.cc > +++ b/osaf/services/saf/amf/amfnd/clc.cc > @@ -815,6 +815,8 @@ uint32_t avnd_comp_clc_fsm_run(AVND_CB * > if (all_comps_terminated()) { > LOG_NO("Terminated all AMF components"); > LOG_NO("Shutdown completed, exiting"); > + cb->nodeid_mdsdest_db.deleteAll(); > + cb->hctypedb.deleteAll(); > exit(0); > } else { > TRACE("Do nothing"); > @@ -2301,6 +2303,8 @@ uint32_t avnd_comp_clc_terming_cleansucc > if (all_comps_terminated()) { > LOG_NO("Terminated all AMF components"); > LOG_NO("Shutdown completed, exiting"); > + cb->nodeid_mdsdest_db.deleteAll(); > + cb->hctypedb.deleteAll(); > exit(0); > } > } > @@ -2362,6 +2366,8 @@ uint32_t avnd_comp_clc_terming_cleanfail > all_comps_terminated()) { > LOG_WA("Terminated all AMF components (with failures)"); > LOG_NO("Shutdown completed, exiting"); > + cb->nodeid_mdsdest_db.deleteAll(); > + cb->hctypedb.deleteAll(); > exit(0); > } > > diff --git a/osaf/services/saf/amf/amfnd/term.cc > b/osaf/services/saf/amf/amfnd/term.cc > --- a/osaf/services/saf/amf/amfnd/term.cc > +++ b/osaf/services/saf/amf/amfnd/term.cc > @@ -58,8 +58,6 @@ extern const AVND_EVT_HDLR g_avnd_func_l > void avnd_last_step_clean(AVND_CB *cb) > { > AVND_COMP *comp; > - AVND_NODEID_TO_MDSDEST_MAP *rec = nullptr; > - AVND_HCTYPE *hc = nullptr; > int cleanup_call_cnt = 0; > > TRACE_ENTER(); > @@ -86,21 +84,11 @@ void avnd_last_step_clean(AVND_CB *cb) > /* Stop was called early or some other problem */ > if (cleanup_call_cnt == 0) { > LOG_NO("No component to terminate, exiting"); > + cb->nodeid_mdsdest_db.deleteAll(); > + cb->hctypedb.deleteAll(); > exit(0); > } > > - /* Clean all node id stored in nodeid_mdsdest_db */ > - for (const auto& node: cb->nodeid_mdsdest_db) { > - rec = node.second; > - delete rec; > - } > - > - /* Clean all hctype stored in cb->hctypedb */ > - for (const auto& hctype: cb->hctypedb) { > - hc = hctype.second; > - delete hc; > - } > - > TRACE_LEAVE(); > } > ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel