the tabstops are wrong in many places but other then that it looks good for merge.
regards -steve On Mon, 2009-10-12 at 12:48 +1300, angus salkeld wrote: > Hi > > This is the same patch with Steve's requested changes. > > -Angus > > Signed-off-by: Angus Salkeld <[email protected]> > --- > exec/coroipcs.c | 107 +++++++++++++++++++++++++++++++-- > exec/main.c | 140 > +++++++++++++++++++++++++++++++++++++++++++ > include/corosync/coroipcs.h | 12 ++++ > 3 files changed, 254 insertions(+), 5 deletions(-) > > diff --git a/exec/coroipcs.c b/exec/coroipcs.c > index ab7be0b..9186f25 100644 > --- a/exec/coroipcs.c > +++ b/exec/coroipcs.c > @@ -72,6 +72,7 @@ > #include <corosync/list.h> > > #include <corosync/coroipc_types.h> > +#include <corosync/hdb.h> > #include <corosync/coroipcs.h> > #include <corosync/coroipc_ipc.h> > > @@ -91,6 +92,7 @@ > #define MSG_SEND_UNLOCKED 1 > > static struct coroipcs_init_state *api; > +static struct coroipcs_init_stats_state *stats_api; > > DECLARE_LIST_INIT (conn_info_list_head); > > @@ -130,11 +132,13 @@ enum conn_state { > struct conn_info { > int fd; > pthread_t thread; > + pid_t client_pid; > pthread_attr_t thread_attr; > unsigned int service; > enum conn_state state; > int notify_flow_control_enabled; > int refcount; > + hdb_handle_t stats_handle; > #if _POSIX_THREAD_PROCESS_SHARED < 1 > key_t semkey; > int semid; > @@ -180,6 +184,7 @@ static void sem_post_exit_thread (struct conn_info > *conn_info) > retry_semop: > res = sem_post (&conn_info->control_buffer->sem0); > if (res == -1 && errno == EINTR) { > + stats_api->stats_increment_value (conn_info->stats_handle, > "sem_retry_count"); > goto retry_semop; > } > #else > @@ -190,6 +195,7 @@ retry_semop: > retry_semop: > res = semop (conn_info->semid, &sop, 1); > if ((res == -1) && (errno == EINTR || errno == EAGAIN)) { > + stats_api->stats_increment_value (conn_info->stats_handle, > "sem_retry_count"); > goto retry_semop; > } > #endif > @@ -437,6 +443,7 @@ static inline int conn_info_destroy (struct conn_info > *conn_info) > * Retry library exit function if busy > */ > if (conn_info->state == CONN_STATE_THREAD_DESTROYED) { > + stats_api->stats_destroy_connection (conn_info->stats_handle); > res = api->exit_fn_get (conn_info->service) (conn_info); > if (res == -1) { > api->serialize_unlock (); > @@ -588,6 +595,7 @@ retry_semwait: > pthread_exit (0); > } > if ((res == -1) && (errno == EINTR)) { > + stats_api->stats_increment_value > (conn_info->stats_handle, "sem_retry_count"); > goto retry_semwait; > } > #else > @@ -602,6 +610,7 @@ retry_semop: > } > res = semop (conn_info->semid, &sop, 1); > if ((res == -1) && (errno == EINTR || errno == EAGAIN)) { > + stats_api->stats_increment_value > (conn_info->stats_handle, "sem_retry_count"); > goto retry_semop; > } else > if ((res == -1) && (errno == EINVAL || errno == EIDRM)) { > @@ -639,12 +648,14 @@ retry_semop: > } else > if (send_ok) { > api->serialize_lock(); > + stats_api->stats_increment_value > (conn_info->stats_handle, "requests"); > api->handler_fn_get (conn_info->service, header->id) > (conn_info, header); > api->serialize_unlock(); > } else { > /* > * Overload, tell library to retry > */ > + stats_api->stats_increment_value > (conn_info->stats_handle, "sem_retry_count"); > coroipc_response_header.size = sizeof > (coroipc_response_header_t); > coroipc_response_header.id = 0; > coroipc_response_header.error = CS_ERR_TRY_AGAIN; > @@ -672,9 +683,11 @@ req_setup_send ( > retry_send: > res = send (conn_info->fd, &res_setup, sizeof (mar_res_setup_t), > MSG_WAITALL); > if (res == -1 && errno == EINTR) { > + stats_api->stats_increment_value (conn_info->stats_handle, > "send_retry_count"); > goto retry_send; > } else > if (res == -1 && errno == EAGAIN) { > + stats_api->stats_increment_value (conn_info->stats_handle, > "send_retry_count"); > goto retry_send; > } > return (0); > @@ -719,6 +732,7 @@ req_setup_recv ( > retry_recv: > res = recvmsg (conn_info->fd, &msg_recv, MSG_NOSIGNAL); > if (res == -1 && errno == EINTR) { > + stats_api->stats_increment_value (conn_info->stats_handle, > "recv_retry_count"); > goto retry_recv; > } else > if (res == -1 && errno != EAGAIN) { > @@ -753,6 +767,7 @@ retry_recv: > if (getpeerucred (conn_info->fd, &uc) == 0) { > euid = ucred_geteuid (uc); > egid = ucred_getegid (uc); > + conn_info->client_pid = ucred_getpid (uc); > if (api->security_valid (euid, egid)) { > authenticated = 1; > } > @@ -768,6 +783,10 @@ retry_recv: > uid_t euid; > gid_t egid; > > + /* > + * TODO get the peer's pid. > + * conn_info->client_pid = ?; > + */ > euid = -1; > egid = -1; > if (getpeereid (conn_info->fd, &euid, &egid) == 0) { > @@ -785,6 +804,7 @@ retry_recv: > assert (cmsg); > cred = (struct ucred *)CMSG_DATA (cmsg); > if (cred) { > + conn_info->client_pid = cred->pid; > if (api->security_valid (cred->uid, cred->gid)) { > authenticated = 1; > } > @@ -838,6 +858,7 @@ static int conn_info_create (int fd) > memset (conn_info, 0, sizeof (struct conn_info)); > > conn_info->fd = fd; > + conn_info->client_pid = 0; > conn_info->service = SOCKET_SERVICE_INIT; > conn_info->state = CONN_STATE_THREAD_INACTIVE; > list_init (&conn_info->outq_head); > @@ -845,7 +866,7 @@ static int conn_info_create (int fd) > list_init (&conn_info->zcb_mapped_list_head); > list_add (&conn_info->list, &conn_info_list_head); > > - api->poll_dispatch_add (fd, conn_info); > + api->poll_dispatch_add (fd, conn_info); > > return (0); > } > @@ -926,10 +947,16 @@ extern void coroipcs_ipc_init ( > #endif > listen (server_fd, SERVER_BACKLOG); > > - /* > - * Setup connection dispatch routine > - */ > - api->poll_accept_add (server_fd); > + /* > + * Setup connection dispatch routine > + */ > + api->poll_accept_add (server_fd); > +} > + > +extern void coroipcs_ipc_stats_init ( > + struct coroipcs_init_stats_state *init_stats_state) > +{ > + stats_api = init_stats_state; > } > > void coroipcs_ipc_exit (void) > @@ -1006,6 +1033,7 @@ retry_semop: > return (0); > } > #endif > + stats_api->stats_increment_value (conn_info->stats_handle, "responses"); > return (0); > } > > @@ -1121,6 +1149,7 @@ retry_semop: > return; > } > #endif > + stats_api->stats_increment_value (conn_info->stats_handle, > "dispatched"); > } > > static void outq_flush (struct conn_info *conn_info) { > @@ -1173,9 +1202,11 @@ retry_recv: > sizeof (mar_req_priv_change), > MSG_NOSIGNAL); > if (res == -1 && errno == EINTR) { > + stats_api->stats_increment_value (conn_info->stats_handle, > "recv_retry_count"); > goto retry_recv; > } > if (res == -1 && errno == EAGAIN) { > + stats_api->stats_increment_value (conn_info->stats_handle, > "recv_retry_count"); > goto retry_recv; > } > if (res == -1 && errno != EAGAIN) { > @@ -1346,6 +1377,69 @@ retry_accept: > return (0); > } > > +static char * pid_to_name (pid_t pid, char* out_name, size_t name_len) > +{ > + char *name; > + char *rest; > + FILE *fp; > + char fname[32]; > + char buf[256]; > + > + snprintf (fname, 32, "/proc/%d/stat", pid); > + fp = fopen (fname, "r"); > + if (!fp) { > + return NULL; > + } > + > + if (fgets (buf, sizeof (buf), fp) == NULL) { > + fclose (fp); > + return NULL; > + } > + fclose (fp); > + > + name = strrchr (buf, '('); > + if (!name) { > + return NULL; > + } > + > + /* move past the bracket */ > + name++; > + > + rest = strrchr (buf, ')'); > + > + if (rest == NULL || rest[1] != ' ') { > + return NULL; > + } > + > + *rest = '\0'; > + /* move past the NULL and space */ > + rest += 2; > + > + /* copy the name */ > + strncpy (out_name, name, name_len); > + out_name[name_len] = '\0'; > + return out_name; > +} > + > +static void coroipcs_init_conn_stats ( > + struct conn_info * conn) > +{ > + char conn_name[42]; > + char proc_name[32]; > + > + if (conn->client_pid > 0) { > + if (pid_to_name (conn->client_pid, proc_name, > sizeof(proc_name))) > + snprintf (conn_name, sizeof(conn_name), "%s:%d:%d", > proc_name, conn->client_pid, conn->fd); > + else > + snprintf (conn_name, sizeof(conn_name), "%d:%d", > conn->client_pid, conn->fd); > + } else > + snprintf (conn_name, sizeof(conn_name), "%d", conn->fd); > + > + conn->stats_handle = stats_api->stats_create_connection (conn_name, > conn->client_pid, conn->fd); > + stats_api->stats_update_value (conn->stats_handle, "service_id", > + &conn->service, > sizeof(conn->service)); > +} > + > int coroipcs_handler_dispatch ( > int fd, > int revent, > @@ -1447,6 +1541,9 @@ int coroipcs_handler_dispatch ( > > api->init_fn_get (conn_info->service) (conn_info); > > + /* create stats objects */ > + coroipcs_init_conn_stats (conn_info); > + > pthread_attr_init (&conn_info->thread_attr); > /* > * IA64 needs more stack space then other arches > diff --git a/exec/main.c b/exec/main.c > index ede12dd..76ffffd 100644 > --- a/exec/main.c > +++ b/exec/main.c > @@ -129,6 +129,8 @@ static hdb_handle_t corosync_poll_handle; > > struct sched_param global_sched_param; > > +static hdb_handle_t object_connection_handle; > + > hdb_handle_t corosync_poll_handle_get (void) > { > return (corosync_poll_handle); > @@ -669,6 +671,100 @@ static void corosync_poll_dispatch_modify ( > corosync_poll_handler_dispatch); > } > > + > +static hdb_handle_t corosync_stats_create_connection (const char* name, > + const pid_t pid, const int fd) > +{ > + uint32_t zero_32 = 0; > + uint64_t zero_64 = 0; > + unsigned int key_incr_dummy; > + hdb_handle_t object_handle; > + > + objdb->object_key_increment (object_connection_handle, > + "active", > strlen("active"), > + > &key_incr_dummy); > + > + objdb->object_create (object_connection_handle, > + &object_handle, > + name, > + strlen (name)); > + > + objdb->object_key_create_typed (object_handle, > + > "service_id", > + > &zero_32, sizeof (zero_32), > + > OBJDB_VALUETYPE_UINT32); > + > + objdb->object_key_create_typed (object_handle, > + > "client_pid", > + &pid, > sizeof (pid), > + > OBJDB_VALUETYPE_INT32); > + > + objdb->object_key_create_typed (object_handle, > + > "responses", > + > &zero_64, sizeof (zero_64), > + > OBJDB_VALUETYPE_UINT64); > + > + objdb->object_key_create_typed (object_handle, > + > "dispatched", > + > &zero_64, sizeof (zero_64), > + > OBJDB_VALUETYPE_UINT64); > + > + objdb->object_key_create_typed (object_handle, > + > "requests", > + > &zero_64, sizeof (zero_64), > + > OBJDB_VALUETYPE_INT64); > + > + objdb->object_key_create_typed (object_handle, > + > "sem_retry_count", > + > &zero_64, sizeof (zero_64), > + > OBJDB_VALUETYPE_UINT64); > + > + objdb->object_key_create_typed (object_handle, > + > "send_retry_count", > + > &zero_64, sizeof (zero_64), > + > OBJDB_VALUETYPE_UINT64); > + > + objdb->object_key_create_typed (object_handle, > + > "recv_retry_count", > + > &zero_64, sizeof (zero_64), > + > OBJDB_VALUETYPE_UINT64); > + > + return object_handle; > +} > + > +static void corosync_stats_destroy_connection (hdb_handle_t handle) > +{ > + unsigned int key_incr_dummy; > + > + objdb->object_destroy (handle); > + > + objdb->object_key_increment (object_connection_handle, > + "closed", > strlen("closed"), > + > &key_incr_dummy); > + objdb->object_key_decrement (object_connection_handle, > + "active", > strlen("active"), > + > &key_incr_dummy); > +} > + > +static void corosync_stats_update_value (hdb_handle_t handle, > + > const char *name, const void *value, > + > const size_t value_len) > +{ > + objdb->object_key_replace (handle, > + name, strlen(name), > + value, value_len); > +} > + > +static void corosync_stats_increment_value (hdb_handle_t handle, > + > const char* name) > +{ > + unsigned int key_incr_dummy; > + > + objdb->object_key_increment (handle, > + name, strlen(name), > + &key_incr_dummy); > +} > + > static struct coroipcs_init_state ipc_init_state = { > .socket_name = COROSYNC_SOCKET_NAME, > .sched_policy = SCHED_OTHER, > @@ -692,6 +788,13 @@ static struct coroipcs_init_state ipc_init_state = { > .handler_fn_get = corosync_handler_fn_get > }; > > +static struct coroipcs_init_stats_state ipc_init_stats_state = { > + .stats_create_connection = > corosync_stats_create_connection, > + .stats_destroy_connection = > corosync_stats_destroy_connection, > + .stats_update_value = > corosync_stats_update_value, > + .stats_increment_value = corosync_stats_increment_value > +}; > + > static void corosync_setscheduler (void) > { > #if defined(HAVE_PTHREAD_SETSCHEDPARAM) && > defined(HAVE_SCHED_GET_PRIORITY_MAX) && defined(HAVE_SCHED_SETSCHEDULER) > @@ -734,6 +837,35 @@ static void corosync_setscheduler (void) > #endif > } > > +static void corosync_stats_init (void) > +{ > + hdb_handle_t object_find_handle; > + hdb_handle_t object_runtime_handle; > + uint64_t zero_64 = 0; > + > + objdb->object_find_create (OBJECT_PARENT_HANDLE, > + "runtime", strlen > ("runtime"), > + &object_find_handle); > + > + if (objdb->object_find_next (object_find_handle, > + > &object_runtime_handle) != 0) { > + return; > + } > + > + /* Connection objects */ > + objdb->object_create (object_runtime_handle, > + &object_connection_handle, > + "connections", strlen > ("connections")); > + > + objdb->object_key_create_typed (object_connection_handle, > + > "active", &zero_64, sizeof (zero_64), > + > OBJDB_VALUETYPE_UINT64); > + objdb->object_key_create_typed (object_connection_handle, > + > "closed", &zero_64, sizeof (zero_64), > + > OBJDB_VALUETYPE_UINT64); > +} > + > + > static void main_service_ready (void) > { > int res; > @@ -746,6 +878,7 @@ static void main_service_ready (void) > corosync_exit_error (AIS_DONE_INIT_SERVICES); > } > evil_init (api); > + corosync_stats_init (); > } > > int main (int argc, char **argv) > @@ -765,6 +898,7 @@ int main (int argc, char **argv) > int background, setprio; > struct stat stat_out; > char corosync_lib_dir[PATH_MAX]; > + hdb_handle_t object_runtime_handle; > > #if defined(HAVE_PTHREAD_SPIN_LOCK) > pthread_spin_init (&serialize_spin, 0); > @@ -977,6 +1111,11 @@ int main (int argc, char **argv) > corosync_exit_error (AIS_DONE_MAINCONFIGREAD); > } > > + /* create the main runtime object */ > + objdb->object_create (OBJECT_PARENT_HANDLE, > + &object_runtime_handle, > + "runtime", strlen > ("runtime")); > + > /* > * Now we are fully initialized. > */ > @@ -1062,6 +1201,7 @@ int main (int argc, char **argv) > } > > coroipcs_ipc_init (&ipc_init_state); > + coroipcs_ipc_stats_init (&ipc_init_stats_state); > > /* > * Start main processing loop > diff --git a/include/corosync/coroipcs.h b/include/corosync/coroipcs.h > index 946b66d..0756a96 100644 > --- a/include/corosync/coroipcs.h > +++ b/include/corosync/coroipcs.h > @@ -74,9 +74,21 @@ struct coroipcs_init_state { > coroipcs_handler_fn_lvalue (*handler_fn_get)(unsigned int service, > unsigned int id); > }; > > +struct coroipcs_init_stats_state { > + hdb_handle_t (*stats_create_connection) (const char* name, > + const pid_t pid, const int fd); > + void (*stats_destroy_connection) (hdb_handle_t handle); > + void (*stats_update_value) (hdb_handle_t handle, > + const char* name, const void* value, const size_t > value_len); > + void (*stats_increment_value) (hdb_handle_t handle, const char* name); > +}; > + > extern void coroipcs_ipc_init ( > struct coroipcs_init_state *init_state); > > +extern void coroipcs_ipc_stats_init ( > + struct coroipcs_init_stats_state *init_stats_state); > + > extern void *coroipcs_private_data_get (void *conn); > > extern int coroipcs_response_send ( _______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
