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