Dear Mahesh,

Thank you very much for your checking.
It is very strangle that I tested with 2 following case:
- restart nd by kill -9 <ckptnd pid>
- restart node by kill -9 <amfd pid>
Both cases executed well in my local machine.

Would you please tell me the process to reproduce this error?
It is very strangle that ER is cannot open replica's shm that is not in
touch of this patch.

Thank you and best regards,
Hoang

-----Original Message-----
From: A V Mahesh [mailto:mahesh.va...@oracle.com] 
Sent: Tuesday, October 25, 2016 12:53 PM
To: Hoang Vo <hoang.m...@dektech.com.au>; anders.wid...@ericsson.com
Cc: opensaf-devel@lists.sourceforge.net
Subject: Re: [PATCH 1 of 1] cpnd: use shared memory based on ckpt name
length [#2108] V2

Hi Hoang,

With the patch after CPND restart cpnd shm open request is getting failed

please test CPND restart cases.

============================================================================
================================

1111 saCkptCheckpointOpen  returned checkpointHandle 626040
222 saCkptCheckpointOpen  returned checkpointHandle 6261f0
  Before pkill osafckptnd  saCkptCheckpointOpen2222
root     23946     1  0 11:14 ?        00:00:00 
/usr/lib64/opensaf/osafckptnd
root     24041 24038  0 11:15 pts/0    00:00:00 sh -c ps -ef | grep 
osafckptnd
root     24043 24041  0 11:15 pts/0    00:00:00 grep osafckptnd
Oct 25 11:15:07 SC-1 osafckptnd[23946]: exiting for shutdown
Oct 25 11:15:07 SC-1 osafamfnd[23844]: NO 
'safSu=SC-1,safSg=NoRed,safApp=OpenSAF' component restart probation 
timer started (timeout: 60000000000 ns)
Oct 25 11:15:07 SC-1 osafamfnd[23844]: NO Restarting a component of 
'safSu=SC-1,safSg=NoRed,safApp=OpenSAF' (comp restart count: 1)
Oct 25 11:15:07 SC-1 osafamfnd[23844]: NO 
'safComp=CPND,safSu=SC-1,safSg=NoRed,safApp=OpenSAF' faulted due to 
'avaDown' : Recovery is 'componentRestart'
Oct 25 11:15:07 SC-1 osafckptd[23989]: NO cpnd_down_process:: Start 
CPND_RETENTION timer id = 0x663f10, arg=0x664020
Oct 25 11:15:07 SC-1 osafckptnd[24058]: Started
  VVVVVVVVVV saCkptCheckpointOpen 3rd may hit try again returned 18.
333 saCkptCheckpointOpen  returned checkpointHandle 7f29fbdc7588
  VVVVVVVVVV saCkptCheckpointOpen 4th returned may hit try again 
returned 12.
444 saCkptCheckpointOpen  returned checkpointHandle 7fffb4a097d8
  saCkptCheckpointOpen 5th returned 12.
5555 saCkptCheckpointOpen  returned checkpointHandle 7f29fbdf61a8
  Before pkill osafckptnd & saCkptCheckpointClose
root     24058     1  0 11:15 ?        00:00:00 
/usr/lib64/opensaf/osafckptnd
root     24063 24038  0 11:15 pts/0    00:00:00 sh -c ps -ef | grep 
osafckptnd
root     24065 24063  0 11:15 pts/0    00:00:00 grep osafckptnd
Oct 25 11:15:19 SC-1 osafckptnd[24058]: exiting for shutdown
Oct 25 11:15:19 SC-1 osafamfnd[23844]: NO Restarting a component of 
'safSu=SC-1,safSg=NoRed,safApp=OpenSAF' (comp restart count: 2)
Oct 25 11:15:19 SC-1 osafamfnd[23844]: NO 
'safComp=CPND,safSu=SC-1,safSg=NoRed,safApp=OpenSAF' faulted due to 
'avaDown' : Recovery is 'componentRestart'
Oct 25 11:15:19 SC-1 osafckptnd[24080]: Started
Oct 25 11:15:19 SC-1 osafckptnd[24080]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_1
Oct 25 11:15:19 SC-1 osafckptnd[24080]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_1
1111 saCkptCheckpointClose  checkpointHandle 626040
Attempt 0-0:  saCkptCheckpointClose returned 12.
222 saCkptCheckpointClose  checkpointHandle 6261f0
Attempt 0-0:  saCkptCheckpointClose returned 12.
333 saCkptCheckpointClose  checkpointHandle 7f29fbdc7588
Attempt 0-0:  saCkptCheckpointClose returned 9.
4444 saCkptCheckpointClose  checkpointHandle 7fffb4a097d8
Attempt 0-0:  saCkptCheckpointClose returned 9.
555 saCkptCheckpointClose  checkpointHandle 7f29fbdf61a8
Attempt 0-0:  saCkptCheckpointClose returned 9.
1111 saCkptCheckpointOpen  returned checkpointHandle 626040
222 saCkptCheckpointOpen  returned checkpointHandle 628b40
  Before pkill osafckptnd  saCkptCheckpointOpen2222
root     24080     1  0 11:15 ?        00:00:00 
/usr/lib64/opensaf/osafckptnd
root     24085 24038  0 11:15 pts/0    00:00:00 sh -c ps -ef | grep 
osafckptnd
root     24087 24085  0 11:15 pts/0    00:00:00 grep osafckptnd
Oct 25 11:15:26 SC-1 osafckptnd[24080]: exiting for shutdown
Oct 25 11:15:26 SC-1 osafamfnd[23844]: NO Restarting a component of 
'safSu=SC-1,safSg=NoRed,safApp=OpenSAF' (comp restart count: 3)
Oct 25 11:15:26 SC-1 osafamfnd[23844]: NO 
'safComp=CPND,safSu=SC-1,safSg=NoRed,safApp=OpenSAF' faulted due to 
'avaDown' : Recovery is 'componentRestart'
Oct 25 11:15:26 SC-1 osafckptd[23989]: NO cpnd_down_process:: Start 
CPND_RETENTION timer id = 0x663f10, arg=0x664020
Oct 25 11:15:26 SC-1 osafckptnd[24102]: Started
Oct 25 11:15:26 SC-1 osafckptnd[24102]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_1
Oct 25 11:15:26 SC-1 osafckptnd[24102]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_1
  VVVVVVVVVV saCkptCheckpointOpen 3rd may hit try again returned 18.
333 saCkptCheckpointOpen  returned checkpointHandle 0
  VVVVVVVVVV saCkptCheckpointOpen 4th returned may hit try again 
returned 12.
444 saCkptCheckpointOpen  returned checkpointHandle 0
  saCkptCheckpointOpen 5th returned 12.
5555 saCkptCheckpointOpen  returned checkpointHandle 0
  Before pkill osafckptnd & saCkptCheckpointClose
root     24102     1  0 11:15 ?        00:00:00 
/usr/lib64/opensaf/osafckptnd
root     24107 24038  0 11:15 pts/0    00:00:00 sh -c ps -ef | grep 
osafckptnd
root     24109 24107  0 11:15 pts/0    00:00:00 grep osafckptnd
Oct 25 11:15:38 SC-1 osafckptnd[24102]: exiting for shutdown
Oct 25 11:15:38 SC-1 osafamfnd[23844]: NO Restarting a component of 
'safSu=SC-1,safSg=NoRed,safApp=OpenSAF' (comp restart count: 4)
Oct 25 11:15:38 SC-1 osafamfnd[23844]: NO 
'safComp=CPND,safSu=SC-1,safSg=NoRed,safApp=OpenSAF' faulted due to 
'avaDown' : Recovery is 'componentRestart'
Oct 25 11:15:38 SC-1 osafckptnd[24124]: Started
Oct 25 11:15:38 SC-1 osafckptnd[24124]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_1
Oct 25 11:15:38 SC-1 osafckptnd[24124]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_1
Oct 25 11:15:38 SC-1 osafckptnd[24124]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_2
Oct 25 11:15:38 SC-1 osafckptnd[24124]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_2
1111 saCkptCheckpointClose  checkpointHandle 626040
Attempt 1-0:  saCkptCheckpointClose returned 12.
222 saCkptCheckpointClose  checkpointHandle 628b40
Attempt 1-0:  saCkptCheckpointClose returned 12.
333 saCkptCheckpointClose  checkpointHandle 0
Attempt 1-0:  saCkptCheckpointClose returned 9.
4444 saCkptCheckpointClose  checkpointHandle 0
Attempt 1-0:  saCkptCheckpointClose returned 9.
555 saCkptCheckpointClose  checkpointHandle 0
Attempt 1-0:  saCkptCheckpointClose returned 9.
1111 saCkptCheckpointOpen  returned checkpointHandle 626040
222 saCkptCheckpointOpen  returned checkpointHandle 628b40
  Before pkill osafckptnd  saCkptCheckpointOpen2222
root     24124     1  0 11:15 ?        00:00:00 
/usr/lib64/opensaf/osafckptnd
root     24129 24038  0 11:15 pts/0    00:00:00 sh -c ps -ef | grep 
osafckptnd
root     24131 24129  0 11:15 pts/0    00:00:00 grep osafckptnd
Oct 25 11:15:45 SC-1 osafckptnd[24124]: exiting for shutdown
Oct 25 11:15:45 SC-1 osafamfnd[23844]: NO Restarting a component of 
'safSu=SC-1,safSg=NoRed,safApp=OpenSAF' (comp restart count: 5)
Oct 25 11:15:45 SC-1 osafamfnd[23844]: NO 
'safComp=CPND,safSu=SC-1,safSg=NoRed,safApp=OpenSAF' faulted due to 
'avaDown' : Recovery is 'componentRestart'
Oct 25 11:15:45 SC-1 osafckptd[23989]: NO cpnd_down_process:: Start 
CPND_RETENTION timer id = 0x663f10, arg=0x664020
Oct 25 11:15:45 SC-1 osafckptnd[24146]: Started
Oct 25 11:15:45 SC-1 osafckptnd[24146]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_1
Oct 25 11:15:45 SC-1 osafckptnd[24146]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_1
Oct 25 11:15:45 SC-1 osafckptnd[24146]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_2
Oct 25 11:15:45 SC-1 osafckptnd[24146]: ER cpnd shm open request failed 
safCkpt=checkpoint_tes_131343_2
  VVVVVVVVVV saCkptCheckpointOpen 3rd may hit try again returned 18.

============================================================================
===========================================================

-AVM

On 10/21/2016 8:11 AM, Hoang Vo wrote:
>   osaf/libs/common/cpsv/include/cpsv_shm.h |   28 +-
>   osaf/services/saf/cpsv/cpnd/cpnd_res.c   |  859
+++++++++++-------------------
>   2 files changed, 336 insertions(+), 551 deletions(-)
>
>
> problem: In the case of CKPT osafckptnd increased 3,5Mb - 240 percent on
all nodes
> CKPT_INFO size inscrease when support longDN lead to total size increase.
>
> solution:
> - From start, cpnd use old format shm.
> - Run time cpnd keep using old format shm until first longDN checkpoint is
created.
> After that cpnd create extended format shm for longDN use.
> - Fix init size for shm.
>
> 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
> @@ -27,7 +27,9 @@
>   #define SHM_NEXT -3
>   #define SHM_INIT -1
>   
> -#define CPSV_CPND_SHM_VERSION    1
> +#define CPSV_CPND_SHM_VERSION                        1
> +#define CPSV_CPND_SHM_VERSION_DEPRECATE      2
> +#define CPSV_CPND_SHM_VERSION_EXTENDED       3
>   
>   typedef struct cpsv_ckpt_hdr {
>       SaCkptCheckpointHandleT ckpt_id;        /* Index for identifying the
checkpoint */
> @@ -57,7 +59,7 @@ typedef struct cpsv_sect_hdr {
>   } CPSV_SECT_HDR;
>   
>   typedef struct ckpt_info {
> -     char ckpt_name[kOsafMaxDnLength];
> +     SaNameT ckpt_name;
>       SaCkptCheckpointHandleT ckpt_id;
>       uint32_t maxSections;
>       SaSizeT maxSecSize;
> @@ -74,23 +76,10 @@ 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 ckpt_extend_info {
> +     char ckpt_name[kOsafMaxDnLength + 1];
> +     uint32_t is_valid;
> +} CKPT_EXTENDED_INFO;
>   
>   typedef struct client_info {
>       SaCkptHandleT ckpt_app_hdl;
> @@ -109,6 +98,7 @@ typedef struct gbl_shm_ptr {
>       void *base_addr;
>       void *cli_addr;
>       void *ckpt_addr;
> +     void *extended_addr;    /* Added in CPSV_CPND_SHM_VERSION_EXTENDED
*/
>       int32_t n_clients;
>       int32_t n_ckpts;
>   } GBL_SHM_PTR;
> 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,8 +40,6 @@
>   
>   #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))
> @@ -50,13 +48,10 @@ 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);
> +static void cpnd_destroy_shm(NCS_OS_POSIX_SHM_REQ_OPEN_INFO *open_req);
> +static uint32_t cpnd_shm_extended_open(CPND_CB *cb, uint32_t flag);
> +static uint32_t cpnd_extended_name_lend(SaConstStringT value, SaNameT*
name);
> +static void cpnd_extended_name_free(const SaNameT* name);
>   
>
/***************************************************************************
**** *
>    * Name           : cpnd_client_extract_bits
> @@ -324,10 +319,24 @@ 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 rc = NCSCC_RC_SUCCESS;
> +     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;
>       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();
> @@ -349,7 +358,7 @@ void *cpnd_restart_shm_create(NCS_OS_POS
>   
>       /* 1. FIRST TRYING TO OPEN IN RDWR MODE */
>       cpnd_open_req->type = NCS_OS_POSIX_SHM_REQ_OPEN;
> -     cpnd_open_req->info.open.i_size =
> +     cpnd_open_req->info.open.i_size = sizeof(CPND_SHM_VERSION) +
>           sizeof(CLIENT_HDR) + (MAX_CLIENTS * sizeof(CLIENT_INFO)) +
sizeof(CKPT_HDR) +
>           (MAX_CKPTS * sizeof(CKPT_INFO));
>       if (cb->shm_alloc_guaranteed == true)
> @@ -366,15 +375,19 @@ 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");
> -
> -             if (NULL == cpnd_create_shm_cpnd_cp_info(cpnd_open_req)) {
> +             cpnd_open_req->info.open.i_flags = O_CREAT | O_RDWR;
> +             rc = ncs_os_posix_shm(cpnd_open_req);
> +             if (NCSCC_RC_FAILURE == rc) {
>                       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(CPND_SHM_VERSION) +
> +                    sizeof(CLIENT_HDR) + (MAX_CLIENTS *
sizeof(CLIENT_INFO)) + sizeof(CKPT_HDR) +
> +                    (MAX_CKPTS * sizeof(CKPT_INFO)));
> +             memcpy(cpnd_open_req->info.open.o_addr, &cpnd_shm_version,
sizeof(cpnd_shm_version));
>               TRACE_1("cpnd new shm create request success");
>               return cpnd_open_req->info.open.o_addr;
>       }
> @@ -390,53 +403,231 @@ 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");
> +             /* Update version value from existing shared memory */
> +             memcpy(&cpnd_shm_version, cpnd_open_req->info.open.o_addr,
sizeof(cpnd_shm_version));
> +
>               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));
> +
> +             switch (cpnd_shm_version.shm_version) {
> +                     case CPSV_CPND_SHM_VERSION:
> +                             /* Do nothing, continue with next step */
> +                             break;
> +                     case CPSV_CPND_SHM_VERSION_EXTENDED:
> +                             /* Update extended address */
> +                             rc = cpnd_shm_extended_open(cb, O_RDWR);
> +                             break;
> +                     default:
> +                             /* Unsupport version, should discard old and
open new one */
> +                             cpnd_destroy_shm(&cpnd_open_req->info.open);
> +                             m_MMGR_FREE_CPND_DEFAULT(buffer);
> +                             return
cpnd_restart_shm_create(cpnd_open_req, cb, nodeid);
> +             }
> +
> +             if (rc != NCSCC_RC_SUCCESS) {
> +                     m_MMGR_FREE_CPND_DEFAULT(buffer);
> +                     return NULL;
> +             }
>   
>               /* READ FROM THE SHARED MEMORY */
>   
> -             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);
> +             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);
>   
> -                     /* Destroy the CPND_CHECKPOINT_INFO version 0 */
> -
cpnd_destroy_shm_cpnd_cp_info(&cpnd_open_req->info.open);
> +             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);
>   
> -                     /* 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;
> +                             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 ");
> +                                     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;
> +
> +                             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");
>                       }
> +             }
> +             counter = 0;
>   
> -                     /* 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);
> +             /* 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);
>   
> -                     break;
> -             }
> -             case 1:
> -                     cpnd_restore_ckpt_info_v1(cb,
gbl_shm_addr.ckpt_addr, nodeid);
> -                     break;
> -             default:
> -                     LOG_ER("cpnd share memory version invalide");
> -                     break;
> -             }
> +                     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 =
osaf_extended_name_borrow(&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,
"_%u_%llu", (uint32_t)nodeid, 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 */
> @@ -858,7 +1049,10 @@ uint32_t cpnd_write_ckpt_info(CPND_CB *c
>   
>       TRACE_ENTER();
>       memset(&ckpt_info, 0, sizeof(CKPT_INFO));
> -     strncpy(ckpt_info.ckpt_name, cp_node->ckpt_name, kOsafMaxDnLength);
> +     rc = cpnd_extended_name_lend(cp_node->ckpt_name,
&ckpt_info.ckpt_name);
> +     if (rc != NCSCC_RC_SUCCESS) {
> +             return rc;
> +     }
>       ckpt_info.ckpt_id = cp_node->ckpt_id;
>       ckpt_info.maxSections = cp_node->create_attrib.maxSections;
>       ckpt_info.maxSecSize = cp_node->create_attrib.maxSectionSize;
> @@ -1188,6 +1382,7 @@ void cpnd_clear_ckpt_info(CPND_CB *cb, C
>               i_offset = prev_offset * sizeof(CKPT_INFO);
>               m_CPND_CKPTINFO_UPDATE((char *)cb->shm_addr.ckpt_addr +
sizeof(CKPT_HDR), prev_ckpt_info, i_offset);
>   
> +             cpnd_extended_name_free(&curr_ckpt_info.ckpt_name);
>               memset(&curr_ckpt_info, '\0', sizeof(CKPT_INFO));
>               i_offset = curr_offset * sizeof(CKPT_INFO);
>               m_CPND_CKPTINFO_UPDATE((char *)cb->shm_addr.ckpt_addr +
sizeof(CKPT_HDR), curr_ckpt_info, i_offset);
> @@ -1221,6 +1416,7 @@ void cpnd_clear_ckpt_info(CPND_CB *cb, C
>                               LOG_ER("cpnd clear ckpt info failed,exceeded
the write limits(UINT64_MAX) ");
>                       }
>                       i_offset = (curr_ckpt_info.offset) *
sizeof(CKPT_INFO);
> +                     cpnd_extended_name_free(&curr_ckpt_info.ckpt_name);
>                       memset(&curr_ckpt_info, '\0', sizeof(CKPT_INFO));
>   
>                       m_CPND_CKPTINFO_UPDATE((char
*)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR), curr_ckpt_info,
> @@ -1302,8 +1498,20 @@ uint32_t cpnd_restart_shm_ckpt_update(CP
>       CKPT_INFO ckpt_info;
>       memset(&ckpt_info, 0, sizeof(ckpt_info));
>       CKPT_HDR ckpt_hdr;
> +     uint32_t rc = NCSCC_RC_SUCCESS;
>   
>       TRACE_ENTER();
> +     /* Check ckpt name input versus shm version and restart shm if need
*/
> +     if (strlen(cp_node->ckpt_name) > SA_MAX_UNEXTENDED_NAME_LENGTH &&
cb->shm_addr.extended_addr == 0) {
> +             /* Open new shared memory */
> +             rc = cpnd_shm_extended_open(cb, O_CREAT | O_RDWR);
> +             if (rc != NCSCC_RC_SUCCESS) {
> +                     return rc;
> +             }
> +             /* Update shared memory version */
> +             ((CPND_SHM_VERSION*)cb->shm_addr.base_addr)->shm_version =
CPSV_CPND_SHM_VERSION_EXTENDED;
> +     }
> +
>       /* check if the ckpt already exists */
>       if (cp_node->offset == SHM_INIT) {      /* if it is not there then
find the free place to fit into */
>               /* now find the free shm for placing the checkpoint info */
> @@ -1345,436 +1553,113 @@ uint32_t cpnd_restart_shm_ckpt_update(CP
>   }
>   
>
/***************************************************************************
******************
> - * Name           :  cpnd_restore_client_info
> + * Name           :  cpnd_shm_extended_open
>    *
> - * Description    : To restore client information from share memory
> + * Description    : Open extended shared 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;
> +static uint32_t cpnd_shm_extended_open(CPND_CB *cb, uint32_t flag)
> +{
> +     uint32_t rc = NCSCC_RC_FAILURE;
> +     NCS_OS_POSIX_SHM_REQ_INFO cpnd_open_req;
> +     memset(&cpnd_open_req, 0, sizeof(cpnd_open_req));
> +     uint8_t total_length = strlen("CPND_EXTENDED_INFO") +
sizeof(cb->nodeid) + 5;
> +     char *buffer = m_MMGR_ALLOC_CPND_DEFAULT(total_length);
> +     if (buffer == NULL) {
> +             LOG_ER("cpnd default memory allocation failed in cpnd_open
in resart shm create");
> +             return rc;
> +     }
> +     cb->cpnd_res_shm_name = (uint8_t*)buffer;
> +     memset(buffer, '\0', total_length);
> +     strncpy(buffer, "CPND_EXTENDED_INFO", total_length);
> +     sprintf(buffer + strlen("CPND_EXTENDED_INFO"), "_%d", cb->nodeid);
>   
> -     TRACE_ENTER();
> +     cpnd_open_req.type = NCS_OS_POSIX_SHM_REQ_OPEN;
> +     cpnd_open_req.info.open.i_size = MAX_CKPTS *
sizeof(CKPT_EXTENDED_INFO);
> +     if (cb->shm_alloc_guaranteed == true)
> +             cpnd_open_req.info.open.ensures_space = true;
> +     else
> +             cpnd_open_req.info.open.ensures_space = false;
> +     cpnd_open_req.info.open.i_offset = 0;
> +     cpnd_open_req.info.open.i_name = buffer;
> +     cpnd_open_req.info.open.i_map_flags = MAP_SHARED;
> +     cpnd_open_req.info.open.o_addr = cb->shm_addr.extended_addr;
> +     cpnd_open_req.info.open.i_flags = flag;
>   
> -     /* 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);
> +     rc = ncs_os_posix_shm(&cpnd_open_req);
>   
> -     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");
> -             }
> +     if (rc == NCSCC_RC_SUCCESS) {
> +             cb->shm_addr.extended_addr = cpnd_open_req.info.open.o_addr;
>       }
> -
> -     TRACE_LEAVE();
> -     return SA_AIS_OK;
> +     return rc;
>   }
>   
> -
>
/***************************************************************************
******************
> - * Name           :  cpnd_restore_client_info_v1
> + * Name           :  cpnd_extended_name_lend
>    *
> - * Description    : To restore client information from share memory
version 1
> + * Description    : Find a free location for extended shared memory
>    *
>    * 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;
> +static uint32_t cpnd_extended_name_lend(SaConstStringT value, SaNameT*
name)
> +{
> +     size_t length = strlen(value);
> +     TRACE("LENGTH=%x", (int)length);
> +     if (length <= SA_MAX_UNEXTENDED_NAME_LENGTH) {
> +             osaf_extended_name_lend(value, name);
> +             return NCSCC_RC_SUCCESS;
> +     }
>   
> -     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++;
> +     /* Find memory slot for ckpt_name */
> +     CPND_CB *cb = ncshm_take_hdl(NCS_SERVICE_ID_CPND,
m_CPND_GET_CB_HDL);
> +     TRACE("cb=%p, extended_info=%p", cb, cb->shm_addr.extended_addr);
> +     CKPT_EXTENDED_INFO *extended_info = cb->shm_addr.extended_addr;
> +     if (!extended_info) {
> +             /* Logically there is no way for this */
> +             return NCSCC_RC_FAILURE;
> +     }
> +     int position = 0;
> +     while (position < MAX_CKPTS) {
> +             if (extended_info->is_valid == 1) {
> +                     ++position;
>                       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, "_%u_%llu",
(uint32_t)nodeid, 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;
> +             memset(&extended_info->ckpt_name, 0, kOsafMaxDnLength + 1);
> +             memcpy(&extended_info->ckpt_name, &value, length);
> +
osaf_extended_name_lend((SaConstStringT)(&extended_info->ckpt_name), name);
> +             extended_info->is_valid = 1;
> +             return NCSCC_RC_SUCCESS;
> +     }
> +     /* Logically there is no way for this */
> +     return NCSCC_RC_FAILURE;
>   }
>   
>
/***************************************************************************
******************
> - * Name           :  cpnd_restore_client_info_v0
> + * Name           :  cpnd_extended_name_free
>    *
> - * Description    : To restore client information from share memory
version 0
> + * Description    : Free location for extended shared memory
>    *
>    * 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, "_%u_%llu",
(uint32_t)nodeid, 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)
> +static void cpnd_extended_name_free(const SaNameT* name)
>   {
> -     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;
> +     size_t length = osaf_extended_name_length(name);
> +     if (length <= SA_MAX_UNEXTENDED_NAME_LENGTH) {
> +             return;
> +     }
> +     SaConstStringT ckpt_name = osaf_extended_name_borrow(name);
> +     /* Reset valid flag for future use */
> +     ((CKPT_EXTENDED_INFO *)ckpt_name)->is_valid = 0;
>   }
>   
>
/***************************************************************************
******************
> @@ -1787,7 +1672,7 @@ static void cpnd_convert_cp_info_v0(CKPT
>    * Return Values  : -
>    *
>
****************************************************************************
******************/
> -static void cpnd_destroy_shm_cpnd_cp_info(NCS_OS_POSIX_SHM_REQ_OPEN_INFO
*open_req)
> +static void cpnd_destroy_shm(NCS_OS_POSIX_SHM_REQ_OPEN_INFO *open_req)
>   {
>       NCS_OS_POSIX_SHM_REQ_INFO shm_info;
>       uint32_t rc = NCSCC_RC_SUCCESS;
> @@ -1824,94 +1709,4 @@ static void cpnd_destroy_shm_cpnd_cp_inf
>       }
>   
>       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();
> -}
> +}
> \ No newline at end of file
>



------------------------------------------------------------------------------
The Command Line: Reinvented for Modern Developers
Did the resurgence of CLI tooling catch you by surprise?
Reconnect with the command line and become more productive. 
Learn the new .NET and ASP.NET CLI. Get your free copy!
http://sdm.link/telerik
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to