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