Although it is technically possible to upgrade OpenSAF without rebooting the node, in practice this is neither tested nor recommended anyway. So I don't think you need to support "version 2" in the new code. We do support downgrade of OpenSAF, and I guess it can't be worse than downgrading to a previous version anyhow. You could verify that it doesn't crash if it encounters a shared memory with an unknown version.
regards, Anders Widell On 10/18/2016 11:17 AM, Vo Minh Hoang wrote: > 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