Nack from me. Library should not rely on internal service protocol state. New message types should be handled by IMM service.
Best regards, Zoran -----Original Message----- From: Hung Nguyen [mailto:[email protected]] Sent: Thursday, April 16, 2015 9:21 AM To: Anders Björnerstedt Cc: [email protected] Subject: [devel] [PATCH 5 of 5] imm: Replace use of SaNameT from IMMSV_OI_CCB_UPCALL_RSP [#969] osaf/libs/agents/saf/imma/imma_oi_api.c | 10 ++++- osaf/libs/agents/saf/imma/imma_proc.c | 16 ++++++- osaf/libs/common/immsv/immsv_evt.c | 47 ++++++++++++++++++++++++ osaf/libs/common/immsv/include/immsv_evt.h | 3 + osaf/libs/common/immsv/include/immsv_evt_model.h | 1 + osaf/services/saf/immsv/immnd/ImmModel.cc | 20 ++++++++- osaf/services/saf/immsv/immnd/immnd_evt.c | 17 ++++++++ 7 files changed, 106 insertions(+), 8 deletions(-) Define new message types: IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3, IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4 and IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2. Add new member 'stringName' to IMMSV_OI_CCB_UPCALL_RSP. 'stringName' is used in new message types. Clients will use new messages when 'isProto47' is true. Otherwise, old messages are used. ImmModel now has to handle both old and new messages. The message type is detected by checking if 'name' member of IMMSV_OI_CCB_UPCALL_RSP is empty or not. diff --git a/osaf/libs/agents/saf/imma/imma_oi_api.c b/osaf/libs/agents/saf/imma/imma_oi_api.c --- a/osaf/libs/agents/saf/imma/imma_oi_api.c +++ b/osaf/libs/agents/saf/imma/imma_oi_api.c @@ -3777,11 +3777,17 @@ SaAisErrorT saImmOiAugmentCcbInitialize( /* populate the EVT structure */ memset(&init_evt, 0, sizeof(IMMSV_EVT)); init_evt.type = IMMSV_EVT_TYPE_IMMND; - init_evt.info.immnd.type = IMMND_EVT_A2ND_OI_CCB_AUG_INIT; + if (cl_node->isProto47) { + init_evt.info.immnd.type = IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2; + init_evt.info.immnd.info.ccbUpcallRsp.stringName.buf = (char*) osaf_extended_name_borrow(&cbi->name); + init_evt.info.immnd.info.ccbUpcallRsp.stringName.size = osaf_extended_name_length(&cbi->name) + 1; + } else { + init_evt.info.immnd.type = IMMND_EVT_A2ND_OI_CCB_AUG_INIT; + init_evt.info.immnd.info.ccbUpcallRsp.name = cbi->name; + } init_evt.info.immnd.info.ccbUpcallRsp.ccbId = ccbId; init_evt.info.immnd.info.ccbUpcallRsp.implId = cbi->implId; init_evt.info.immnd.info.ccbUpcallRsp.inv = cbi->inv; - init_evt.info.immnd.info.ccbUpcallRsp.name = cbi->name; /* Note that we register using the new OM handle as client for the aug-ccb */ rc = imma_evt_fake_evs(cb, &init_evt, &out_evt, cl_node->syncr_timeout, diff --git a/osaf/libs/agents/saf/imma/imma_proc.c b/osaf/libs/agents/saf/imma/imma_proc.c --- a/osaf/libs/agents/saf/imma/imma_proc.c +++ b/osaf/libs/agents/saf/imma/imma_proc.c @@ -2613,12 +2613,18 @@ static bool imma_process_callback_info(I SaImmHandleT privateAugOmHandle = 0LL; memset(&ccbObjDelRpl, 0, sizeof(IMMSV_EVT)); ccbObjDelRpl.type = IMMSV_EVT_TYPE_IMMND; - ccbObjDelRpl.info.immnd.type = IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP; + if (cl_node->isProto47) { + ccbObjDelRpl.info.immnd.type = IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3; + ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.stringName.buf = (char*) osaf_extended_name_borrow(&callback->name); + ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.stringName.size = osaf_extended_name_length(&callback->name) + 1; + } else { + ccbObjDelRpl.info.immnd.type = IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP; + osaf_extended_name_lend(osaf_extended_name_borrow(&(callback->name)), &(ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.name)); + } ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.result = localEr; ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.oi_client_hdl = callback->lcl_imm_hdl; ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.ccbId = callback->ccbID; ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.inv = callback->inv; - osaf_extended_name_lend(osaf_extended_name_borrow(&(callback->name)), &(ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.name)); osafassert(m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) == NCSCC_RC_SUCCESS); locked = true; @@ -2628,7 +2634,11 @@ static bool imma_process_callback_info(I if (localEr != SA_AIS_OK) { if(errorStr) { - ccbObjDelRpl.info.immnd.type = IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2; + if (ccbObjDelRpl.info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP) { + ccbObjDelRpl.info.immnd.type = IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2; + } else if (ccbObjDelRpl.info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) { + ccbObjDelRpl.info.immnd.type = IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4; + } ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.errorString.size = strlen(errorStr) + 1; ccbObjDelRpl.info.immnd.info.ccbUpcallRsp.errorString.buf = errorStr; diff --git a/osaf/libs/common/immsv/immsv_evt.c b/osaf/libs/common/immsv/immsv_evt.c --- a/osaf/libs/common/immsv/immsv_evt.c +++ b/osaf/libs/common/immsv/immsv_evt.c @@ -183,6 +183,9 @@ static const char *immnd_evt_names[] = { "IMMND_EVT_A2ND_OBJ_CREATE_2", /* saImmOmCcbObjectCreate_o3 */ "IMMND_EVT_A2ND_OI_OBJ_CREATE_2", /* saImmOiRtObjectCreate_o3 */ "IMMND_EVT_D2ND_ADMINIT_2", /* Admin Owner init reply */ + "IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3", /*CcbObjDelete local Reply */ + "IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4", /*CcbObjDelete local Reply */ + "IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2", "undefined (high)" }; @@ -2005,6 +2008,19 @@ static uint32_t immsv_evt_enc_sublevels( if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) { return NCSCC_RC_OUT_OF_MEM; } + } else if ((i_evt->info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) || + (i_evt->info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) || + (i_evt->info.immnd.type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2)) { + IMMSV_OCTET_STRING *os = &(i_evt->info.immnd.info.ccbUpcallRsp.stringName); + if (!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) { + return NCSCC_RC_OUT_OF_MEM; + } + if (i_evt->info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) { + os = &(i_evt->info.immnd.info.ccbUpcallRsp.errorString); + if (!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) { + return NCSCC_RC_OUT_OF_MEM; + } + } } } @@ -2522,6 +2538,15 @@ static uint32_t immsv_evt_dec_sublevels( } else if (o_evt->info.immnd.type == IMMND_EVT_D2ND_ADMINIT_2) { IMMSV_OCTET_STRING *os = &(o_evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName); immsv_evt_dec_inline_string(i_ub, os); + } else if ((o_evt->info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) || + (o_evt->info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) || + (o_evt->info.immnd.type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2)) { + IMMSV_OCTET_STRING *os = &(o_evt->info.immnd.info.ccbUpcallRsp.stringName); + immsv_evt_dec_inline_string(i_ub, os); + if (o_evt->info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) { + os = &(o_evt->info.immnd.info.ccbUpcallRsp.errorString); + immsv_evt_dec_inline_string(i_ub, os); + } } } return NCSCC_RC_SUCCESS; @@ -3599,6 +3624,9 @@ static uint32_t immsv_evt_enc_toplevel(I case IMMND_EVT_A2ND_PBE_PRTO_DELETES_COMPLETED_RSP:/*Pbe PRTO deletes done */ case IMMND_EVT_A2ND_PBE_PRT_ATTR_UPDATE_RSP:/* Pbe OI rt attr update response*/ case IMMND_EVT_A2ND_OI_CCB_AUG_INIT:/*OI augments CCB inside ccb upcall. #1963 */ + case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3: /*CcbObjDelete local Reply */ + case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4: /*CcbObjDelete local Reply */ + case IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2: /*OI augments CCB inside ccb upcall */ { IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 8); ncs_encode_64bit(&p8, immndevt->info.ccbUpcallRsp.oi_client_hdl); @@ -3641,11 +3669,19 @@ static uint32_t immsv_evt_enc_toplevel(I break; } } + } else if ((immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) || + (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) || + (immndevt->type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2)) { + IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4); + ncs_encode_32bit(&p8, immndevt->info.ccbUpcallRsp.stringName.size); + ncs_enc_claim_space(o_ub, 4); + /* immndevt->info.ccbUpcallRsp.stringName.buf encoded by sublevel +*/ } if((immndevt->type == IMMND_EVT_A2ND_CCB_COMPLETED_RSP_2) || (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_CREATE_RSP_2) || (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2) || + (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) || (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP_2)) { IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4); ncs_encode_32bit(&p8, immndevt->info.ccbUpcallRsp.errorString.size); @@ -5013,6 +5049,9 @@ static uint32_t immsv_evt_dec_toplevel(N case IMMND_EVT_A2ND_PBE_PRTO_DELETES_COMPLETED_RSP:/*Pbe PRTO deletes done */ case IMMND_EVT_A2ND_PBE_PRT_ATTR_UPDATE_RSP:/* Pbe OI rt attr update response*/ case IMMND_EVT_A2ND_OI_CCB_AUG_INIT:/*OI augments CCB inside ccb upcall. #1963 */ + case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3: /*CcbObjDelete local Reply */ + case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4: /*CcbObjDelete local Reply */ + case IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2: /*OI augments CCB inside ccb upcall */ { IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 8); immndevt->info.ccbUpcallRsp.oi_client_hdl = ncs_decode_64bit(&p8); @@ -5057,11 +5096,19 @@ static uint32_t immsv_evt_dec_toplevel(N value[length] = '\0'; osaf_extended_name_steal(value, &immndevt->info.ccbUpcallRsp.name); } + } else if ((immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) || + (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) || + (immndevt->type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2)) { + IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4); + immndevt->info.ccbUpcallRsp.stringName.size = ncs_decode_32bit(&p8); + ncs_dec_skip_space(i_ub, 4); + /* immndevt->info.ccbUpcallRsp.stringName.buf decoded by sublevel +*/ } if((immndevt->type == IMMND_EVT_A2ND_CCB_COMPLETED_RSP_2) || (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_CREATE_RSP_2) || (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2) || + (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) || (immndevt->type == IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP_2)) { IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4); immndevt->info.ccbUpcallRsp.errorString.size = ncs_decode_32bit(&p8); diff --git a/osaf/libs/common/immsv/include/immsv_evt.h b/osaf/libs/common/immsv/include/immsv_evt.h --- a/osaf/libs/common/immsv/include/immsv_evt.h +++ b/osaf/libs/common/immsv/include/immsv_evt.h @@ -215,6 +215,9 @@ typedef enum immnd_evt_type { IMMND_EVT_A2ND_OI_OBJ_CREATE_2 = 99, /* saImmOiRtObjectCreate_o3 */ IMMND_EVT_D2ND_ADMINIT_2 = 100, /* Admin Owner init reply */ + IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3 = 101, /*CcbObjDelete local Reply */ + IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4 = 102, /*CcbObjDelete local Reply */ + IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2 = 103, /* Init of OI augmented ccb +handle */ IMMND_EVT_MAX } IMMND_EVT_TYPE; diff --git a/osaf/libs/common/immsv/include/immsv_evt_model.h b/osaf/libs/common/immsv/include/immsv_evt_model.h --- a/osaf/libs/common/immsv/include/immsv_evt_model.h +++ b/osaf/libs/common/immsv/include/immsv_evt_model.h @@ -288,6 +288,7 @@ extern "C" { SaAisErrorT result; SaNameT name; IMMSV_OCTET_STRING errorString; + IMMSV_OCTET_STRING stringName; } IMMSV_OI_CCB_UPCALL_RSP; typedef struct ImmsvSyncFevsBase { 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 @@ -5985,10 +5985,17 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up ObjectMutationMap::iterator omuti; ObjectInfo* obj = NULL; ObjectMap::iterator oi; + std::string objectName; TRACE_ENTER(); /*Note: objectName is parent-name for the create case! */ - std::string objectName(osaf_extended_name_borrow(&rsp->name)); + if (osaf_is_extended_name_empty(&rsp->name)) { + /* This must be IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2 */ + const IMMSV_OCTET_STRING *os = &rsp->stringName; + objectName = std::string((const char*) os->buf, strnlen((const char*) os->buf, (size_t) os->size)); + } else { + objectName = std::string(osaf_extended_name_borrow(&rsp->name)); + } osafassert(nameCheck(objectName)||nameToInternal(objectName)); i = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); @@ -9640,12 +9647,19 @@ ImmModel::ccbObjDelContinuation(immsv_oi SaUint32T* reqConn, bool* augDelete) { TRACE_ENTER(); - std::string objectName(osaf_extended_name_borrow(&rsp->name)); - + std::string objectName; SaUint32T ccbId = rsp->ccbId; CcbInfo* ccb = 0; CcbVector::iterator i1; + if (osaf_is_extended_name_empty(&rsp->name)) { + /* This must be IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3 or IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4 */ + const IMMSV_OCTET_STRING *os = &rsp->stringName; + objectName = std::string((const char*) os->buf, strnlen((const char*) os->buf, (size_t) os->size)); + } else { + objectName = std::string(osaf_extended_name_borrow(&rsp->name)); + } + i1 = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); if(i1 == sCcbVector.end() || (!(*i1)->isActive()) ) { TRACE_5("ccb id %u missing or terminated in delete processing", ccbId); 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 @@ -484,6 +484,17 @@ uint32_t immnd_evt_destroy(IMMSV_EVT *ev free(evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName.buf); evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName.buf = NULL; evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName.size = 0; + } else if ((evt->info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3) || + (evt->info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4) || + (evt->info.immnd.type == IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2)) { + free(evt->info.immnd.info.ccbUpcallRsp.stringName.buf); + evt->info.immnd.info.ccbUpcallRsp.stringName.buf = NULL; + evt->info.immnd.info.ccbUpcallRsp.stringName.size = 0; + if ((evt->info.immnd.type == IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4)) { + free(evt->info.immnd.info.ccbUpcallRsp.errorString.buf); + evt->info.immnd.info.ccbUpcallRsp.errorString.buf = NULL; + evt->info.immnd.info.ccbUpcallRsp.errorString.size = 0; + } } if (onheap) { @@ -3217,6 +3228,7 @@ static SaAisErrorT immnd_fevs_local_chec case IMMND_EVT_A2ND_OBJ_DELETE: case IMMND_EVT_A2ND_CCB_FINALIZE: case IMMND_EVT_A2ND_OI_CCB_AUG_INIT: + case IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2: case IMMND_EVT_A2ND_AUG_ADMO: if(immModel_pbeNotWritable(cb)) { error = SA_AIS_ERR_TRY_AGAIN; @@ -3536,6 +3548,8 @@ static SaAisErrorT immnd_fevs_local_chec case IMMND_EVT_A2ND_PBE_PRT_ATTR_UPDATE_RSP: case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP: case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2: + case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3: + case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4: if(fevsReq->sender_count != 0x0) { LOG_WA("ERR_LIBRARY: fevsReq->sender_count != 0x0 for OI response type:%u", frwrd_evt.info.immnd.type); @@ -7981,6 +7995,7 @@ immnd_evt_proc_fevs_dispatch(IMMND_CB *c break; case IMMND_EVT_A2ND_OI_CCB_AUG_INIT: + case IMMND_EVT_A2ND_OI_CCB_AUG_INIT_2: immnd_evt_ccb_augment_init(cb, &frwrd_evt.info.immnd, originatedAtThisNd, clnt_hdl, reply_dest); break; @@ -8054,6 +8069,8 @@ immnd_evt_proc_fevs_dispatch(IMMND_CB *c case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP: case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2: + case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_3: + case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_4: immnd_evt_proc_ccb_obj_delete_rsp(cb, &frwrd_evt.info.immnd, originatedAtThisNd, clnt_hdl, reply_dest); break; ------------------------------------------------------------------------------ BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT Develop your own process in accordance with the BPMN 2 standard Learn Process modeling best practices with Bonita BPM through live exercises http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_ source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
