On Sun, Aug 08, 2010 at 10:17:43PM -0700, Steven Dake wrote: > The model is when server has too many sockets in use, library > returns TRY_AGAIN? Hi Steve
No, if the server runs out of fds then we shutdown the listening socket. The library returns LIB error, I believe. Then when we have more fds we setup the listening socket again. Is there any point of try again in this situation? I would say this is not a "normal" error and probalby shows a machine setup incorrectly. If processes start and quitely keep trying again it might not help anyone. -Angus > > Regards > -steve > > On 08/08/2010 08:01 PM, Angus Salkeld wrote: > > Whenever we accept a new connection or close an > > existing one, check the number of available file > > descriptors and either publish or withdraw the > > IPC listening socket. > > > >Signed-off-by: Angus Salkeld<asalk...@redhat.com> > >--- > > exec/ipc.c | 92 > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- > > 1 files changed, 86 insertions(+), 6 deletions(-) > > > >diff --git a/exec/ipc.c b/exec/ipc.c > >index 5337d25..bf3102c 100644 > >--- a/exec/ipc.c > >+++ b/exec/ipc.c > >@@ -99,6 +99,7 @@ > > #define MSG_SEND_UNLOCKED 1 > > > > static unsigned int g_gid_valid = 0; > >+static int32_t libais_server_fd = -1; > > > > static void (*ipc_serialize_lock_fn) (void); > > > >@@ -161,6 +162,15 @@ static int priv_change (struct conn_info *conn_info); > > > > static void ipc_disconnect (struct conn_info *conn_info); > > > >+static void server_socket_publish(void); > >+ > >+static void server_socket_withdraw(void); > >+ > >+static void server_socket_check(void); > >+ > >+static int poll_handler_accept (poll_handle handle, int fd, > >+ int revent, void *data); > >+ > > static int ipc_thread_active (void *conn) > > { > > struct conn_info *conn_info = (struct conn_info *)conn; > >@@ -211,6 +221,7 @@ static inline int conn_info_destroy (struct conn_info > >*conn_info) > > conn_info->state == CONN_STATE_DISCONNECT_INACTIVE) { > > list_del (&conn_info->list); > > close (conn_info->fd); > >+ server_socket_check(); > > free (conn_info); > > return (-1); > > } > >@@ -257,6 +268,7 @@ static inline int conn_info_destroy (struct conn_info > >*conn_info) > > free (conn_info->private_data); > > } > > close (conn_info->fd); > >+ server_socket_check(); > > free (conn_info); > > ipc_serialize_unlock_fn(); > > return (-1); > >@@ -773,7 +785,12 @@ retry_accept: > > } > > > > if (new_fd == -1) { > >- log_printf (LOG_LEVEL_ERROR, "ERROR: Could not accept Library > >connection: %s\n", strerror (errno)); > >+ log_printf (LOG_LEVEL_ERROR, > >+ "ERROR: Could not accept Library connection: %s\n", > >+ strerror (errno)); > >+ if (errno == EMFILE || errno == ENFILE) { > >+ server_socket_withdraw(); > >+ } > > return (0); /* This is an error, but -1 would indicate > > disconnect from poll loop */ > > } > > > >@@ -802,6 +819,7 @@ retry_accept: > > if (res != 0) { > > close (new_fd); > > } > >+ server_socket_check(); > > > > return (0); > > } > >@@ -835,14 +853,23 @@ void openais_ipc_init ( > > void (*serialize_lock_fn) (void), > > void (*serialize_unlock_fn) (void)) > > { > >- int libais_server_fd; > >- struct sockaddr_un un_addr; > >- int res; > >- > > ipc_serialize_lock_fn = serialize_lock_fn; > > > > ipc_serialize_unlock_fn = serialize_unlock_fn; > > > >+ server_socket_publish(); > >+ > >+ g_gid_valid = gid_valid; > >+} > >+ > >+static void server_socket_publish(void) > >+{ > >+ int32_t res = 0; > >+ struct sockaddr_un un_addr; > >+ > >+ log_printf(LOG_LEVEL_WARNING, > >+ "Publishing socket for client connections.\n"); > >+ > > /* > > * Create socket for libais clients, name socket, listen for connections > > */ > >@@ -885,8 +912,61 @@ void openais_ipc_init ( > > */ > > poll_dispatch_add (aisexec_poll_handle, libais_server_fd, > > POLLIN|POLLNVAL, 0, poll_handler_accept); > >+} > > > >- g_gid_valid = gid_valid; > >+static void server_socket_withdraw(void) > >+{ > >+ log_printf(LOG_LEVEL_WARNING, > >+ "Withdrawing socket for client connections.\n"); > >+ > >+ poll_dispatch_delete(aisexec_poll_handle, libais_server_fd); > >+ shutdown(libais_server_fd, SHUT_RDWR); > >+ close(libais_server_fd); > >+ libais_server_fd = -1; > >+} > >+ > >+/* > >+ * The actual used sockets is 12 but allowing a larger number > >+ * for safety. > >+ */ > >+#define COROIPC_NUM_RESERVED_SOCKETS 25 > >+ > >+static int32_t num_avail_sockets(void) > >+{ > >+ struct rlimit lim; > >+ int32_t open_socks = 0; > >+ int32_t res; > >+ struct list_head *list; > >+ > >+ if (getrlimit(RLIMIT_NOFILE,&lim) == -1) { > >+ char error_str[100]; > >+ strerror_r(errno, error_str, 100); > >+ log_printf(LOG_LEVEL_ERROR, > >+ "getrlimit: %s\n", error_str); > >+ return -1; > >+ } > >+ > >+ for (list = conn_info_list_head.next; list !=&conn_info_list_head; > >+ list = list->next) { > >+ open_socks++; > >+ } > >+ res = lim.rlim_cur - (open_socks + COROIPC_NUM_RESERVED_SOCKETS); > >+ log_printf(LOG_LEVEL_DEBUG, > >+ "(lim.rlim_cur:%lu - (open_socks:%d + reserved:%d) == %d\n", > >+ lim.rlim_cur, open_socks, COROIPC_NUM_RESERVED_SOCKETS, res); > >+ return res; > >+} > >+ > >+static void server_socket_check(void) > >+{ > >+ int32_t num = num_avail_sockets(); > >+ > >+ if (libais_server_fd == -1&& num> 0) { > >+ server_socket_publish(); > >+ } > >+ else if (libais_server_fd != -1&& num<= 0) { > >+ server_socket_withdraw(); > >+ } > > } > > > > void openais_ipc_exit (void) _______________________________________________ Openais mailing list Openais@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/openais