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. - 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. 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