Sirisha, Thank you for the review
Comments 1,2 & 3 are the this enhancement related , so I will address while pushing the patch, but comment 4 & 5 are existing problems , so can you please raise new ticket for those. -AVM On 12/12/2013 2:52 PM, Sirisha Alla wrote: > Mahesh, > > I have not done a line by line review of the code but have run some > tests. Below are my comments: > > 1) If saCkptInitialize_2 is invoked with wrong version, version > parameter is not being filled up according to the standard initialize > API definitions. > 2) If TrackCallback is provided as NULL during initialization and > saCkptTrack() is invoked on the handle, SA_AIS_ERR_INIT would be the > closest error value that needs to be returned. I have taken > SynchronizeAsync() API definition as the reference. > 3) If saCkptTrack() API is invoked on the handle for which tracking > has not been started or the tracking has been stopped, > SA_AIS_ERR_NOT_EXIST needs to be returned by saCkptTrack() API. Please > refer to saClmClusterTrackStop() API in the CLM specification. > 4) It is observed that callbacks are being invoked for the following > operations: Section Create, Section Delete, Write, Overwrite. > Documentation for the implementation needs to be added accordingly. > 5) dataSize in the iovector should be set to zero for section > deletion, since there is no data available for reading in case of > section delete. > 6) Since the dataBuffer returned in the ioVector is NULL, readSize > should always be set to zero which is not the case now. > > Regards, > Sirisha > > > > On Monday 02 December 2013 12:07 PM, mahesh.va...@oracle.com wrote: >> opensaf.spec.in | 1 + >> osaf/libs/agents/saf/cpa/cpa_api.c | 538 >> ++++++++++++++++++++++++++++++- >> osaf/libs/agents/saf/cpa/cpa_proc.c | 6 +- >> osaf/libs/common/cpsv/cpsv_edu.c | 22 +- >> osaf/libs/common/cpsv/include/cpa_cb.h | 3 +- >> osaf/libs/common/cpsv/include/cpa_def.h | 2 +- >> osaf/libs/common/cpsv/include/cpa_proc.h | 2 +- >> osaf/libs/common/cpsv/include/cpsv.h | 7 + >> osaf/libs/common/cpsv/include/cpsv_evt.h | 8 +- >> osaf/libs/saf/include/Makefile.am | 1 + >> osaf/libs/saf/include/saCkpt_B_02_03.h | 66 +++ >> osaf/services/saf/cpsv/cpnd/cpnd_evt.c | 39 ++- >> 12 files changed, 677 insertions(+), 18 deletions(-) >> >> >> diff --git a/opensaf.spec.in b/opensaf.spec.in >> --- a/opensaf.spec.in >> +++ b/opensaf.spec.in >> @@ -1398,6 +1398,7 @@ fi >> %{_includedir}/saAis.h >> %{_includedir}/saAmf.h >> %{_includedir}/saCkpt.h >> +%{_includedir}/saCkpt_B_02_03.h >> %{_includedir}/saClm.h >> %{_includedir}/saEvt.h >> %{_includedir}/saImm.h >> diff --git a/osaf/libs/agents/saf/cpa/cpa_api.c >> b/osaf/libs/agents/saf/cpa/cpa_api.c >> --- a/osaf/libs/agents/saf/cpa/cpa_api.c >> +++ b/osaf/libs/agents/saf/cpa/cpa_api.c >> @@ -119,8 +119,9 @@ SaAisErrorT saCkptInitialize(SaCkptHandl >> >> /* Store the callback functions, if set */ >> if (ckptCallbacks) { >> - cl_node->ckpt_callbk = *ckptCallbacks; >> - >> + cl_node->ckpt_callbk.saCkptCheckpointOpenCallback = >> ckptCallbacks->saCkptCheckpointOpenCallback; >> + cl_node->ckpt_callbk.saCkptCheckpointSynchronizeCallback = >> ckptCallbacks->saCkptCheckpointSynchronizeCallback; >> + cl_node->ckpt_callbk.saCkptCheckpointTrackCallback = NULL; >> } >> >> proc_rc = cpa_callback_ipc_init(cl_node); >> @@ -278,11 +279,266 @@ SaAisErrorT saCkptInitialize(SaCkptHandl >> } >> >> >> /**************************************************************************** >> - Name : saCkptSelectionObjectGet >> - >> - Description : This function returns the operating system handle >> - associated with the ckptHandle. >> - >> +Name : SaCkptInitialize_2 >> + >> +Description : This function initializes the Checkpoint Service for the >> +invoking process and registers the various callback functions. >> +The handle 'ckptHandle' is returned as the reference to this >> +association between the process and the Checkpoint Service. >> + >> + >> +Arguments : ckptHandle - A pointer to the handle designating this >> +particular initialization of the Checkpoint >> +service that it to be returned by the Checkpoint >> +Service. >> +callbacks - Pointer to a SaCkptCallbacksT_2 structure, >> +containing the callback functions of the process >> +that the Checkpoint Service may invoke. >> +version - Is a pointer to the version of the Checkpoint >> +Service that the invoking process is using. >> + >> +Return Values : Refer to SAI-AIS specification for various return values. >> + >> +Notes : >> + >> ******************************************************************************/ >> +SaAisErrorT saCkptInitialize_2(SaCkptHandleT *ckptHandle, const >> SaCkptCallbacksT_2 *ckptCallbacks, SaVersionT *version) >> +{ >> + CPA_CB *cb = NULL; >> + SaAisErrorT rc = SA_AIS_OK; >> + CPSV_EVT init_evt; >> + CPSV_EVT *out_evt = NULL; >> + uint32_t proc_rc = NCSCC_RC_SUCCESS; >> + CPA_CLIENT_NODE *cl_node = NULL; >> + bool locked = true; >> + SaVersionT client_version; >> + >> + TRACE_ENTER(); >> + proc_rc = ncs_agents_startup(); >> + if (NCSCC_RC_SUCCESS != proc_rc) { >> + TRACE_4("cpa CkptInit:agents_startup Api failed with return >> value:%d", proc_rc); >> + return SA_AIS_ERR_LIBRARY; >> + } >> + >> + proc_rc = ncs_cpa_startup(); >> + if (NCSCC_RC_SUCCESS != proc_rc) { >> + TRACE_4("cpa CkptInit:agents_startup Api failed with return >> value:%d" , proc_rc); >> + ncs_agents_shutdown(); >> + return SA_AIS_ERR_LIBRARY; >> + } >> + >> + if ((!ckptHandle) || (!version)) { >> + rc = SA_AIS_ERR_INVALID_PARAM; >> + TRACE_4("cpa CkptInit Api failed with return value :%d", rc); >> + goto end; >> + } >> + >> + *ckptHandle = 0; >> + >> + memcpy(&client_version, version, sizeof(SaVersionT)); >> + >> + if (m_CPA_VER_IS_BELOW_B_2_3(version)) { >> + rc = SA_AIS_ERR_VERSION; >> + TRACE_2("ERR_VERSION: saCkptInitialize_2 SHOULD BE A VERSION >> B.02.03 and above initialize but claims to be" >> + "%c %u %u", version->releaseCode, >> version->majorVersion, version->minorVersion); >> + goto end; >> + } >> + >> + /* Draft Validations : Version */ >> + rc = cpa_version_validate(version); >> + if (rc != SA_AIS_OK) { >> + TRACE_4("cpa CkptInit Api failed with return value:%d", rc); >> + goto end; >> + } >> + >> + /* retrieve CPA CB */ >> + m_CPA_RETRIEVE_CB(cb); >> + if (cb == NULL) { >> + TRACE_4("cpa CkptInit:HDL_TAKE"); >> + return SA_AIS_ERR_LIBRARY; >> + } >> + >> + /* Take the CB Lock */ >> + if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) { >> + TRACE_4("cpa CkptInit:LOCK"); >> + rc = SA_AIS_ERR_LIBRARY; >> + goto lock_fail; >> + } >> + >> + /* Alloc the client info data structure & put it in the Pat tree */ >> + cl_node = (CPA_CLIENT_NODE *)m_MMGR_ALLOC_CPA_CLIENT_NODE; >> + if (cl_node == NULL) { >> + TRACE_4("cpa mem alloc CkptInit:CPA_CLIENT_NODE"); >> + rc = SA_AIS_ERR_NO_MEMORY; >> + goto cnode_alloc_fail; >> + } >> + memset(cl_node, 0, sizeof(CPA_CLIENT_NODE)); >> + >> + /* Store the callback functions, if set */ >> + if (ckptCallbacks) { >> + cl_node->ckpt_callbk = *ckptCallbacks; >> + } >> + >> + proc_rc = cpa_callback_ipc_init(cl_node); >> + if (proc_rc != NCSCC_RC_SUCCESS) { >> + /* Error handling */ >> + rc = SA_AIS_ERR_LIBRARY; >> + /* ALready looged by cpa_callback_ipc_init */ >> + goto ipc_init_fail; >> + } >> + >> + /* populate the EVT structure */ >> + memset(&init_evt, 0, sizeof(CPSV_EVT)); >> + init_evt.type = CPSV_EVT_TYPE_CPND; >> + init_evt.info.cpnd.type = CPND_EVT_A2ND_CKPT_INIT; >> + init_evt.info.cpnd.info.initReq.version = client_version; >> + >> + /* Release the CB lock Before MDS Send */ >> + if (locked) >> + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); >> + locked = false; >> + >> + /* CPND GOES DOWN */ >> + if (false == cb->is_cpnd_up) { >> + rc = SA_AIS_ERR_TRY_AGAIN; >> + TRACE_4("cpa: api failed in CkptInit:CPND_DOWN"); >> + goto mds_fail; >> + } >> + >> + /* send the request to the CPND */ >> + proc_rc = cpa_mds_msg_sync_send(cb->cpa_mds_hdl, &cb->cpnd_mds_dest, >> &init_evt, &out_evt, CPSV_WAIT_TIME); >> + >> + /* Error Handling */ >> + switch (proc_rc) { >> + case NCSCC_RC_SUCCESS: >> + break; >> + case NCSCC_RC_REQ_TIMOUT: >> + TRACE_4("cpa CkptInit:MDS Api failed with return >> value:%d,cpnd_mds_dest:%"PRIu64, proc_rc, cb->cpa_mds_dest); >> + rc = SA_AIS_ERR_TIMEOUT; >> + goto mds_fail; >> + default: >> + TRACE_4("cpa CkptInit:MDS Api failed with return >> value:%d,cpnd_mds_dest:%"PRIu64, proc_rc, cb->cpa_mds_dest); >> + rc = SA_AIS_ERR_TRY_AGAIN; >> + goto mds_fail; >> + } >> + >> + if (out_evt) { >> + rc = out_evt->info.cpa.info.initRsp.error; >> + if (rc != SA_AIS_OK) { >> + TRACE_4("cpa CkptInit:CPND_ERR Api failed with return >> value:%d",rc); >> + goto rsp_not_ok; >> + } >> + >> + if (m_CPA_VER_IS_ABOVE_B_1_1(version)) { >> + if (rc == SA_AIS_ERR_UNAVAILABLE) { >> + cb->is_cpnd_joined_clm = false; >> + if (locked) >> + m_NCS_UNLOCK(&cb->cb_lock, >> NCS_LOCK_WRITE); >> + locked = false; >> + goto clm_left; >> + } else { >> + cb->is_cpnd_joined_clm = true; >> + } >> + } >> + /* Take the CB lock after MDS Send */ >> + if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) != >> NCSCC_RC_SUCCESS) { >> + TRACE_4("cpa CkptInit:LOCK"); >> + rc = SA_AIS_ERR_LIBRARY; >> + goto lock_fail1; >> + } else >> + locked = true; >> + >> + cl_node->cl_hdl = out_evt->info.cpa.info.initRsp.ckptHandle; >> + cl_node->stale = false; >> + proc_rc = cpa_client_node_add(&cb->client_tree, cl_node); >> + if (proc_rc != NCSCC_RC_SUCCESS) { >> + rc = SA_AIS_ERR_LIBRARY; >> + TRACE_4("cpa api processing failed in >> CkptInit:client_node_add Api failed with return value:%d,cl_hdl:%llx ", rc, >> cl_node->cl_hdl); >> + goto node_add_fail; >> + } >> + } else { >> + TRACE_4("cpa api processing failed in CkptInit Api failed with >> return value:%d", rc); >> + rc = SA_AIS_ERR_NO_RESOURCES; >> + } >> + >> + if (rc != SA_AIS_OK) { >> + TRACE_4("cpa CkptInit:CPND_ERR Api failed with return >> value:%d",rc); >> + goto cpnd_rsp_fail; >> + } >> + >> + /*Error handling */ >> +cpnd_rsp_fail: >> +node_add_fail: >> +lock_fail1: >> + if (rc != SA_AIS_OK) { >> + CPSV_EVT finalize_evt, *out_evt1; >> + >> + out_evt1 = NULL; >> + /* populate the structure */ >> + memset(&finalize_evt, 0, sizeof(CPSV_EVT)); >> + finalize_evt.type = CPSV_EVT_TYPE_CPND; >> + finalize_evt.info.cpnd.type = CPND_EVT_A2ND_CKPT_FINALIZE; >> + finalize_evt.info.cpnd.info.finReq.client_hdl = cl_node->cl_hdl; >> + >> + if (locked) >> + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); >> + locked = false; >> + >> + /* send the request to the CPND */ >> + proc_rc = cpa_mds_msg_sync_send(cb->cpa_mds_hdl, >> &(cb->cpnd_mds_dest), >> + &finalize_evt, &out_evt1, CPSV_WAIT_TIME); >> + if (out_evt1) >> + m_MMGR_FREE_CPSV_EVT(out_evt1, NCS_SERVICE_ID_CPA); >> + } >> + >> +rsp_not_ok: >> +mds_fail: >> + >> + /* Free the IPC initialized for this client */ >> + if (rc != SA_AIS_OK) >> + cpa_callback_ipc_destroy(cl_node); >> + >> +ipc_init_fail: >> + /* Free the Client NODE */ >> + if (rc != SA_AIS_OK) >> + m_MMGR_FREE_CPA_CLIENT_NODE(cl_node); >> + >> +cnode_alloc_fail: >> + /* Release the CB lock */ >> + if (locked) >> + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); >> + >> +lock_fail: >> +clm_left: >> + /* Release the CB handle */ >> + m_CPA_GIVEUP_CB; >> + >> + /* Free the Out Event */ >> + if (out_evt) >> + m_MMGR_FREE_CPSV_EVT(out_evt, NCS_SERVICE_ID_CPA); >> + >> + if (rc == SA_AIS_OK) { >> + memcpy(&(cl_node->version), &client_version, >> sizeof(SaVersionT)); >> + /* Went well, return ckptHandle to the application */ >> + *ckptHandle = cl_node->cl_hdl; >> + TRACE_1("cpa ckptInit Api success with return value:%d and >> cl_hdl:%llx", SA_AIS_OK, cl_node->cl_hdl); >> + } >> +end: >> + if (rc != SA_AIS_OK) { >> + ncs_cpa_shutdown(); >> + ncs_agents_shutdown(); >> + } >> + >> + TRACE_LEAVE2("API Return code = %u", rc); >> + return rc; >> +} >> + >> + >> +/**************************************************************************** >> +Name : saCkptSelectionObjectGet >> + >> +Description : This function returns the operating system handle >> +associated with the ckptHandle. >> + >> Arguments : ckptHandle - Checkpoint service handle. >> selectionObject - Pointer to the operating system >> handle. >> >> @@ -4166,7 +4422,7 @@ ncsCkptRegisterCkptArrivalCallback(SaCkp >> } >> >> if (ckptArrivalCallback) { >> - cl_node->ckptArrivalCallback = ckptArrivalCallback; >> + cl_node->ckpt_callbk.saCkptCheckpointTrackCallback = >> ckptArrivalCallback; >> if (cl_node->callbk_mbx == 0) >> proc_rc = cpa_callback_ipc_init(cl_node); >> else >> @@ -4226,3 +4482,269 @@ ncsCkptRegisterCkptArrivalCallback(SaCkp >> TRACE_LEAVE2("API return code = %u", rc); >> return rc; >> } >> + >> +/**************************************************************************** >> +Name : saCkptTrack >> + >> +Description : This function enable the Ckpt Track call back >> + >> +Arguments : ckptHandle - Checkpoint handle. >> + >> +Return Values : Refer to SAI-AIS specification for various return values. >> + >> +Notes : >> + >> ******************************************************************************/ >> +SaAisErrorT saCkptTrack(SaCkptHandleT ckptHandle) >> +{ >> + SaAisErrorT rc = SA_AIS_OK; >> + CPSV_EVT evt; >> + uint32_t proc_rc = NCSCC_RC_SUCCESS; >> + CPA_CLIENT_NODE *cl_node = NULL; >> + CPA_CB *cb = NULL; >> + bool is_locked = false; >> + >> + /* retrieve CPA CB */ >> + m_CPA_RETRIEVE_CB(cb); >> + if (!cb) { >> + rc = SA_AIS_ERR_BAD_HANDLE; >> + TRACE_4("cpa CkptArrivalCallback Api failed with return >> value:%d,ckptHandle:%llx",rc, ckptHandle); >> + goto done; >> + } >> + >> + /* get the CB Lock */ >> + if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) { >> + rc = SA_AIS_ERR_LIBRARY; >> + TRACE_4("cpa CkptArrivalCallback:LOCK Api failed with return >> value:%d,ckptHandle:%llx", rc, ckptHandle); >> + goto lock_fail; >> + } >> + >> + is_locked = true; >> + >> + /* Get the Client info */ >> + rc = cpa_client_node_get(&cb->client_tree, &ckptHandle, &cl_node); >> + >> + if (!cl_node) { >> + rc = SA_AIS_ERR_BAD_HANDLE; >> + TRACE_4("cpa CkptArrivalCallback:client_node_get Api failed >> with return value:%d,ckptHandle:%llx", rc, ckptHandle); >> + goto proc_fail; >> + } >> + >> + if (m_CPA_VER_IS_BELOW_B_2_3(&cl_node->version)) { >> + rc = SA_AIS_ERR_VERSION; >> + TRACE_2("ERR_VERSION: saCkptTrack SHOULD BE A VERSION B.02.03 >> and above API but claims to be" >> + "%c %u %u", cl_node->version.releaseCode, >> cl_node->version.majorVersion, cl_node->version.minorVersion); >> + goto proc_fail; >> + } >> + >> + if (cl_node->ckpt_callbk.saCkptCheckpointTrackCallback) { >> + if (cl_node->callbk_mbx == 0) >> + proc_rc = cpa_callback_ipc_init(cl_node); >> + else >> + proc_rc = NCSCC_RC_SUCCESS; >> + } else { >> + rc = SA_AIS_ERR_INVALID_PARAM; >> + TRACE_4("cpa CkptArrivalCallback Api failed with return >> value:%d,ckptHandle:%llx", rc, ckptHandle); >> + goto proc_fail; >> + >> + } >> + >> + if (proc_rc != NCSCC_RC_SUCCESS) { >> + /* Error handling */ >> + rc = SA_AIS_ERR_LIBRARY; >> + TRACE_4("cpa CkptArrivalCallback Api failed with return >> value:%d,ckptHandle:%llx", rc, ckptHandle); >> + goto proc_fail; >> + } >> + /* Send it to CPND */ >> + memset(&evt, 0, sizeof(CPSV_EVT)); >> + evt.type = CPSV_EVT_TYPE_CPND; >> + evt.info.cpnd.type = CPND_EVT_A2ND_ARRIVAL_CB_REG; >> + evt.info.cpnd.info.arr_ntfy.client_hdl = ckptHandle; >> + >> + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); >> + is_locked = false; >> + /* IF CPND IS DOWN */ >> + if (false == cb->is_cpnd_up) { >> + rc = SA_AIS_ERR_TRY_AGAIN; >> + TRACE_4("cpa CkptArrivalCallback Api failed with return >> value:%d,ckptHandle:%llx", rc, ckptHandle); >> + goto lock_fail; >> + } >> + proc_rc = cpa_mds_msg_send(cb->cpa_mds_hdl, &cb->cpnd_mds_dest, &evt, >> NCSMDS_SVC_ID_CPND); >> + /* Generate rc from proc_rc */ >> + switch (proc_rc) { >> + case NCSCC_RC_SUCCESS: >> + break; >> + case NCSCC_RC_REQ_TIMOUT: >> + rc = SA_AIS_ERR_TIMEOUT; >> + TRACE_4("cpa CkptArrivalCallback:MDS Api failed with >> return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc, ckptHandle, >> cb->cpnd_mds_dest); >> + goto proc_fail; >> + default: >> + rc = SA_AIS_ERR_NO_RESOURCES; >> + TRACE_4("cpa CkptArrivalCallback:MDS Api failed with >> return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc, ckptHandle, >> cb->cpnd_mds_dest); >> + goto proc_fail; >> + } >> + >> +proc_fail: >> + if (is_locked) >> + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); >> +lock_fail: >> + m_CPA_GIVEUP_CB; >> + >> +done: >> + TRACE_LEAVE2("API return code = %u", rc); >> + return rc; >> +} >> + >> +/**************************************************************************** >> +Name : saCkptTrackStop >> + >> +Description : This function disable the Ckpt Track call back >> + >> +Arguments : ckptHandle - Checkpoint handle. >> + >> +Return Values : Refer to SAI-AIS specification for various return values. >> + >> +Notes : >> + >> ******************************************************************************/ >> +SaAisErrorT saCkptTrackStop(SaCkptHandleT ckptHandle) >> +{ >> + SaAisErrorT rc = SA_AIS_OK; >> + CPSV_EVT evt; >> + uint32_t proc_rc = NCSCC_RC_SUCCESS; >> + CPA_CLIENT_NODE *cl_node = NULL; >> + CPA_CB *cb = NULL; >> + bool is_locked = false; >> + >> + /* retrieve CPA CB */ >> + m_CPA_RETRIEVE_CB(cb); >> + if (!cb) { >> + rc = SA_AIS_ERR_BAD_HANDLE; >> + TRACE_4("cpa CkptArrivalCallback Api failed with return >> value:%d,ckptHandle:%llx",rc, ckptHandle); >> + goto done; >> + } >> + >> + /* get the CB Lock */ >> + if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) { >> + rc = SA_AIS_ERR_LIBRARY; >> + TRACE_4("cpa CkptArrivalCallback:LOCK Api failed with return >> value:%d,ckptHandle:%llx", rc, ckptHandle); >> + goto lock_fail; >> + } >> + >> + is_locked = true; >> + >> + /* Get the Client info */ >> + rc = cpa_client_node_get(&cb->client_tree, &ckptHandle, &cl_node); >> + >> + if (!cl_node) { >> + rc = SA_AIS_ERR_BAD_HANDLE; >> + TRACE_4("cpa CkptArrivalCallback:client_node_get Api failed >> with return value:%d,ckptHandle:%llx", rc, ckptHandle); >> + goto proc_fail; >> + } >> + >> + if (m_CPA_VER_IS_BELOW_B_2_3(&cl_node->version)) { >> + rc = SA_AIS_ERR_VERSION; >> + TRACE_2("ERR_VERSION: saCkptTrackStop SHOULD BE A VERSION >> B.02.03 and above API but claims to be" >> + "%c %u %u", cl_node->version.releaseCode, >> cl_node->version.majorVersion, cl_node->version.minorVersion); >> + goto proc_fail; >> + } >> + >> + if (cl_node->ckpt_callbk.saCkptCheckpointTrackCallback) { >> + if (cl_node->callbk_mbx == 0) >> + proc_rc = cpa_callback_ipc_init(cl_node); >> + else >> + proc_rc = NCSCC_RC_SUCCESS; >> + } else { >> + rc = SA_AIS_ERR_INVALID_PARAM; >> + TRACE_4("cpa CkptArrivalCallback Api failed with return >> value:%d,ckptHandle:%llx", rc, ckptHandle); >> + goto proc_fail; >> + >> + } >> + >> + if (proc_rc != NCSCC_RC_SUCCESS) { >> + /* Error handling */ >> + rc = SA_AIS_ERR_LIBRARY; >> + TRACE_4("cpa CkptArrivalCallback Api failed with return >> value:%d,ckptHandle:%llx", rc, ckptHandle); >> + goto proc_fail; >> + } >> + >> + /* Send it to CPND */ >> + memset(&evt, 0, sizeof(CPSV_EVT)); >> + evt.type = CPSV_EVT_TYPE_CPND; >> + evt.info.cpnd.type = CPND_EVT_A2ND_ARRIVAL_CB_UNREG; >> + evt.info.cpnd.info.arr_ntfy.client_hdl = ckptHandle; >> + >> + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); >> + is_locked = false; >> + >> + /* IF CPND IS DOWN */ >> + if (false == cb->is_cpnd_up) { >> + rc = SA_AIS_ERR_TRY_AGAIN; >> + TRACE_4("cpa CkptArrivalCallback Api failed with return >> value:%d,ckptHandle:%llx", rc, ckptHandle); >> + goto lock_fail; >> + } >> + proc_rc = cpa_mds_msg_send(cb->cpa_mds_hdl, &cb->cpnd_mds_dest, &evt, >> NCSMDS_SVC_ID_CPND); >> + >> + /* Generate rc from proc_rc */ >> + switch (proc_rc) { >> + case NCSCC_RC_SUCCESS: >> + break; >> + case NCSCC_RC_REQ_TIMOUT: >> + rc = SA_AIS_ERR_TIMEOUT; >> + TRACE_4("cpa CkptArrivalCallback:MDS Api failed with >> return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc, ckptHandle, >> cb->cpnd_mds_dest); >> + goto proc_fail; >> + default: >> + rc = SA_AIS_ERR_NO_RESOURCES; >> + TRACE_4("cpa CkptArrivalCallback:MDS Api failed with >> return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc, ckptHandle, >> cb->cpnd_mds_dest); >> + goto proc_fail; >> + } >> + >> +proc_fail: >> + if (is_locked) >> + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); >> +lock_fail: >> + m_CPA_GIVEUP_CB; >> + >> +done: >> + TRACE_LEAVE2("API return code = %u", rc); >> + return rc; >> +} >> + >> +/**************************************************************************** >> +Name : saCkptCheckpointTrack >> + >> +Description : This function enables the specific Checkpoint Track call >> back >> + >> +Arguments : checkpointHandle - The handle that designates the >> checkpoint >> +to enables Track. >> + >> +Return Values : Refer to SAI-AIS specification for various return values. >> + >> +Notes : >> + >> ******************************************************************************/ >> +SaAisErrorT saCkptCheckpointTrack(SaCkptCheckpointHandleT checkpointHandle) >> +{ >> + SaAisErrorT rc = SA_AIS_ERR_NOT_SUPPORTED; >> + TRACE_ENTER(); >> + TRACE_LEAVE2("API return code = %u", rc); >> + return rc; >> +} >> + >> +/**************************************************************************** >> +Name : saCkptCheckpointTrackStop >> + >> +Description : This function disables the specific Checkpoint Track call >> back >> + >> +Arguments : checkpointHandle - The handle that designates the >> checkpoint >> +to disables Track. >> + >> +Return Values : Refer to SAI-AIS specification for various return values. >> + >> +Notes : >> + >> ******************************************************************************/ >> +SaAisErrorT saCkptCheckpointTrackStop(SaCkptCheckpointHandleT >> checkpointHandle) >> +{ >> + SaAisErrorT rc = SA_AIS_ERR_NOT_SUPPORTED; >> + TRACE_ENTER(); >> + TRACE_LEAVE2("API return code = %u", rc); >> + return rc; >> +} >> + >> diff --git a/osaf/libs/agents/saf/cpa/cpa_proc.c >> b/osaf/libs/agents/saf/cpa/cpa_proc.c >> --- a/osaf/libs/agents/saf/cpa/cpa_proc.c >> +++ b/osaf/libs/agents/saf/cpa/cpa_proc.c >> @@ -1031,10 +1031,10 @@ static void cpa_process_callback_info(CP >> } >> break; >> case CPA_CALLBACK_TYPE_ARRIVAL_NTFY: >> - if (cl_node->ckptArrivalCallback) { >> + if (cl_node->ckpt_callbk.saCkptCheckpointTrackCallback) { >> uint32_t i = 0; >> - cl_node->ckptArrivalCallback(callback->lcl_ckpt_hdl, >> callback->ioVector, >> - callback->num_of_elmts); >> + >> cl_node->ckpt_callbk.saCkptCheckpointTrackCallback(callback->lcl_ckpt_hdl, >> callback->ioVector, >> + callback->num_of_elmts); >> for (i = 0; i < callback->num_of_elmts; i++) { >> if (callback->ioVector[i].sectionId.id != NULL >> && callback->ioVector[i].sectionId.idLen != >> 0) >> diff --git a/osaf/libs/common/cpsv/cpsv_edu.c >> b/osaf/libs/common/cpsv/cpsv_edu.c >> --- a/osaf/libs/common/cpsv/cpsv_edu.c >> +++ b/osaf/libs/common/cpsv/cpsv_edu.c >> @@ -87,7 +87,7 @@ FUNC_DECLARATION(CPD_EVT); >> FUNC_DECLARATION(CPA_EVT); >> FUNC_DECLARATION(CPSV_EVT); >> FUNC_DECLARATION(CPSV_A2ND_CKPT_LIST_UPDATE); >> - >> +FUNC_DECLARATION(CPSV_A2ND_ARRIVAL_UNREG); >> /* Test function declaration */ >> TEST_FUNC_DECLARATION(CPSV_EVT); >> TEST_FUNC_DECLARATION(CPA_EVT); >> @@ -1086,6 +1086,21 @@ FUNC_DECLARATION(DS) >> >> #undef DS >> >> +#define DS CPSV_A2ND_ARRIVAL_UNREG >> +FUNC_DECLARATION(DS) >> +{ >> + NCS_ENC_DEC_DECLARATION(DS); >> + NCS_ENC_DEC_ARRAY(DS) { >> + >> + { >> + EDU_START, FUNC_NAME(CPSV_A2ND_ARRIVAL_UNREG), 0, 0, 0, >> sizeof(DS), 0, NULL}, { >> + EDU_EXEC, ncs_edp_uns64, 0, 0, 0, (long)&((DS >> *) 0)->client_hdl, 0, NULL}, { >> + EDU_END, 0, 0, 0, 0, 0, 0, NULL},}; >> + NCS_ENC_DEC_REM_FLOW(DS) >> +} >> + >> +#undef DS >> + >> /* CPD --> CPND */ >> #define DS CPSV_CPND_DEST_INFO >> FUNC_DECLARATION(DS) >> @@ -1234,6 +1249,7 @@ FUNC_DECLARATION(DS) >> >> #undef DS >> >> + >> #define DS CPND_EVT >> TEST_FUNC_DECLARATION(DS) >> { >> @@ -1301,6 +1317,7 @@ TEST_FUNC_DECLARATION(DS) >> >> LCL_TEST_JUMP_OFFSET_CPND_EVT_D2ND_CKPT_NUM_SECTIONS, >> LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_CKPT_LIST_UPDATE, >> + LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_ARRIVAL_CB_UNREG, >> >> }; >> >> @@ -1416,6 +1433,8 @@ TEST_FUNC_DECLARATION(DS) >> return LCL_TEST_JUMP_OFFSET_CPSV_D2ND_RESTART_DONE; >> case CPND_EVT_A2ND_CKPT_LIST_UPDATE: >> return LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_CKPT_LIST_UPDATE; >> + case CPND_EVT_A2ND_ARRIVAL_CB_UNREG: >> + return LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_ARRIVAL_CB_UNREG; >> default: >> return EDU_FAIL; >> } >> @@ -1520,6 +1539,7 @@ FUNC_DECLARATION(DS) >> EDU_EXEC, FUNC_NAME(CPSV_CKPT_NUM_SECTIONS), 0, 0, EDU_EXIT, >> (long)&((DS *) 0)->info.ckpt_sections, 0, NULL}, { >> EDU_EXEC, FUNC_NAME(CPSV_A2ND_CKPT_LIST_UPDATE), 0, 0, >> EDU_EXIT, (long)&((DS *) 0)->info.ckptListUpdate, 0, NULL},{ >> + EDU_EXEC, FUNC_NAME(CPSV_A2ND_ARRIVAL_UNREG), 0, 0, >> EDU_EXIT, (long)&((DS *) 0)->info.arr_ntfy, 0, NULL},{ >> EDU_END, 0, 0, 0, 0, 0, 0, NULL},}; >> NCS_ENC_DEC_REM_FLOW(DS) >> } >> diff --git a/osaf/libs/common/cpsv/include/cpa_cb.h >> b/osaf/libs/common/cpsv/include/cpa_cb.h >> --- a/osaf/libs/common/cpsv/include/cpa_cb.h >> +++ b/osaf/libs/common/cpsv/include/cpa_cb.h >> @@ -28,9 +28,8 @@ typedef struct cpa_client_node { >> SaCkptHandleT cl_hdl; /* index for the tree */ >> uint8_t stale; /*Loss of connection with cpnd because of clm >> node left >> will set this to true for the connection. */ >> - SaCkptCallbacksT ckpt_callbk; >> + SaCkptCallbacksT_2 ckpt_callbk; >> SYSF_MBX callbk_mbx; /* Mailbox Queue for client messages */ >> - ncsCkptCkptArrivalCallbackT ckptArrivalCallback; /* NCS callback >> extention */ >> SaVersionT version; >> } CPA_CLIENT_NODE; >> >> diff --git a/osaf/libs/common/cpsv/include/cpa_def.h >> b/osaf/libs/common/cpsv/include/cpa_def.h >> --- a/osaf/libs/common/cpsv/include/cpa_def.h >> +++ b/osaf/libs/common/cpsv/include/cpa_def.h >> @@ -21,7 +21,7 @@ >> /* Macros for Validating Version */ >> #define CPA_RELEASE_CODE 'B' >> #define CPA_MAJOR_VERSION 0x02 >> -#define CPA_MINOR_VERSION 0x02 >> +#define CPA_MINOR_VERSION 0x03 >> #define CPA_BASE_MAJOR_VERSION 0x01 >> #define CPA_BASE_MINOR_VERSION 0x01 >> >> diff --git a/osaf/libs/common/cpsv/include/cpa_proc.h >> b/osaf/libs/common/cpsv/include/cpa_proc.h >> --- a/osaf/libs/common/cpsv/include/cpa_proc.h >> +++ b/osaf/libs/common/cpsv/include/cpa_proc.h >> @@ -23,7 +23,7 @@ typedef enum cpa_callback_type { >> CPA_CALLBACK_TYPE_OPEN = 1, >> CPA_CALLBACK_TYPE_SYNC, >> CPA_CALLBACK_TYPE_ARRIVAL_NTFY, >> - CPA_CALLBACK_TYPE_MAX = CPA_CALLBACK_TYPE_SYNC >> + CPA_CALLBACK_TYPE_MAX = CPA_CALLBACK_TYPE_ARRIVAL_NTFY >> } CPA_CALLBACK_TYPE; >> >> /* Info required for Call back */ >> diff --git a/osaf/libs/common/cpsv/include/cpsv.h >> b/osaf/libs/common/cpsv/include/cpsv.h >> --- a/osaf/libs/common/cpsv/include/cpsv.h >> +++ b/osaf/libs/common/cpsv/include/cpsv.h >> @@ -74,6 +74,13 @@ >> ((ver)->releaseCode > 'B') )&& \ >> ((ver)->majorVersion > 0x01 ) && \ >> ((ver)->minorVersion > 0x01 ) ) >> + >> +#define m_CPA_VER_IS_BELOW_B_2_3(ver) \ >> + (((ver)->releaseCode != 'B') || \ >> + ((ver)->majorVersion != 0x02 ) || \ >> + ((ver)->minorVersion < 0x03 ) ) >> + >> + >> #define m_IS_SA_CKPT_CHECKPOINT_COLLOCATED(attr) \ >> ((attr)->creationFlags & SA_CKPT_CHECKPOINT_COLLOCATED) >> >> diff --git a/osaf/libs/common/cpsv/include/cpsv_evt.h >> b/osaf/libs/common/cpsv/include/cpsv_evt.h >> --- a/osaf/libs/common/cpsv/include/cpsv_evt.h >> +++ b/osaf/libs/common/cpsv/include/cpsv_evt.h >> @@ -30,6 +30,7 @@ >> #define CPSV_EVT_H >> >> #include <saCkpt.h> >> +#include <saCkpt_B_02_03.h> >> #include "ncssysf_tmr.h" >> >> >> /***************************************************************************** >> @@ -115,7 +116,7 @@ typedef enum cpnd_evt_type { >> >> CPND_EVT_A2ND_CKPT_ITER_GETNEXT, /* Checkpoint Section >> Iternation Getnext Call */ >> >> - CPND_EVT_A2ND_ARRIVAL_CB_REG, /* Checkpoint Arrival Callback */ >> + CPND_EVT_A2ND_ARRIVAL_CB_REG, /* Checkpoint Arrival Callback >> Register*/ >> >> CPND_EVT_A2ND_CKPT_WRITE, /* Checkpoint Write And overwrite call >> */ >> CPND_EVT_A2ND_CKPT_READ, /* Checkpoint Read Call */ >> @@ -177,6 +178,7 @@ typedef enum cpnd_evt_type { >> CPND_EVT_D2ND_CKPT_NUM_SECTIONS, >> CPND_EVT_A2ND_CKPT_REFCNTSET, /* ref cont opener's set call */ >> CPND_EVT_A2ND_CKPT_LIST_UPDATE, /* Checkpoint ckpt list update Call */ >> + CPND_EVT_A2ND_ARRIVAL_CB_UNREG, /* Checkpoint Arrival Callback >> Un-Register*/ >> CPND_EVT_MAX >> >> }CPND_EVT_TYPE; >> @@ -394,6 +396,10 @@ typedef struct cpsv_a2nd_arrival_reg { >> SaCkptCheckpointHandleT client_hdl; >> } CPSV_A2ND_ARRIVAL_REG; >> >> +typedef struct cpsv_a2nd_arrival_unreg { >> + SaCkptCheckpointHandleT client_hdl; >> +} CPSV_A2ND_ARRIVAL_UNREG; >> + >> typedef struct cpsv_a2nd_sync_ckpt { >> SaCkptCheckpointHandleT ckpt_id; >> SaCkptCheckpointHandleT lcl_ckpt_hdl; >> diff --git a/osaf/libs/saf/include/Makefile.am >> b/osaf/libs/saf/include/Makefile.am >> --- a/osaf/libs/saf/include/Makefile.am >> +++ b/osaf/libs/saf/include/Makefile.am >> @@ -22,6 +22,7 @@ include_HEADERS = \ >> saAis.h \ >> saAmf.h \ >> saCkpt.h \ >> + saCkpt_B_02_03.h \ >> saClm.h \ >> saEvt.h \ >> saImm.h \ >> diff --git a/osaf/libs/saf/include/saCkpt_B_02_03.h >> b/osaf/libs/saf/include/saCkpt_B_02_03.h >> new file mode 100644 >> --- /dev/null >> +++ b/osaf/libs/saf/include/saCkpt_B_02_03.h >> @@ -0,0 +1,66 @@ >> +/* -*- OpenSAF -*- >> + * >> + * (C) Copyright 2008 The OpenSAF Foundation >> + * >> + * This program is distributed in the hope that it will be useful, but >> + * WITHOUT ANY WARRANTY; without even the implied warranty of >> MERCHANTABILITY >> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed >> + * under the GNU Lesser General Public License Version 2.1, February 1999. >> + * The complete license can be accessed from the following location: >> + *http://opensource.org/licenses/lgpl-license.php >> + * See the Copying file included with the OpenSAF distribution for full >> + * licensing terms. >> + * >> + * Author(s): Oracle >> + */ >> + >> +/* >> + * DESCRIPTION: >> + * This file provides the suggested additions to the C language binding >> for >> + * the Service Availability(TM) Forum Information Model Management >> Service (CKPT). >> + * It contains only the prototypes and type definitions that are part of >> this >> + * proposed addition. >> + * These additions are currently NON STANDARD. But the intention is to >> get these >> + * additions approved formally by SAF in the future. >> + * >> + */ >> + >> +#ifndef _SA_CKPT_B_02_03_H >> +#define _SA_CKPT_B_02_03_H >> + >> +#include "saAis.h" >> + >> +#ifdef __cplusplus >> +extern "C" { >> +#endif >> + typedef void >> + (*SaCkptCheckpointTrackCallbackT) (SaCkptCheckpointHandleT >> checkpointHandle, >> + SaCkptIOVectorElementT *ioVector, >> + SaUint32T numberOfElements); >> + >> + typedef struct { >> + SaCkptCheckpointOpenCallbackT saCkptCheckpointOpenCallback; >> + SaCkptCheckpointSynchronizeCallbackT >> saCkptCheckpointSynchronizeCallback; >> + SaCkptCheckpointTrackCallbackT saCkptCheckpointTrackCallback; >> + } SaCkptCallbacksT_2; >> + >> + extern SaAisErrorT >> + saCkptInitialize_2(SaCkptHandleT *ckptHandle, const >> SaCkptCallbacksT_2 *callbacks, SaVersionT *version); >> + >> + extern SaAisErrorT >> + saCkptTrack(SaCkptHandleT ckptHandle); >> + >> + extern SaAisErrorT >> + saCkptTrackStop(SaCkptHandleT ckptHandle); >> + >> + extern SaAisErrorT >> + saCkptCheckpointTrack(SaCkptCheckpointHandleT checkpointHandle); >> + >> + extern SaAisErrorT >> + saCkptCheckpointTrackStop(SaCkptCheckpointHandleT >> checkpointHandle); >> + >> +#ifdef __cplusplus >> +} >> +#endif >> + >> +#endif /* _SA_CKPT_H */ >> diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_evt.c >> b/osaf/services/saf/cpsv/cpnd/cpnd_evt.c >> --- a/osaf/services/saf/cpsv/cpnd/cpnd_evt.c >> +++ b/osaf/services/saf/cpsv/cpnd/cpnd_evt.c >> @@ -59,6 +59,7 @@ static uint32_t cpnd_evt_proc_nd2nd_ckpt >> static uint32_t cpnd_evt_proc_nd2nd_ckpt_active_data_access_rsp(CPND_CB >> *cb, CPND_EVT *evt, CPSV_SEND_INFO *sinfo); >> static uint32_t cpnd_evt_proc_ckpt_sync(CPND_CB *cb, CPND_EVT *evt, >> CPSV_SEND_INFO *sinfo); >> static uint32_t cpnd_evt_proc_arrival_cbreg(CPND_CB *cb, CPND_EVT *evt, >> CPSV_SEND_INFO *sinfo); >> +static uint32_t cpnd_evt_proc_arrival_cbunreg(CPND_CB *cb, CPND_EVT *evt, >> CPSV_SEND_INFO *sinfo); >> static uint32_t cpnd_evt_proc_nd2nd_ckpt_sync_req(CPND_CB *cb, CPND_EVT >> *evt, CPSV_SEND_INFO *sinfo); >> static uint32_t cpnd_evt_proc_nd2nd_ckpt_active_sync(CPND_CB *cb, CPND_EVT >> *evt, CPSV_SEND_INFO *sinfo); >> static uint32_t cpnd_evt_proc_ckpt_read(CPND_CB *cb, CPND_EVT *evt, >> CPSV_SEND_INFO *sinfo); >> @@ -105,7 +106,7 @@ static char *cpnd_evt_str[] = { >> "CPND_EVT_A2ND_CKPT_READ", /* Checkpoint Read Call */ >> "CPND_EVT_A2ND_CKPT_SYNC", /* Checkpoint Synchronize call */ >> "CPND_EVT_A2ND_CKPT_READ_ACK", /* read ack */ >> - "CPND_EVT_A2ND_ARRIVAL_CB_REG", /* Arrival Callback Register */ >> + "CPND_EVT_A2ND_ARRIVAL_CB_REG", /* Track Callback Register */ >> >> "CPND_EVT_ND2ND_ACTIVE_STATUS", /* ckpt status info from active */ >> /* Not used Anywhere from 3.0.2 */ >> "CPND_EVT_ND2ND_ACTIVE_STATUS_ACK", /* ckpt status ack from active >> */ /*Not used Anywhere from 3.0.2 */ >> @@ -148,6 +149,7 @@ static char *cpnd_evt_str[] = { >> "CPND_EVT_D2ND_CKPT_NUM_SECTIONS", >> "CPND_EVT_A2ND_CKPT_REFCNTSET", >> "CPND_EVT_A2ND_CKPT_LIST_UPDATE", /* Checkpoint ckpt list >> update Call */ >> + "CPND_EVT_A2ND_ARRIVAL_CB_UNREG", /* Track Callback Un-Register >> */ >> "CPND_EVT_MAX" >> }; >> #endif >> @@ -264,6 +266,9 @@ void cpnd_process_evt(CPSV_EVT *evt) >> case CPND_EVT_A2ND_ARRIVAL_CB_REG: >> (void)cpnd_evt_proc_arrival_cbreg(cb, &evt->info.cpnd, >> &evt->sinfo); >> break; >> + case CPND_EVT_A2ND_ARRIVAL_CB_UNREG: >> + (void)cpnd_evt_proc_arrival_cbunreg(cb, &evt->info.cpnd, >> &evt->sinfo); >> + break; >> case CPND_EVT_D2ND_CKPT_ACTIVE_SET: /* broadcast message */ >> (void)cpnd_evt_proc_ckpt_active_set(cb, &evt->info.cpnd, >> &evt->sinfo); >> break; >> @@ -3312,6 +3317,38 @@ static uint32_t cpnd_evt_proc_arrival_cb >> return rc; >> } >> >> +/****************************************************************************** >> + * Name : cpnd_evt_proc_arrival_cbunreg >> + * >> + * Description : Function to process the arrival callback registration >> + * >> + * Arguments : CPND_CB *cb - CPND CB pointer >> + * CPSV_EVT *evt - Received Event structure >> + * CPSV_SEND_INFO *sinfo - Sender MDS information. >> + * >> + * Return Values : NCSCC_RC_SUCCESS/Error >> + * >> + >> *****************************************************************************/ >> +static uint32_t cpnd_evt_proc_arrival_cbunreg(CPND_CB *cb, CPND_EVT *evt, >> CPSV_SEND_INFO *sinfo) >> +{ >> + CPND_CKPT_CLIENT_NODE *cl_node = NULL; >> + uint32_t rc = NCSCC_RC_SUCCESS; >> + >> + TRACE_ENTER(); >> + cpnd_client_node_get(cb, evt->info.arr_ntfy.client_hdl, &cl_node); >> + if (cl_node == NULL) { >> + TRACE_4("cpnd client hdl get failed for >> client_hdl:%llx",evt->info.arr_ntfy.client_hdl); >> + rc = NCSCC_RC_FAILURE; >> + TRACE_LEAVE(); >> + return rc; >> + } >> + cl_node->arrival_cb_flag = false; >> + >> + cpnd_restart_set_arrcb(cb, cl_node); >> + TRACE_LEAVE(); >> + return rc; >> +} >> + >> >> /**************************************************************************** >> * Name : cpnd_evt_proc_nd2nd_ckpt_sync_req >> * > ------------------------------------------------------------------------------ Rapidly troubleshoot problems before they affect your business. Most IT organizations don't have a clear picture of how application performance affects their revenue. With AppDynamics, you get 100% visibility into your Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro! http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel