osaf/services/saf/immsv/immnd/ImmModel.cc | 18 +++++- osaf/services/saf/immsv/immnd/immnd_evt.c | 82 ++++++++---------------------- 2 files changed, 37 insertions(+), 63 deletions(-)
Set validation abort error string when OI returns ERR_BAD_OPERATION or ERR_FAILED_OPERATION. This is to prevent om clients from retrying the operations that are already rejected by OI. 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 @@ -10872,7 +10872,11 @@ ImmModel::ccbObjDelContinuation(immsv_oi "implementer returned error, Ccb aborted with error: %u", rsp->result); ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; - setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Implementer returned error: ", rsp->result); + if (rsp->result == SA_AIS_ERR_BAD_OPERATION || rsp->result == SA_AIS_ERR_FAILED_OPERATION) { + setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Implementer returned error: %u", rsp->result); + } else { + setCcbErrorString(ccb, IMM_RESOURCE_ABORT "Implementer returned error: %u", rsp->result); + } //TODO: This is perhaps more drastic than the specification //demands. We are here aborting the entire Ccb, whereas the spec //seems to allow for a non-ok returnvalue from implementer @@ -11150,7 +11154,11 @@ ImmModel::ccbObjCreateContinuation(SaUin "implementer returned error, Ccb aborted with error: %u", error); ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; - setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Implementer returned error: %u", error); + if (error == SA_AIS_ERR_BAD_OPERATION || error == SA_AIS_ERR_FAILED_OPERATION) { + setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Implementer returned error: %u", error); + } else { + setCcbErrorString(ccb, IMM_RESOURCE_ABORT "Implementer returned error: %u", error); + } //TODO: This is perhaps more drastic than the specification demands. //We are here aborting the entire Ccb, whereas the spec seems to allow //for a non-ok returnvalue from implementer (in this callback) to @@ -11240,7 +11248,11 @@ ImmModel::ccbObjModifyContinuation(SaUin LOG_IN("ImmModel::ccbObjModifyContinuation: " "implementer returned error, Ccb aborted with error: %u", error); ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; - setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Implementer returned error: %u", error); + if (error == SA_AIS_ERR_BAD_OPERATION || error == SA_AIS_ERR_FAILED_OPERATION) { + setCcbErrorString(ccb, IMM_VALIDATION_ABORT "Implementer returned error: %u", error); + } else { + setCcbErrorString(ccb, IMM_RESOURCE_ABORT "Implementer returned error: %u", error); + } //TODO: This is perhaps more drastic than the specification demands. //We are here aborting the entire Ccb, whereas the spec seems to allow //for a non-ok returnvalue from implementer (in this callback) to 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 @@ -3741,42 +3741,23 @@ static void immnd_evt_proc_ccb_obj_modif memset(&send_evt, '\0', sizeof(IMMSV_EVT)); send_evt.type = IMMSV_EVT_TYPE_IMMA; send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; - IMMSV_ATTR_NAME_LIST strList; - IMMSV_ATTR_NAME_LIST errStrList = { { 0 }, NULL }; - + + IMMSV_ATTR_NAME_LIST* errStrList = immModel_ccbGrabErrStrings(cb, evt->info.ccbUpcallRsp.ccbId); if (evt->info.ccbUpcallRsp.result != SA_AIS_OK) { - if(evt->info.ccbUpcallRsp.result != SA_AIS_ERR_FAILED_OPERATION) { - char buf[2]; - int size; - - /* Create error string */ - size = snprintf(buf, 1, - IMM_RESOURCE_ABORT "Upcall failed with error code: %u", - evt->info.ccbUpcallRsp.result); - osafassert(size >= 0); - errStrList.name.size = ++size; - errStrList.name.buf = (char *)malloc(size); - errStrList.next = NULL; - size = snprintf(errStrList.name.buf, errStrList.name.size, - IMM_RESOURCE_ABORT "Upcall failed with error code: %u", - evt->info.ccbUpcallRsp.result); - osafassert(size >= 0); - - evt->info.ccbUpcallRsp.result = SA_AIS_ERR_FAILED_OPERATION; - } + evt->info.ccbUpcallRsp.result = SA_AIS_ERR_FAILED_OPERATION; + if (evt->info.ccbUpcallRsp.errorString.size) { osafassert(evt->type == IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP_2); - if(errStrList.name.buf) { - strList.next = &errStrList; - } else { - strList.next = NULL; - } + + IMMSV_ATTR_NAME_LIST strList = { { 0 }, NULL }; + strList.next = errStrList; strList.name = evt->info.ccbUpcallRsp.errorString;/*borrow*/ + send_evt.info.imma.info.errRsp.errStrings = &(strList); send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; - } else if(errStrList.name.buf) { + } else if (errStrList) { osafassert(evt->type == IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP); - send_evt.info.imma.info.errRsp.errStrings = &(errStrList); + send_evt.info.imma.info.errRsp.errStrings = errStrList; send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; } } @@ -3789,7 +3770,7 @@ static void immnd_evt_proc_ccb_obj_modif LOG_WA("Failed to send response to agent/client over MDS rc:%u", rc); } - free(errStrList.name.buf); + immsv_evt_free_attrNames(errStrList); } TRACE_LEAVE(); @@ -3840,42 +3821,23 @@ static void immnd_evt_proc_ccb_obj_creat memset(&send_evt, '\0', sizeof(IMMSV_EVT)); send_evt.type = IMMSV_EVT_TYPE_IMMA; send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; - IMMSV_ATTR_NAME_LIST strList; - IMMSV_ATTR_NAME_LIST errStrList = { { 0 }, NULL }; - + + IMMSV_ATTR_NAME_LIST* errStrList = immModel_ccbGrabErrStrings(cb, evt->info.ccbUpcallRsp.ccbId); if (evt->info.ccbUpcallRsp.result != SA_AIS_OK) { - if(evt->info.ccbUpcallRsp.result != SA_AIS_ERR_FAILED_OPERATION) { - char buf[2]; - int size; - - /* Create error string */ - size = snprintf(buf, 1, - IMM_RESOURCE_ABORT "Upcall failed with error code: %u", - evt->info.ccbUpcallRsp.result); - osafassert(size >= 0); - errStrList.name.size = ++size; - errStrList.name.buf = (char *)malloc(size); - errStrList.next = NULL; - size = snprintf(errStrList.name.buf, errStrList.name.size, - IMM_RESOURCE_ABORT "Upcall failed with error code: %u", - evt->info.ccbUpcallRsp.result); - osafassert(size >= 0); - - evt->info.ccbUpcallRsp.result = SA_AIS_ERR_FAILED_OPERATION; - } + evt->info.ccbUpcallRsp.result = SA_AIS_ERR_FAILED_OPERATION; + if (evt->info.ccbUpcallRsp.errorString.size) { osafassert(evt->type == IMMND_EVT_A2ND_CCB_OBJ_CREATE_RSP_2); - if(errStrList.name.buf) { - strList.next = &errStrList; - } else { - strList.next = NULL; - } + + IMMSV_ATTR_NAME_LIST strList = { { 0 }, NULL }; + strList.next = errStrList; strList.name = evt->info.ccbUpcallRsp.errorString;/*borrow*/ + send_evt.info.imma.info.errRsp.errStrings = &(strList); send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; - } else if(errStrList.name.buf) { + } else if (errStrList) { osafassert(evt->type == IMMND_EVT_A2ND_CCB_OBJ_CREATE_RSP); - send_evt.info.imma.info.errRsp.errStrings = &(errStrList); + send_evt.info.imma.info.errRsp.errStrings = errStrList; send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; } } @@ -3888,7 +3850,7 @@ static void immnd_evt_proc_ccb_obj_creat LOG_WA("Failed to send response to agent/client over MDS rc:%u", rc); } - free(errStrList.name.buf); + immsv_evt_free_attrNames(errStrList); } TRACE_LEAVE(); ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel