Dear Anders and Mahesh,

Thank you very much for your comments.

I would like to clarify the backward compatible satisfaction in this case.
We have `small format shm` that is used from beginning (version 1).
We also have `big format shm` that is introduced with Long DN feature
(changeset 7949:815c56c74d18) (version 2).
The question is:
Do we need to make modification that compatible with both 2 kind of shm or
just the original small one and complete remove the big one?

As you might know, the 2 SHMs approach comes before this SHM swapping ideal
but I postpone implementing it because of the complicated logic for working
with both 2 old versions.

If we don't need to care about version 2, I might introduce cleaner code
solution.

Thank you and best regards,
Hoang

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

Hi Hoang,

Swamping SHM looks more complex logic  to me while accessing old & new 
shm in transit ,
and it will create more issue and will take some time to stabilize.

Let us explore other options like Anders Widell suggested or any other,
which can be simple and avoids the SHM swap.

I assessed these issues and I was reluctant to have  Long DN for Ckpt 
service ,
where their is no much piratical use case.

-AVM

On 10/18/2016 1:57 PM, Anders Widell wrote:
> Maybe it is better to create a second shm containing a fixed-size 
> record of the remaining 2048-256 bytes of the DN? Then you will not 
> have to convert the shm format and creating a new shm segment should 
> be very quick.
>
> regards,
>
> Anders Widell
>
>
> On 10/18/2016 09:29 AM, Vo Minh Hoang wrote:
>> Dear Mahesh,
>>
>> Sorry I miss-sending incomplete email.
>> This is full version.
>> ------
>> I would like to send my answer to 2 of your concerning points in 
>> compound.
>>
>> Based on my understand, a client command affects shared mem by following
>> behavior:
>>
>> Client --> CPA ==> CPND (1) ==> CPD (active) ==> CPND (has replica) (2)
>> ----> update shm (3)
>>
>> When:
>> --> Synchronous
>> ==> Asynchronous
>> (1) and (2) has same behavior to update shm and store pointer to shm
>> (3) The modification only take place here include swapping shm and 
>> update
>> pointers
>>
>> So even there are multiple call from multiple client at a time, CPND 
>> update
>> shm in sequence. So just after the first request swaps shm, the second
>> request could access shm. There is not case that 2 requests access 
>> shm at
>> the same time.
>> When shm already storing data, in swapping, CPND will update pointer 
>> so the
>> next request that accesses old data can still work with updated 
>> pointer with
>> same behavior.
>>
>> Thank you and best regards,
>> Hoang
>>
>> -----Original Message-----
>> From: Vo Minh Hoang [mailto:hoang.m...@dektech.com.au]
>> Sent: Tuesday, October 18, 2016 2:15 PM
>> To: 'A V Mahesh' <mahesh.va...@oracle.com>
>> Cc: 'anders.wid...@ericsson.com' <anders.wid...@ericsson.com>;
>> 'opensaf-devel@lists.sourceforge.net' 
>> <opensaf-devel@lists.sourceforge.net>
>> Subject: RE: [PATCH 1 of 1] cpnd: use shared memory based on ckpt name
>> length [#2108]
>>
>> Dear Mahesh,
>>
>> I would like to send my answer to 2 of your concerning points in 
>> compound.
>>
>> Based on my understand, a client command affects shared mem by following
>> behavior:
>>
>> Client --> CPA ==> CPND (1) ==> CPD (active) ==> CPND (has replica) (2)
>> ----> update shm (3)
>>
>> When:
>> -->
>>
>>
>>
>> -----Original Message-----
>> From: A V Mahesh [mailto:mahesh.va...@oracle.com]
>> Sent: Tuesday, October 18, 2016 1:10 PM
>> To: Vo Minh Hoang <hoang.m...@dektech.com.au>
>> Cc: anders.wid...@ericsson.com; opensaf-devel@lists.sourceforge.net
>> Subject: Re: [PATCH 1 of 1] cpnd: use shared memory based on ckpt name
>> length [#2108]
>>
>> Hi Hoang,
>>
>>
>> On 10/18/2016 11:24 AM, Vo Minh Hoang wrote:
>>> Dear Mahesh,
>>>
>>>>> [AVM] A non-collated Ckpt will have two replicas on both Active and
>>> standby.
>>> Each node will receive one CPND_EVT_D2ND_CKPT_CREATE message so it 
>>> handles
>>> swapping itself and does not affect each other nor another.
>> [AVM]   I was taking about existing, swapping of existing `small 
>> format shm`
>>    not  not new create request , where the ckpt is already opened
>> multiple nodes with ALL option.
>>>>> [AVM] piratically  we can have large size data & transit time, if ckt
>> pat
>>> has  large data  sham is file I/O operation
>>>>>               not middle-ware controlled activity , swap time will 
>>>>> vary
>>> depending on system.
>>> I am agree that this modification affects performance of create/open
>>> function so it need performance acceptance verification.
>>> Fortunately, shared mem is on memory so it is not heavily depend on 
>>> OS or
>>> file system (unless on swap memory area).
>>> Maybe I am not understand your ideal here but I have not found a clear
>>> reason of handling try-again.
>> [AVM] say for example an application is writing in a loop to old `small
>> format shm`,
>> at that moment you started conversation of old `small format shm` to
>> new  `big format`
>>
>> -AVM
>>
>>> Thank you and best regards,
>>> Hoang
>>>
>>> -----Original Message-----
>>> From: A V Mahesh [mailto:mahesh.va...@oracle.com]
>>> Sent: Tuesday, October 18, 2016 12:14 PM
>>> To: Vo Minh Hoang <hoang.m...@dektech.com.au>
>>> Cc: anders.wid...@ericsson.com; opensaf-devel@lists.sourceforge.net
>>> Subject: Re: [PATCH 1 of 1] cpnd: use shared memory based on ckpt name
>>> length [#2108]
>>>
>>> Hi Hoan,
>>>
>>>
>>> On 10/18/2016 9:59 AM, Vo Minh Hoang wrote:
>>>> Dear Mahesh,
>>>>
>>>> Thank you very much for your comments.
>>>>
>>>> I would like to explain my understanding and reason for this solution.
>>>> Please correct me if I am wrong.
>>>>
>>>> - This memory swapping works on single node alone, it will occur
>>>> maximum once per node in open/create checkpoint process.
>>>> - This swapping action just takes place in nodes that meet condition
>>>> and does not affect other node.
>>> [AVM] A non-collated Ckpt will have two replicas on both Active and
>> standby
>>> .
>>>> - CPND handles open/create processes atomically in sequence in one
>>>> thread only.
>>>>
>>>> Because of that I think it is unnecessary to implement thread
>>>> synchronizing or `try-again` handling.
>>> [AVM] piratically  we can have large size data & transit time, if 
>>> ckt pat
>>> has  large data  sham is file I/O operation
>>>                not middle-ware controlled activity , swap time will 
>>> vary
>>> depending on system.
>>>> Sincerely,
>>>> Hoang
>>>>
>>>> -----Original Message-----
>>>> From: A V Mahesh [mailto:mahesh.va...@oracle.com]
>>>> Sent: Tuesday, October 18, 2016 10:48 AM
>>>> To: Vo Minh Hoang <hoang.m...@dektech.com.au>
>>>> Cc: anders.wid...@ericsson.com; opensaf-devel@lists.sourceforge.net
>>>> Subject: Re: [PATCH 1 of 1] cpnd: use shared memory based on ckpt name
>>>> length [#2108]
>>>>
>>>> Hi Hoang,
>>>>
>>>> On 10/13/2016 12:44 PM, Vo Minh Hoang wrote:
>>>>> No, old checkpoint data is converted to `big format`.
>>>>> So all of them will be stored in `big format`.
>>>> [AVM] This approach is introducing NEW transit ,  so far application
>>>> are aware of  switch-over & fail-over transit and TRY-AGAIN is
>>>> expected only in those case , now this solution is introducing  a new
>>>> transit  for the application which are accessioning the old (by the
>>>> way this patch didn't implemented TRY-AGAIN when shared memory
>>>> swapping action occurring)
>>>>
>>>> `small format shm`, up on some application creating  `big format` (
>>>> application impacting the HA behavior )
>>>>      not sure about the solution approach need to discussed !
>>>>
>>>> -AVM
>>>>
>>>> On 10/13/2016 12:44 PM, Vo Minh Hoang wrote:
>>>>> Dear Mahesh,
>>>>>
>>>>> Because of keeping the consistent working behavior of existing
>>>>> function, only 1 shared memory at a time. If shared memory swapping
>>>>> action occurs, a new shared memory will replace old one.
>>>>>
>>>>> Here is the detailed answers to your questions:
>>>>>>> -The  existing  `small format shm`  will continue to be small , is
>>>>>>> that
>>>>> right ?
>>>>>>> -Only newly created longDN checkpoint will be in `big format shm`,
>>>>>>> is
>>>>> that right ?
>>>>> No, old checkpoint data is converted to `big format`.
>>>>> So all of them will be stored in `big format`.
>>>>>
>>>>>>> - what will be the format of newly joined the PL-5 opens  an
>>>>>>> existing
>>>>> `small format shm`
>>>>> PL-5 still use `small format`.
>>>>> Only when a long DN replica is added in this node, the shared memory
>>>>> is converted to `big format`.
>>>>>>>      the what will be the new replica  on new node `small format 
>>>>>>> shm`
>>>>>>> or `big
>>>>> format shm` ?
>>>>> This implementation only affect the `header` shared memory
>>>>> (opensaf_CPND_CHECKPOINT_INFO_nodeid). It do not change replica
>>>>> shared memory (opensaf_ckptname_nodeid_n).
>>>>>
>>>>> About testing, because of above specification, I tested:
>>>>> - start new node
>>>>> - restart ckptnd with existing small shm
>>>>> - restart ckptnd with existing big shm
>>>>> - create first long dn (check all node)
>>>>>
>>>>> Thank you and best regards,
>>>>> Hoang
>>>>>
>>>>> -----Original Message-----
>>>>> From: A V Mahesh [mailto:mahesh.va...@oracle.com]
>>>>> Sent: Thursday, October 13, 2016 1:33 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]
>>>>>
>>>>> Hi Hoang,
>>>>>
>>>>>      >> - Run time cpnd keep using small format shm until first 
>>>>> longDN
>>>>> checkpoint is created.
>>>>>      >> After that cpnd use big format shm.
>>>>>
>>>>> While reviewing I am assuming following please confirm  :
>>>>>
>>>>> -The  existing  `small format shm`  will continue to be small , is
>>>>> that right ?
>>>>> -Only newly created longDN checkpoint will be in `big format shm`, is
>>>>> that right ?
>>>>> - what will be the format of newly joined the PL-5 opens an existing
>>>>> `small format shm`
>>>>>        the what will be the new replica  on new node `small format 
>>>>> shm`
>>>>> or `big format shm` ?
>>>>>
>>>>>
>>>>> I hope you  tested following :
>>>>> ==========================
>>>>> - combination of some `small format shm`  and some  `big format shm`
>>>>> ckpts
>>>>> - Joined a New node ( say PL-5)  and then opened the existing `small
>>>>> format shm` ckpt from the new Node
>>>>> - Restating controller which has combination of  `small format shm`
>>>>> and `big format shm` and how the restored non-collocated ckpt`s
>>>>>
>>>>> -AVM
>>>>>
>>>>> On 10/11/2016 1:15 PM, Hoang Vo wrote:
>>>>>> osaf/libs/common/cpsv/include/cpsv_shm.h |    9 +-
>>>>>>       osaf/services/saf/cpsv/cpnd/cpnd_res.c   |  565
>>>>> ++++++++++++++++++++++++++++--
>>>>>>       2 files changed, 536 insertions(+), 38 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 small format shm.
>>>>>> - Run time cpnd keep using small format shm until first longDN
>>>>>> checkpoint
>>>>> is created.
>>>>>> After that cpnd use big format 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,8 @@
>>>>>>       #define SHM_NEXT -3
>>>>>>       #define SHM_INIT -1
>>>>>>       -#define CPSV_CPND_SHM_VERSION    1
>>>>>> +#define CPSV_CPND_SHM_VERSION_SHORT_DN    0
>>>>>> +#define CPSV_CPND_SHM_VERSION_LONG_DN    1
>>>>>>             typedef struct cpsv_ckpt_hdr {
>>>>>>           SaCkptCheckpointHandleT ckpt_id;    /* Index for
>>> identifying the
>>>>> checkpoint */
>>>>>> @@ -134,4 +135,10 @@ typedef enum cpnd_type_info {
>>>>>>           CPND_CKPT_INFO
>>>>>>       } CPND_TYPE_INFO;
>>>>>>       +#define cpsv_cpnd_shm_size(x) x == 
>>>>>> CPSV_CPND_SHM_VERSION_LONG_DN ?
>> \
>>>>>> +    sizeof(CLIENT_HDR) + (MAX_CLIENTS * sizeof(CLIENT_INFO)) +
>>>>> \
>>>>>> +    sizeof(CKPT_HDR) + (MAX_CKPTS * sizeof(CKPT_INFO)) :
>>>>> \
>>>>>> +    sizeof(CLIENT_HDR) + (MAX_CLIENTS * sizeof(CLIENT_INFO)) +
>>>>> \
>>>>>> +    sizeof(CKPT_HDR) + (MAX_CKPTS * sizeof(CKPT_INFO_V0))
>>>>> \
>>>>>> +
>>>>>>       #endif
>>>>>> 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
>>>>>> @@ -44,20 +44,34 @@
>>>>>>             #define m_CPND_CKPTINFO_UPDATE(addr,ckpt_info,offset)
>>>>>> memcpy(addr+offset,&ckpt_info,sizeof(CKPT_INFO))
>>>>>>       +#define m_CPND_CKPTINFO_V0_UPDATE(addr,ckpt_info,offset)
>>>>>> +memcpy(addr+offset,&ckpt_info,sizeof(CKPT_INFO_V0))
>>>>>> +
>>>>>>       #define m_CPND_CKPTHDR_UPDATE(ckpt_hdr,offset)
>>>>>> memcpy(offset,&ckpt_hdr,sizeof(CKPT_HDR))
>>>>>>       +void *cpnd_restart_shm(NCS_OS_POSIX_SHM_REQ_INFO 
>>>>>> *cpnd_open_req,
>>>>>> +CPND_CB *cb, SaClmNodeIdT nodeid); uint32_t
>>>>>> +cpnd_update_ckpt_with_clienthdl_v1(CPND_CB *cb, CPND_CKPT_NODE
>>>>>> +*cp_node, SaCkptHandleT client_hdl); uint32_t
>>>>>> +cpnd_update_ckpt_with_clienthdl_v0(CPND_CB *cb, CPND_CKPT_NODE
>>>>>> +*cp_node, SaCkptHandleT client_hdl); uint32_t
>>>>>> +cpnd_write_ckpt_info_v1(CPND_CB *cb, CPND_CKPT_NODE *cp_node,
>>>>>> +int32_t offset, SaCkptHandleT client_hdl); uint32_t
>>>>>> +cpnd_write_ckpt_info_v0(CPND_CB *cb, CPND_CKPT_NODE *cp_node,
>>>>>> +int32_t offset, SaCkptHandleT client_hdl);
>>>>>> +
>>>>>>       static uint32_t cpnd_res_ckpt_sec_add(CPND_CKPT_SECTION_INFO
>>>>>> *pSecPtr,
>>>>> CPND_CKPT_NODE *cp_node);
>>>>>>       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 bool cpnd_find_exact_ckptinfo_v0(CPND_CB *cb, CKPT_INFO_V0
>>>>> *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_restart_client_reset_v1(CPND_CB *cb,
>>>>>> +CPND_CKPT_NODE *cp_node, CPND_CKPT_CLIENT_NODE *cl_node); static
>>>>>> +void cpnd_restart_client_reset_v0(CPND_CB *cb, CPND_CKPT_NODE
>>>>>> +*cp_node, CPND_CKPT_CLIENT_NODE *cl_node);
>>>>>>       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 CPND_SHM_VERSION cpnd_shm_version;
>>>>>> +
>>>>>>
>>>>> /********************************************************************
>>>>> *
>>>>> ******
>>>>> **** *
>>>>>>        * Name           : cpnd_client_extract_bits
>>>>>>        *
>>>>>> @@ -296,12 +310,21 @@ void cpnd_restart_update_timer(CPND_CB *
>>>>>>           CKPT_INFO ckpt_info;
>>>>>>                 memset(&ckpt_info, '\0', sizeof(CKPT_INFO));
>>>>>> -    if (cp_node->offset >= 0) {
>>>>>> +    if (cp_node->offset < 0) {
>>>>>> +        return;
>>>>>> +    }
>>>>>> +    if (cpnd_shm_version.shm_version == 
>>>>>> CPSV_CPND_SHM_VERSION_LONG_DN)
>>>>>> +{
>>>>>>               m_CPND_CKPTINFO_READ(ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> cp_node->offset *
>>> sizeof(CKPT_INFO));
>>>>>>               ckpt_info.close_time = closetime;
>>>>>>               m_CPND_CKPTINFO_UPDATE((char
>>> *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR),
>>>>>> ckpt_info, cp_node->offset *
>>>>> sizeof(CKPT_INFO));
>>>>>> +    } else {
>>>>>> +        m_CPND_CKPTINFO_V0_READ(ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> + cp_node->offset *
>>>>> sizeof(CKPT_INFO_V0));
>>>>>> +        ((CKPT_INFO_V0 *)(&ckpt_info))->close_time = closetime;
>>>>>> +        m_CPND_CKPTINFO_V0_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR),
>>>>>> +                       ckpt_info, cp_node->offset *
>>>>> sizeof(CKPT_INFO_V0));
>>>>>>           }
>>>>>>           return;
>>>>>>       }
>>>>>> @@ -321,25 +344,52 @@ void cpnd_restart_update_timer(CPND_CB *
>>>>>>                           shared memory and update the shared memory
>>>>>> as and
>>>>> when the database gets updated
>>>>>>        * TBD            : TO CHECK THE ERROR CONDITIONS
>>>>>> ********************************************************************
>>>>>> *
>>>>>> *
>>>>>> ******************************/
>>>>>> +void *cpnd_restart_shm_create(NCS_OS_POSIX_SHM_REQ_INFO
>>>>>> +*cpnd_open_req, CPND_CB *cb, SaClmNodeIdT nodeid) {
>>>>>> +    TRACE_ENTER();
>>>>>>       -void *cpnd_restart_shm_create(NCS_OS_POSIX_SHM_REQ_INFO
>>>>>> *cpnd_open_req, CPND_CB *cb, SaClmNodeIdT nodeid)
>>>>>> +    /* Initializing shared memory version */
>>>>>> +    memset(&cpnd_shm_version, '\0', sizeof(cpnd_shm_version));
>>>>>> +    /* From start always init shm for short DN version */
>>>>>> +    cpnd_shm_version.shm_version = CPSV_CPND_SHM_VERSION_SHORT_DN;
>>>>>> +
>>>>>> +    void *ret = cpnd_restart_shm(cpnd_open_req, cb, nodeid);
>>>>>> +
>>>>>> +    TRACE_LEAVE();
>>>>>> +
>>>>>> +    return ret;
>>>>>> +}
>>>>>> +
>>>>>>
>>>>> +/*******************************************************************
>>>>> +*
>>>>> +******
>>>>> **************************
>>>>>> + * Name           : cpnd_restart_shm
>>>>>> + *
>>>>>> + * Description    : To create the shared memory for CPND restart
>>>>>> + *
>>>>>> + * Arguments      : NCS_OS_POSIX_SHM_REQ_INFO *open_req - Shared
>> Memory
>>>>> Request Info pointer
>>>>>> + *                  CPND_CB *cb - CPND CB pointer
>>>>>> + *
>>>>>> + * Return Values  : void * - Returns the starting address of the
>>>>>> + shared
>>>>> memory
>>>>>> + * Notes          : If the shared memory is present - CPND has
>>> restarted
>>>>> , so CPND will update its database by
>>>>>> +                    reading the information from the shared memory
>>>>>> +                    If the shared memory is not present - CPND is
>>>>>> + coming
>>>>> up for the first time , so create a new
>>>>>> +                    shared memory and update the shared memory as
>>>>>> + and
>>>>> when the database gets updated
>>>>>> + * TBD            : TO CHECK THE ERROR CONDITIONS
>>>>>> +*******************************************************************
>>>>>> +*
>>>>>> +* *******************************/ void
>>>>>> +*cpnd_restart_shm(NCS_OS_POSIX_SHM_REQ_INFO *cpnd_open_req, CPND_CB
>>>>>> +*cb, SaClmNodeIdT nodeid)
>>>>>>       {
>>>>>>           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};
>>>>>> -    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;
>>>>>>                 size = strlen("CPND_CHECKPOINT_INFO");
>>>>>>           total_length = size + sizeof(nodeid) + 5;
>>>>>>           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");
>>>>>> +        TRACE_LEAVE();
>>>>>>               return NULL;
>>>>>>           }
>>>>>>           cb->cpnd_res_shm_name = (uint8_t*)buffer; @@ -349,9 +399,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 =
>>>>>> -        sizeof(CLIENT_HDR) + (MAX_CLIENTS * sizeof(CLIENT_INFO)) +
>>>>> sizeof(CKPT_HDR) +
>>>>>> -        (MAX_CKPTS * sizeof(CKPT_INFO));
>>>>>> +    cpnd_open_req->info.open.i_size =
>>>>>> +cpsv_cpnd_shm_size(cpnd_shm_version.shm_version);
>>>>>>           if (cb->shm_alloc_guaranteed == true)
>>>>>>               cpnd_open_req->info.open.ensures_space = true;
>>>>>>           else
>>>>>> @@ -370,12 +418,14 @@ void *cpnd_restart_shm_create(NCS_OS_POS
>>>>>>               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);
>>>>>> +            TRACE_LEAVE();
>>>>>>                   return NULL;
>>>>>>               }
>>>>>>
>>>>>>               cb->cpnd_first_time = true;
>>>>>>                     TRACE_1("cpnd new shm create request success");
>>>>>> +        TRACE_LEAVE();
>>>>>>               return cpnd_open_req->info.open.o_addr;
>>>>>>           }
>>>>>>       @@ -390,7 +440,7 @@ void *cpnd_restart_shm_create(NCS_OS_POS
>>>>>>                 /* Already the shared memory exists */
>>>>>>           else {
>>>>>> -        CPND_SHM_VERSION shm_version;
>>>>>> +        CPND_SHM_VERSION shm_version;    // Shm version of existing
>>>>> memory
>>>>>>               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) + @@ -403,10 +453,15 @@ void
>>>>> *cpnd_restart_shm_create(NCS_OS_POS
>>>>>>               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:
>>>>>> +        case CPSV_CPND_SHM_VERSION_SHORT_DN:
>>>>>>               {
>>>>>>                   cpnd_restore_ckpt_info_v0(cb,
>>>>> gbl_shm_addr.ckpt_addr, nodeid);
>>>>>>       +            /* Keep v0 format if both have same version */
>>>>>> +            if (cpnd_shm_version.shm_version ==
>>>>> shm_version.shm_version) {
>>>>>> +                break;
>>>>>> +            }
>>>>>> +
>>>>>>                   /* Destroy the CPND_CHECKPOINT_INFO version
>>> 0 */
>>>>> cpnd_destroy_shm_cpnd_cp_info(&cpnd_open_req->info.open);
>>>>>>       @@ -414,6 +469,7 @@ void *cpnd_restart_shm_create(NCS_OS_POS
>>>>>>                   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);
>>>>>> +                TRACE_LEAVE();
>>>>>>                       return NULL;
>>>>>>                   }
>>>>>>       @@ -426,7 +482,8 @@ void *cpnd_restart_shm_create(NCS_OS_POS
>>>>>>                         break;
>>>>>>               }
>>>>>> -        case 1:
>>>>>> +        case CPSV_CPND_SHM_VERSION_LONG_DN:
>>>>>> +            shm_version.shm_version =
>>>>> CPSV_CPND_SHM_VERSION_LONG_DN;
>>>>>> cpnd_restore_ckpt_info_v1(cb,
>>>>> gbl_shm_addr.ckpt_addr, nodeid);
>>>>>>                   break;
>>>>>>               default:
>>>>>> @@ -505,8 +562,13 @@ int32_t cpnd_find_free_loc(CPND_CB *cb,
>>>>>>                   }
>>>>>>                   read_req.type = NCS_OS_POSIX_SHM_REQ_READ;
>>>>>>                   read_req.info.read.i_addr = (void *)((char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR));
>>>>>> - read_req.info.read.i_read_size = sizeof(CKPT_INFO);
>>>>>> -            read_req.info.read.i_offset = counter *
>>>>> sizeof(CKPT_INFO);
>>>>>> +            if (cpnd_shm_version.shm_version ==
>>>>> CPSV_CPND_SHM_VERSION_LONG_DN) {
>>>>>> + read_req.info.read.i_read_size =
>>>>> sizeof(CKPT_INFO);
>>>>>> + read_req.info.read.i_offset = counter *
>>>>> sizeof(CKPT_INFO);
>>>>>> +            } else {
>>>>>> +                read_req.info.read.i_read_size =
>>>>> sizeof(CKPT_INFO_V0);
>>>>>> + read_req.info.read.i_offset = counter *
>>>>> sizeof(CKPT_INFO_V0);
>>>>>> +            }
>>>>>>                   read_req.info.read.i_to_buff = (CKPT_INFO
>>>>> *)&ckpt_info;
>>>>>>                   rc = ncs_os_posix_shm(&read_req);
>>>>>>                   if (rc != NCSCC_RC_SUCCESS) { @@ -515,7
>>> +577,8 @@ int32_t
>>>>>> cpnd_find_free_loc(CPND_CB *cb,
>>>>>>                       return -2;
>>>>>>                   }
>>>>>>       -            if (1 == ((CKPT_INFO
>>>>> *)read_req.info.read.i_to_buff)->is_valid) {
>>>>>> +            if ((cpnd_shm_version.shm_version ==
>>>>> CPSV_CPND_SHM_VERSION_LONG_DN && 1 == ckpt_info.is_valid) ||
>>>>>> + (cpnd_shm_version.shm_version ==
>>>>> CPSV_CPND_SHM_VERSION_SHORT_DN
>>>>>> +&& 1 == ((CKPT_INFO_V0 *)(&ckpt_info))->is_valid)) {
>>>>>>                       counter++;
>>>>>>                       memset(&ckpt_info, '\0',
>>> sizeof(CKPT_INFO));
>>>>>>                       if (counter == MAX_CKPTS) {
>>>>>> @@ -738,25 +801,95 @@ bool cpnd_find_exact_ckptinfo(CPND_CB *c
>>>>>>             }
>>>>>>
>>>>> +/*******************************************************************
>>>>> +*
>>>>> +******
>>>>> **********************
>>>>>> + * Name          : cpnd_find_exact_ckptinfo_v0
>>>>>> + *
>>>>>> + * Description   : find if the checkpoint info v0 exists in the 
>>>>>> shared
>>>>> memory ,
>>>>>> +                   then findout the matching bm_offset offset value
>>>>>> + *
>>>>>> + * Arguments     : CPND_CKPT_NODE - ckpt node
>>>>>> + *
>>>>>> + * Return Values : The offset( if same bm_pffset present) /prev
>>>>>> + offset(
>>>>> if same bm_offset is not present )
>>>>>> +                    where this checkpoint info is present
>>>>>> + *
>>>>>> +*******************************************************************
>>>>>> +*
>>>>>> +*
>>>>>> +*****************************/
>>>>>> +
>>>>>> +bool cpnd_find_exact_ckptinfo_v0(CPND_CB *cb, CKPT_INFO_V0
>>>>>> +*ckpt_info,
>>>>> uint32_t bitmap_offset, uint32_t *offset,
>>>>>> +                  uint32_t *prev_offset)
>>>>>> +{
>>>>>> +    int32_t next;
>>>>>> +    CKPT_INFO_V0 prev_ckpt_info;
>>>>>> +    uint64_t i_offset;
>>>>>> +    bool found = false;
>>>>>> +
>>>>>> +    TRACE_ENTER();
>>>>>> +    memset(&prev_ckpt_info, 0, sizeof(CKPT_INFO_V0));
>>>>>> +    memcpy(&prev_ckpt_info, ckpt_info, sizeof(CKPT_INFO_V0));
>>>>>> +    next = ckpt_info->offset;
>>>>>> +    *prev_offset = prev_ckpt_info.offset;
>>>>>> +
>>>>>> +    while (next >= 0) {
>>>>>> +        memset(&prev_ckpt_info, 0, sizeof(CKPT_INFO_V0));
>>>>>> +        if ((next * sizeof(CKPT_INFO_V0)) > UINTMAX_MAX) {
>>>>>> +            LOG_ER("cpnd exact_ckptinf failed,exceeded the write
>>>>> limits(UINT64_MAX) ");
>>>>>> +        }
>>>>>> +        i_offset = next * sizeof(CKPT_INFO_V0);
>>>>>> +        m_CPND_CKPTINFO_V0_READ(prev_ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR), i_offset);
>>>>>> +        if (prev_ckpt_info.bm_offset == bitmap_offset) {
>>>>>> +            found = true;
>>>>>> +            *offset = prev_ckpt_info.offset;
>>>>>> +            break;
>>>>>> +        }
>>>>>> +        next = prev_ckpt_info.next;
>>>>>> +        *prev_offset = prev_ckpt_info.offset;
>>>>>> +    }
>>>>>> +    TRACE_LEAVE();
>>>>>> +    return found;
>>>>>> +
>>>>>> +}
>>>>>> +
>>>>>>
>>>>> /********************************************************************
>>>>> *
>>>>> ******
>>>>> ****************************
>>>>>>        * Name          : cpnd_update_ckpt_with_clienthdl
>>>>>>        *
>>>>>>        * Description   : To write the checkpoint data, which already
>>> exists
>>>> in
>>>>> the shared memory, here we just change the bitmap
>>>>>>        *
>>>>>> - * Arguments     : CPND_CKPT_NODE - ckpt node , offset - to 
>>>>>> update the
>>>>> respective ckpt , client_hdl
>>>>>> + * Arguments     : CPND_CKPT_NODE - ckpt node , offset - to 
>>>>>> update the
>>>>> respective ckpt , client_hdl
>>>>>>        *
>>>>>>        * Return Values : Success / Error
>>>>>> - *
>>>>>> + *
>>>>>>        * Notes         :  None
>>>>>> ********************************************************************
>>>>>> *
>>>>>> *
>>>>>> ********************************/
>>>>>>             uint32_t cpnd_update_ckpt_with_clienthdl(CPND_CB *cb,
>>>>>> CPND_CKPT_NODE
>>>>> *cp_node, SaCkptHandleT client_hdl)
>>>>>>       {
>>>>>> +    uint32_t rc = NCSCC_RC_SUCCESS;
>>>>>> +    if (cpnd_shm_version.shm_version == 
>>>>>> CPSV_CPND_SHM_VERSION_LONG_DN) {
>>>>>> +        rc = cpnd_update_ckpt_with_clienthdl_v1(cb, cp_node,
>>>>> client_hdl);
>>>>>> +    } else {
>>>>>> +        rc = cpnd_update_ckpt_with_clienthdl_v0(cb, cp_node,
>>>>> client_hdl);
>>>>>> +    }
>>>>>> +    return rc;
>>>>>> +}
>>>>>> +
>>>>>>
>>>>> +/*******************************************************************
>>>>> +*
>>>>> +******
>>>>> *****************************
>>>>>> + * Name          : cpnd_update_ckpt_with_clienthdl_v1
>>>>>> + *
>>>>>> + * Description   : To write the checkpoint data, which already 
>>>>>> exists
>>> in
>>>>> the shared memory, here we just change the bitmap
>>>>>> + *
>>>>>> + * Arguments     : CPND_CKPT_NODE - ckpt node , offset - to 
>>>>>> update the
>>>>> respective ckpt , client_hdl
>>>>>> + *
>>>>>> + * Return Values : Success / Error
>>>>>> + *
>>>>>> + * Notes         :  None
>>>>>> +
>>>>>> +*******************************************************************
>>>>>> +*
>>>>>> +*
>>>>>> +*********************************/
>>>>>> +
>>>>>> +uint32_t cpnd_update_ckpt_with_clienthdl_v1(CPND_CB *cb,
>>>>>> +CPND_CKPT_NODE *cp_node, SaCkptHandleT client_hdl) {
>>>>>>           CKPT_INFO ckpt_info, prev_ckpt_info, new_ckpt_info;
>>>>>>           uint32_t bitmap_offset = 0, bitmap_value = 0, prev_offset,
>>>>>> offset,
>>>>> rc = NCSCC_RC_SUCCESS;
>>>>>>           bool found = false;
>>>>>> -    uint64_t i_offset;
>>>>>> -
>>>>>> +    uint64_t i_offset;
>>>>>> +
>>>>>>           TRACE_ENTER();
>>>>>>           memset(&ckpt_info, '\0', sizeof(CKPT_INFO));
>>>>>>           memset(&prev_ckpt_info, '\0', sizeof(CKPT_INFO)); @@ 
>>>>>> -837,20
>>>>>> +970,139 @@ uint32_t cpnd_update_ckpt_with_clienthdl
>>>>>>           return rc;
>>>>>>       }
>>>>>> -/******************************************************************
>>>>>> *
>>>>>> *
>>>>>> ****************************************
>>>>>>
>>>>> +/*******************************************************************
>>>>> +*
>>>>> +******
>>>>> *****************************
>>>>>> + * Name          : cpnd_update_ckpt_with_clienthdl_v0
>>>>>> + *
>>>>>> + * Description   : To write the checkpoint data, which already 
>>>>>> exists
>>> in
>>>>> the shared memory, here we just change the bitmap
>>>>>> + *
>>>>>> + * Arguments     : CPND_CKPT_NODE - ckpt node , offset - to 
>>>>>> update the
>>>>> respective ckpt , client_hdl
>>>>>> + *
>>>>>> + * Return Values : Success / Error
>>>>>> + *
>>>>>> + * Notes         :  None
>>>>>> +
>>>>>> +*******************************************************************
>>>>>> +*
>>>>>> +*
>>>>>> +*********************************/
>>>>>> +
>>>>>> +uint32_t cpnd_update_ckpt_with_clienthdl_v0(CPND_CB *cb,
>>>>>> +CPND_CKPT_NODE *cp_node, SaCkptHandleT client_hdl) {
>>>>>> +    CKPT_INFO_V0 ckpt_info, prev_ckpt_info, new_ckpt_info;
>>>>>> +    uint32_t bitmap_offset = 0, bitmap_value = 0, prev_offset, 
>>>>>> offset,
>>>>> rc = NCSCC_RC_SUCCESS;
>>>>>> +    bool found = false;
>>>>>> +    uint64_t i_offset;
>>>>>> +
>>>>>> +    TRACE_ENTER();
>>>>>> +    memset(&ckpt_info, '\0', sizeof(CKPT_INFO_V0));
>>>>>> +    memset(&prev_ckpt_info, '\0', sizeof(CKPT_INFO_V0));
>>>>>> +    memset(&new_ckpt_info, '\0', sizeof(CKPT_INFO_V0));
>>>>>> +
>>>>>> +    /* Read the starting shared memory entry for this cp_node */
>>>>>> +    prev_offset = cp_node->offset;
>>>>>> +    i_offset = prev_offset * sizeof(CKPT_INFO_V0);
>>>>>> +    m_CPND_CKPTINFO_V0_READ(ckpt_info, (char 
>>>>>> *)cb->shm_addr.ckpt_addr
>>>>>> ++ sizeof(CKPT_HDR), i_offset);
>>>>>> +
>>>>>> +    /* Findout the bitmap offset and bitmap value for the input 
>>>>>> client
>>>>> handle */
>>>>>> +    bitmap_offset = client_hdl / 32;
>>>>>> +
>>>>>> +    bitmap_value = cpnd_client_bitmap_set(client_hdl % 32);
>>>>>> +
>>>>>> +    /*findout the ckpt_info with the exact bitmap_offset or findout
>>>>>> +prev
>>>>> ckpt_info if exact one not found */
>>>>>> +    found = cpnd_find_exact_ckptinfo_v0(cb, &ckpt_info, 
>>>>>> bitmap_offset,
>>>>>> +&offset, &prev_offset);
>>>>>> +
>>>>>> +    if (!found) {
>>>>>> +        CKPT_HDR ckpt_hdr;
>>>>>> +        uint32_t no_ckpts = 0;
>>>>>> +        /* Update the Next Location in the previous
>>>>> prev_ckpt_info.next as we have to find a new ckpt_info */
>>>>>> +        if ((prev_offset * sizeof(CKPT_INFO_V0)) > UINTMAX_MAX) {
>>>>>> +            LOG_ER("cpnd update clienthdl failed,exceeded the
>>>>> write limits(UINT64_MAX) ");
>>>>>> +        }
>>>>>> +        i_offset = prev_offset * sizeof(CKPT_INFO_V0);
>>>>>> +        m_CPND_CKPTINFO_V0_READ(prev_ckpt_info, (char
>>>>>> +*)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR), i_offset);
>>>>>> +
>>>>>> +        prev_ckpt_info.next = cpnd_find_free_loc(cb,
>>>>> CPND_CKPT_INFO);
>>>>>> +        if (prev_ckpt_info.next == -1) {
>>>>>> +            TRACE_4("cpnd client free block failed ");
>>>>>> +            TRACE_LEAVE();
>>>>>> +            return NCSCC_RC_FAILURE;
>>>>>> +        }
>>>>>> +        if (prev_ckpt_info.next == -2) {
>>>>>> +            TRACE_LEAVE();
>>>>>> +            return NCSCC_RC_FAILURE;
>>>>>> +            /* SHARED MEMORY READ ERROR */
>>>>>> +        }
>>>>>> +
>>>>>> +        /* Update the Header with incremented number of 
>>>>>> ckpt_info 's
>>>>> */
>>>>>> +        memset(&ckpt_hdr, '\0', sizeof(CKPT_HDR));
>>>>>> +        m_CPND_CKPTHDR_READ(ckpt_hdr, (char
>>>>> *)cb->shm_addr.ckpt_addr, 0);
>>>>>> +        no_ckpts = ++(ckpt_hdr.num_ckpts);
>>>>>> +
>>>>>> +        if (no_ckpts >= MAX_CKPTS)
>>>>>> +        {
>>>>>> +            TRACE_LEAVE();
>>>>>> +            return NCSCC_RC_FAILURE;
>>>>>> +        }
>>>>>> +
>>>>>> +        /* write the checkpoint info (number of ckpts)in the  
>>>>>> header
>>>>> */
>>>>>> + cpnd_ckpt_write_header(cb, no_ckpts);
>>>>>> +
>>>>>> +        m_CPND_CKPTINFO_V0_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>>> +sizeof(CKPT_HDR), prev_ckpt_info, i_offset);
>>>>>> +
>>>>>> +        /* Allocate New ckpt_info information */
>>>>>> +        offset = prev_ckpt_info.next;
>>>>>> +        /* bitmap_value = 
>>>>>> cpnd_client_bitmap_set((client_hdl%32)+1);
>>>>> */
>>>>>> + memcpy(&new_ckpt_info, &prev_ckpt_info,
>>>>> sizeof(CKPT_INFO_V0));
>>>>>> +        new_ckpt_info.offset = offset;
>>>>>> +        new_ckpt_info.client_bitmap = bitmap_value;
>>>>>> +        new_ckpt_info.bm_offset = bitmap_offset;
>>>>>> +        new_ckpt_info.is_valid = 1;
>>>>>> +        new_ckpt_info.is_first = false;
>>>>>> +        new_ckpt_info.next = SHM_NEXT;
>>>>>> +
>>>>>> +        i_offset = offset * sizeof(CKPT_INFO_V0);
>>>>>> +        m_CPND_CKPTINFO_V0_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>>> +sizeof(CKPT_HDR), new_ckpt_info, i_offset);
>>>>>> +
>>>>>> +    } else {
>>>>>> +        i_offset = offset * sizeof(CKPT_INFO_V0);
>>>>>> +        m_CPND_CKPTINFO_V0_READ(prev_ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR), i_offset);
>>>>>> + prev_ckpt_info.client_bitmap = prev_ckpt_info.client_bitmap
>>>>> | bitmap_value;
>>>>>> + m_CPND_CKPTINFO_V0_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR), prev_ckpt_info, i_offset);
>>>>>> +    }
>>>>>> +    TRACE_LEAVE();
>>>>>> +    return rc;
>>>>>> +}/*****************************************************************
>>>>>> +*
>>>>>> +*
>>>>>> +*****************************************
>>>>>>        * Name          :  cpnd_write_ckpt_info
>>>>>>        *
>>>>>> - * Description   : To write checkpoint info
>>>>>> + * Description   : To write checkpoint info
>>>>>>        *
>>>>>>        * Arguments     : CPND_CKPT_NODE - ckpt node , offset - to 
>>>>>> write
>> to
>>>>> corresponding ckpt , client_hdl
>>>>>>        *
>>>>>>        * Return Values : Success / Error
>>>>>>        *
>>>>>> - * Notes : Check if the offset is less than 31 , if so then update
>>>>>> the information in the corresponding offset
>>>>>> + * Notes : Check if the offset is less than 31 , if so then update
>>>>>> + the information in the corresponding offset
>>>>>>                  else find the next free location and there 
>>>>>> update the
>>>>> checkpoint information
>>>>>> ********************************************************************
>>>>>> *
>>>>>> * **************************************/
>>>>>> +uint32_t cpnd_write_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE *cp_node,
>>>>>> +int32_t offset, SaCkptHandleT client_hdl) {
>>>>>> +    uint32_t rc = NCSCC_RC_SUCCESS;
>>>>>> +    if (cpnd_shm_version.shm_version == 
>>>>>> CPSV_CPND_SHM_VERSION_LONG_DN) {
>>>>>> +        rc = cpnd_write_ckpt_info_v1(cb, cp_node, offset,
>>>>> client_hdl);
>>>>>> +    } else {
>>>>>> +        rc = cpnd_write_ckpt_info_v0(cb, cp_node, offset,
>>>>> client_hdl);
>>>>>> +    }
>>>>>> +    return rc;
>>>>>> +}
>>>>>>       -uint32_t cpnd_write_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE 
>>>>>> *cp_node,
>>>>>> int32_t offset, SaCkptHandleT client_hdl)
>>>>>>
>>>>> +/*******************************************************************
>>>>> +*
>>>>> +******
>>>>> **********************************
>>>>>> + * Name          : cpnd_write_ckpt_info_v1
>>>>>> + *
>>>>>> + * Description   : To write checkpoint info
>>>>>> + *
>>>>>> + * Arguments     : CPND_CKPT_NODE - ckpt node , offset - to 
>>>>>> write to
>>>>> corresponding ckpt , client_hdl
>>>>>> + *
>>>>>> + * Return Values : Success / Error
>>>>>> + *
>>>>>> + * Notes : Check if the offset is less than 31 , if so then update
>>>>>> + the
>>>>> information in the corresponding offset
>>>>>> +           else find the next free location and there update the
>>>>>> +checkpoint information
>>>>>> +*******************************************************************
>>>>>> +*
>>>>>> +* ***************************************/
>>>>>> +uint32_t cpnd_write_ckpt_info_v1(CPND_CB *cb, CPND_CKPT_NODE
>>>>>> +*cp_node, int32_t offset, SaCkptHandleT client_hdl)
>>>>>>       {
>>>>>>           CKPT_INFO ckpt_info;
>>>>>>           uint32_t rc = NCSCC_RC_SUCCESS; @@ -885,6 +1137,54 @@
>>> uint32_t
>>>>>> cpnd_write_ckpt_info(CPND_CB *c
>>>>>>             }
>>>>>>
>>>>> +/*******************************************************************
>>>>> +*
>>>>> +******
>>>>> **********************************
>>>>>> + * Name          : cpnd_write_ckpt_info_v0
>>>>>> + *
>>>>>> + * Description   : To write checkpoint info v0
>>>>>> + *
>>>>>> + * Arguments     : CPND_CKPT_NODE - ckpt node , offset - to 
>>>>>> write to
>>>>> corresponding ckpt , client_hdl
>>>>>> + *
>>>>>> + * Return Values : Success / Error
>>>>>> + *
>>>>>> + * Notes : Check if the offset is less than 31 , if so then update
>>>>>> + the
>>>>> information in the corresponding offset
>>>>>> +           else find the next free location and there update the
>>>>>> +checkpoint information
>>>>>> +*******************************************************************
>>>>>> +*
>>>>>> +* ***************************************/
>>>>>> +
>>>>>> +uint32_t cpnd_write_ckpt_info_v0(CPND_CB *cb, CPND_CKPT_NODE
>>>>>> +*cp_node, int32_t offset, SaCkptHandleT client_hdl) {
>>>>>> +    CKPT_INFO_V0 ckpt_info;
>>>>>> +    uint32_t rc = NCSCC_RC_SUCCESS;
>>>>>> +    uint64_t i_offset;
>>>>>> +
>>>>>> +    TRACE_ENTER();
>>>>>> +    memset(&ckpt_info, 0, sizeof(CKPT_INFO_V0));
>>>>>> +    osaf_extended_name_lend(cp_node->ckpt_name, 
>>>>>> &ckpt_info.ckpt_name);
>>>>>> +    ckpt_info.ckpt_id = cp_node->ckpt_id;
>>>>>> +    ckpt_info.maxSections = cp_node->create_attrib.maxSections;
>>>>>> +    ckpt_info.maxSecSize = cp_node->create_attrib.maxSectionSize;
>>>>>> +    ckpt_info.cpnd_rep_create = cp_node->cpnd_rep_create;
>>>>>> +    ckpt_info.offset = offset;
>>>>>> +    ckpt_info.node_id = cb->nodeid;
>>>>>> +    ckpt_info.is_first = true;
>>>>>> +
>>>>>> +    if (client_hdl) {
>>>>>> +        ckpt_info.bm_offset = client_hdl / 32;
>>>>>> +        ckpt_info.client_bitmap = cpnd_client_bitmap_set(client_hdl
>>>>> % 32);
>>>>>> +    }
>>>>>> +    ckpt_info.is_valid = 1;
>>>>>> +    ckpt_info.next = SHM_NEXT;
>>>>>> +
>>>>>> +    if ((offset * sizeof(CKPT_INFO_V0)) > UINTMAX_MAX) {
>>>>>> +        LOG_ER("cpnd write ckpt info  failed,exceeded the write
>>>>> limits(UINT64_MAX) ");
>>>>>> +    }
>>>>>> +    i_offset = offset * sizeof(CKPT_INFO_V0);
>>>>>> +    m_CPND_CKPTINFO_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>>> +sizeof(CKPT_HDR), ckpt_info, i_offset);
>>>>>> +
>>>>>> +    TRACE_LEAVE2("cpnd ckpt info write success
>>>>> ckpt_id:%llx",cp_node->ckpt_id);
>>>>>> +    return rc;
>>>>>> +
>>>>>> +}
>>>>>> +
>>>>>>
>>> /********************************************************************
>>>>>>        *  Name        : cpnd_restart_shm_client_update
>>>>>>        *
>>>>>> @@ -1062,11 +1362,18 @@ uint32_t cpnd_restart_shm_ckpt_free(CPND
>>>>>>           if (((cp_node->offset) * sizeof(CKPT_INFO)) > 
>>>>>> UINTMAX_MAX) {
>>>>>>               LOG_ER("cpnd ckpt free  failed,exceeded the write
>>>>> limits(UINT64_MAX) ");
>>>>>>           }
>>>>>> -    i_offset = (cp_node->offset) * sizeof(CKPT_INFO);
>>>>>> +    if (cpnd_shm_version.shm_version == 
>>>>>> CPSV_CPND_SHM_VERSION_LONG_DN) {
>>>>>> +        i_offset = (cp_node->offset) * sizeof(CKPT_INFO);
>>>>>> +
>>>>>> +        /*Update the prev & curr shared memory segments with the 
>>>>>> new
>>>>> data */
>>>>>> + m_CPND_CKPTINFO_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR), ckpt_info, i_offset);
>>>>>> +    } else {
>>>>>> +        i_offset = (cp_node->offset) * sizeof(CKPT_INFO_V0);
>>>>>> +
>>>>>> +        /*Update the prev & curr shared memory segments with the 
>>>>>> new
>>>>> data */
>>>>>> + m_CPND_CKPTINFO_V0_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR), ckpt_info, i_offset);
>>>>>> +    }
>>>>>>           cp_node->offset = SHM_INIT;
>>>>>> -
>>>>>> -    /*Update the prev & curr shared memory segments with the new 
>>>>>> data */
>>>>>> -    m_CPND_CKPTINFO_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR), ckpt_info, i_offset);
>>>>>>
>>>>>>           TRACE_LEAVE();
>>>>>>       @@ -1088,12 +1395,21 @@ void 
>>>>>> cpnd_restart_ckpt_name_length_reset
>>>>>>           CKPT_INFO ckpt_info;
>>>>>>                 memset(&ckpt_info, '\0', sizeof(CKPT_INFO));
>>>>>> -    if (cp_node->offset >= 0) {
>>>>>> +    if (cp_node->offset < 0) {
>>>>>> +        return;
>>>>>> +    }
>>>>>> +    if (cpnd_shm_version.shm_version == 
>>>>>> CPSV_CPND_SHM_VERSION_LONG_DN)
>>>>>> +{
>>>>>>               m_CPND_CKPTINFO_READ(ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> cp_node->offset *
>>> sizeof(CKPT_INFO));
>>>>>>               ckpt_info.is_unlink = true;
>>>>>>               m_CPND_CKPTINFO_UPDATE((char
>>> *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR), ckpt_info,
>>>>>> cp_node->offset *
>>> sizeof(CKPT_INFO));
>>>>>> +    } else {
>>>>>> +        m_CPND_CKPTINFO_V0_READ(ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> + cp_node->offset *
>>>>> sizeof(CKPT_INFO_V0));
>>>>>> +        ((CKPT_INFO_V0 *)(&ckpt_info))->is_unlink = true;
>>>>>> +        m_CPND_CKPTINFO_V0_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR), ckpt_info,
>>>>>> + cp_node->offset *
>>>>> sizeof(CKPT_INFO_V0));
>>>>>>           }
>>>>>>           return;
>>>>>>       }
>>>>>> @@ -1112,12 +1428,21 @@ void cpnd_restart_set_close_flag(CPND_CB
>>>>>>           CKPT_INFO ckpt_info;
>>>>>>                 memset(&ckpt_info, '\0', sizeof(CKPT_INFO));
>>>>>> -    if (cp_node->offset >= 0) {
>>>>>> +    if (cp_node->offset < 0) {
>>>>>> +        return;
>>>>>> +    }
>>>>>> +    if (cpnd_shm_version.shm_version == 
>>>>>> CPSV_CPND_SHM_VERSION_LONG_DN)
>>>>>> +{
>>>>>>               m_CPND_CKPTINFO_READ(ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> cp_node->offset *
>>> sizeof(CKPT_INFO));
>>>>>>               ckpt_info.is_close = true;
>>>>>>               m_CPND_CKPTINFO_UPDATE((char
>>> *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR), ckpt_info,
>>>>>> cp_node->offset *
>>> sizeof(CKPT_INFO));
>>>>>> +    } else {
>>>>>> +        m_CPND_CKPTINFO_V0_READ(ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> + cp_node->offset *
>>>>> sizeof(CKPT_INFO_V0));
>>>>>> +        ((CKPT_INFO_V0 *)(&ckpt_info))->is_close = true;
>>>>>> +        m_CPND_CKPTINFO_V0_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR), ckpt_info,
>>>>>> + cp_node->offset *
>>>>> sizeof(CKPT_INFO_V0));
>>>>>>           }
>>>>>>           return;
>>>>>>       }
>>>>>> @@ -1136,12 +1461,21 @@ void cpnd_restart_reset_close_flag(CPND_
>>>>>>           CKPT_INFO ckpt_info;
>>>>>>                 memset(&ckpt_info, '\0', sizeof(CKPT_INFO));
>>>>>> -    if (cp_node->offset >= 0) {
>>>>>> +    if (cp_node->offset < 0) {
>>>>>> +        return;
>>>>>> +    }
>>>>>> +    if (cpnd_shm_version.shm_version == 
>>>>>> CPSV_CPND_SHM_VERSION_LONG_DN)
>>>>>> +{
>>>>>>               m_CPND_CKPTINFO_READ(ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> cp_node->offset *
>>> sizeof(CKPT_INFO));
>>>>>>               ckpt_info.is_close = false;
>>>>>>               m_CPND_CKPTINFO_UPDATE((char
>>> *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR),
>>>>>> ckpt_info, cp_node->offset *
>>>>> sizeof(CKPT_INFO));
>>>>>> +    } else {
>>>>>> +        m_CPND_CKPTINFO_V0_READ(ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> + cp_node->offset *
>>>>> sizeof(CKPT_INFO_V0));
>>>>>> +        ((CKPT_INFO_V0 *)(&ckpt_info))->is_close = false;
>>>>>> +        m_CPND_CKPTINFO_V0_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR),
>>>>>> +                       ckpt_info, cp_node->offset *
>>>>> sizeof(CKPT_INFO_V0));
>>>>>>           }
>>>>>>           return;
>>>>>>       }
>>>>>> @@ -1235,6 +1569,94 @@ void cpnd_clear_ckpt_info(CPND_CB *cb, C
>>>>>>       }
>>>>>> /*******************************************************************
>>>>>> *
>>>>>> *
>>>>>> ***************************************
>>>>>> + * Name         :  cpnd_clear_ckpt_info_v0
>>>>>> + *
>>>>>> + * Description  : To start the timer and to reset the client
>>>>>> +information
>>>>>> + *
>>>>>> + * Arguments    :
>>>>>> + *
>>>>>> + * Return Values:
>>>>>> +*******************************************************************
>>>>>> +*
>>>>>> +* ***************************************/
>>>>>> +void cpnd_clear_ckpt_info_v0(CPND_CB *cb, CPND_CKPT_NODE *cp_node,
>>>>>> +uint32_t curr_offset, uint32_t prev_offset) {
>>>>>> +    CKPT_INFO_V0 prev_ckpt_info, curr_ckpt_info, next_ckpt_info;
>>>>>> +    uint64_t i_offset, no_ckpts;
>>>>>> +    CKPT_HDR ckpt_hdr;
>>>>>> +
>>>>>> +    TRACE_ENTER();
>>>>>> +    memset(&prev_ckpt_info, '\0', sizeof(CKPT_INFO_V0));
>>>>>> +    memset(&curr_ckpt_info, '\0', sizeof(CKPT_INFO_V0));
>>>>>> +    memset(&next_ckpt_info, '\0', sizeof(CKPT_INFO_V0));
>>>>>> +
>>>>>> +    if (((prev_offset * sizeof(CKPT_INFO_V0)) > UINTMAX_MAX) ||
>>>>> ((curr_offset * sizeof(CKPT_INFO_V0)) > UINTMAX_MAX)){
>>>>>> +        LOG_ER("cpnd clear ckpt info failed,exceeded the write
>>>>> limits(UINT64_MAX) ");
>>>>>> +    }
>>>>>> +    i_offset = prev_offset * sizeof(CKPT_INFO_V0);
>>>>>> +    m_CPND_CKPTINFO_V0_READ(prev_ckpt_info, (char
>>>>>> +*)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR), i_offset);
>>>>>> +
>>>>>> +    i_offset = curr_offset * sizeof(CKPT_INFO_V0);
>>>>>> +    m_CPND_CKPTINFO_V0_READ(curr_ckpt_info, (char
>>>>>> +*)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR), i_offset);
>>>>>> +
>>>>>> +    /* Update the Next Location in the previous 
>>>>>> prev_ckpt_info.next as
>>>>> we have to clear the curr ckpt_info */
>>>>>> +    if (cp_node->offset != curr_offset) {
>>>>>> +        memset(&ckpt_hdr, '\0', sizeof(CKPT_HDR));
>>>>>> +        m_CPND_CKPTHDR_READ(ckpt_hdr, (char
>>>>> *)cb->shm_addr.ckpt_addr, 0);
>>>>>> +        no_ckpts = --(ckpt_hdr.num_ckpts);
>>>>>> +        /* write the checkpoint info (number of ckpts)in the  
>>>>>> header
>>>>> */
>>>>>> + cpnd_ckpt_write_header(cb, no_ckpts);
>>>>>> +
>>>>>> +        prev_ckpt_info.next = curr_ckpt_info.next;
>>>>>> +        /*Update the prev & curr shared memory segments with the 
>>>>>> new
>>>>> data */
>>>>>> +        i_offset = prev_offset * sizeof(CKPT_INFO_V0);
>>>>>> +        m_CPND_CKPTINFO_V0_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>>> +sizeof(CKPT_HDR), prev_ckpt_info, i_offset);
>>>>>> +
>>>>>> +        memset(&curr_ckpt_info, '\0', sizeof(CKPT_INFO_V0));
>>>>>> +        i_offset = curr_offset * sizeof(CKPT_INFO_V0);
>>>>>> +        m_CPND_CKPTINFO_V0_UPDATE((char *)cb->shm_addr.ckpt_addr +
>>>>> sizeof(CKPT_HDR), curr_ckpt_info, i_offset);
>>>>>> +    } else {        /* This is the starting entry for this
>>>>> cp_node so update accordingly */
>>>>>> +
>>>>>> +        if (curr_ckpt_info.next >= 0) {
>>>>>> +            memset(&ckpt_hdr, '\0', sizeof(CKPT_HDR));
>>>>>> +            m_CPND_CKPTHDR_READ(ckpt_hdr, (char
>>>>> *)cb->shm_addr.ckpt_addr, 0);
>>>>>> +            no_ckpts = --(ckpt_hdr.num_ckpts);
>>>>>> +            /* write the checkpoint info (number of ckpts)in the
>>>>> header  */
>>>>>> + cpnd_ckpt_write_header(cb, no_ckpts);
>>>>>> +
>>>>>> +            cp_node->offset = curr_ckpt_info.next;
>>>>>> +
>>>>>> +            i_offset = (curr_ckpt_info.next) *
>>>>> sizeof(CKPT_INFO_V0);
>>>>>> +            if (((curr_ckpt_info.next) * sizeof(CKPT_INFO_V0)) >
>>>>> UINTMAX_MAX) {
>>>>>> +                LOG_ER("cpnd clear ckpt info failed,exceeded
>>>>> the write limits(UINT64_MAX) ");
>>>>>> +            }
>>>>>> +            i_offset = (curr_ckpt_info.next) *
>>>>> sizeof(CKPT_INFO_V0);
>>>>>> + m_CPND_CKPTINFO_V0_READ(next_ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> + i_offset);
>>>>>> +
>>>>>> +            next_ckpt_info.is_close = curr_ckpt_info.is_close;
>>>>>> +            next_ckpt_info.is_unlink = curr_ckpt_info.is_unlink;
>>>>>> +            next_ckpt_info.close_time =
>>>>> curr_ckpt_info.close_time;
>>>>>> + next_ckpt_info.is_first = true;
>>>>>> +            m_CPND_CKPTINFO_V0_UPDATE((char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR), next_ckpt_info,
>>>>>> + i_offset);
>>>>>> +
>>>>>> +            if (((curr_ckpt_info.offset) * sizeof(CKPT_INFO_V0))
>>>>>> UINTMAX_MAX) {
>>>>>> +                LOG_ER("cpnd clear ckpt info failed,exceeded
>>>>> the write limits(UINT64_MAX) ");
>>>>>> +            }
>>>>>> +            i_offset = (curr_ckpt_info.offset) *
>>>>> sizeof(CKPT_INFO_V0);
>>>>>> + memset(&curr_ckpt_info, '\0', sizeof(CKPT_INFO_V0));
>>>>>> +
>>>>>> +            m_CPND_CKPTINFO_V0_UPDATE((char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR), curr_ckpt_info,
>>>>>> + i_offset);
>>>>>> +
>>>>>> +        } else {
>>>>>> +            /* There is only one ckpt_info is there for this
>>>>> cp_node so no need to delete this node as part of close
>>>>>> +               This ckpt_info gets deleted as part of  unlink &
>>>>> lcl_ref_cnt of cp_node == 0  /  lcl_ref_cnt == 0 & ret_tmr expires */
>>>>>> +        }
>>>>>> +    }
>>>>>> +    TRACE_LEAVE();
>>>>>> +}
>>>>>> +
>>>>>> +/******************************************************************
>>>>>> +*
>>>>>> +*
>>>>>> +****************************************
>>>>>>        * Name :  cpnd_restart_client_reset
>>>>>>        *
>>>>>>        * Description : To start the timer and to reset the client
>>>>>> information @@ -1245,6 +1667,23 @@ void cpnd_clear_ckpt_info(CPND_CB
>>>>>> *cb,
>>>>> C
>>>>> *********************************************************************
>>>>> *
>>>>> ******
>>>>> ********************************/
>>>>>>       void cpnd_restart_client_reset(CPND_CB *cb, CPND_CKPT_NODE
>>>>>> *cp_node,
>>>>> CPND_CKPT_CLIENT_NODE *cl_node)
>>>>>>       {
>>>>>> +    if (cpnd_shm_version.shm_version == 
>>>>>> CPSV_CPND_SHM_VERSION_LONG_DN) {
>>>>>> +        cpnd_restart_client_reset_v1(cb, cp_node, cl_node);
>>>>>> +    } else {
>>>>>> +        cpnd_restart_client_reset_v0(cb, cp_node, cl_node);
>>>>>> +    }
>>>>>> +}
>>>>>> +/******************************************************************
>>>>>> +*
>>>>>> +*
>>>>>> +****************************************
>>>>>> + * Name :  cpnd_restart_client_reset_v1
>>>>>> + *
>>>>>> + * Description : To start the timer and to reset the client
>>>>>> +information
>>>>>> + *
>>>>>> + * Arguments :
>>>>>> + *
>>>>>> + * Return Values:
>>>>>> +*******************************************************************
>>>>>> +*
>>>>>> +* ***************************************/
>>>>>> +void cpnd_restart_client_reset_v1(CPND_CB *cb, CPND_CKPT_NODE
>>>>>> +*cp_node, CPND_CKPT_CLIENT_NODE *cl_node) {
>>>>>>           CKPT_INFO ckpt_info;
>>>>>>           uint32_t bitmap_offset = 0, num_bitset = 0;
>>>>>>           bool found = false;
>>>>>> @@ -1281,6 +1720,53 @@ void cpnd_restart_client_reset(CPND_CB *
>>>>>>           return;
>>>>>>       }
>>>>>> +/******************************************************************
>>>>>> +*
>>>>>> +*
>>>>>> +****************************************
>>>>>> + * Name :  cpnd_restart_client_reset_v0
>>>>>> + *
>>>>>> + * Description : To start the timer and to reset the client
>>>>>> +information
>>>>>> + *
>>>>>> + * Arguments :
>>>>>> + *
>>>>>> + * Return Values:
>>>>>> +*******************************************************************
>>>>>> +*
>>>>>> +* ***************************************/
>>>>>> +void cpnd_restart_client_reset_v0(CPND_CB *cb, CPND_CKPT_NODE
>>>>>> +*cp_node, CPND_CKPT_CLIENT_NODE *cl_node) {
>>>>>> +    CKPT_INFO_V0 ckpt_info;
>>>>>> +    uint32_t bitmap_offset = 0, num_bitset = 0;
>>>>>> +    bool found = false;
>>>>>> +    uint32_t offset, prev_offset;
>>>>>> +    SaCkptHandleT client_hdl = cl_node->ckpt_app_hdl;
>>>>>> +
>>>>>> +
>>>>>> +    TRACE_ENTER();
>>>>>> +    bitmap_offset = client_hdl / 32;
>>>>>> +
>>>>>> +    memset(&ckpt_info, '\0', sizeof(CKPT_INFO_V0));
>>>>>> +
>>>>>> +    if (cp_node->offset >= 0) {
>>>>>> +        m_CPND_CKPTINFO_V0_READ(ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> + cp_node->offset *
>>>>> sizeof(CKPT_INFO_V0));
>>>>>> +        /* findour the exact ckpt_info matching the client_hdl */
>>>>>> +        found = cpnd_find_exact_ckptinfo_v0(cb, &ckpt_info,
>>>>> bitmap_offset, &offset, &prev_offset);
>>>>>> +        if (found) {
>>>>>> +            memset(&ckpt_info, '\0', sizeof(CKPT_INFO_V0));
>>>>>> +            m_CPND_CKPTINFO_V0_READ(ckpt_info, (char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> +                         offset * sizeof(CKPT_INFO_V0));
>>>>>> + client_bitmap_reset(&ckpt_info.client_bitmap,
>>>>> (client_hdl % 32));
>>>>>> + m_CPND_CKPTINFO_V0_UPDATE((char
>>>>> *)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR),
>>>>>> + ckpt_info, offset *
>>>>> sizeof(CKPT_INFO_V0));
>>>>>> +
>>>>>> +            /* Delete the ckpt_info from shared memory if this
>>>>> ckpt_info's all 31 refs are closed */
>>>>>> +            num_bitset =
>>>>> client_bitmap_isset(ckpt_info.client_bitmap);
>>>>>> +            if (!num_bitset)
>>>>>> +                cpnd_clear_ckpt_info_v0(cb, cp_node, offset,
>>>>> prev_offset);
>>>>>> +
>>>>>> +        }
>>>>>> +    }
>>>>>> +    TRACE_LEAVE();
>>>>>> +    return;
>>>>>> +}
>>>>>> +
>>>>>>
>>>>> /********************************************************************
>>>>> *
>>>>> ******
>>>>> ******************
>>>>>>        * Name           : cpnd_restart_shm_ckpt_update
>>>>>>        *
>>>>>> @@ -1304,6 +1790,14 @@ uint32_t cpnd_restart_shm_ckpt_update(CP
>>>>>>           CKPT_HDR ckpt_hdr;
>>>>>>                 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 &&
>>>>> cpnd_shm_version.shm_version != CPSV_CPND_SHM_VERSION_LONG_DN) {
>>>>>> + cpnd_shm_version.shm_version =
>>>>> CPSV_CPND_SHM_VERSION_LONG_DN;
>>>>>> +        NCS_OS_POSIX_SHM_REQ_INFO cpnd_open_req;
>>>>>> +        memset(&cpnd_open_req, 0, sizeof(cpnd_open_req));
>>>>>> +        cpnd_restart_shm(&cpnd_open_req, cb, cb->nodeid);
>>>>>> +    }
>>>>>> +
>>>>>>           /* 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 */
>>>>> @@
>>>>>> -1372,6 +1866,9 @@ static uint32_t cpnd_restore_client_info
>>>>>>           n_clients = cli_hdr.num_clients;
>>>>>>           TRACE_1("cpnd num clients read - n_clients = %d",
>>> n_clients);
>>>>>>       +    /* Clean up before loading data*/
>>>>>> +    cpnd_client_node_tree_cleanup(cb);
>>>>>> +
>>>>>>           /* ( DO - WHILE )-  READ THE CLIENT INFO AND FILL THE
>>> DATABASE
>>>>>> OF
>>>>> CLIENT INFO */
>>>>>>           if (n_clients != 0) {
>>>>>>               while (counter < MAX_CLIENTS) { @@ -1839,12 +2336,8
>>> @@ static
>>>>>> void cpnd_destroy_shm_cpnd_cp_inf
>>>>>>       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; @@ -1855,9
>>>>>> +2348,7 @@ static void *cpnd_create_shm_cpnd_cp_inf
>>>>>>           }
>>>>>>                 /* 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)));
>>>>>> +    memset(req_info->info.open.o_addr, 0,
>>>>>> +cpsv_cpnd_shm_size(cpnd_shm_version.shm_version));
>>>>>>           memcpy(req_info->info.open.o_addr, &cpnd_shm_version,
>>>>>> sizeof(cpnd_shm_version));
>>>>>>                 TRACE_LEAVE();
>>>>
>>>
>>>
>>
>



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to