[RHEL7,COMMIT] fuse/kio_pcs: adapt prometheus statistics to current vstorage state

Submitted by Konstantin Khorenko on April 27, 2018, 9:07 a.m.

Details

Message ID 201804270907.w3R97rqi031210@finist_ce7.work
State New
Series "fuse/kio_pcs: adapt prometheus statistics to current vstorage state"
Headers show

Commit Message

Konstantin Khorenko April 27, 2018, 9:07 a.m.
The commit is pushed to "branch-rh7-3.10.0-693.21.1.vz7.47.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-693.21.1.vz7.46.7
------>
commit 36b1455dfe00c44327fd78a4850cb627586f96b8
Author: Alexey Kuznetsov <kuznet@virtuozzo.com>
Date:   Fri Apr 27 12:07:53 2018 +0300

    fuse/kio_pcs: adapt prometheus statistics to current vstorage state
    
    Signed-off-by: Alexey Kuznetsov <kuznet@virtuozzo.com>
    Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
---
 fs/fuse/kio/pcs/fuse_prometheus_prot.h | 25 ++++++++++++++++---------
 fs/fuse/kio/pcs/pcs_cs.c               | 14 ++++----------
 fs/fuse/kio/pcs/pcs_fuse_kdirect.c     | 34 ++++++++++++++++------------------
 3 files changed, 36 insertions(+), 37 deletions(-)

Patch hide | download patch | download mbox

diff --git a/fs/fuse/kio/pcs/fuse_prometheus_prot.h b/fs/fuse/kio/pcs/fuse_prometheus_prot.h
index 254fae3ad1eb..e39f2337268f 100644
--- a/fs/fuse/kio/pcs/fuse_prometheus_prot.h
+++ b/fs/fuse/kio/pcs/fuse_prometheus_prot.h
@@ -1,23 +1,30 @@ 
 #ifndef __FUSE_PROMETHEUS_PROT__
 #define __FUSE_PROMETHEUS_PROT__ 1
 
-#define KFUSE_OP_READ		0
-#define KFUSE_OP_WRITE		1
-#define KFUSE_OP_FSYNC		2
-#define KFUSE_OP_FALLOCATE	3
-#define KFUSE_OP_MAX		4
+#define KFUSE_OP_CS_READ	0
+#define KFUSE_OP_CS_WRITE	1
+#define KFUSE_OP_CS_SYNC	2
+#define KFUSE_OP_CS_WRITE_HOLE	3
+#define KFUSE_OP_CS_WRITE_ZERO	4
+#define KFUSE_OP_CS_FIEMAP	5
 
-#define KFUSE_PROM_MAX		(9*5 + 1)
+#define KFUSE_OP_READ		6
+#define KFUSE_OP_WRITE		7
+#define KFUSE_OP_FSYNC		8
+#define KFUSE_OP_FALLOCATE	9
+#define KFUSE_OP_MAX		10
+
+#define KFUSE_PROM_MAX		(9*5 + 2)
 
 struct kfuse_stat_rec
 {
-	u64	value;
-	u64	count;
+	u64	buckets[KFUSE_PROM_MAX];
+	u64	sum;
 };
 
 struct kfuse_histogram
 {
-	struct kfuse_stat_rec	buckets[KFUSE_OP_MAX][KFUSE_PROM_MAX+1];
+	struct kfuse_stat_rec	metrics[KFUSE_OP_MAX];
 };
 
 #endif /* __FUSE_PROMETHEUS_PROT__ */
diff --git a/fs/fuse/kio/pcs/pcs_cs.c b/fs/fuse/kio/pcs/pcs_cs.c
index d6324d9a90f4..2752658bedab 100644
--- a/fs/fuse/kio/pcs/pcs_cs.c
+++ b/fs/fuse/kio/pcs/pcs_cs.c
@@ -234,21 +234,15 @@  struct pcs_cs *pcs_cs_find_create(struct pcs_cs_set *csset, PCS_NODE_ID_T *id, P
 	return cs;
 }
 
