Hi zoran,

Ideally, the errorstrings should capture all errors, that are the result 
of ccb apply.
i.e : if the validation error is coming from more than one implementer 
then these errors needs to be captured and sent to OM.
In the present patch, only one validation abort is added.

README:

Multiple error strings may however be set from different OIs
in different callbacks related to the same OM downcall (e.g.
saImmOmCcbApply).

/Neel.

On Monday 26 October 2015 03:57 PM, Zoran Milinkovic wrote:
>   osaf/services/saf/immsv/immnd/ImmModel.cc |  103 
> +++++++++--------------------
>   1 files changed, 31 insertions(+), 72 deletions(-)
>
>
> The patch add a precedence of validation error string over resource abort 
> error string.
> If resource abort error string exists, it will be overwritten by validation 
> abort error string.
> If at least one validation abort error string exist, new resource abort error 
> string will not be adda.
>
> Since the new check of abort error strings is done in setCcbErrorString, the 
> patch removes earlier code for ignoring several abort error strings.
>
> 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
> @@ -5185,22 +5185,7 @@ ImmModel::ccbApply(SaUint32T ccbId,
>           osafassert(reqConn==0 || (ccb->mOriginatingConn == reqConn));
>           
>           if(!ccb->isOk()) {
> -            /* At this point, CCB might already have error string with CCB 
> abort reason.
> -             * If none CCB abort reason can be found in error strings,
> -             * then it's a resource abort.
> -            */
> -            ImmsvAttrNameList *errStr = ccb->mErrorStrings;
> -            while(errStr) {
> -                if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
> errStr->name.buf
> -                        || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
> errStr->name.buf) {
> -                    break;
> -                }
> -                errStr = errStr->next;
> -            }
> -            if(!errStr) {
> -                setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an 
> error state");
> -            }
> -
> +            setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
> state");
>               err = SA_AIS_ERR_FAILED_OPERATION;
>           } else if((sImmNodeState == IMM_NODE_LOADING) && 
> !sMissingParents.empty()) {
>               MissingParentsMap::iterator mpm;
> @@ -6254,20 +6239,7 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up
>       if(ccb->mVeto != SA_AIS_OK) {
>           TRACE("Ccb %u is already in an error state %u, can not accept 
> augmentation",
>                ccbId, ccb->mVeto);
> -
> -        /* ccb->mVeto != SA_AIS_OK, error string with abort reason can 
> already be set */
> -        ImmsvAttrNameList *errStr = ccb->mErrorStrings;
> -        while(errStr) {
> -            if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
> errStr->name.buf
> -                    || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
> errStr->name.buf) {
> -                break;
> -            }
> -            errStr = errStr->next;
> -        }
> -        if(!errStr) {
> -            setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
> state");
> -        }
> -
> +        setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
> state");
>           err = SA_AIS_ERR_FAILED_OPERATION; /*ccb->mVeto;*/
>           goto done;
>       }
> @@ -7020,21 +6992,8 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im
>       if(!ccb->isOk()) {
>           LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state "
>               "rejecting ccbObjectCreate operation ", ccbId);
> -
> -        /* !ccb->isOk(), error string with abort reason can already be set */
> -        ImmsvAttrNameList *errStr = ccb->mErrorStrings;
> -        while(errStr) {
> -            if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
> errStr->name.buf
> -                    || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
> errStr->name.buf) {
> -                break;
> -            }
> -            errStr = errStr->next;
> -        }
> -        if(!errStr) {
> -            setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
> state");
> -        }
> -
>           err = SA_AIS_ERR_FAILED_OPERATION;
> +        setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
> state");
>           goto ccbObjectCreateExit;
>       }
>   
> @@ -8192,21 +8151,8 @@ ImmModel::ccbObjectModify(const ImmsvOmC
>       if(!ccb->isOk()) {
>           LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state "
>               "rejecting ccbObjectModify operation ", ccbId);
> -
> -        /* !ccb->isOk(), error string with abort reason can already be set */
> -        ImmsvAttrNameList *errStr = ccb->mErrorStrings;
> -        while(errStr) {
> -            if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
> errStr->name.buf
> -                    || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
> errStr->name.buf) {
> -                break;
> -            }
> -            errStr = errStr->next;
> -        }
> -        if(!errStr) {
> -            setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
> state");
> -        }
> -
>           err = SA_AIS_ERR_FAILED_OPERATION;
> +        setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
> state");
>           goto ccbObjectModifyExit;
>       }
>       
> @@ -9154,21 +9100,8 @@ ImmModel::ccbObjectDelete(const ImmsvOmC
>       if(!ccb->isOk()) {
>           LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state "
>               "rejecting ccbObjectDelete operation ", ccbId);
> -
> -        /* !ccb->isOk(), error string with abort reason can already be set */
> -        ImmsvAttrNameList *errStr = ccb->mErrorStrings;
> -        while(errStr) {
> -            if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
> errStr->name.buf
> -                    || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
> errStr->name.buf) {
> -                break;
> -            }
> -            errStr = errStr->next;
> -        }
> -        if(!errStr) {
> -            setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
> state");
> -        }
> -
>           err = SA_AIS_ERR_FAILED_OPERATION;
> +        setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
> state");
>           goto ccbObjectDeleteExit;
>       }
>       
> @@ -9648,6 +9581,7 @@ ImmModel::setCcbErrorString(CcbInfo *ccb
>       char *fmtError = (char *)malloc(errLen);
>       int len;
>       va_list args;
> +    int isValidationErrString = 0;
>   
>       va_copy(args, vl);
>       len = vsnprintf(fmtError, errLen, errorString, args);
> @@ -9660,6 +9594,12 @@ ImmModel::setCcbErrorString(CcbInfo *ccb
>           osafassert(vsnprintf(fmtError, len, errorString, vl) >= 0);
>       }
>   
> +    if(strstr(errorString, IMM_VALIDATION_ABORT) == errorString) {
> +        isValidationErrString = 1;
> +    } else if(strstr(errorString, IMM_RESOURCE_ABORT) == errorString) {
> +        isValidationErrString = 2;
> +    }
> +
>       unsigned int ix=0;
>       ImmsvAttrNameList* errStr = ccb->mErrorStrings;
>       ImmsvAttrNameList** errStrTail = &(ccb->mErrorStrings);
> @@ -9670,6 +9610,25 @@ ImmModel::setCcbErrorString(CcbInfo *ccb
>               free(fmtError);
>               return;
>           }
> +        if(isValidationErrString) {
> +            // Precendence of validation abort over resource abort error 
> string
> +            if(isValidationErrString == 1) {
> +                // Validation abort error string will replace resource abort 
> error string
> +                if(strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
> errStr->name.buf) {
> +                    free(errStr->name.buf);
> +                    errStr->name.buf = fmtError;
> +                    errStr->name.size = len;
> +                    return;
> +                }
> +            } else if(strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
> errStr->name.buf
> +                    || strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
> errStr->name.buf) {
> +                // If validation abort or resource abort error string exist,
> +                // new resource abort string will not be added.
> +                // It can exists more validation abort error strings
> +                // or only the first resource abort error string
> +                return;
> +            }
> +        }
>           ++ix;
>           errStrTail = &(errStr->next);
>           errStr = errStr->next;


------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to