Hi Hoang,

Is this issue coming with  enabling #1712  feature  ?

Exporting  `OSAF_CKPT_SHM_ALLOC_GUARANTEE=1`  will  provide guaranteed 
CPSV service SHM
issue and this is addressed broadly all SHM memory issue.

So I don't think we required  API level  changes. ( may we need to 
document the usage of  Exporting  `OSAF_CKPT_SHM_ALLOC_GUARANTEE=1` )

#1712  description
==============================================================================
summary:     leap: provide ensured disk space option for shm_open 
request [1712]

description:
leap: provide ensured disk space option for shm_open request [1712]
Provided ensured disk space is allocated for NCS_OS_POSIX_SHM_REQ_OPEN 
request
using posix_fallocate() so that application such as CPSV subsequent writes
to bytes in the specified range are guaranteed not to fail because of lack
of disk space.

Updated the Opensaf services according to new options based
on requirements.

Cpsv service uses the ensured disk space option based on 
OSAF_CKPT_SHM_ALLOC_GUARANTEE
environment variable ,so if user exports as 
OSAF_CKPT_SHM_ALLOC_GUARANTEE=1 (true) cpsv
provided ensured disk space.
==============================================================================

-AVM


On 11/23/2016 3:28 PM, Hoang Vo wrote:
>   osaf/libs/core/include/ncs_osprm.h      |   9 +++++++++
>   osaf/libs/core/leap/os_defs.c           |  19 +++++++++++++++++--
>   osaf/services/saf/cpsv/cpnd/cpnd_proc.c |  16 ++++++++++++++++
>   3 files changed, 42 insertions(+), 2 deletions(-)
>
>
> problem: when checkpoint service init without shared memory size guaranteed
> works in high memory load, core dump occur while adding section to checkpoint.
>
> solution:  check the true size of shared memory before writing to it.
>
> diff --git a/osaf/libs/core/include/ncs_osprm.h 
> b/osaf/libs/core/include/ncs_osprm.h
> --- a/osaf/libs/core/include/ncs_osprm.h
> +++ b/osaf/libs/core/include/ncs_osprm.h
> @@ -557,6 +557,7 @@ typedef enum {
>     NCS_OS_POSIX_SHM_REQ_UNLINK,    /* unlink is shm_unlink */
>     NCS_OS_POSIX_SHM_REQ_READ,
>     NCS_OS_POSIX_SHM_REQ_WRITE,
> +  NCS_OS_POSIX_SHM_REQ_STATS,
>     NCS_OS_POSIX_SHM_REQ_MAX
>   } NCS_OS_POSIX_SHM_REQ_TYPE;
>   typedef struct ncs_os_posix_shm_req_open_info_tag {
> @@ -598,6 +599,13 @@ typedef struct ncs_os_posix_shm_req_writ
>     uint64_t i_offset;
>   } NCS_OS_POSIX_SHM_REQ_WRITE_INFO;
>   
> +typedef struct ncs_os_posix_shm_req_stats_info_tag {
> +  uint32_t i_hdl;
> +  int32_t i_fd;
> +  bool ensures_space;
> +  void *o_addr;
> +} NCS_OS_POSIX_SHM_REQ_STATS_INFO;
> +
>   typedef struct ncs_shm_req_info {
>     NCS_OS_POSIX_SHM_REQ_TYPE type;
>   
> @@ -607,6 +615,7 @@ typedef struct ncs_shm_req_info {
>       NCS_OS_POSIX_SHM_REQ_UNLINK_INFO unlink;
>       NCS_OS_POSIX_SHM_REQ_READ_INFO read;
>       NCS_OS_POSIX_SHM_REQ_WRITE_INFO write;
> +    NCS_OS_POSIX_SHM_REQ_STATS_INFO stats;
>     } info;
>   
>   } NCS_OS_POSIX_SHM_REQ_INFO;
> diff --git a/osaf/libs/core/leap/os_defs.c b/osaf/libs/core/leap/os_defs.c
> --- a/osaf/libs/core/leap/os_defs.c
> +++ b/osaf/libs/core/leap/os_defs.c
> @@ -799,9 +799,9 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S
>                               }
>                       } else {
>                               if (ftruncate(req->info.open.o_fd, (off_t) 
> shm_size /* off_t == long */ ) < 0) {
> -                                     printf("ftruncate failed with errno 
> value %d \n", errno);
> +                                     LOG_WA("ftruncate failed with errno 
> value %d \n", errno);
>                                       return NCSCC_RC_FAILURE;
> -                                }
> +                }
>                       }
>   
>                       uint32_t prot_flag = 
> ncs_shm_prot_flags(req->info.open.i_flags);
> @@ -859,6 +859,21 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S
>                      req->info.write.i_write_size);
>               break;
>   
> +     case NCS_OS_POSIX_SHM_REQ_STATS:
> +             if (!req->info.stats.o_addr) {
> +                     printf("Output space is not defined\n");
> +                     return NCSCC_RC_FAILURE;
> +             }
> +
> +             if (req->info.stats.ensures_space) {
> +                     return NCSCC_RC_SUCCESS;
> +             } else {
> +                     if(fstat(req->info.stats.i_fd, req->info.stats.o_addr)) 
> {
> +                             return NCSCC_RC_FAILURE;
> +                     }
> +             }
> +             break;
> +
>       default:
>               printf("Option Not supported %d \n", req->type);
>               return NCSCC_RC_FAILURE;
> diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_proc.c 
> b/osaf/services/saf/cpsv/cpnd/cpnd_proc.c
> --- a/osaf/services/saf/cpsv/cpnd/cpnd_proc.c
> +++ b/osaf/services/saf/cpsv/cpnd/cpnd_proc.c
> @@ -1851,6 +1851,22 @@ uint32_t cpnd_sec_hdr_update(CPND_CKPT_S
>       CPSV_SECT_HDR sec_hdr;
>       uint32_t rc = NCSCC_RC_SUCCESS;
>       NCS_OS_POSIX_SHM_REQ_INFO write_req;
> +     struct stat shm_stat;
> +     memset(&write_req, '\0', sizeof(write_req));
> +     memset(&shm_stat, '\0', sizeof(shm_stat));
> +     write_req.type = NCS_OS_POSIX_SHM_REQ_STATS;
> +     write_req.info.stats.i_fd = cp_node->replica_info.open.info.open.o_fd;
> +     write_req.info.stats.ensures_space = false;
> +     write_req.info.stats.o_addr = &shm_stat;
> +     shm_stat.st_size = sizeof(CPSV_CKPT_HDR) + (sec_info->lcl_sec_id + 1) * 
> (sizeof(CPSV_SECT_HDR) + cp_node->create_attrib.maxSectionSize);
> +     rc = ncs_os_posix_shm(&write_req);
> +     if (rc != NCSCC_RC_SUCCESS) {
> +             return rc;
> +     }
> +
> +     if (shm_stat.st_size < sizeof(CPSV_CKPT_HDR) + (sec_info->lcl_sec_id + 
> 1) * (sizeof(CPSV_SECT_HDR) + cp_node->create_attrib.maxSectionSize)) {
> +             return NCSCC_RC_OUT_OF_MEM;
> +     }
>       memset(&write_req, '\0', sizeof(write_req));
>       memset(&sec_hdr, '\0', sizeof(CPSV_SECT_HDR));
>       sec_hdr.lcl_sec_id = sec_info->lcl_sec_id;


------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to