-static void (*io_times_logger_cb)(struct pcs_int_request *ireq, struct pcs_msg *resp, u32 max_iolat, void *ctx) = NULL;
-static void *io_times_logger_ctx = NULL;
-
-void cs_set_io_times_logger(void (*logger)(struct pcs_int_request *ireq, struct pcs_msg *resp, u32 max_iolat, void *ctx), void *ctx)
-{
-	io_times_logger_cb = logger;
-	io_times_logger_ctx = ctx;
-}
-
 void cs_log_io_times(struct pcs_int_request * ireq, struct pcs_msg * resp, unsigned int max_iolat)
 {
 	/* Ugly. Need to move fc ref to get rid of pcs_cluster_core */
 	struct fuse_conn * fc = container_of(ireq->cc, struct pcs_fuse_cluster, cc)->fc;
+	struct pcs_cs_iohdr * h = (struct pcs_cs_iohdr *)msg_inline_head(resp);
+	int reqt = h->hdr.type != PCS_CS_SYNC_RESP ? ireq->iochunk.direction : PCS_REQ_T_SYNC;
+
+	fuse_stat_account(fc, reqt, ktime_sub(ktime_get(), ireq->ts_sent));
 	if (fc->ktrace && fc->ktrace_level >= LOG_TRACE) {
-		struct pcs_cs_iohdr * h = (struct pcs_cs_iohdr *)msg_inline_head(resp);
 		int n = 1;
 		struct fuse_trace_hdr * t;
 
diff --git a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
index f35b8975a19b..bae89deffde2 100644
--- a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
+++ b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
@@ -1033,27 +1033,25 @@  void fuse_stat_account(struct fuse_conn * fc, int op, ktime_t val)
 		cpu = get_cpu();
 		histp = per_cpu_ptr(tr->prometheus_hist, cpu);
 		if (histp && *histp) {
-			struct kfuse_stat_rec * buckets = (*histp)->buckets[op];
-			struct kfuse_stat_rec * bucket;
+			struct kfuse_stat_rec * rec = (*histp)->metrics + op;
+			int bucket;
 			unsigned long long lat = ktime_to_ns(val)/1000;
 
 			if (lat < 1000)
-				bucket = buckets + (lat/100);
+				bucket = (lat/100);
 			else if (lat < 10000)
-				bucket = buckets + 9*1 + (lat/1000);
+				bucket = 9*1 + (lat/1000);
 			else if (lat < 100000)
-				bucket = buckets + 9*2 + (lat/10000);
+				bucket = 9*2 + (lat/10000);
 			else if (lat < 1000000)
-				bucket = buckets + 9*3 + (lat/100000);
+				bucket = 9*3 + (lat/100000);
 			else if (lat < 10000000)
-				bucket = buckets + 9*4 + (lat/1000000);
+				bucket = 9*4 + (lat/1000000);
 			else
-				bucket = buckets + 9*5;
+				bucket = 9*5 + 1;
 
-			bucket->value += lat;
-			bucket->count++;
-			buckets[KFUSE_PROM_MAX].value += lat;
-			buckets[KFUSE_PROM_MAX].count++;
+			rec->buckets[bucket]++;
+			rec->sum += lat;
 		}
 		put_cpu();
 	}
@@ -1088,10 +1086,10 @@  static ssize_t prometheus_file_read(struct file *filp,
 	struct kfuse_histogram * hist;
 	int cpu;
 
-	if (*ppos >= KFUSE_PROM_MAX*KFUSE_OP_MAX*sizeof(struct kfuse_stat_rec))
+	if (*ppos >= sizeof(struct kfuse_histogram))
 		return 0;
-	if (*ppos + count > KFUSE_PROM_MAX*KFUSE_OP_MAX*sizeof(struct kfuse_stat_rec))
-		count = KFUSE_PROM_MAX*KFUSE_OP_MAX*sizeof(struct kfuse_stat_rec) - *ppos;
+	if (*ppos + count > sizeof(struct kfuse_histogram))
+		count = sizeof(struct kfuse_histogram) - *ppos;
 
 	hist = (void*)get_zeroed_page(GFP_KERNEL);
 	if (!hist)
@@ -1107,10 +1105,10 @@  static ssize_t prometheus_file_read(struct file *filp,
 		if (histp && *histp) {
 			int i, k;
 			for (i = 0; i < KFUSE_OP_MAX; i++) {
-				for (k = 0; k < KFUSE_PROM_MAX + 1; k++) {
-					hist->buckets[i][k].value += (*histp)->buckets[i][k].value;
-					hist->buckets[i][k].count += (*histp)->buckets[i][k].count;
+				for (k = 0; k < KFUSE_PROM_MAX; k++) {
+					hist->metrics[i].buckets[k] += (*histp)->metrics[i].buckets[k];
 				}
+				hist->metrics[i].sum += (*histp)->metrics[i].sum;
 			}
 		}
 	}