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