Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
Hi, The immsv/README obviously needs an update. /AndersBj -Original Message- From: Zoran Milinkovic [mailto:zoran.milinko...@ericsson.com] Sent: den 18 september 2015 15:27 To: Hung Nguyen D; reddy.neelaka...@oracle.com Cc: opensaf-devel@lists.sourceforge.net Subject: Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] Hi Hung, Find my comments inline. From: Hung Nguyen D Sent: Thursday, September 17, 2015 12:00 PM To: Zoran Milinkovic; reddy.neelaka...@oracle.com Cc: opensaf-devel@lists.sourceforge.net Subject: Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] Hi Zoran, Please see inline comments below. Best Regards, Hùng Nguyễn - DEK Technologies From: Zoran Milinkovic Sent: Wednesday, September 16, 2015 9:28PM To: Neelakanta Reddy Cc: Opensaf-devel Subject: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] osaf/services/saf/immsv/immnd/ImmModel.cc | 129 +++- osaf/services/saf/immsv/immnd/ImmModel.hh |5 + osaf/services/saf/immsv/immnd/immnd_evt.c | 125 ++- osaf/services/saf/immsv/immnd/immnd_init.h |6 + 4 files changed, 232 insertions(+), 33 deletions(-) The patch set prefix "IMM:" to all error string that come from IMM. Based on CCB abort type (resource or validation abort), error strings are prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c b/osaf/services/saf/immsv/immnd/immnd_evt.c --- a/osaf/services/saf/immsv/immnd/immnd_evt.c +++ b/osaf/services/saf/immsv/immnd/immnd_evt.c @@ -38,6 +38,10 @@ #define IMMND_SEARCH_BUNDLE_SIZE ((MDS_DIRECT_BUF_MAXSIZE / 100) * 90) #define IMMND_MAX_SEARCH_RESULT (IMMND_SEARCH_BUNDLE_SIZE / 300) +// Same strings exists in ImmModel.cc +#define IMM_VALIDATION_ABORT "IMM: Validation abort: " +#define IMM_RESOURCE_ABORT "IMM: Resource abort: " + [Hung] Can we expose these macros to saImmOm_A_2_x.h so that applications can use them? [Zoran] These strings are for internal use, and make them official in public headers is not a good idea. I know that it’s not the best solution to keep the same defined strings in two places. These error string should be described in a document, so that applications use the string pattern to distinguish between two kind of aborts. @@ -7413,14 +7503,23 @@ static void immnd_evt_proc_ccb_finalize( memset(&send_evt, '\0', sizeof(IMMSV_EVT)); send_evt.type = IMMSV_EVT_TYPE_IMMA; - send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; send_evt.info.imma.info.errRsp.error = err; + send_evt.info.imma.info.errRsp.errStrings = NULL; + + if(err == SA_AIS_OK) { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; + } else { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; + send_evt.info.imma.info.errRsp.errStrings = immModel_ccbGrabErrStrings(cb, evt->info.ccbId); + } [Hung] IMM_ERROR_2 should only be used when there's at least one error string. We can't make sure that when err is not SA_AIS_OK, there will be at least one error string. Please see immnd_evt_proc_object_create(). [Zoran] I will change this when I push the code @@ -7768,11 +7871,19 @@ static void immnd_evt_proc_ccb_apply(IMM memset(&send_evt, '\0', sizeof(IMMSV_EVT)); send_evt.type = IMMSV_EVT_TYPE_IMMA; send_evt.info.imma.info.errRsp.error = err; + send_evt.info.imma.info.errRsp.errStrings = NULL; send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; + if(err != SA_AIS_OK) { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; + send_evt.info.imma.info.errRsp.errStrings = immModel_ccbGrabErrStrings(cb, evt->info.objDelete.ccbId); + } + [Hung] The same as immnd_evt_proc_ccb_finalize(). [Zoran] I will change this when I push the code Thanks, Zoran -- ___ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel -- ___ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel
Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
Hi Hung, Find my comments inline. From: Hung Nguyen D Sent: Thursday, September 17, 2015 12:00 PM To: Zoran Milinkovic; reddy.neelaka...@oracle.com Cc: opensaf-devel@lists.sourceforge.net Subject: Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] Hi Zoran, Please see inline comments below. Best Regards, Hùng Nguyễn - DEK Technologies From: Zoran Milinkovic Sent: Wednesday, September 16, 2015 9:28PM To: Neelakanta Reddy Cc: Opensaf-devel Subject: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] osaf/services/saf/immsv/immnd/ImmModel.cc | 129 +++- osaf/services/saf/immsv/immnd/ImmModel.hh |5 + osaf/services/saf/immsv/immnd/immnd_evt.c | 125 ++- osaf/services/saf/immsv/immnd/immnd_init.h |6 + 4 files changed, 232 insertions(+), 33 deletions(-) The patch set prefix "IMM:" to all error string that come from IMM. Based on CCB abort type (resource or validation abort), error strings are prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c b/osaf/services/saf/immsv/immnd/immnd_evt.c --- a/osaf/services/saf/immsv/immnd/immnd_evt.c +++ b/osaf/services/saf/immsv/immnd/immnd_evt.c @@ -38,6 +38,10 @@ #define IMMND_SEARCH_BUNDLE_SIZE ((MDS_DIRECT_BUF_MAXSIZE / 100) * 90) #define IMMND_MAX_SEARCH_RESULT (IMMND_SEARCH_BUNDLE_SIZE / 300) +// Same strings exists in ImmModel.cc +#define IMM_VALIDATION_ABORT "IMM: Validation abort: " +#define IMM_RESOURCE_ABORT "IMM: Resource abort: " + [Hung] Can we expose these macros to saImmOm_A_2_x.h so that applications can use them? [Zoran] These strings are for internal use, and make them official in public headers is not a good idea. I know that it’s not the best solution to keep the same defined strings in two places. These error string should be described in a document, so that applications use the string pattern to distinguish between two kind of aborts. @@ -7413,14 +7503,23 @@ static void immnd_evt_proc_ccb_finalize( memset(&send_evt, '\0', sizeof(IMMSV_EVT)); send_evt.type = IMMSV_EVT_TYPE_IMMA; - send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; send_evt.info.imma.info.errRsp.error = err; + send_evt.info.imma.info.errRsp.errStrings = NULL; + + if(err == SA_AIS_OK) { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; + } else { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; + send_evt.info.imma.info.errRsp.errStrings = immModel_ccbGrabErrStrings(cb, evt->info.ccbId); + } [Hung] IMM_ERROR_2 should only be used when there's at least one error string. We can't make sure that when err is not SA_AIS_OK, there will be at least one error string. Please see immnd_evt_proc_object_create(). [Zoran] I will change this when I push the code @@ -7768,11 +7871,19 @@ static void immnd_evt_proc_ccb_apply(IMM memset(&send_evt, '\0', sizeof(IMMSV_EVT)); send_evt.type = IMMSV_EVT_TYPE_IMMA; send_evt.info.imma.info.errRsp.error = err; + send_evt.info.imma.info.errRsp.errStrings = NULL; send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; + if(err != SA_AIS_OK) { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; + send_evt.info.imma.info.errRsp.errStrings = immModel_ccbGrabErrStrings(cb, evt->info.objDelete.ccbId); + } + [Hung] The same as immnd_evt_proc_ccb_finalize(). [Zoran] I will change this when I push the code Thanks, Zoran -- ___ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel
Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
Hi Zoran, Please see inline comments below. Best Regards, Hùng Nguyễn - DEK Technologies *From:* Zoran Milinkovic *Sent:* Wednesday, September 16, 2015 9:28PM *To:* Neelakanta Reddy *Cc:* Opensaf-devel *Subject:* [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] osaf/services/saf/immsv/immnd/ImmModel.cc | 129 +++- osaf/services/saf/immsv/immnd/ImmModel.hh |5 + osaf/services/saf/immsv/immnd/immnd_evt.c | 125 ++- osaf/services/saf/immsv/immnd/immnd_init.h |6 + 4 files changed, 232 insertions(+), 33 deletions(-) The patch set prefix "IMM:" to all error string that come from IMM. Based on CCB abort type (resource or validation abort), error strings are prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -35,6 +35,9 @@ #define CCB_CRIT_THRESHOLD 8 /* See ImmModel::immNotPbeWritable */ #define SEARCH_TIMEOUT_SEC 600 /* Search timeout */ +// Same strings exists in immnd_evt.c +#define IMM_VALIDATION_ABORT "IMM: Validation abort: " +#define IMM_RESOURCE_ABORT "IMM: Resource abort: " struct ContinuationInfo2 { @@ -2145,6 +2148,23 @@ immModel_resourceDisplay(IMMND_CB *cb, resourceDisplay(reqparams, rparams, searchcount); } +void +immModel_setCcbErrorString(IMMND_CB *cb, SaUint32T ccbId, const char *errorString, ...) { +CcbVector::iterator cvi; +va_list vl; + +cvi = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); +if (cvi == sCcbVector.end()) { +/* Cannot find CCB. Error string will be ignored. + * This case should never happen. */ +return; +} + +va_start(vl, errorString); +ImmModel::instance(&cb->immModel)->setCcbErrorString(*cvi, errorString, vl); +va_end(vl); +} + /**/ ImmModel::ImmModel() : @@ -5019,6 +5039,8 @@ ImmModel::ccbApply(SaUint32T ccbId, LOG_NO("ERR_BAD_HANDLE: Admin owner id %u does not exist", ccb->mAdminOwnerId); ccb->mVeto = SA_AIS_ERR_BAD_HANDLE; +/* Later in the code, error code will be set to SA_AIS_ERR_FAILED_OPERATION */ +setCcbErrorString(ccb, IMM_RESOURCE_ABORT "Admin owner does not exist"); } else if(ccb->mState > IMM_CCB_READY) { if(ccb->mState == IMM_CCB_VALIDATING) { LOG_IN("Ccb <%u> in incorrect state 'CCB_VALIDATING for " @@ -5040,6 +5062,8 @@ ImmModel::ccbApply(SaUint32T ccbId, /* apply callback needs to be sent to implementers. */ err = SA_AIS_ERR_INTERRUPT; } +} else if(err == SA_AIS_ERR_FAILED_OPERATION) { +setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Completed validation failed"); } goto done; } @@ -5070,9 +5094,11 @@ ImmModel::ccbApply(SaUint32T ccbId, } err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Parent is missing"); } else if(!validateNoDanglingRefs(ccb)) { err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, IMM_VALIDATION_ABORT "No dangling validation failed"); } else { /* sMissingParents must be empty if err is SA_AIS_OK */ osafassert(sMissingParents.empty()); @@ -5111,6 +5137,8 @@ ImmModel::ccbApply(SaUint32T ccbId, "refusing apply", impInfo->mImplementerName.c_str()); err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, +IMM_RESOURCE_ABORT "Lost connection with implementer"); break; } //Wait for ack, possibly remote @@ -5699,7 +5727,7 @@ ImmModel::ccbAbort(SaUint32T ccbId, Conn not really any error at all, but mVeto should not be SA_AIS_OK. */ ccb->mVeto = SA_AIS_ERR_NO_RESOURCES; -setCcbErrorString(ccb, "Resource Error: CCB abort due to either " +setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB abort due to either " "OI t
Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
Ack from me. Not tested. /AndersBj -Original Message- From: Zoran Milinkovic [mailto:zoran.milinko...@ericsson.com] Sent: den 16 september 2015 16:28 To: reddy.neelaka...@oracle.com Cc: opensaf-devel@lists.sourceforge.net Subject: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] osaf/services/saf/immsv/immnd/ImmModel.cc | 129 +++- osaf/services/saf/immsv/immnd/ImmModel.hh |5 + osaf/services/saf/immsv/immnd/immnd_evt.c | 125 ++- osaf/services/saf/immsv/immnd/immnd_init.h |6 + 4 files changed, 232 insertions(+), 33 deletions(-) The patch set prefix "IMM:" to all error string that come from IMM. Based on CCB abort type (resource or validation abort), error strings are prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -35,6 +35,9 @@ #define CCB_CRIT_THRESHOLD 8 /* See ImmModel::immNotPbeWritable */ #define SEARCH_TIMEOUT_SEC 600 /* Search timeout */ +// Same strings exists in immnd_evt.c +#define IMM_VALIDATION_ABORT "IMM: Validation abort: " +#define IMM_RESOURCE_ABORT "IMM: Resource abort: " struct ContinuationInfo2 { @@ -2145,6 +2148,23 @@ immModel_resourceDisplay(IMMND_CB *cb, resourceDisplay(reqparams, rparams, searchcount); } +void +immModel_setCcbErrorString(IMMND_CB *cb, SaUint32T ccbId, const char *errorString, ...) { +CcbVector::iterator cvi; +va_list vl; + +cvi = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); +if (cvi == sCcbVector.end()) { +/* Cannot find CCB. Error string will be ignored. + * This case should never happen. */ +return; +} + +va_start(vl, errorString); +ImmModel::instance(&cb->immModel)->setCcbErrorString(*cvi, errorString, vl); +va_end(vl); +} + /**/ ImmModel::ImmModel() : @@ -5019,6 +5039,8 @@ ImmModel::ccbApply(SaUint32T ccbId, LOG_NO("ERR_BAD_HANDLE: Admin owner id %u does not exist", ccb->mAdminOwnerId); ccb->mVeto = SA_AIS_ERR_BAD_HANDLE; +/* Later in the code, error code will be set to SA_AIS_ERR_FAILED_OPERATION */ +setCcbErrorString(ccb, IMM_RESOURCE_ABORT "Admin owner does + not exist"); } else if(ccb->mState > IMM_CCB_READY) { if(ccb->mState == IMM_CCB_VALIDATING) { LOG_IN("Ccb <%u> in incorrect state 'CCB_VALIDATING for " @@ -5040,6 +5062,8 @@ ImmModel::ccbApply(SaUint32T ccbId, /* apply callback needs to be sent to implementers. */ err = SA_AIS_ERR_INTERRUPT; } +} else if(err == SA_AIS_ERR_FAILED_OPERATION) { +setCcbErrorString(ccb, IMM_VALIDATION_ABORT + "Completed validation failed"); } goto done; } @@ -5070,9 +5094,11 @@ ImmModel::ccbApply(SaUint32T ccbId, } err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Parent is + missing"); } else if(!validateNoDanglingRefs(ccb)) { err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, IMM_VALIDATION_ABORT "No dangling + validation failed"); } else { /* sMissingParents must be empty if err is SA_AIS_OK */ osafassert(sMissingParents.empty()); @@ -5111,6 +5137,8 @@ ImmModel::ccbApply(SaUint32T ccbId, "refusing apply", impInfo->mImplementerName.c_str()); err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, +IMM_RESOURCE_ABORT "Lost connection with + implementer"); break; } //Wait for ack, possibly remote @@ -5699,7 +5727,7 @@ ImmModel::ccbAbort(SaUint32T ccbId, Conn not really any error at all, but mVeto should not be SA_AIS_OK. */ ccb->mVeto = SA_AIS_ERR_NO_RESOURCES; -setCcbErrorString(ccb, "Resource Error: CCB abort due to either " +setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB abort due to either " "OI timeout or explicit abort request."); } @@ -6087,6 +6115,7 @@ ImmModel:
Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
Hi Anders, The answer to Johan is correct. All error strings are prefixed with "IMM:" string. Only error strings for error code SA_AIS_FAILED_OPRATION have prefix "IMM: Resource abort" or "IMM: Validation abort". I made static prefix in the new patch, so the typo will not be possible. Assertion because of missed error string would be too strict. If an error string is missing, then it would be considered as a resource abort. All validation aborts are covered. Thanks, Zoran -Original Message- From: Anders Widell Sent: Wednesday, September 02, 2015 1:00 PM To: Johan Mårtensson O; Zoran Milinkovic; reddy.neelaka...@oracle.com Cc: opensaf-devel@lists.sourceforge.net Subject: Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] Johan, I guess the abort classification only applies to the case when we return SA_AIS_ERR_FAILED_OPERATION, and that is the reason why some error strings have neither the "Resource abort" nor the "Validation abort" prefix in the patch below? Still I see a potential that this classification is forgotten, in some future modification of the code. Zoran, would it be possible to add some sort of assertion (or at least a log message) that can catch cases where the classification has been forgotten (or even the string has been misspelt) in the error string? / Anders Widell On 09/01/2015 10:56 AM, Johan Mårtensson O wrote: > Hi Zoran, > > See comments on the patch below. > > / Johan > > -Original Message- > From: Zoran Milinkovic [mailto:zoran.milinko...@ericsson.com] > Sent: den 28 augusti 2015 16:07 > To: reddy.neelaka...@oracle.com > Cc: opensaf-devel@lists.sourceforge.net > Subject: [devel] [PATCH 1 of 1] imm: classify abort error strings and > prefix existing error strings [#744] > > osaf/services/saf/immsv/immnd/ImmModel.cc | 126 > +++- > osaf/services/saf/immsv/immnd/ImmModel.hh |5 + > osaf/services/saf/immsv/immnd/immnd_evt.c | 48 ++- > osaf/services/saf/immsv/immnd/immnd_init.h |6 + > 4 files changed, 156 insertions(+), 29 deletions(-) > > > The patch set prefix "IMM:" to all error string that come from IMM. > Based on CCB abort type (resource or validation abort), error strings are > prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" > > diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc > b/osaf/services/saf/immsv/immnd/ImmModel.cc > --- a/osaf/services/saf/immsv/immnd/ImmModel.cc > +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc > @@ -2109,6 +2109,23 @@ immModel_resourceDisplay(IMMND_CB *cb, > resourceDisplay(reqparams, rparams, searchcount); } > > +void > +immModel_setCcbErrorString(IMMND_CB *cb, SaUint32T ccbId, const char > *errorString, ...) { > +CcbVector::iterator cvi; > +va_list vl; > + > +cvi = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); > +if (cvi == sCcbVector.end()) { > +/* Cannot find CCB. Error string will be ignored. > + * This case should never happen. */ > +return; > +} > + > +va_start(vl, errorString); > +ImmModel::instance(&cb->immModel)->setCcbErrorString(*cvi, errorString, > vl); > +va_end(vl); > +} > + > > /* > */ > > ImmModel::ImmModel() : > @@ -4982,6 +4999,8 @@ ImmModel::ccbApply(SaUint32T ccbId, > LOG_NO("ERR_BAD_HANDLE: Admin owner id %u does not exist", > ccb->mAdminOwnerId); > ccb->mVeto = SA_AIS_ERR_BAD_HANDLE; > +/* Later in the code, error code will be set to > SA_AIS_ERR_FAILED_OPERATION */ > +setCcbErrorString(ccb, "IMM: Resource abort: Admin owner > + does not exist"); > } else if(ccb->mState > IMM_CCB_READY) { > if(ccb->mState == IMM_CCB_VALIDATING) { > LOG_IN("Ccb <%u> in incorrect state 'CCB_VALIDATING for " > @@ -5003,6 +5022,8 @@ ImmModel::ccbApply(SaUint32T ccbId, > /* apply callback needs to be sent to > implementers. */ > err = SA_AIS_ERR_INTERRUPT; > } > +} else if(err == SA_AIS_ERR_FAILED_OPERATION) { > +setCcbErrorString(ccb, "IMM: Validation abort: > + Completed validation failed"); > } > goto done; > } > @@ -5033,9 +5054,11 @@ ImmModel::ccbApply(SaUint32T ccbId, > } > err =
Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
Hi Hung, I fixed all your comments in the new patch. Find more details in the email sent to Neelakanta. Thanks, Zoran From: Hung Nguyen [mailto:hung.d.ngu...@dektech.com.au] Sent: Monday, August 31, 2015 8:51 PM To: Zoran Milinkovic; reddy.neelaka...@oracle.com Cc: opensaf-devel@lists.sourceforge.net Subject: Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] Hi Zoran, I have some inline comments, please see below for details. Best Regards, Hung Nguyen DEK Technologies Vietnam From: Zoran Milinkovic Sent: Friday, August 28, 2015 9:06PM To: Neelakanta Reddy Cc: Opensaf-devel Subject: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] osaf/services/saf/immsv/immnd/ImmModel.cc | 126 +++- osaf/services/saf/immsv/immnd/ImmModel.hh |5 + osaf/services/saf/immsv/immnd/immnd_evt.c | 48 ++- osaf/services/saf/immsv/immnd/immnd_init.h |6 + 4 files changed, 156 insertions(+), 29 deletions(-) The patch set prefix "IMM:" to all error string that come from IMM. Based on CCB abort type (resource or validation abort), error strings are prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -2109,6 +2109,23 @@ immModel_resourceDisplay(IMMND_CB *cb, resourceDisplay(reqparams, rparams, searchcount); } +void +immModel_setCcbErrorString(IMMND_CB *cb, SaUint32T ccbId, const char *errorString, ...) { +CcbVector::iterator cvi; +va_list vl; + +cvi = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); +if (cvi == sCcbVector.end()) { +/* Cannot find CCB. Error string will be ignored. + * This case should never happen. */ +return; +} + +va_start(vl, errorString); +ImmModel::instance(&cb->immModel)->setCcbErrorString(*cvi, errorString, vl); +va_end(vl); +} + /**/ ImmModel::ImmModel() : @@ -4982,6 +4999,8 @@ ImmModel::ccbApply(SaUint32T ccbId, LOG_NO("ERR_BAD_HANDLE: Admin owner id %u does not exist", ccb->mAdminOwnerId); ccb->mVeto = SA_AIS_ERR_BAD_HANDLE; +/* Later in the code, error code will be set to SA_AIS_ERR_FAILED_OPERATION */ +setCcbErrorString(ccb, "IMM: Resource abort: Admin owner does not exist"); } else if(ccb->mState > IMM_CCB_READY) { if(ccb->mState == IMM_CCB_VALIDATING) { LOG_IN("Ccb <%u> in incorrect state 'CCB_VALIDATING for " @@ -5003,6 +5022,8 @@ ImmModel::ccbApply(SaUint32T ccbId, /* apply callback needs to be sent to implementers. */ err = SA_AIS_ERR_INTERRUPT; } +} else if(err == SA_AIS_ERR_FAILED_OPERATION) { +setCcbErrorString(ccb, "IMM: Validation abort: Completed validation failed"); } goto done; } @@ -5033,9 +5054,11 @@ ImmModel::ccbApply(SaUint32T ccbId, } err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, "IMM: Validation abort: Parent is missing"); } else if(!validateNoDanglingRefs(ccb)) { err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, "IMM: Validation abort: No dangling validation failed"); } else { /* sMissingParents must be empty if err is SA_AIS_OK */ osafassert(sMissingParents.empty()); @@ -5074,6 +5097,8 @@ ImmModel::ccbApply(SaUint32T ccbId, "refusing apply", impInfo->mImplementerName.c_str()); err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, +"IMM: Resource abort: Lost connection with implementer"); break; } //Wait for ack, possibly remote @@ -5662,7 +5687,7 @@ ImmModel::ccbAbort(SaUint32T ccbId, Conn not really any error at all, but mVeto should not be SA_AIS_OK. */ ccb->mVeto = SA_AIS_ERR_NO_RESOURCES; -setCcbErrorString(ccb, "Resource Error: CCB abort due to either " +setCcbErrorString(ccb, "
[devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
osaf/services/saf/immsv/immnd/ImmModel.cc | 129 +++- osaf/services/saf/immsv/immnd/ImmModel.hh |5 + osaf/services/saf/immsv/immnd/immnd_evt.c | 125 ++- osaf/services/saf/immsv/immnd/immnd_init.h |6 + 4 files changed, 232 insertions(+), 33 deletions(-) The patch set prefix "IMM:" to all error string that come from IMM. Based on CCB abort type (resource or validation abort), error strings are prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -35,6 +35,9 @@ #define CCB_CRIT_THRESHOLD 8 /* See ImmModel::immNotPbeWritable */ #define SEARCH_TIMEOUT_SEC 600 /* Search timeout */ +// Same strings exists in immnd_evt.c +#define IMM_VALIDATION_ABORT "IMM: Validation abort: " +#define IMM_RESOURCE_ABORT "IMM: Resource abort: " struct ContinuationInfo2 { @@ -2145,6 +2148,23 @@ immModel_resourceDisplay(IMMND_CB *cb, resourceDisplay(reqparams, rparams, searchcount); } +void +immModel_setCcbErrorString(IMMND_CB *cb, SaUint32T ccbId, const char *errorString, ...) { +CcbVector::iterator cvi; +va_list vl; + +cvi = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); +if (cvi == sCcbVector.end()) { +/* Cannot find CCB. Error string will be ignored. + * This case should never happen. */ +return; +} + +va_start(vl, errorString); +ImmModel::instance(&cb->immModel)->setCcbErrorString(*cvi, errorString, vl); +va_end(vl); +} + /**/ ImmModel::ImmModel() : @@ -5019,6 +5039,8 @@ ImmModel::ccbApply(SaUint32T ccbId, LOG_NO("ERR_BAD_HANDLE: Admin owner id %u does not exist", ccb->mAdminOwnerId); ccb->mVeto = SA_AIS_ERR_BAD_HANDLE; +/* Later in the code, error code will be set to SA_AIS_ERR_FAILED_OPERATION */ +setCcbErrorString(ccb, IMM_RESOURCE_ABORT "Admin owner does not exist"); } else if(ccb->mState > IMM_CCB_READY) { if(ccb->mState == IMM_CCB_VALIDATING) { LOG_IN("Ccb <%u> in incorrect state 'CCB_VALIDATING for " @@ -5040,6 +5062,8 @@ ImmModel::ccbApply(SaUint32T ccbId, /* apply callback needs to be sent to implementers. */ err = SA_AIS_ERR_INTERRUPT; } +} else if(err == SA_AIS_ERR_FAILED_OPERATION) { +setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Completed validation failed"); } goto done; } @@ -5070,9 +5094,11 @@ ImmModel::ccbApply(SaUint32T ccbId, } err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Parent is missing"); } else if(!validateNoDanglingRefs(ccb)) { err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, IMM_VALIDATION_ABORT "No dangling validation failed"); } else { /* sMissingParents must be empty if err is SA_AIS_OK */ osafassert(sMissingParents.empty()); @@ -5111,6 +5137,8 @@ ImmModel::ccbApply(SaUint32T ccbId, "refusing apply", impInfo->mImplementerName.c_str()); err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, +IMM_RESOURCE_ABORT "Lost connection with implementer"); break; } //Wait for ack, possibly remote @@ -5699,7 +5727,7 @@ ImmModel::ccbAbort(SaUint32T ccbId, Conn not really any error at all, but mVeto should not be SA_AIS_OK. */ ccb->mVeto = SA_AIS_ERR_NO_RESOURCES; -setCcbErrorString(ccb, "Resource Error: CCB abort due to either " +setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB abort due to either " "OI timeout or explicit abort request."); } @@ -6087,6 +6115,7 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up rsp->inv, ccbId); if(ccb->mVeto == SA_AIS_OK) { ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +/* Note: This error code is returned to OI. Parent CCB is aborted */ err = SA_AIS_ERR_BAD_OPERATION; } goto done; @@ -6108,6 +6137,7 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up TRACE("Ccb %u is already in an error state %u, can not accept augmentation", ccbId, ccb->mVeto); err = SA_AIS_ERR_FAILED_OPERATION; /*ccb->mVeto;*/ +set
Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
Johan, I guess the abort classification only applies to the case when we return SA_AIS_ERR_FAILED_OPERATION, and that is the reason why some error strings have neither the "Resource abort" nor the "Validation abort" prefix in the patch below? Still I see a potential that this classification is forgotten, in some future modification of the code. Zoran, would it be possible to add some sort of assertion (or at least a log message) that can catch cases where the classification has been forgotten (or even the string has been misspelt) in the error string? / Anders Widell On 09/01/2015 10:56 AM, Johan Mårtensson O wrote: > Hi Zoran, > > See comments on the patch below. > > / Johan > > -Original Message- > From: Zoran Milinkovic [mailto:zoran.milinko...@ericsson.com] > Sent: den 28 augusti 2015 16:07 > To: reddy.neelaka...@oracle.com > Cc: opensaf-devel@lists.sourceforge.net > Subject: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix > existing error strings [#744] > > osaf/services/saf/immsv/immnd/ImmModel.cc | 126 > +++- > osaf/services/saf/immsv/immnd/ImmModel.hh |5 + > osaf/services/saf/immsv/immnd/immnd_evt.c | 48 ++- > osaf/services/saf/immsv/immnd/immnd_init.h |6 + > 4 files changed, 156 insertions(+), 29 deletions(-) > > > The patch set prefix "IMM:" to all error string that come from IMM. > Based on CCB abort type (resource or validation abort), error strings are > prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" > > diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc > b/osaf/services/saf/immsv/immnd/ImmModel.cc > --- a/osaf/services/saf/immsv/immnd/ImmModel.cc > +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc > @@ -2109,6 +2109,23 @@ immModel_resourceDisplay(IMMND_CB *cb, > resourceDisplay(reqparams, rparams, searchcount); } > > +void > +immModel_setCcbErrorString(IMMND_CB *cb, SaUint32T ccbId, const char > *errorString, ...) { > +CcbVector::iterator cvi; > +va_list vl; > + > +cvi = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); > +if (cvi == sCcbVector.end()) { > +/* Cannot find CCB. Error string will be ignored. > + * This case should never happen. */ > +return; > +} > + > +va_start(vl, errorString); > +ImmModel::instance(&cb->immModel)->setCcbErrorString(*cvi, errorString, > vl); > +va_end(vl); > +} > + > /**/ > > ImmModel::ImmModel() : > @@ -4982,6 +4999,8 @@ ImmModel::ccbApply(SaUint32T ccbId, > LOG_NO("ERR_BAD_HANDLE: Admin owner id %u does not exist", > ccb->mAdminOwnerId); > ccb->mVeto = SA_AIS_ERR_BAD_HANDLE; > +/* Later in the code, error code will be set to > SA_AIS_ERR_FAILED_OPERATION */ > +setCcbErrorString(ccb, "IMM: Resource abort: Admin owner > + does not exist"); > } else if(ccb->mState > IMM_CCB_READY) { > if(ccb->mState == IMM_CCB_VALIDATING) { > LOG_IN("Ccb <%u> in incorrect state 'CCB_VALIDATING for " > @@ -5003,6 +5022,8 @@ ImmModel::ccbApply(SaUint32T ccbId, > /* apply callback needs to be sent to > implementers. */ > err = SA_AIS_ERR_INTERRUPT; > } > +} else if(err == SA_AIS_ERR_FAILED_OPERATION) { > +setCcbErrorString(ccb, "IMM: Validation abort: > + Completed validation failed"); > } > goto done; > } > @@ -5033,9 +5054,11 @@ ImmModel::ccbApply(SaUint32T ccbId, > } > err = SA_AIS_ERR_FAILED_OPERATION; > ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; > +setCcbErrorString(ccb, "IMM: Validation abort: Parent is > + missing"); > } else if(!validateNoDanglingRefs(ccb)) { > err = SA_AIS_ERR_FAILED_OPERATION; > ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; > +setCcbErrorString(ccb, "IMM: Validation abort: No dangling > + validation failed"); > } else { > /* sMissingParents must be empty if err is SA_AIS_OK */ > osafassert(sMissingParents.empty()); > @@ -5074,6 +5097,8 @@ ImmModel::ccbApply(SaUint32T ccbId, > "refusing apply", > impInfo->mImplementerName.c_str()); > err = SA_AIS_ERR_FAIL
Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
Hi Zoran, See comments on the patch below. / Johan -Original Message- From: Zoran Milinkovic [mailto:zoran.milinko...@ericsson.com] Sent: den 28 augusti 2015 16:07 To: reddy.neelaka...@oracle.com Cc: opensaf-devel@lists.sourceforge.net Subject: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] osaf/services/saf/immsv/immnd/ImmModel.cc | 126 +++- osaf/services/saf/immsv/immnd/ImmModel.hh |5 + osaf/services/saf/immsv/immnd/immnd_evt.c | 48 ++- osaf/services/saf/immsv/immnd/immnd_init.h |6 + 4 files changed, 156 insertions(+), 29 deletions(-) The patch set prefix "IMM:" to all error string that come from IMM. Based on CCB abort type (resource or validation abort), error strings are prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -2109,6 +2109,23 @@ immModel_resourceDisplay(IMMND_CB *cb, resourceDisplay(reqparams, rparams, searchcount); } +void +immModel_setCcbErrorString(IMMND_CB *cb, SaUint32T ccbId, const char *errorString, ...) { +CcbVector::iterator cvi; +va_list vl; + +cvi = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); +if (cvi == sCcbVector.end()) { +/* Cannot find CCB. Error string will be ignored. + * This case should never happen. */ +return; +} + +va_start(vl, errorString); +ImmModel::instance(&cb->immModel)->setCcbErrorString(*cvi, errorString, vl); +va_end(vl); +} + /**/ ImmModel::ImmModel() : @@ -4982,6 +4999,8 @@ ImmModel::ccbApply(SaUint32T ccbId, LOG_NO("ERR_BAD_HANDLE: Admin owner id %u does not exist", ccb->mAdminOwnerId); ccb->mVeto = SA_AIS_ERR_BAD_HANDLE; +/* Later in the code, error code will be set to SA_AIS_ERR_FAILED_OPERATION */ +setCcbErrorString(ccb, "IMM: Resource abort: Admin owner + does not exist"); } else if(ccb->mState > IMM_CCB_READY) { if(ccb->mState == IMM_CCB_VALIDATING) { LOG_IN("Ccb <%u> in incorrect state 'CCB_VALIDATING for " @@ -5003,6 +5022,8 @@ ImmModel::ccbApply(SaUint32T ccbId, /* apply callback needs to be sent to implementers. */ err = SA_AIS_ERR_INTERRUPT; } +} else if(err == SA_AIS_ERR_FAILED_OPERATION) { +setCcbErrorString(ccb, "IMM: Validation abort: + Completed validation failed"); } goto done; } @@ -5033,9 +5054,11 @@ ImmModel::ccbApply(SaUint32T ccbId, } err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, "IMM: Validation abort: Parent is + missing"); } else if(!validateNoDanglingRefs(ccb)) { err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, "IMM: Validation abort: No dangling + validation failed"); } else { /* sMissingParents must be empty if err is SA_AIS_OK */ osafassert(sMissingParents.empty()); @@ -5074,6 +5097,8 @@ ImmModel::ccbApply(SaUint32T ccbId, "refusing apply", impInfo->mImplementerName.c_str()); err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, +"IMM: Resource abort: Lost connection with + implementer"); break; } //Wait for ack, possibly remote @@ -5662,7 +5687,7 @@ ImmModel::ccbAbort(SaUint32T ccbId, Conn not really any error at all, but mVeto should not be SA_AIS_OK. */ ccb->mVeto = SA_AIS_ERR_NO_RESOURCES; -setCcbErrorString(ccb, "Resource Error: CCB abort due to either " +setCcbErrorString(ccb, "IMM: Resource abort: CCB abort due to either " "OI timeout or explicit abort request."); } @@ -6050,6 +6075,7 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up rsp->inv, ccbId); if(ccb->mVeto == SA_AIS_OK) { ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +/* Note: This error code is returned to OI. Parent CCB is + aborted */ err = SA_AIS_ERR_BAD_OPERATION; } goto do
Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
Hi Zoran, I have some inline comments, please see below for details. Best Regards, Hung Nguyen DEK Technologies Vietnam *From:*Zoran Milinkovic *Sent:*Friday, August 28, 2015 9:06PM *To:*Neelakanta Reddy *Cc:*Opensaf-devel *Subject:*[devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744] osaf/services/saf/immsv/immnd/ImmModel.cc | 126 +++- osaf/services/saf/immsv/immnd/ImmModel.hh |5 + osaf/services/saf/immsv/immnd/immnd_evt.c | 48 ++- osaf/services/saf/immsv/immnd/immnd_init.h |6 + 4 files changed, 156 insertions(+), 29 deletions(-) The patch set prefix "IMM:" to all error string that come from IMM. Based on CCB abort type (resource or validation abort), error strings are prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -2109,6 +2109,23 @@ immModel_resourceDisplay(IMMND_CB *cb, resourceDisplay(reqparams, rparams, searchcount); } +void +immModel_setCcbErrorString(IMMND_CB *cb, SaUint32T ccbId, const char *errorString, ...) { +CcbVector::iterator cvi; +va_list vl; + +cvi = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); +if (cvi == sCcbVector.end()) { +/* Cannot find CCB. Error string will be ignored. + * This case should never happen. */ +return; +} + +va_start(vl, errorString); +ImmModel::instance(&cb->immModel)->setCcbErrorString(*cvi, errorString, vl); +va_end(vl); +} + /**/ ImmModel::ImmModel() : @@ -4982,6 +4999,8 @@ ImmModel::ccbApply(SaUint32T ccbId, LOG_NO("ERR_BAD_HANDLE: Admin owner id %u does not exist", ccb->mAdminOwnerId); ccb->mVeto = SA_AIS_ERR_BAD_HANDLE; +/* Later in the code, error code will be set to SA_AIS_ERR_FAILED_OPERATION */ +setCcbErrorString(ccb, "IMM: Resource abort: Admin owner does not exist"); } else if(ccb->mState > IMM_CCB_READY) { if(ccb->mState == IMM_CCB_VALIDATING) { LOG_IN("Ccb <%u> in incorrect state 'CCB_VALIDATING for " @@ -5003,6 +5022,8 @@ ImmModel::ccbApply(SaUint32T ccbId, /* apply callback needs to be sent to implementers. */ err = SA_AIS_ERR_INTERRUPT; } +} else if(err == SA_AIS_ERR_FAILED_OPERATION) { +setCcbErrorString(ccb, "IMM: Validation abort: Completed validation failed"); } goto done; } @@ -5033,9 +5054,11 @@ ImmModel::ccbApply(SaUint32T ccbId, } err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, "IMM: Validation abort: Parent is missing"); } else if(!validateNoDanglingRefs(ccb)) { err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, "IMM: Validation abort: No dangling validation failed"); } else { /* sMissingParents must be empty if err is SA_AIS_OK */ osafassert(sMissingParents.empty()); @@ -5074,6 +5097,8 @@ ImmModel::ccbApply(SaUint32T ccbId, "refusing apply", impInfo->mImplementerName.c_str()); err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, +"IMM: Resource abort: Lost connection with implementer"); break; } //Wait for ack, possibly remote @@ -5662,7 +5687,7 @@ ImmModel::ccbAbort(SaUint32T ccbId, Conn not really any error at all, but mVeto should not be SA_AIS_OK. */ ccb->mVeto = SA_AIS_ERR_NO_RESOURCES; -setCcbErrorString(ccb, "Resource Error: CCB abort due to either " +setCcbErrorString(ccb, "IMM: Resource abort: CCB abort due to either " "OI timeout or explicit abort request."); } @@ -6050,6 +6075,7 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up rsp->inv, ccbId); if(ccb->mVeto == SA_AIS_OK) { ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +/* Note: This error code is returned to OI. Parent CCB is aborted */
[devel] [PATCH 1 of 1] imm: classify abort error strings and prefix existing error strings [#744]
osaf/services/saf/immsv/immnd/ImmModel.cc | 126 +++- osaf/services/saf/immsv/immnd/ImmModel.hh |5 + osaf/services/saf/immsv/immnd/immnd_evt.c | 48 ++- osaf/services/saf/immsv/immnd/immnd_init.h |6 + 4 files changed, 156 insertions(+), 29 deletions(-) The patch set prefix "IMM:" to all error string that come from IMM. Based on CCB abort type (resource or validation abort), error strings are prefixed with "IMM: Resource abort:" or "IMM: Validation abort:" diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -2109,6 +2109,23 @@ immModel_resourceDisplay(IMMND_CB *cb, resourceDisplay(reqparams, rparams, searchcount); } +void +immModel_setCcbErrorString(IMMND_CB *cb, SaUint32T ccbId, const char *errorString, ...) { +CcbVector::iterator cvi; +va_list vl; + +cvi = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); +if (cvi == sCcbVector.end()) { +/* Cannot find CCB. Error string will be ignored. + * This case should never happen. */ +return; +} + +va_start(vl, errorString); +ImmModel::instance(&cb->immModel)->setCcbErrorString(*cvi, errorString, vl); +va_end(vl); +} + /**/ ImmModel::ImmModel() : @@ -4982,6 +4999,8 @@ ImmModel::ccbApply(SaUint32T ccbId, LOG_NO("ERR_BAD_HANDLE: Admin owner id %u does not exist", ccb->mAdminOwnerId); ccb->mVeto = SA_AIS_ERR_BAD_HANDLE; +/* Later in the code, error code will be set to SA_AIS_ERR_FAILED_OPERATION */ +setCcbErrorString(ccb, "IMM: Resource abort: Admin owner does not exist"); } else if(ccb->mState > IMM_CCB_READY) { if(ccb->mState == IMM_CCB_VALIDATING) { LOG_IN("Ccb <%u> in incorrect state 'CCB_VALIDATING for " @@ -5003,6 +5022,8 @@ ImmModel::ccbApply(SaUint32T ccbId, /* apply callback needs to be sent to implementers. */ err = SA_AIS_ERR_INTERRUPT; } +} else if(err == SA_AIS_ERR_FAILED_OPERATION) { +setCcbErrorString(ccb, "IMM: Validation abort: Completed validation failed"); } goto done; } @@ -5033,9 +5054,11 @@ ImmModel::ccbApply(SaUint32T ccbId, } err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, "IMM: Validation abort: Parent is missing"); } else if(!validateNoDanglingRefs(ccb)) { err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, "IMM: Validation abort: No dangling validation failed"); } else { /* sMissingParents must be empty if err is SA_AIS_OK */ osafassert(sMissingParents.empty()); @@ -5074,6 +5097,8 @@ ImmModel::ccbApply(SaUint32T ccbId, "refusing apply", impInfo->mImplementerName.c_str()); err = SA_AIS_ERR_FAILED_OPERATION; ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +setCcbErrorString(ccb, +"IMM: Resource abort: Lost connection with implementer"); break; } //Wait for ack, possibly remote @@ -5662,7 +5687,7 @@ ImmModel::ccbAbort(SaUint32T ccbId, Conn not really any error at all, but mVeto should not be SA_AIS_OK. */ ccb->mVeto = SA_AIS_ERR_NO_RESOURCES; -setCcbErrorString(ccb, "Resource Error: CCB abort due to either " +setCcbErrorString(ccb, "IMM: Resource abort: CCB abort due to either " "OI timeout or explicit abort request."); } @@ -6050,6 +6075,7 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up rsp->inv, ccbId); if(ccb->mVeto == SA_AIS_OK) { ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; +/* Note: This error code is returned to OI. Parent CCB is aborted */ err = SA_AIS_ERR_BAD_OPERATION; } goto done; @@ -6071,6 +6097,7 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up TRACE("Ccb %u is already in an error state %u, can not accept augmentation", ccbId, ccb->mVeto); err = SA_AIS_ERR_FAILED_OPERATION; /*ccb->mVeto;*/ +setCcbErrorString(ccb, "IMM: Resource abort: CCB is in an error state"); goto done; } @@ -6823,6 +6850,7 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state " "rejecting ccbObjectCreate operation ", ccbId); err = SA_AIS_ERR_FAILED_OPERATION;