This patch only affects the ccb-operation callbacks for ccb- 
create/delete/modify.
It does not append anything to a user error string since the callback never
reached the user. It adds an error string in the imm server where there 
previously could
be no string,  now clarifying what the cause of the ERR_NOT_EXIST was. 

The only issue I have with the fix (that I realized after acking) is that for 
the create
callback it is really the ERR_EXIST case that mainly needs clarification. The 
only reason
for this patch is to increase comprehension of the cause by some human user. 
This string 
is not as such intended to be caught and processed by a program. It is 
backwards compatible
with what exists. 


I think the point you are addressing is the need to support program processing 
of the 
error string to discriminate (process differently) based on the different 
causes of
the same error code. There is a need for that also, particularly for handling 
the
result of an aborted CCB. 

Here we are talking some "taging" either as prefix or postfix. 
We can and will add that also, at least to the cases where it is important.
The cardinal example being SA_AIS_ERR_FAILED_OPERATION for a CCB (abort of a 
CCB).

We may even add this also to ccb-create/delete/modify if there is need to 
programmetricaly 
process diferrently, e.g. The cases of an object not esisting from the 
implementer being detached.

In summary, this patch solves a human factors problem and does not introiduce 
any new problem
Or make it more difficult to solve the other problem, i.e. I dont see it as 
controversial.

/AndersBj


