Looks good for commit - can you bump up the 20 limit to something more, 
like perhaps 50?

Thanks
-steve

On 08/23/2010 07:21 PM, Angus Salkeld wrote:
> These 2 patches result in the library returning NO_RESOURCES when
> corosync is running out of file descriptors. I think it's better...
>
> -Angus
>
>
> Signed-off-by: Angus Salkeld<[email protected]>
> ---
>   exec/coropoll.c                   |   69 
> +++++++++++++++++++++++++++++++++++++
>   exec/main.c                       |   19 ++++++++++
>   include/corosync/totem/coropoll.h |    7 ++++
>   3 files changed, 95 insertions(+), 0 deletions(-)
>
> diff --git a/exec/coropoll.c b/exec/coropoll.c
> index 7910214..bad4607 100644
> --- a/exec/coropoll.c
> +++ b/exec/coropoll.c
> @@ -42,6 +42,8 @@
>   #include<string.h>
>   #include<stdio.h>
>   #include<unistd.h>
> +#include<sys/time.h>
> +#include<sys/resource.h>
>
>   #include<corosync/hdb.h>
>   #include<corosync/totem/coropoll.h>
> @@ -63,6 +65,8 @@ struct poll_instance {
>       struct timerlist timerlist;
>       int stop_requested;
>       int pipefds[2];
> +     poll_low_fds_event_fn low_fds_event_fn;
> +     int32_t not_enough_fds;
>   };
>
>   DECLARE_HDB_DATABASE (poll_instance_database,NULL);
> @@ -92,6 +96,7 @@ hdb_handle_t poll_create (void)
>       poll_instance->ufds = 0;
>       poll_instance->poll_entry_count = 0;
>       poll_instance->stop_requested = 0;
> +     poll_instance->not_enough_fds = 0;
>       timerlist_init (&poll_instance->timerlist);
>
>       res = pipe (poll_instance->pipefds);
> @@ -380,6 +385,69 @@ error_exit:
>       return (res);
>   }
>
> +int poll_low_fds_event_set(
> +     hdb_handle_t handle,
> +     poll_low_fds_event_fn fn)
> +{
> +     struct poll_instance *poll_instance;
> +
> +     if (hdb_handle_get (&poll_instance_database, handle,
> +             (void *)&poll_instance) != 0) {
> +             return -ENOENT;
> +     }
> +
> +     poll_instance->low_fds_event_fn = fn;
> +
> +     hdb_handle_put (&poll_instance_database, handle);
> +     return 0;
> +}
> +
> +/* logs, std(in|out|err), pipe */
> +#define POLL_FDS_USED_MISC 20
> +
> +static void poll_fds_usage_check(struct poll_instance *poll_instance)
> +{
> +     struct rlimit lim;
> +     static int32_t socks_limit = 0;
> +     int32_t send_event = 0;
> +     int32_t socks_used = 0;
> +     int32_t socks_avail = 0;
> +     int32_t i;
> +
> +     if (socks_limit == 0) {
> +             if (getrlimit(RLIMIT_NOFILE,&lim) == -1) {
> +                     char error_str[100];
> +                     strerror_r(errno, error_str, 100);
> +                     printf("getrlimit: %s\n", error_str);
> +                     return;
> +             }
> +             socks_limit = lim.rlim_cur;
> +             socks_limit -= POLL_FDS_USED_MISC;
> +     }
> +
> +     for (i = 0; i<  poll_instance->poll_entry_count; i++) {
> +             if (poll_instance->poll_entries[i].ufd.fd != -1) {
> +                     socks_used++;
> +             }
> +     }
> +     socks_avail = socks_limit - socks_used;
> +     send_event = 0;
> +     if (poll_instance->not_enough_fds) {
> +             if (socks_avail>  2) {
> +                     poll_instance->not_enough_fds = 0;
> +                     send_event = 1;
> +             }
> +     } else {
> +             if (socks_avail<= 1) {
> +                     poll_instance->not_enough_fds = 1;
> +                     send_event = 1;
> +             }
> +     }
> +     if (send_event) {
> +             poll_instance->low_fds_event_fn(poll_instance->not_enough_fds,
> +                     socks_avail);
> +     }
> +}
>
>   int poll_run (
>       hdb_handle_t handle)
> @@ -403,6 +471,7 @@ rebuild_poll:
>                               &poll_instance->poll_entries[i].ufd,
>                               sizeof (struct pollfd));
>               }
> +             poll_fds_usage_check(poll_instance);
>               expire_timeout_msec = timerlist_msec_duration_to_expire 
> (&poll_instance->timerlist);
>
>               if (expire_timeout_msec != -1&&  expire_timeout_msec>  
> 0xFFFFFFFF) {
> diff --git a/exec/main.c b/exec/main.c
> index 4ddb5f2..d5306a3 100644
> --- a/exec/main.c
> +++ b/exec/main.c
> @@ -139,6 +139,8 @@ static pthread_t corosync_exit_thread;
>
>   static sem_t corosync_exit_sem;
>
> +static int32_t corosync_not_enough_fds_left = 0;
> +
>   static void serialize_unlock (void);
>
>   hdb_handle_t corosync_poll_handle_get (void)
> @@ -921,6 +923,11 @@ static coroipcs_handler_fn_lvalue 
> corosync_handler_fn_get (unsigned int service,
>   static int corosync_security_valid (int euid, int egid)
>   {
>       struct list_head *iter;
> +
> +     if (corosync_not_enough_fds_left) {
> +             return 0;
> +     }
> +
>       if (euid == 0 || egid == 0) {
>               return (1);
>       }
> @@ -1329,6 +1336,17 @@ static void corosync_stats_init (void)
>               OBJDB_VALUETYPE_UINT64);
>   }
>
> +static void main_low_fds_event(int32_t not_enough, size_t fds_available)
> +{
> +     corosync_not_enough_fds_left = not_enough;
> +     if (not_enough) {
> +             log_printf(LOGSYS_LEVEL_WARNING, "refusing new connections 
> (fds_available:%zu)\n",
> +                     fds_available);
> +     } else {
> +             log_printf(LOGSYS_LEVEL_NOTICE, "allowing new connections 
> (fds_available:%zu)\n",
> +                     fds_available);
> +     }
> +}
>
>   static void main_service_ready (void)
>   {
> @@ -1614,6 +1632,7 @@ int main (int argc, char **argv, char **envp)
>               sched_priority);
>
>       corosync_poll_handle = poll_create ();
> +     poll_low_fds_event_set(corosync_poll_handle, main_low_fds_event);
>
>       /*
>        * Sleep for a while to let other nodes in the cluster
> diff --git a/include/corosync/totem/coropoll.h 
> b/include/corosync/totem/coropoll.h
> index 3c0bca7..1e9c703 100644
> --- a/include/corosync/totem/coropoll.h
> +++ b/include/corosync/totem/coropoll.h
> @@ -36,11 +36,14 @@
>
>   #include<corosync/hdb.h>
>   #include<pthread.h>
> +#include<stdlib.h>
>
>   #ifdef __cplusplus
>   extern "C" {
>   #endif
>
> +typedef void (*poll_low_fds_event_fn) (int32_t not_enough, size_t 
> fds_available);
> +
>   typedef void * poll_timer_handle;
>
>   hdb_handle_t poll_create (void);
> @@ -73,6 +76,10 @@ int poll_dispatch_delete (
>       hdb_handle_t handle,
>       int fd);
>
> +int poll_low_fds_event_set(
> +     hdb_handle_t handle,
> +     poll_low_fds_event_fn fn);
> +
>   int poll_timer_add (
>       hdb_handle_t handle,
>       int msec_in_future, void *data,


_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to