[Openais] [PATCH 2/3] Add per service-function statistics.

angus salkeld angus.salkeld at alliedtelesis.co.nz
Sun Oct 11 16:49:19 PDT 2009


With requested changes.

-Angus

Signed-off-by: Angus Salkeld <angus.salkeld at gmail.com>
---
 exec/apidef.c  |    4 +-
 exec/main.c    |   19 +++++++++++++
 exec/service.c |   81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 exec/service.h |    3 ++
 4 files changed, 104 insertions(+), 3 deletions(-)

diff --git a/exec/apidef.c b/exec/apidef.c
index 37b0230..7de2209 100644
--- a/exec/apidef.c
+++ b/exec/apidef.c
@@ -49,11 +49,11 @@
 #include "timer.h"
 #include "sync.h"
 #include "quorum.h"
-#include "service.h"
 #include "schedwrk.h"
 #include "main.h"
-#include <corosync/engine/coroapi.h>
 #include "apidef.h"
+#include <corosync/engine/coroapi.h>
+#include "service.h"
 
 LOGSYS_DECLARE_SUBSYS ("APIDEF");
 
diff --git a/exec/main.c b/exec/main.c
index 76ffffd..717b2d6 100644
--- a/exec/main.c
+++ b/exec/main.c
@@ -429,6 +429,7 @@ static void deliver_fn (
 	int fn_id;
 	unsigned int id;
 	unsigned int size;
+	unsigned int key_incr_dummy;
 
 	header = msg;
 	if (endian_conversion_required) {
@@ -457,6 +458,10 @@ static void deliver_fn (
 		return;
 	}
 
+	objdb->object_key_increment (service_stats_handle[service][fn_id],
+								 "rx", strlen("rx"),
+								 &key_incr_dummy);
+
 	if (endian_conversion_required) {
 		assert(ais_service[service]->exec_engine[fn_id].exec_endian_convert_fn != NULL);
 		ais_service[service]->exec_engine[fn_id].exec_endian_convert_fn
@@ -480,6 +485,20 @@ int main_mcast (
         unsigned int iov_len,
         unsigned int guarantee)
 {
+	const coroipc_request_header_t *req = iovec->iov_base;
+	int service;
+	int fn_id;
+	unsigned int key_incr_dummy;
+
+	service = req->id >> 16;
+	fn_id = req->id & 0xffff;
+
+	if (ais_service[service]) {
+		objdb->object_key_increment (service_stats_handle[service][fn_id],
+									 "tx", strlen("tx"),
+									 &key_incr_dummy);
+	}
+
 	return (totempg_groups_mcast_joined (corosync_group_handle, iovec, iov_len, guarantee));
 }
 
diff --git a/exec/service.c b/exec/service.c
index d0c11c0..18f4909 100644
--- a/exec/service.c
+++ b/exec/service.c
@@ -91,8 +91,10 @@ static struct default_service default_services[] = {
 
 struct corosync_service_engine *ais_service[SERVICE_HANDLER_MAXIMUM_COUNT];
 
-static hdb_handle_t object_internal_configuration_handle;
+hdb_handle_t service_stats_handle[SERVICE_HANDLER_MAXIMUM_COUNT][64];
 
+static hdb_handle_t object_internal_configuration_handle;
+static hdb_handle_t object_stats_services_handle;
 
 static unsigned int default_services_requested (struct corosync_api_v1 *corosync_api)
 {
@@ -141,6 +143,11 @@ unsigned int corosync_service_link_and_init (
 	struct corosync_service_engine *service;
 	unsigned int res;
 	hdb_handle_t object_service_handle;
+	hdb_handle_t object_stats_handle;
+	int fn;
+	char object_name[32];
+	char *name_sufix;
+	uint64_t zero_64 = 0;
 
 	/*
 	 * reference the service interface
@@ -203,6 +210,39 @@ unsigned int corosync_service_link_and_init (
 		&service->id,
 		sizeof (service->id), OBJDB_VALUETYPE_UINT16);
 
+	name_sufix = strrchr (service_name, '_');
+	if (name_sufix)
+		name_sufix++;
+	else
+		name_sufix = (char*)service_name;
+
+	corosync_api->object_create (object_stats_services_handle,
+								 &object_stats_handle,
+								 name_sufix, strlen (name_sufix));
+
+	corosync_api->object_key_create_typed (object_stats_handle,
+										 "service_id",
+										 &service->id, sizeof (service->id),
+										 OBJDB_VALUETYPE_INT16);
+
+	for (fn = 0; fn < service->exec_engine_count; fn++) {
+
+		snprintf (object_name, 32, "%d", fn);
+		corosync_api->object_create (object_stats_handle,
+									 &service_stats_handle[service->id][fn],
+									 object_name, strlen (object_name));
+
+		corosync_api->object_key_create_typed (service_stats_handle[service->id][fn],
+											 "tx",
+											 &zero_64, sizeof (zero_64),
+											 OBJDB_VALUETYPE_UINT64);
+
+		corosync_api->object_key_create_typed (service_stats_handle[service->id][fn],
+											 "rx",
+											 &zero_64, sizeof (zero_64),
+											 OBJDB_VALUETYPE_UINT64);
+	}
+
 	log_printf (LOGSYS_LEVEL_NOTICE, "Service initialized '%s'\n", service->name);
 	return (res);
 }
@@ -305,6 +345,29 @@ extern unsigned int corosync_service_unlink_and_exit (
 	unsigned short *service_id;
 	unsigned int *found_service_ver;
 	hdb_handle_t object_find_handle;
+	char object_name[32];
+	char *name_sufix;
+
+	name_sufix = strrchr (service_name, '_');
+	if (name_sufix)
+		name_sufix++;
+	else
+		name_sufix = (char*)service_name;
+
+	corosync_api->object_find_create (
+		object_stats_services_handle,
+		name_sufix, strlen (name_sufix),
+		&object_find_handle);
+
+	if (corosync_api->object_find_next (
+			object_find_handle,
+			&object_service_handle) == 0) {
+
+		corosync_api->object_destroy (object_service_handle);
+
+	}
+	corosync_api->object_find_destroy (object_find_handle);
+
 
 	corosync_api->object_find_create (
 		object_internal_configuration_handle,
@@ -377,7 +440,23 @@ unsigned int corosync_service_defaults_link_and_init (struct corosync_api_v1 *co
 	char *found_service_ver;
 	unsigned int found_service_ver_atoi;
 	hdb_handle_t object_find_handle;
+	hdb_handle_t object_find2_handle;
+	hdb_handle_t object_runtime_handle;
+
+	corosync_api->object_find_create (
+		OBJECT_PARENT_HANDLE,
+		"runtime",
+		strlen ("runtime"),
+		&object_find2_handle);
 
+	if (corosync_api->object_find_next (
+			object_find2_handle,
+			&object_runtime_handle) == 0) {
+
+		corosync_api->object_create (object_runtime_handle,
+									 &object_stats_services_handle,
+									 "services", strlen ("services"));
+	}
 	corosync_api->object_create (OBJECT_PARENT_HANDLE,
 		&object_internal_configuration_handle,
 		"internal_configuration",
diff --git a/exec/service.h b/exec/service.h
index 7e331b0..6d9048a 100644
--- a/exec/service.h
+++ b/exec/service.h
@@ -35,6 +35,7 @@
 #ifndef COROSYNC_SERVICE_H_DEFINED
 #define COROSYNC_SERVICE_H_DEFINED
 
+#include <corosync/hdb.h>
 /*
  * Link and initialize a service
  */
@@ -74,4 +75,6 @@ extern unsigned int corosync_service_defaults_link_and_init (
 
 extern struct corosync_service_engine *ais_service[];
 
+extern hdb_handle_t service_stats_handle[SERVICE_HANDLER_MAXIMUM_COUNT][64];
+
 #endif /* SERVICE_H_DEFINED */
-- 
1.6.3.4



More information about the Openais mailing list