-----Original Message-----
From: Hans Feldt [mailto:hans.fe...@ericsson.com] 
Sent: den 3 april 2014 12:33
To: Zoran Milinkovic; reddy.neelaka...@oracle.com
Cc: opensaf-devel@lists.sourceforge.net
Subject: Re: [devel] [PATCH 1 of 2] IMM: add error strings for CCB operations 
for ERR_NOT_EXIST error [#459]

I think this patch is a bit controversial. We need to define a "protocol" for 
the text carried in the error strings to allow for future changes. For example 
we should consider source identification, maybe we should have key/value pairs 
in the string?

Remember that the string might end up in front of an operator...

Thanks,
Hans

On 04/02/2014 03:36 PM, Zoran Milinkovic wrote:
>   osaf/services/saf/immsv/immnd/ImmModel.cc |  60 
> +++++++++++++++++++++++++++++++
>   osaf/services/saf/immsv/immnd/ImmModel.hh |   5 ++
>   osaf/services/saf/immsv/immnd/immnd_evt.c |  27 ++++++++++++-
>   3 files changed, 89 insertions(+), 3 deletions(-)
>
>
> When an implementer is detached from an object/class, CCB operations return 
> ERR_NOT_EXIST error code.
> The patch should give more information regarding the error code in the error 
> string.
>
> 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
> @@ -6950,6 +6950,10 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im
>                       TRACE_7("ERR_NOT_EXIST: object '%s' does not have an "
>                           "implementer and flag SA_IMM_CCB_REGISTERED_OI is 
> set",
>                           objectName.c_str());
> +                    setCcbErrorString(ccb,
> +                            "ERR_NOT_EXIST: object '%s' does not have an "
> +                            "implementer and flag SA_IMM_CCB_REGISTERED_OI 
> is set",
> +                            objectName.c_str());
>                       err = SA_AIS_ERR_NOT_EXIST;
>                   }
>               } else { /* SA_IMM_CCB_REGISTERED_OI NOT set */ @@ 
> -7790,6 +7794,10 @@ ImmModel::ccbObjectModify(const ImmsvOmC
>                   TRACE_7("ERR_NOT_EXIST: object '%s' does not have an "
>                       "implementer and flag SA_IMM_CCB_REGISTERED_OI is set",
>                       objectName.c_str());
> +                setCcbErrorString(ccb,
> +                        "ERR_NOT_EXIST: object '%s' does not have an "
> +                        "implementer and flag SA_IMM_CCB_REGISTERED_OI is 
> set",
> +                        objectName.c_str());
>                   err = SA_AIS_ERR_NOT_EXIST;
>               }
>           } else { /* SA_IMM_CCB_REGISTERED_OI NOT set */ @@ -8201,6 
> +8209,10 @@ ImmModel::deleteObject(ObjectMap::iterat
>                   TRACE_7("ERR_NOT_EXIST: object '%s' does not have an 
> implementer "
>                       "and flag SA_IMM_CCB_REGISTERED_OI is set",
>                       oi->first.c_str());
> +                setCcbErrorString(ccb,
> +                        "ERR_NOT_EXIST: object '%s' does not have an 
> implementer "
> +                        "and flag SA_IMM_CCB_REGISTERED_OI is set",
> +                        oi->first.c_str());
>                   return SA_AIS_ERR_NOT_EXIST;
>               }
>           } else {  /* SA_IMM_CCB_REGISTERED_OI NOT set */ @@ -8370,6 
> +8382,54 @@ ImmModel::deleteObject(ObjectMap::iterat
>       return SA_AIS_OK;
>   }
>
> +void
> +ImmModel::setCcbErrorString(CcbInfo *ccb, const char *errorString, 
> +...) {
> +    int errLen = strlen(errorString) + 1;
> +    char *fmtError = (char *)malloc(errLen);
> +    int len;
> +    va_list vl;
> +
> +    va_start(vl, errorString);
> +    len = vsnprintf(fmtError, errLen, errorString, vl);
> +    va_end(vl);
> +
> +    osafassert(len >= 0);
> +    len++;   /* Reserve one byte for null-terminated sign '\0' */
> +    if(len > errLen) {
> +        fmtError = (char *)realloc(fmtError, len);
> +        va_start(vl, errorString);
> +        osafassert(vsnprintf(fmtError, len, errorString, vl) >= 0);
> +        va_end(vl);
> +    }
> +
> +    unsigned int ix=0;
> +    ImmsvAttrNameList* errStr = ccb->mErrorStrings;
> +    ImmsvAttrNameList** errStrTail = &(ccb->mErrorStrings);
> +    while(errStr) {
> +        if(!strncmp(fmtError, errStr->name.buf, len)) {
> +            TRACE_5("Discarding duplicate error string '%s' for ccb id %u",
> +                fmtError, ccb->mId);
> +            free(fmtError);
> +            return;
> +        }
> +        ++ix;
> +        errStrTail = &(errStr->next);
> +        errStr = errStr->next;
> +    }
> +
> +    if(ix >= IMMSV_MAX_ATTRIBUTES) {
> +        TRACE_5("Discarding error string '%s' for ccb id %u (too many)",
> +            fmtError, ccb->mId);
> +        free(fmtError);
> +    } else {
> +        (*errStrTail) = (ImmsvAttrNameList *) 
> malloc(sizeof(ImmsvAttrNameList));
> +        (*errStrTail)->next = NULL;
> +        (*errStrTail)->name.size = len;
> +        (*errStrTail)->name.buf = fmtError;
> +    }
> +}
> +
>   bool
>   ImmModel::hasLocalClassAppliers(ClassInfo* classInfo)
>   {
> diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh 
> b/osaf/services/saf/immsv/immnd/ImmModel.hh
> --- a/osaf/services/saf/immsv/immnd/ImmModel.hh
> +++ b/osaf/services/saf/immsv/immnd/ImmModel.hh
> @@ -259,6 +259,11 @@ public:
>                                        IdVector& continuations,
>                                        unsigned int pbeIsLocal);
>
> +    void                setCcbErrorString(
> +                                          CcbInfo *ccb,
> +                                          const char *errorString,
> +                                          ...);
> +
>       bool                hasLocalClassAppliers(ClassInfo* classInfo);
>       bool                hasLocalObjAppliers(const std::string& objName);
>
> 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
> @@ -5732,11 +5732,18 @@ static void immnd_evt_proc_object_create
>               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.type = IMMA_EVT_ND2A_IMM_ERROR;
> +             send_evt.info.imma.info.errRsp.errStrings = 
> +immModel_ccbGrabErrStrings(cb, evt->info.objCreate.ccbId);
> +
> +             if(send_evt.info.imma.info.errRsp.errStrings) {
> +                     send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2;
> +             } else {
> +                     send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR;
> +             }
>
>               if (immnd_mds_send_rsp(cb, &(cl_node->tmpSinfo), &send_evt) != 
> NCSCC_RC_SUCCESS) {
>                       LOG_WA("Failed to send result to Agent over MDS");
>               }
> +             
> +immsv_evt_free_attrNames(send_evt.info.imma.info.errRsp.errStrings);
>       }
>       TRACE_LEAVE();
>   }
> @@ -5957,11 +5964,18 @@ static void immnd_evt_proc_object_modify
>               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.type = IMMA_EVT_ND2A_IMM_ERROR;
> +             send_evt.info.imma.info.errRsp.errStrings = 
> +immModel_ccbGrabErrStrings(cb, evt->info.objModify.ccbId);
> +
> +             if(send_evt.info.imma.info.errRsp.errStrings) {
> +                     send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2;
> +             } else {
> +                     send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR;
> +             }
>
>               if (immnd_mds_send_rsp(cb, &(cl_node->tmpSinfo), &send_evt) != 
> NCSCC_RC_SUCCESS) {
>                       LOG_WA("Failed to send result to Agent over MDS");
>               }
> +             
> +immsv_evt_free_attrNames(send_evt.info.imma.info.errRsp.errStrings);
>       }
>
>    done:
> @@ -6715,11 +6729,18 @@ static void immnd_evt_proc_object_delete
>               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.type = IMMA_EVT_ND2A_IMM_ERROR;
> +             send_evt.info.imma.info.errRsp.errStrings = 
> +immModel_ccbGrabErrStrings(cb, evt->info.objDelete.ccbId);
> +
> +             if(send_evt.info.imma.info.errRsp.errStrings) {
> +                     send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2;
> +             } else {
> +                     send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR;
> +             }
>
>               if (immnd_mds_send_rsp(cb, &(cl_node->tmpSinfo), &send_evt) != 
> NCSCC_RC_SUCCESS) {
>                       LOG_WA("Failed to send result to Agent over MDS");
>               }
> +             
> +immsv_evt_free_attrNames(send_evt.info.imma.info.errRsp.errStrings);
>       }
>   }
>
>
> ----------------------------------------------------------------------
> -------- _______________________________________________
> 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

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

Reply via email to