Dear Mahesh,

I think this problem is #1712, problem occur when
OSAF_CKPT_SHM_ALLOC_GUARANTEE is not set.

My thinking is that because we provide 2 mode (guarantee or not) so we
should making sure no coredump happened.
Btw, because this is out of my scope of decide, I would like to ask Anders
Widell about it.

-----Original Message-----
From: A V Mahesh [mailto:mahesh.va...@oracle.com] 
Sent: Friday, November 25, 2016 4:06 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: ensure shared memory size before writing
[#2202]

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