Hi Hoang , cpnd_restore_client_info cpnd_restore_ckpt_info_v0 cpnd_restore_ckpt_info_v1
can you please elaborate this share memory version & and restoring client information from share memory process , Not able to interpret the use case. -AVM On 6/23/2016 4:23 PM, Hoang Vo wrote: > osaf/libs/common/cpsv/include/cpsv_shm.h | 20 +- > osaf/services/saf/cpsv/cpnd/cpnd_proc.c | 1 - > osaf/services/saf/cpsv/cpnd/cpnd_res.c | 821 > +++++++++++++++++++++++------- > 3 files changed, 634 insertions(+), 208 deletions(-) > > > diff --git a/osaf/libs/common/cpsv/include/cpsv_shm.h > b/osaf/libs/common/cpsv/include/cpsv_shm.h > --- a/osaf/libs/common/cpsv/include/cpsv_shm.h > +++ b/osaf/libs/common/cpsv/include/cpsv_shm.h > @@ -31,7 +31,7 @@ > > typedef struct cpsv_ckpt_hdr { > SaCkptCheckpointHandleT ckpt_id; /* Index for identifying the > checkpoint */ > - char ckpt_name[kOsafMaxDnLength]; > + SaNameT ckpt_name; > SaCkptCheckpointCreationAttributesT create_attrib; > SaCkptCheckpointOpenFlagsT open_flags; > uint32_t ckpt_lcl_ref_cnt; > @@ -74,6 +74,24 @@ typedef struct ckpt_info { > int32_t next; > } CKPT_INFO; > > +typedef struct ckpt_info_v0 { > + SaNameT ckpt_name; > + SaCkptCheckpointHandleT ckpt_id; > + uint32_t maxSections; > + SaSizeT maxSecSize; > + NODE_ID node_id; > + int32_t offset; > + uint32_t client_bitmap; > + int32_t is_valid; > + uint32_t bm_offset; > + bool is_unlink; > + bool is_close; > + bool cpnd_rep_create; > + bool is_first; > + SaTimeT close_time; > + int32_t next; > +} CKPT_INFO_V0; > + > typedef struct client_info { > SaCkptHandleT ckpt_app_hdl; > uint32_t ckpt_open_ref_cnt; > diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_proc.c > b/osaf/services/saf/cpsv/cpnd/cpnd_proc.c > --- a/osaf/services/saf/cpsv/cpnd/cpnd_proc.c > +++ b/osaf/services/saf/cpsv/cpnd/cpnd_proc.c > @@ -1813,7 +1813,6 @@ uint32_t cpnd_ckpt_hdr_update(CPND_CKPT_ > memset(&write_req, '\0', sizeof(write_req)); > memset(&ckpt_hdr, '\0', sizeof(CPSV_CKPT_HDR)); > ckpt_hdr.ckpt_id = cp_node->ckpt_id; > - strncpy(ckpt_hdr.ckpt_name, cp_node->ckpt_name, kOsafMaxDnLength); > ckpt_hdr.create_attrib = cp_node->create_attrib; > ckpt_hdr.open_flags = cp_node->open_flags; > ckpt_hdr.is_unlink = cp_node->is_unlink; > diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_res.c > b/osaf/services/saf/cpsv/cpnd/cpnd_res.c > --- a/osaf/services/saf/cpsv/cpnd/cpnd_res.c > +++ b/osaf/services/saf/cpsv/cpnd/cpnd_res.c > @@ -40,6 +40,8 @@ > > #define m_CPND_CKPTINFO_READ(ckpt_info,addr,offset) > memcpy(&ckpt_info,addr+offset,sizeof(CKPT_INFO)) > > +#define m_CPND_CKPTINFO_V0_READ(ckpt_info,addr,offset) > memcpy(&ckpt_info,addr+offset,sizeof(CKPT_INFO_V0)) > + > #define m_CPND_CKPTINFO_UPDATE(addr,ckpt_info,offset) > memcpy(addr+offset,&ckpt_info,sizeof(CKPT_INFO)) > > #define m_CPND_CKPTHDR_UPDATE(ckpt_hdr,offset) > memcpy(offset,&ckpt_hdr,sizeof(CKPT_HDR)) > @@ -48,6 +50,13 @@ static uint32_t cpnd_res_ckpt_sec_add(CP > static bool cpnd_find_exact_ckptinfo(CPND_CB *cb, CKPT_INFO *ckpt_info, > uint32_t bitmap_offset, > uint32_t *offset, uint32_t > *prev_offset); > static void cpnd_clear_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE *cp_node, > uint32_t curr_offset, uint32_t prev_offset); > +static uint32_t cpnd_restore_client_info(CPND_CB *cb, uint8_t *cli_addr); > +static uint32_t cpnd_restore_ckpt_info_v1(CPND_CB *cb, uint8_t *ckpt_addr, > SaClmNodeIdT nodeid); > +static uint32_t cpnd_restore_ckpt_info_v0(CPND_CB *cb, uint8_t *ckpt_addr, > SaClmNodeIdT nodeid); > +static void cpnd_destroy_shm_cpnd_cp_info(NCS_OS_POSIX_SHM_REQ_OPEN_INFO > *open_req); > +static void *cpnd_create_shm_cpnd_cp_info(NCS_OS_POSIX_SHM_REQ_INFO > *req_info); > +static void cpnd_update_shm_cpnd_cp_info(CPND_CB *cb); > +static void cpnd_convert_cp_info_v0(CKPT_INFO_V0 *cp_info_v0, CKPT_INFO > *cp_info); > > > /******************************************************************************* > * > * Name : cpnd_client_extract_bits > @@ -315,24 +324,10 @@ void cpnd_restart_update_timer(CPND_CB * > > void *cpnd_restart_shm_create(NCS_OS_POSIX_SHM_REQ_INFO *cpnd_open_req, > CPND_CB *cb, SaClmNodeIdT nodeid) > { > - uint32_t counter = 0, count, num_bitset = 0, n_clients, rc = > NCSCC_RC_SUCCESS, bit_position; > - uint64_t i_offset; > - int32_t next_offset; > - CPND_CKPT_CLIENT_NODE *cl_node = NULL; > - CPND_CKPT_NODE *cp_node = NULL; > - CLIENT_INFO cl_info; > - CLIENT_HDR cli_hdr; > - CKPT_INFO cp_info, tmp_cp_info; > - SaCkptHandleT client_hdl; > + uint32_t rc = NCSCC_RC_SUCCESS; > char *buf = NULL, *buffer = NULL; > uint8_t size = 0, total_length; > GBL_SHM_PTR gbl_shm_addr = {0, 0, 0, 0, 0}; > - memset(&cp_info, '\0', sizeof(CKPT_INFO)); > - NCS_OS_POSIX_SHM_REQ_INFO ckpt_rep_open; > - SaTimeT presentTime, timeout = 0; > - int64_t now, diff_time, giga_sec; > - uint32_t max_client_hdl = 0; > - SaTimeT tmpTime = 0; > CPND_SHM_VERSION cpnd_shm_version; > > TRACE_ENTER(); > @@ -371,18 +366,15 @@ void *cpnd_restart_shm_create(NCS_OS_POS > > if (rc == NCSCC_RC_FAILURE) { /* INITIALLY IT FAILS SO CREATE A > SHARED MEMORY */ > TRACE_1("cpnd comming up first time"); > - cpnd_open_req->info.open.i_flags = O_CREAT | O_RDWR; > - rc = ncs_os_posix_shm(cpnd_open_req); > - if (NCSCC_RC_FAILURE == rc) { > + > + if (NULL == cpnd_create_shm_cpnd_cp_info(cpnd_open_req)) { > LOG_ER("cpnd open request fail for RDWR mode %s",buf); > m_MMGR_FREE_CPND_DEFAULT(buffer); > return NULL; > } > + > cb->cpnd_first_time = true; > > - memset(cpnd_open_req->info.open.o_addr, 0, > - sizeof(CLIENT_HDR) + (MAX_CLIENTS * sizeof(CLIENT_INFO)) > + sizeof(CKPT_HDR) + > - (MAX_CKPTS * sizeof(CKPT_INFO))); > TRACE_1("cpnd new shm create request success"); > return cpnd_open_req->info.open.o_addr; > } > @@ -398,208 +390,53 @@ void *cpnd_restart_shm_create(NCS_OS_POS > > /* Already the shared memory exists */ > else { > + CPND_SHM_VERSION shm_version; > TRACE_1("cpnd restart already shared memory exits"); > gbl_shm_addr.cli_addr = cpnd_open_req->info.open.o_addr + > sizeof(cpnd_shm_version); /* Starting address of the shared memory */ > gbl_shm_addr.ckpt_addr = (void *)((char *)gbl_shm_addr.cli_addr > + sizeof(CLIENT_HDR) + > (MAX_CLIENTS * > sizeof(CLIENT_INFO))); > cb->shm_addr = gbl_shm_addr; > + memcpy(&shm_version, cpnd_open_req->info.open.o_addr, > sizeof(shm_version)); > > /* READ FROM THE SHARED MEMORY */ > > - TRACE("CPND IS RESTARTING "); > - /* Read the number of clients from the header */ > - memset(&cli_hdr, '\0', sizeof(CLIENT_HDR)); > - m_CPND_CLIHDR_INFO_READ(cli_hdr, (char *)gbl_shm_addr.cli_addr, > 0); > + TRACE("CPND IS RESTARTING WITH VERSION %d", > shm_version.shm_version); > + cpnd_restore_client_info(cb, gbl_shm_addr.cli_addr); > + switch (shm_version.shm_version) { > + case 0: > + { > + cpnd_restore_ckpt_info_v0(cb, gbl_shm_addr.ckpt_addr, > nodeid); > > - n_clients = cli_hdr.num_clients; > - TRACE_1("cpnd num clients read "); > - /* ( DO - WHILE )- READ THE CLIENT INFO AND FILL THE DATABASE > OF CLIENT INFO */ > - if (n_clients != 0) { > - while (counter < MAX_CLIENTS) { > - memset(&cl_info, '\0', sizeof(CLIENT_INFO)); > - if ((counter * sizeof(CLIENT_INFO)) > > INTMAX_MAX) { > - LOG_ER("cpnd ckpt shm create > failed,exceeded the write limits(UINT64_MAX) "); > - } > - i_offset = counter * sizeof(CLIENT_INFO); > - m_CPND_CLINFO_READ(cl_info, (char > *)gbl_shm_addr.cli_addr + sizeof(CLIENT_HDR), > - i_offset); > + /* Destroy the CPND_CHECKPOINT_INFO version 0 */ > + > cpnd_destroy_shm_cpnd_cp_info(&cpnd_open_req->info.open); > > - if (cl_info.ckpt_app_hdl == 0) { > - counter++; > - continue; > - } > + /* Create the CPND_CHECKPOINT_INFO version 1 */ > + if (NULL == > cpnd_create_shm_cpnd_cp_info(cpnd_open_req)) { > + LOG_ER("cpnd open request fail for RDWR mode > %s",buf); > + m_MMGR_FREE_CPND_DEFAULT(buffer); > + return NULL; > + } > > - cl_node = m_MMGR_ALLOC_CPND_CKPT_CLIENT_NODE; > - if (cl_node == NULL) { > - LOG_ER("cpnd ckpt client node memory > alloc failed "); > - rc = SA_AIS_ERR_NO_MEMORY; > - goto memfail; > - } > - memset(cl_node, '\0', > sizeof(CPND_CKPT_CLIENT_NODE)); > - cl_node->ckpt_app_hdl = cl_info.ckpt_app_hdl; > - cl_node->ckpt_open_ref_cnt = > cl_info.ckpt_open_ref_cnt; > - cl_node->open_reader_flags_cnt = > cl_info.open_reader_flags_cnt; > - cl_node->open_writer_flags_cnt = > cl_info.open_writer_flags_cnt; > - cl_node->agent_mds_dest = > cl_info.agent_mds_dest; > - cl_node->offset = cl_info.offset; > - cl_node->version = cl_info.version; > - cl_node->arrival_cb_flag = cl_info.arr_flag; > - cl_node->ckpt_list = NULL; > + /* Update the CPND_CHECKPOINT_INFO version 1 */ > + gbl_shm_addr.cli_addr = cpnd_open_req->info.open.o_addr > + sizeof(cpnd_shm_version); /* Starting address of the shared memory */ > + gbl_shm_addr.ckpt_addr = (void *)((char > *)gbl_shm_addr.cli_addr + sizeof(CLIENT_HDR) + > + > (MAX_CLIENTS * sizeof(CLIENT_INFO))); > + cb->shm_addr = gbl_shm_addr; > + cpnd_update_shm_cpnd_cp_info(cb); > > - if (cpnd_client_node_add(cb, cl_node) != > NCSCC_RC_SUCCESS) { > - TRACE_4("cpnd client nonde tree add > failed cpkpt_app_hdl %llx ",cl_node->ckpt_app_hdl); > - rc = SA_AIS_ERR_NO_MEMORY; > - goto node_add_fail; > - } > - counter++; > - if (cl_info.ckpt_app_hdl > max_client_hdl) { > - max_client_hdl = cl_info.ckpt_app_hdl; > - cb->cli_id_gen = cl_info.ckpt_app_hdl + > 1; > - } > - TRACE_1("cpnd client info read success"); > - } > + break; > } > - counter = 0; > + case 1: > + cpnd_restore_ckpt_info_v1(cb, gbl_shm_addr.ckpt_addr, > nodeid); > + break; > + default: > + LOG_ER("cpnd share memory version invalide"); > + break; > + } > > - /* TO READ THE NUMBER OF CHECKPOINTS FROM THE HEADER */ > - while (counter < MAX_CKPTS) { > - memset(&cp_info, '\0', sizeof(CKPT_INFO)); > - if ((counter * sizeof(CKPT_INFO)) > UINTMAX_MAX) { > - LOG_ER("cpnd ckpt shm create failed,exceeded > the write limits(UINT64_MAX) "); > - } > - i_offset = counter * sizeof(CKPT_INFO); > - m_CPND_CKPTINFO_READ(cp_info, (char > *)gbl_shm_addr.ckpt_addr + sizeof(CKPT_HDR), i_offset); > - > - if (cp_info.is_valid == 0) { > - counter++; > - continue; > - } > - if (cp_info.is_first) { > - cp_node = m_MMGR_ALLOC_CPND_CKPT_NODE; > - if (cp_node == NULL) { > - LOG_ER("cpnd ckpt node memory > allocation failed"); > - goto memfail; > - } > - > - memset(cp_node, '\0', sizeof(CPND_CKPT_NODE)); > - cp_node->ckpt_name = strdup(cp_info.ckpt_name); > - cp_node->ckpt_id = cp_info.ckpt_id; > - cp_node->offset = cp_info.offset; > - cp_node->is_close = cp_info.is_close; > - cp_node->is_unlink = cp_info.is_unlink; > - cp_node->close_time = cp_info.close_time; > - cp_node->cpnd_rep_create = > cp_info.cpnd_rep_create; > - cpnd_ckpt_sec_map_init(&cp_node->replica_info); > - > - /* Non-collocated Differentiator flag */ > - if (cp_info.cpnd_rep_create) { > - /* OPEN THE SHARED MEMORY ALREADY > CREATED FOR CHECKPOINT REPLICA */ > - /* size=cp_node->ckpt_name.length; */ > - buf = > m_MMGR_ALLOC_CPND_DEFAULT(CPND_MAX_REPLICA_NAME_LENGTH); > - memset(buf, '\0', > CPND_MAX_REPLICA_NAME_LENGTH); > - strncpy(buf, cp_node->ckpt_name, > CPND_REP_NAME_MAX_CKPT_NAME_LENGTH); > - sprintf(buf + strlen(buf) - 1, > "_%d_%d", (uint32_t)nodeid, (uint32_t)cp_node->ckpt_id); > - rc = > cpnd_ckpt_replica_create_res(&ckpt_rep_open, buf, &cp_node, 0, &cp_info, > cb->shm_alloc_guaranteed); > - if (rc != NCSCC_RC_SUCCESS) { > - /* assert(0); */ > - TRACE_4("cpnd ckpt replica > create failed with return value %d",rc); > - > - counter++; > - continue; > - } > - cb->num_rep++; > - } > - if (cp_node->is_unlink) { > - free((void *)cp_node->ckpt_name); > - cp_node->ckpt_name = strdup(""); > - } > - > - memset(&tmp_cp_info, '\0', sizeof(CKPT_INFO)); > - memcpy(&tmp_cp_info, &cp_info, > sizeof(CKPT_INFO)); > - next_offset = cp_info.offset; > - while (next_offset >= 0) { > - num_bitset = > client_bitmap_isset(tmp_cp_info.client_bitmap); /* To check which clients > opened this checkpoint */ > - cp_node->ckpt_lcl_ref_cnt = > cp_node->ckpt_lcl_ref_cnt + num_bitset; > - bit_position = 0; > - for (count = 1; count <= num_bitset; > count++) { > - client_hdl = > cpnd_client_extract_bits(tmp_cp_info.client_bitmap, &bit_position); /* > This will return the client which opened this checkpoint */ > - TRACE_1("cpnd client handle > extracted "); > - client_hdl = > (tmp_cp_info.bm_offset * 32) + client_hdl; > - cpnd_client_node_get(cb, > client_hdl, &cl_node); /* already in the above do-while , we added client > node to client tree */ > - if (cl_node == NULL) { > - /* this should not have > happened , quit */ > - /* assert(0); */ > - TRACE_4("cpnd client > node get failed client hdl: %llx",client_hdl); > - continue; > - /* goto end; */ > - } > - cpnd_ckpt_client_add(cp_node, > cl_node); > - } > - next_offset = tmp_cp_info.next; > - if (next_offset >= 0) { > - if ((next_offset * > sizeof(CKPT_INFO)) > UINTMAX_MAX) { > - LOG_ER("cpnd ckpt shm > create failed,exceeded the write limits(UINT64_MAX) "); > - } > - memset(&tmp_cp_info, '\0', > sizeof(CKPT_INFO)); > - i_offset = next_offset * > sizeof(CKPT_INFO); > - > m_CPND_CKPTINFO_READ(tmp_cp_info, > - (char > *)gbl_shm_addr.ckpt_addr + sizeof(CKPT_HDR), > - i_offset); > - } > - > - } /* End of clients processing for this > cp_node */ > - > - cpnd_ckpt_node_add(cb, cp_node); > - > - if (cp_info.is_close) { > - /* start the timer if exists */ > - now = m_GET_TIME_STAMP(tmpTime); > - giga_sec = 1000000000; > - diff_time = now - cp_node->close_time; > - /* > if((cp_node->create_attrib.retentionDuration) > > (SA_TIME_ONE_SECOND*(presentTime - cp_node->close_time))) */ > - if > ((cp_node->create_attrib.retentionDuration) > (giga_sec * diff_time)) { > - /* timeout = > cp_node->create_attrib.retentionDuration - (SA_TIME_ONE_SECOND*(presentTime - > cp_node->close_time)); */ > - timeout = > - > cp_node->create_attrib.retentionDuration - (giga_sec * diff_time); > - timeout = > m_CPSV_CONVERT_SATIME_TEN_MILLI_SEC(timeout); > - } > - if (timeout) { > - /* for restart shared memory > updation */ > - m_GET_TIME_STAMP(presentTime); > - cpnd_restart_update_timer(cb, > cp_node, presentTime); > - if > (!m_CPND_IS_COLLOCATED_ATTR_SET > - > (cp_node->create_attrib.creationFlags)) { > - cp_node->ret_tmr.type = > CPND_TMR_TYPE_NON_COLLOC_RETENTION; > - } else { > - cp_node->ret_tmr.type = > CPND_TMR_TYPE_RETENTION; > - } > - cp_node->ret_tmr.uarg = > cb->cpnd_cb_hdl_id; > - cp_node->ret_tmr.ckpt_id = > cp_node->ckpt_id; > - > cpnd_tmr_start(&cp_node->ret_tmr, timeout); > - } else { > - if > (!m_CPND_IS_COLLOCATED_ATTR_SET > - > (cp_node->create_attrib.creationFlags)) { > - > cpnd_proc_non_colloc_rt_expiry(cb, cp_node->ckpt_id); > - } else { > - cpnd_proc_rt_expiry(cb, > cp_node->ckpt_id); > - } > - } > - } > - > - } /* End of one cp_node processing */ > - counter++; > - } /* End of while after processing all 2000 ckpt > structs */ > } /* End of else CPND after restart */ > TRACE_LEAVE(); > return cpnd_open_req->info.open.o_addr; > - memfail: > - node_add_fail: > - if (cl_node) > - cpnd_client_node_tree_cleanup(cb); > - if (cp_node) > - cpnd_ckpt_node_tree_cleanup(cb); > - TRACE_LEAVE(); > - return cpnd_open_req->info.open.o_addr; > } > > /* TO FIND THE FREE BLOCK */ > @@ -1506,3 +1343,575 @@ uint32_t cpnd_restart_shm_ckpt_update(CP > TRACE_LEAVE(); > return NCSCC_RC_SUCCESS; > } > + > +/********************************************************************************************* > + * Name : cpnd_restore_client_info > + * > + * Description : To restore client information from share memory > + * > + * Arguments : - > + * > + * Return Values : - > + * > + > **********************************************************************************************/ > +static uint32_t cpnd_restore_client_info(CPND_CB *cb, uint8_t *cli_addr) > +{ > + uint32_t counter = 0, n_clients; > + uint64_t i_offset; > + CPND_CKPT_CLIENT_NODE *cl_node = NULL; > + CLIENT_INFO cl_info; > + CLIENT_HDR cli_hdr; > + uint32_t max_client_hdl = 0; > + > + TRACE_ENTER(); > + > + /* Read the number of clients from the header */ > + memset(&cli_hdr, '\0', sizeof(CLIENT_HDR)); > + m_CPND_CLIHDR_INFO_READ(cli_hdr, cli_addr, 0); > + > + n_clients = cli_hdr.num_clients; > + TRACE_1("cpnd num clients read - n_clients = %d", n_clients); > + > + /* ( DO - WHILE )- READ THE CLIENT INFO AND FILL THE DATABASE OF > CLIENT INFO */ > + if (n_clients != 0) { > + while (counter < MAX_CLIENTS) { > + memset(&cl_info, '\0', sizeof(CLIENT_INFO)); > + if ((counter * sizeof(CLIENT_INFO)) > INTMAX_MAX) { > + LOG_ER("cpnd ckpt shm create failed,exceeded > the write limits(UINT64_MAX) "); > + } > + i_offset = counter * sizeof(CLIENT_INFO); > + m_CPND_CLINFO_READ(cl_info, cli_addr + > sizeof(CLIENT_HDR), i_offset); > + > + if (cl_info.ckpt_app_hdl == 0) { > + counter++; > + continue; > + } > + > + cl_node = m_MMGR_ALLOC_CPND_CKPT_CLIENT_NODE; > + if (cl_node == NULL) { > + LOG_ER("cpnd ckpt client node memory alloc > failed "); > + TRACE_LEAVE(); > + return SA_AIS_ERR_NO_MEMORY; > + } > + memset(cl_node, '\0', sizeof(CPND_CKPT_CLIENT_NODE)); > + cl_node->ckpt_app_hdl = cl_info.ckpt_app_hdl; > + cl_node->ckpt_open_ref_cnt = cl_info.ckpt_open_ref_cnt; > + cl_node->open_reader_flags_cnt = > cl_info.open_reader_flags_cnt; > + cl_node->open_writer_flags_cnt = > cl_info.open_writer_flags_cnt; > + cl_node->agent_mds_dest = cl_info.agent_mds_dest; > + cl_node->offset = cl_info.offset; > + cl_node->version = cl_info.version; > + cl_node->arrival_cb_flag = cl_info.arr_flag; > + cl_node->ckpt_list = NULL; > + > + if (cpnd_client_node_add(cb, cl_node) != > NCSCC_RC_SUCCESS) { > + TRACE_4("cpnd client nonde tree add failed > cpkpt_app_hdl %llx ",cl_node->ckpt_app_hdl); > + cpnd_client_node_tree_cleanup(cb); > + TRACE_LEAVE(); > + return SA_AIS_ERR_NO_MEMORY; > + } > + counter++; > + if (cl_info.ckpt_app_hdl > max_client_hdl) { > + max_client_hdl = cl_info.ckpt_app_hdl; > + cb->cli_id_gen = cl_info.ckpt_app_hdl + 1; > + } > + TRACE_1("cpnd client info read success"); > + } > + } > + > + TRACE_LEAVE(); > + return SA_AIS_OK; > +} > + > + > +/********************************************************************************************* > + * Name : cpnd_restore_client_info_v1 > + * > + * Description : To restore client information from share memory version 1 > + * > + * Arguments : - > + * > + * Return Values : - > + * > + > **********************************************************************************************/ > +static uint32_t cpnd_restore_ckpt_info_v1(CPND_CB *cb, uint8_t *ckpt_addr, > SaClmNodeIdT nodeid) > +{ > + uint32_t counter = 0, count, num_bitset = 0, rc = NCSCC_RC_SUCCESS, > bit_position; > + uint64_t i_offset; > + int32_t next_offset; > + CPND_CKPT_CLIENT_NODE *cl_node = NULL; > + CPND_CKPT_NODE *cp_node = NULL; > + CKPT_INFO cp_info, tmp_cp_info; > + SaCkptHandleT client_hdl; > + char *buf = NULL; > + memset(&cp_info, '\0', sizeof(CKPT_INFO)); > + NCS_OS_POSIX_SHM_REQ_INFO ckpt_rep_open; > + SaTimeT presentTime, timeout = 0; > + int64_t now, diff_time, giga_sec; > + SaTimeT tmpTime = 0; > + > + TRACE_ENTER(); > + > + /* TO READ THE NUMBER OF CHECKPOINTS FROM THE HEADER */ > + while (counter < MAX_CKPTS) { > + memset(&cp_info, '\0', sizeof(CKPT_INFO)); > + if ((counter * sizeof(CKPT_INFO)) > UINTMAX_MAX) { > + LOG_ER("cpnd ckpt shm create failed,exceeded the write > limits(UINT64_MAX) "); > + } > + i_offset = counter * sizeof(CKPT_INFO); > + m_CPND_CKPTINFO_READ(cp_info, ckpt_addr + sizeof(CKPT_HDR), > i_offset); > + > + if (cp_info.is_valid == 0) { > + counter++; > + continue; > + } > + if (cp_info.is_first) { > + cp_node = m_MMGR_ALLOC_CPND_CKPT_NODE; > + if (cp_node == NULL) { > + LOG_ER("cpnd ckpt node memory allocation > failed"); > + TRACE_LEAVE(); > + return SA_AIS_ERR_NO_MEMORY; > + } > + > + memset(cp_node, '\0', sizeof(CPND_CKPT_NODE)); > + cp_node->ckpt_name = strdup(cp_info.ckpt_name); > + cp_node->ckpt_id = cp_info.ckpt_id; > + cp_node->offset = cp_info.offset; > + cp_node->is_close = cp_info.is_close; > + cp_node->is_unlink = cp_info.is_unlink; > + cp_node->close_time = cp_info.close_time; > + cp_node->cpnd_rep_create = cp_info.cpnd_rep_create; > + cpnd_ckpt_sec_map_init(&cp_node->replica_info); > + > + /* Non-collocated Differentiator flag */ > + if (cp_info.cpnd_rep_create) { > + /* OPEN THE SHARED MEMORY ALREADY CREATED FOR > CHECKPOINT REPLICA */ > + /* size=cp_node->ckpt_name.length; */ > + buf = > m_MMGR_ALLOC_CPND_DEFAULT(CPND_MAX_REPLICA_NAME_LENGTH); > + memset(buf, '\0', CPND_MAX_REPLICA_NAME_LENGTH); > + strncpy(buf, cp_node->ckpt_name, > CPND_REP_NAME_MAX_CKPT_NAME_LENGTH); > + sprintf(buf + strlen(buf) - 1, "_%d_%d", > (uint32_t)nodeid, (uint32_t)cp_node->ckpt_id); > + rc = > cpnd_ckpt_replica_create_res(&ckpt_rep_open, buf, &cp_node, 0, &cp_info, > cb->shm_alloc_guaranteed); > + if (rc != NCSCC_RC_SUCCESS) { > + /* assert(0); */ > + TRACE_4("cpnd ckpt replica create > failed with return value %d",rc); > + > + counter++; > + continue; > + } > + cb->num_rep++; > + } > + if (cp_node->is_unlink) { > + free((void *)cp_node->ckpt_name); > + cp_node->ckpt_name = strdup(""); > + } > + > + memset(&tmp_cp_info, '\0', sizeof(CKPT_INFO)); > + memcpy(&tmp_cp_info, &cp_info, sizeof(CKPT_INFO)); > + next_offset = cp_info.offset; > + while (next_offset >= 0) { > + num_bitset = > client_bitmap_isset(tmp_cp_info.client_bitmap); /* To check which clients > opened this checkpoint */ > + cp_node->ckpt_lcl_ref_cnt = > cp_node->ckpt_lcl_ref_cnt + num_bitset; > + bit_position = 0; > + for (count = 1; count <= num_bitset; count++) { > + client_hdl = > cpnd_client_extract_bits(tmp_cp_info.client_bitmap, &bit_position); /* > This will return the client which opened this checkpoint */ > + TRACE_1("cpnd client handle extracted > "); > + client_hdl = (tmp_cp_info.bm_offset * > 32) + client_hdl; > + cpnd_client_node_get(cb, client_hdl, > &cl_node); /* already in the above do-while , we added client node to client > tree */ > + if (cl_node == NULL) { > + /* this should not have > happened , quit */ > + /* assert(0); */ > + TRACE_4("cpnd client node get > failed client hdl: %llx",client_hdl); > + continue; > + /* goto end; */ > + } > + cpnd_ckpt_client_add(cp_node, cl_node); > + } > + next_offset = tmp_cp_info.next; > + if (next_offset >= 0) { > + if ((next_offset * sizeof(CKPT_INFO)) > > UINTMAX_MAX) { > + LOG_ER("cpnd ckpt shm create > failed,exceeded the write limits(UINT64_MAX) "); > + } > + memset(&tmp_cp_info, '\0', > sizeof(CKPT_INFO)); > + i_offset = next_offset * > sizeof(CKPT_INFO); > + m_CPND_CKPTINFO_READ(tmp_cp_info, > ckpt_addr + sizeof(CKPT_HDR), i_offset); > + } > + > + } /* End of clients processing for this cp_node */ > + > + cpnd_ckpt_node_add(cb, cp_node); > + > + if (cp_info.is_close) { > + /* start the timer if exists */ > + now = m_GET_TIME_STAMP(tmpTime); > + giga_sec = 1000000000; > + diff_time = now - cp_node->close_time; > + /* > if((cp_node->create_attrib.retentionDuration) > > (SA_TIME_ONE_SECOND*(presentTime - cp_node->close_time))) */ > + if ((cp_node->create_attrib.retentionDuration) > > (giga_sec * diff_time)) { > + /* timeout = > cp_node->create_attrib.retentionDuration - (SA_TIME_ONE_SECOND*(presentTime - > cp_node->close_time)); */ > + timeout = > + > cp_node->create_attrib.retentionDuration - (giga_sec * diff_time); > + timeout = > m_CPSV_CONVERT_SATIME_TEN_MILLI_SEC(timeout); > + } > + if (timeout) { > + /* for restart shared memory updation */ > + m_GET_TIME_STAMP(presentTime); > + cpnd_restart_update_timer(cb, cp_node, > presentTime); > + if (!m_CPND_IS_COLLOCATED_ATTR_SET > + > (cp_node->create_attrib.creationFlags)) { > + cp_node->ret_tmr.type = > CPND_TMR_TYPE_NON_COLLOC_RETENTION; > + } else { > + cp_node->ret_tmr.type = > CPND_TMR_TYPE_RETENTION; > + } > + cp_node->ret_tmr.uarg = > cb->cpnd_cb_hdl_id; > + cp_node->ret_tmr.ckpt_id = > cp_node->ckpt_id; > + cpnd_tmr_start(&cp_node->ret_tmr, > timeout); > + } else { > + if (!m_CPND_IS_COLLOCATED_ATTR_SET > + > (cp_node->create_attrib.creationFlags)) { > + > cpnd_proc_non_colloc_rt_expiry(cb, cp_node->ckpt_id); > + } else { > + cpnd_proc_rt_expiry(cb, > cp_node->ckpt_id); > + } > + } > + } > + > + } /* End of one cp_node processing */ > + counter++; > + } /* End of while after processing all 2000 ckpt structs > */ > + > + TRACE_LEAVE(); > + return SA_AIS_OK; > +} > + > +/********************************************************************************************* > + * Name : cpnd_restore_client_info_v0 > + * > + * Description : To restore client information from share memory version 0 > + * > + * Arguments : - > + * > + * Return Values : - > + * > + > **********************************************************************************************/ > +static uint32_t cpnd_restore_ckpt_info_v0(CPND_CB *cb, uint8_t *ckpt_addr, > SaClmNodeIdT nodeid) > +{ > + uint32_t counter = 0, count, num_bitset = 0, rc = NCSCC_RC_SUCCESS, > bit_position; > + uint64_t i_offset; > + int32_t next_offset; > + CPND_CKPT_CLIENT_NODE *cl_node = NULL; > + CPND_CKPT_NODE *cp_node = NULL; > + CKPT_INFO_V0 cp_info_v0, tmp_cp_info_v0; > + CKPT_INFO cp_info; > + SaCkptHandleT client_hdl; > + char *buf = NULL; > + memset(&cp_info_v0, '\0', sizeof(CKPT_INFO_V0)); > + NCS_OS_POSIX_SHM_REQ_INFO ckpt_rep_open; > + SaTimeT presentTime, timeout = 0; > + int64_t now, diff_time, giga_sec; > + SaTimeT tmpTime = 0; > + > + TRACE_ENTER(); > + > + /* TO READ THE NUMBER OF CHECKPOINTS FROM THE HEADER */ > + while (counter < MAX_CKPTS) { > + memset(&cp_info_v0, '\0', sizeof(CKPT_INFO_V0)); > + if ((counter * sizeof(CKPT_INFO_V0)) > UINTMAX_MAX) { > + LOG_ER("cpnd ckpt shm create failed,exceeded the write > limits(UINT64_MAX) "); > + } > + i_offset = counter * sizeof(CKPT_INFO_V0); > + m_CPND_CKPTINFO_V0_READ(cp_info_v0, ckpt_addr + > sizeof(CKPT_HDR), i_offset); > + > + if (cp_info_v0.is_valid == 0) { > + counter++; > + continue; > + } > + if (cp_info_v0.is_first) { > + cp_node = m_MMGR_ALLOC_CPND_CKPT_NODE; > + if (cp_node == NULL) { > + LOG_ER("cpnd ckpt node memory allocation > failed"); > + TRACE_LEAVE(); > + return SA_AIS_ERR_NO_MEMORY; > + } > + > + memset(cp_node, '\0', sizeof(CPND_CKPT_NODE)); > + cp_node->ckpt_name = > strdup(osaf_extended_name_borrow(&cp_info_v0.ckpt_name)); > + cp_node->ckpt_id = cp_info_v0.ckpt_id; > + cp_node->offset = SHM_INIT; > + cp_node->is_close = cp_info_v0.is_close; > + cp_node->is_unlink = cp_info_v0.is_unlink; > + cp_node->close_time = cp_info_v0.close_time; > + cp_node->cpnd_rep_create = cp_info_v0.cpnd_rep_create; > + cpnd_ckpt_sec_map_init(&cp_node->replica_info); > + > + /* Non-collocated Differentiator flag */ > + if (cp_info_v0.cpnd_rep_create) { > + /* OPEN THE SHARED MEMORY ALREADY CREATED FOR > CHECKPOINT REPLICA */ > + /* size=cp_node->ckpt_name.length; */ > + buf = > m_MMGR_ALLOC_CPND_DEFAULT(CPND_MAX_REPLICA_NAME_LENGTH); > + memset(buf, '\0', CPND_MAX_REPLICA_NAME_LENGTH); > + strncpy(buf, cp_node->ckpt_name, > CPND_REP_NAME_MAX_CKPT_NAME_LENGTH); > + sprintf(buf + strlen(buf) - 1, "_%d_%d", > (uint32_t)nodeid, (uint32_t)cp_node->ckpt_id); > + cpnd_convert_cp_info_v0(&cp_info_v0, &cp_info); > + rc = > cpnd_ckpt_replica_create_res(&ckpt_rep_open, buf, &cp_node, 0, &cp_info, > cb->shm_alloc_guaranteed); > + if (rc != NCSCC_RC_SUCCESS) { > + /* assert(0); */ > + TRACE_4("cpnd ckpt replica create > failed with return value %d",rc); > + > + counter++; > + continue; > + } > + cb->num_rep++; > + } > + if (cp_node->is_unlink) { > + free((void *)cp_node->ckpt_name); > + cp_node->ckpt_name = strdup(""); > + } > + > + memset(&tmp_cp_info_v0, '\0', sizeof(CKPT_INFO_V0)); > + memcpy(&tmp_cp_info_v0, &cp_info_v0, > sizeof(CKPT_INFO_V0)); > + next_offset = cp_info_v0.offset; > + while (next_offset >= 0) { > + num_bitset = > client_bitmap_isset(tmp_cp_info_v0.client_bitmap); /* To check which clients > opened this checkpoint */ > + cp_node->ckpt_lcl_ref_cnt = > cp_node->ckpt_lcl_ref_cnt + num_bitset; > + bit_position = 0; > + for (count = 1; count <= num_bitset; count++) { > + client_hdl = > cpnd_client_extract_bits(tmp_cp_info_v0.client_bitmap, &bit_position); /* > This will return the client which opened this checkpoint */ > + TRACE_1("cpnd client handle extracted > "); > + client_hdl = (tmp_cp_info_v0.bm_offset > * 32) + client_hdl; > + cpnd_client_node_get(cb, client_hdl, > &cl_node); /* already in the above do-while , we added client node to client > tree */ > + if (cl_node == NULL) { > + /* this should not have > happened , quit */ > + /* assert(0); */ > + TRACE_4("cpnd client node get > failed client hdl: %llx",client_hdl); > + continue; > + /* goto end; */ > + } > + cpnd_ckpt_client_add(cp_node, cl_node); > + } > + next_offset = tmp_cp_info_v0.next; > + if (next_offset >= 0) { > + if ((next_offset * > sizeof(CKPT_INFO_V0)) > UINTMAX_MAX) { > + LOG_ER("cpnd ckpt shm create > failed,exceeded the write limits(UINT64_MAX) "); > + } > + memset(&tmp_cp_info_v0, '\0', > sizeof(CKPT_INFO_V0)); > + i_offset = next_offset * > sizeof(CKPT_INFO_V0); > + m_CPND_CKPTINFO_V0_READ(tmp_cp_info_v0, > ckpt_addr + sizeof(CKPT_HDR), i_offset); > + } > + > + } /* End of clients processing for this cp_node */ > + > + cpnd_ckpt_node_add(cb, cp_node); > + > + if (cp_info_v0.is_close) { > + /* start the timer if exists */ > + now = m_GET_TIME_STAMP(tmpTime); > + giga_sec = 1000000000; > + diff_time = now - cp_node->close_time; > + /* > if((cp_node->create_attrib.retentionDuration) > > (SA_TIME_ONE_SECOND*(presentTime - cp_node->close_time))) */ > + if ((cp_node->create_attrib.retentionDuration) > > (giga_sec * diff_time)) { > + /* timeout = > cp_node->create_attrib.retentionDuration - (SA_TIME_ONE_SECOND*(presentTime - > cp_node->close_time)); */ > + timeout = > + > cp_node->create_attrib.retentionDuration - (giga_sec * diff_time); > + timeout = > m_CPSV_CONVERT_SATIME_TEN_MILLI_SEC(timeout); > + } > + if (timeout) { > + /* for restart shared memory updation */ > + m_GET_TIME_STAMP(presentTime); > + cpnd_restart_update_timer(cb, cp_node, > presentTime); > + if (!m_CPND_IS_COLLOCATED_ATTR_SET > + > (cp_node->create_attrib.creationFlags)) { > + cp_node->ret_tmr.type = > CPND_TMR_TYPE_NON_COLLOC_RETENTION; > + } else { > + cp_node->ret_tmr.type = > CPND_TMR_TYPE_RETENTION; > + } > + cp_node->ret_tmr.uarg = > cb->cpnd_cb_hdl_id; > + cp_node->ret_tmr.ckpt_id = > cp_node->ckpt_id; > + cpnd_tmr_start(&cp_node->ret_tmr, > timeout); > + } else { > + if (!m_CPND_IS_COLLOCATED_ATTR_SET > + > (cp_node->create_attrib.creationFlags)) { > + > cpnd_proc_non_colloc_rt_expiry(cb, cp_node->ckpt_id); > + } else { > + cpnd_proc_rt_expiry(cb, > cp_node->ckpt_id); > + } > + } > + } > + > + } /* End of one cp_node processing */ > + counter++; > + } /* End of while after processing all 2000 ckpt structs > */ > + > + TRACE_LEAVE(); > + return SA_AIS_OK; > +} > + > +/********************************************************************************************* > + * Name : cpnd_convert_cp_info_v0 > + * > + * Description : To convert a struct CKTP_INFO_V0 to CKPT_INFO > + * > + * Arguments : - > + * > + * Return Values : - > + * > + > **********************************************************************************************/ > +static void cpnd_convert_cp_info_v0(CKPT_INFO_V0 *cp_info_v0, CKPT_INFO > *cp_info) > +{ > + memset(cp_info, 0, sizeof(CKPT_INFO)); > + > + strncpy(cp_info->ckpt_name, > osaf_extended_name_borrow(&cp_info_v0->ckpt_name), kOsafMaxDnLength); > + cp_info->ckpt_id = cp_info_v0->ckpt_id; > + cp_info->maxSections = cp_info_v0->maxSections; > + cp_info->maxSecSize = cp_info_v0->maxSecSize; > + cp_info->node_id = cp_info_v0->node_id; > + cp_info->offset = SHM_INIT; > + cp_info->client_bitmap = cp_info_v0->client_bitmap; > + cp_info->is_valid = cp_info_v0->is_valid; > + cp_info->bm_offset = cp_info_v0->bm_offset; > + cp_info->is_unlink = cp_info_v0->is_unlink; > + cp_info->is_close = cp_info_v0->is_close; > + cp_info->cpnd_rep_create = cp_info_v0->cpnd_rep_create; > + cp_info->is_first = cp_info_v0->is_first; > + cp_info->close_time = cp_info_v0->close_time; > + cp_info->next = cp_info_v0->next; > +} > + > +/********************************************************************************************* > + * Name : cpnd_destroy_shm_cpnd_cp_info > + * > + * Description : To destroy the shared memory CPND_CHECKPOINT_INFO > + * > + * Arguments : - > + * > + * Return Values : - > + * > + > **********************************************************************************************/ > +static void cpnd_destroy_shm_cpnd_cp_info(NCS_OS_POSIX_SHM_REQ_OPEN_INFO > *open_req) > +{ > + NCS_OS_POSIX_SHM_REQ_INFO shm_info; > + uint32_t rc = NCSCC_RC_SUCCESS; > + > + TRACE_ENTER(); > + > + /* close the shared memory */ > + memset(&shm_info, '\0', sizeof(shm_info)); > + shm_info.type = NCS_OS_POSIX_SHM_REQ_CLOSE; > + shm_info.info.close.i_addr = open_req->o_addr; > + shm_info.info.close.i_fd = open_req->o_fd; > + shm_info.info.close.i_hdl = open_req->o_hdl; > + shm_info.info.close.i_size = open_req->i_size; > + > + rc = ncs_os_posix_shm(&shm_info); > + > + if (rc == NCSCC_RC_FAILURE) { > + LOG_ER("cpnd shm checkpoint_info close failed"); > + TRACE_LEAVE(); > + return; > + } > + > + /* unlink the shared memory */ > + memset(&shm_info, '\0', sizeof(shm_info)); > + shm_info.type = NCS_OS_POSIX_SHM_REQ_UNLINK; > + shm_info.info.unlink.i_name = open_req->i_name; > + > + rc = ncs_os_posix_shm(&shm_info); > + > + if (rc == NCSCC_RC_FAILURE) { > + LOG_ER("cpnd shm checkpoint_info unlink failed"); > + TRACE_LEAVE(); > + return; > + } > + > + TRACE_LEAVE(); > +} > + > +/********************************************************************************************* > + * Name : cpnd_create_shm_cpnd_cp_info > + * > + * Description : To destroy the shared memory CPND_CHECKPOINT_INFO > + * > + * Arguments : - > + * > + * Return Values : - > + * > + > **********************************************************************************************/ > +static void *cpnd_create_shm_cpnd_cp_info(NCS_OS_POSIX_SHM_REQ_INFO > *req_info) > +{ > + uint32_t rc = NCSCC_RC_SUCCESS; > + CPND_SHM_VERSION cpnd_shm_version; > + > + TRACE_ENTER(); > + /* Initializing shared memory version */ > + memset(&cpnd_shm_version, '\0', sizeof(cpnd_shm_version)); > + cpnd_shm_version.shm_version = CPSV_CPND_SHM_VERSION; > + > + /* Create the shared memory */ > + req_info->info.open.i_flags = O_CREAT | O_RDWR; > + rc = ncs_os_posix_shm(req_info); > + if (NCSCC_RC_FAILURE == rc) { > + LOG_ER("cpnd create shm_cpnd_cp_info fail for RDWR mode"); > + return NULL; > + } > + > + /* Initialize memory and set version */ > + memset(req_info->info.open.o_addr, 0, > + sizeof(CLIENT_HDR) + (MAX_CLIENTS * sizeof(CLIENT_INFO)) + > sizeof(CKPT_HDR) + > + (MAX_CKPTS * sizeof(CKPT_INFO))); > + memcpy(req_info->info.open.o_addr, &cpnd_shm_version, > sizeof(cpnd_shm_version)); > + > + TRACE_LEAVE(); > + return req_info->info.open.o_addr; > +} > + > +/********************************************************************************************* > + * Name : cpnd_update_shm_cpnd_cp_info > + * > + * Description : To update the shared memory CPND_CHECKPOINT_INFO when > for new version > + * > + * Arguments : - > + * > + * Return Values : - > + * > + > **********************************************************************************************/ > +static void cpnd_update_shm_cpnd_cp_info(CPND_CB *cb) > +{ > + CPND_CKPT_CLIENT_NODE *cl_node = NULL; > + CPND_CKPT_NODE *ckpt_node = NULL; > + SaCkptHandleT prev_ckpt_hdl; > + > + TRACE_ENTER(); > + > + /* go through the client tree, to update shared memory */ > + cpnd_client_node_getnext(cb, 0, &cl_node); > + while (cl_node) { > + int32_t cl_offset; > + prev_ckpt_hdl = cl_node->ckpt_app_hdl; > + > + cl_offset = cpnd_restart_shm_client_update(cb, cl_node); > + /* -1 shared memory is full &&& -2 - shared memory read failed > */ > + if (cl_offset == -1 || cl_offset == -2) { > + TRACE_4("cpnd client info update failed %d",cl_offset); > + } > + > + cpnd_client_node_getnext(cb, prev_ckpt_hdl, &cl_node); > + } > + > + /* go through the ckpt_node tree, to update shared memory */ > + cpnd_ckpt_node_getnext(cb, 0, &ckpt_node); > + while (ckpt_node != NULL) { > + SaCkptCheckpointHandleT prev_ckpt_id; > + CPND_CKPT_CLLIST_NODE *ckpt_client_list = NULL; > + > + ckpt_client_list = ckpt_node->clist; > + while (ckpt_client_list != NULL) { > + cpnd_restart_shm_ckpt_update(cb, ckpt_node, > ckpt_client_list->cnode->ckpt_app_hdl); > + ckpt_client_list = ckpt_client_list->next; > + } > + > + prev_ckpt_id = ckpt_node->ckpt_id; > + cpnd_ckpt_node_getnext(cb, prev_ckpt_id, &ckpt_node); > + } > + > + TRACE_LEAVE(); > +} ------------------------------------------------------------------------------ Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San Francisco, CA to explore cutting-edge tech and listen to tech luminaries present their vision of the future. This family event has something for everyone, including kids. Get more information and register today. http://sdm.link/attshape _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel