mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-07-01 05:12:37 +00:00
improve messaging performance of mod_erlang_event FS-3347 --resolve
This commit is contained in:
parent
4b6c08b34e
commit
b303e722eb
@ -27,6 +27,7 @@
|
|||||||
* Andrew Thompson <andrew@hijacked.us>
|
* Andrew Thompson <andrew@hijacked.us>
|
||||||
* Rob Charlton <rob.charlton@savageminds.com>
|
* Rob Charlton <rob.charlton@savageminds.com>
|
||||||
* Tamas Cseke <tamas.cseke@virtual-call-center.eu>
|
* Tamas Cseke <tamas.cseke@virtual-call-center.eu>
|
||||||
|
* Seven Du <dujinfang@gmail.com>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* mod_erlang_event.c -- Erlang Event Handler derived from mod_event_socket
|
* mod_erlang_event.c -- Erlang Event Handler derived from mod_event_socket
|
||||||
@ -621,7 +622,7 @@ static switch_status_t notify_new_session(listener_t *listener, session_elem_t *
|
|||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static switch_status_t check_attached_sessions(listener_t *listener)
|
static switch_status_t check_attached_sessions(listener_t *listener, int *msgs_sent)
|
||||||
{
|
{
|
||||||
session_elem_t *sp;
|
session_elem_t *sp;
|
||||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||||
@ -682,6 +683,7 @@ static switch_status_t check_attached_sessions(listener_t *listener)
|
|||||||
switch_mutex_lock(listener->sock_mutex);
|
switch_mutex_lock(listener->sock_mutex);
|
||||||
ei_sendto(listener->ec, listener->sockfd, &sp->process, &ebuf);
|
ei_sendto(listener->ec, listener->sockfd, &sp->process, &ebuf);
|
||||||
switch_mutex_unlock(listener->sock_mutex);
|
switch_mutex_unlock(listener->sock_mutex);
|
||||||
|
(*msgs_sent)++;
|
||||||
ei_x_free(&ebuf);
|
ei_x_free(&ebuf);
|
||||||
switch_event_destroy(&pevent);
|
switch_event_destroy(&pevent);
|
||||||
}
|
}
|
||||||
@ -693,6 +695,7 @@ static switch_status_t check_attached_sessions(listener_t *listener)
|
|||||||
ei_x_encode_atom(&ebuf, "call_hangup");
|
ei_x_encode_atom(&ebuf, "call_hangup");
|
||||||
switch_mutex_lock(listener->sock_mutex);
|
switch_mutex_lock(listener->sock_mutex);
|
||||||
ei_sendto(listener->ec, listener->sockfd, &sp->process, &ebuf);
|
ei_sendto(listener->ec, listener->sockfd, &sp->process, &ebuf);
|
||||||
|
(*msgs_sent)++;
|
||||||
switch_mutex_unlock(listener->sock_mutex);
|
switch_mutex_unlock(listener->sock_mutex);
|
||||||
ei_x_free(&ebuf);
|
ei_x_free(&ebuf);
|
||||||
|
|
||||||
@ -718,6 +721,7 @@ static switch_status_t check_attached_sessions(listener_t *listener)
|
|||||||
switch_mutex_lock(listener->sock_mutex);
|
switch_mutex_lock(listener->sock_mutex);
|
||||||
ei_sendto(listener->ec, listener->sockfd, &sp->process, &ebuf);
|
ei_sendto(listener->ec, listener->sockfd, &sp->process, &ebuf);
|
||||||
switch_mutex_unlock(listener->sock_mutex);
|
switch_mutex_unlock(listener->sock_mutex);
|
||||||
|
(*msgs_sent)++;
|
||||||
ei_x_free(&ebuf);
|
ei_x_free(&ebuf);
|
||||||
|
|
||||||
switch_event_destroy(&pevent);
|
switch_event_destroy(&pevent);
|
||||||
@ -744,13 +748,14 @@ static switch_status_t check_attached_sessions(listener_t *listener)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_log_queue(listener_t *listener)
|
static int check_log_queue(listener_t *listener)
|
||||||
{
|
{
|
||||||
void *pop;
|
void *pop;
|
||||||
|
int msgs_sent = 0;
|
||||||
|
|
||||||
/* send out any pending crap in the log queue */
|
/* send out any pending crap in the log queue */
|
||||||
if (switch_test_flag(listener, LFLAG_LOG)) {
|
if (switch_test_flag(listener, LFLAG_LOG)) {
|
||||||
if (switch_queue_trypop(listener->log_queue, &pop) == SWITCH_STATUS_SUCCESS) {
|
while (msgs_sent < 100 && switch_queue_trypop(listener->log_queue, &pop) == SWITCH_STATUS_SUCCESS) {
|
||||||
switch_log_node_t *dnode = (switch_log_node_t *) pop;
|
switch_log_node_t *dnode = (switch_log_node_t *) pop;
|
||||||
|
|
||||||
if (dnode->data) {
|
if (dnode->data) {
|
||||||
@ -793,21 +798,26 @@ static void check_log_queue(listener_t *listener)
|
|||||||
switch_mutex_lock(listener->sock_mutex);
|
switch_mutex_lock(listener->sock_mutex);
|
||||||
ei_sendto(listener->ec, listener->sockfd, &listener->log_process, &lbuf);
|
ei_sendto(listener->ec, listener->sockfd, &listener->log_process, &lbuf);
|
||||||
switch_mutex_unlock(listener->sock_mutex);
|
switch_mutex_unlock(listener->sock_mutex);
|
||||||
|
msgs_sent ++;
|
||||||
|
|
||||||
ei_x_free(&lbuf);
|
ei_x_free(&lbuf);
|
||||||
switch_log_node_free(&dnode);
|
switch_log_node_free(&dnode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
listener->total_logs += msgs_sent;
|
||||||
|
return msgs_sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_event_queue(listener_t *listener)
|
static int check_event_queue(listener_t *listener)
|
||||||
{
|
{
|
||||||
void *pop;
|
void *pop;
|
||||||
|
int msgs_sent = 0;
|
||||||
|
|
||||||
/* send out any pending crap in the event queue */
|
/* send out any pending crap in the event queue */
|
||||||
if (switch_test_flag(listener, LFLAG_EVENTS)) {
|
if (switch_test_flag(listener, LFLAG_EVENTS)) {
|
||||||
if (switch_queue_trypop(listener->event_queue, &pop) == SWITCH_STATUS_SUCCESS) {
|
while (msgs_sent < 100 && switch_queue_trypop(listener->event_queue, &pop) == SWITCH_STATUS_SUCCESS) {
|
||||||
|
|
||||||
switch_event_t *pevent = (switch_event_t *) pop;
|
switch_event_t *pevent = (switch_event_t *) pop;
|
||||||
|
|
||||||
@ -820,10 +830,22 @@ static void check_event_queue(listener_t *listener)
|
|||||||
ei_sendto(listener->ec, listener->sockfd, &listener->event_process, &ebuf);
|
ei_sendto(listener->ec, listener->sockfd, &listener->event_process, &ebuf);
|
||||||
switch_mutex_unlock(listener->sock_mutex);
|
switch_mutex_unlock(listener->sock_mutex);
|
||||||
|
|
||||||
|
msgs_sent++;
|
||||||
|
|
||||||
ei_x_free(&ebuf);
|
ei_x_free(&ebuf);
|
||||||
|
|
||||||
|
if (pevent->event_id == SWITCH_EVENT_CHANNEL_CREATE) {
|
||||||
|
listener->create++;
|
||||||
|
} else if (pevent->event_id == SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE) {
|
||||||
|
listener->hangup++;
|
||||||
|
}
|
||||||
|
|
||||||
switch_event_destroy(&pevent);
|
switch_event_destroy(&pevent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
listener->total_events += msgs_sent;
|
||||||
|
return msgs_sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_exit(listener_t *listener, erlang_pid * pid)
|
static void handle_exit(listener_t *listener, erlang_pid * pid)
|
||||||
@ -881,6 +903,7 @@ static void handle_exit(listener_t *listener, erlang_pid * pid)
|
|||||||
static void listener_main_loop(listener_t *listener)
|
static void listener_main_loop(listener_t *listener)
|
||||||
{
|
{
|
||||||
int status = 1;
|
int status = 1;
|
||||||
|
int msgs_sent = 0; /* how many messages we sent in a loop */
|
||||||
|
|
||||||
while ((status >= 0 || erl_errno == ETIMEDOUT || erl_errno == EAGAIN) && !prefs.done) {
|
while ((status >= 0 || erl_errno == ETIMEDOUT || erl_errno == EAGAIN) && !prefs.done) {
|
||||||
erlang_msg msg;
|
erlang_msg msg;
|
||||||
@ -890,9 +913,11 @@ static void listener_main_loop(listener_t *listener)
|
|||||||
ei_x_new(&buf);
|
ei_x_new(&buf);
|
||||||
ei_x_new_with_version(&rbuf);
|
ei_x_new_with_version(&rbuf);
|
||||||
|
|
||||||
|
msgs_sent = 0;
|
||||||
|
|
||||||
/* do we need the mutex when reading? */
|
/* do we need the mutex when reading? */
|
||||||
/*switch_mutex_lock(listener->sock_mutex); */
|
/*switch_mutex_lock(listener->sock_mutex); */
|
||||||
status = ei_xreceive_msg_tmo(listener->sockfd, &msg, &buf, 10);
|
status = ei_xreceive_msg_tmo(listener->sockfd, &msg, &buf, 1);
|
||||||
/*switch_mutex_unlock(listener->sock_mutex); */
|
/*switch_mutex_unlock(listener->sock_mutex); */
|
||||||
|
|
||||||
switch (status) {
|
switch (status) {
|
||||||
@ -959,12 +984,22 @@ static void listener_main_loop(listener_t *listener)
|
|||||||
ei_x_free(&buf);
|
ei_x_free(&buf);
|
||||||
ei_x_free(&rbuf);
|
ei_x_free(&rbuf);
|
||||||
|
|
||||||
check_log_queue(listener);
|
msgs_sent += check_log_queue(listener);
|
||||||
check_event_queue(listener);
|
msgs_sent += check_event_queue(listener);
|
||||||
if (check_attached_sessions(listener) != SWITCH_STATUS_SUCCESS) {
|
if (check_attached_sessions(listener, &msgs_sent) != SWITCH_STATUS_SUCCESS) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "check_attached_sessions requested exit\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "check_attached_sessions requested exit\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (msgs_sent > SWITCH_CORE_QUEUE_LEN / 2) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "%d messages sent in a loop\n", msgs_sent);
|
||||||
|
} else if (msgs_sent > 0) {
|
||||||
|
#ifdef EI_DEBUG
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%d messages sent in a loop\n", msgs_sent);
|
||||||
|
#endif
|
||||||
|
} else { /* no more messages right now, relax */
|
||||||
|
switch_yield(100000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (prefs.done) {
|
if (prefs.done) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "shutting down listener\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "shutting down listener\n");
|
||||||
@ -1682,7 +1717,11 @@ SWITCH_STANDARD_API(erlang_cmd)
|
|||||||
|
|
||||||
if (listen_list.listeners) {
|
if (listen_list.listeners) {
|
||||||
for (l = listen_list.listeners; l; l = l->next) {
|
for (l = listen_list.listeners; l; l = l->next) {
|
||||||
stream->write_function(stream, "Listener to %s with %d outbound sessions\n", l->peer_nodename, count_listener_sessions(l));
|
stream->write_function(stream, "Listener to %s with outbound sessions: %d events: %" SWITCH_UINT64_T_FMT
|
||||||
|
" (lost:%d) logs: %" SWITCH_UINT64_T_FMT " (lost:%d) %d/%d\n",
|
||||||
|
l->peer_nodename, count_listener_sessions(l),
|
||||||
|
l->total_events, l->lost_events,
|
||||||
|
l->total_logs, l->lost_logs, l->create, l->hangup);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stream->write_function(stream, "No active listeners\n");
|
stream->write_function(stream, "No active listeners\n");
|
||||||
|
@ -136,8 +136,12 @@ struct listener {
|
|||||||
switch_thread_rwlock_t *session_rwlock;
|
switch_thread_rwlock_t *session_rwlock;
|
||||||
//session_elem_t *session_list;
|
//session_elem_t *session_list;
|
||||||
switch_hash_t *sessions;
|
switch_hash_t *sessions;
|
||||||
|
uint64_t total_events;
|
||||||
|
uint64_t total_logs;
|
||||||
int lost_events;
|
int lost_events;
|
||||||
int lost_logs;
|
int lost_logs;
|
||||||
|
int create;
|
||||||
|
int hangup;
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
char remote_ip[50];
|
char remote_ip[50];
|
||||||
/*switch_port_t remote_port; */
|
/*switch_port_t remote_port; */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user