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

Reply via email to