From 542ce6855c3fc012d4d9dde80fb762c8be491a97 Mon Sep 17 00:00:00 2001
From: Vladimir Davydov <vdavydov.dev@gmail.com>
Date: Sun, 18 Jun 2017 21:41:13 +0300
Subject: [PATCH] vinyl: add per-index disk write statistics

This patch adds the following counters to the disk section index.info:

  dump                  # dump statistics:
    count               #   number of invocations
    in                  #   number of input statements
      rows
      bytes
    out                 #   number of output statements
      rows
      bytes

  compact               # compaction statistics:
    count               #   number of invocations
    in                  #   number of input statements
      rows
      bytes
    out                 #   number of output statements
      rows
      bytes

Needed for #1662
---
 src/box/vinyl.c   | 28 ++++++++++++++++++++++++----
 src/box/vy_stat.h | 21 +++++++++++++++++++++
 2 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/src/box/vinyl.c b/src/box/vinyl.c
index 17f0c6af1a..8d6f30519d 100644
--- a/src/box/vinyl.c
+++ b/src/box/vinyl.c
@@ -3108,6 +3108,7 @@ vy_task_dump_complete(struct vy_task *task)
 	 * Account the new run.
 	 */
 	vy_index_add_run(index, new_run);
+	vy_stmt_counter_add_disk(&index->stat.disk.dump.out, &new_run->count);
 
 	/* Drop the reference held by the task. */
 	vy_run_unref(new_run);
@@ -3149,12 +3150,14 @@ vy_task_dump_complete(struct vy_task *task)
 			continue;
 		rlist_del_entry(mem, in_sealed);
 		vy_stmt_counter_sub(&index->stat.memory.count, &mem->count);
+		vy_stmt_counter_add(&index->stat.disk.dump.in, &mem->count);
 		vy_scheduler_remove_mem(scheduler, mem);
 		vy_mem_delete(mem);
 	}
 	index->version++;
 	index->dump_lsn = dump_lsn;
 	index->generation = task->generation;
+	index->stat.disk.dump.count++;
 
 	/* The iterator has been cleaned up in a worker thread. */
 	task->wi->iface->close(task->wi);
@@ -3425,6 +3428,8 @@ vy_task_compact_complete(struct vy_task *task)
 	 */
 	if (new_slice != NULL) {
 		vy_index_add_run(index, new_run);
+		vy_stmt_counter_add_disk(&index->stat.disk.compact.out,
+					 &new_run->count);
 		/* Drop the reference held by the task. */
 		vy_run_unref(new_run);
 	} else
@@ -3446,6 +3451,8 @@ vy_task_compact_complete(struct vy_task *task)
 		next_slice = rlist_next_entry(slice, in_range);
 		vy_range_remove_slice(range, slice);
 		rlist_add_entry(&compacted_slices, slice, in_range);
+		vy_stmt_counter_add_disk(&index->stat.disk.compact.in,
+					 &slice->count);
 		if (slice == last_slice)
 			break;
 	}
@@ -3453,6 +3460,7 @@ vy_task_compact_complete(struct vy_task *task)
 	range->version++;
 	vy_index_acct_range(index, range);
 	vy_range_update_compact_priority(range);
+	index->stat.disk.compact.count++;
 
 	/*
 	 * Unaccount unused runs and delete compacted slices.
@@ -4524,6 +4532,17 @@ vy_info_append_disk_stmt_counter(struct info_handler *h, const char *name,
 		info_table_end(h);
 }
 
+static void
+vy_info_append_compact_stat(struct info_handler *h, const char *name,
+			    const struct vy_compact_stat *stat)
+{
+	info_table_begin(h, name);
+	info_append_int(h, "count", stat->count);
+	vy_info_append_stmt_counter(h, "in", &stat->in);
+	vy_info_append_stmt_counter(h, "out", &stat->out);
+	info_table_end(h);
+}
+
 void
 vy_index_info(struct vy_index *index, struct info_handler *h)
 {
@@ -4532,10 +4551,9 @@ vy_index_info(struct vy_index *index, struct info_handler *h)
 
 	info_begin(h);
 
-	info_append_int(h, "rows", stat->disk.count.rows +
-				   stat->memory.count.rows);
-	info_append_int(h, "bytes", stat->disk.count.bytes +
-				    stat->memory.count.bytes);
+	struct vy_stmt_counter count = stat->memory.count;
+	vy_stmt_counter_add_disk(&count, &stat->disk.count);
+	vy_info_append_stmt_counter(h, NULL, &count);
 
 	info_table_begin(h, "memory");
 	vy_info_append_stmt_counter(h, NULL, &stat->memory.count);
@@ -4556,6 +4574,8 @@ vy_index_info(struct vy_index *index, struct info_handler *h)
 	info_append_int(h, "miss", stat->disk.iterator.bloom_miss);
 	info_table_end(h);
 	info_table_end(h);
+	vy_info_append_compact_stat(h, "dump", &stat->disk.dump);
+	vy_info_append_compact_stat(h, "compact", &stat->disk.compact);
 	info_table_end(h);
 
 	info_append_int(h, "range_count", index->range_count);
diff --git a/src/box/vy_stat.h b/src/box/vy_stat.h
index 91e8b8a6bf..23493ea322 100644
--- a/src/box/vy_stat.h
+++ b/src/box/vy_stat.h
@@ -90,6 +90,15 @@ struct vy_run_iterator_stat {
 	struct vy_disk_stmt_counter read;
 };
 
+/** Dump/compaction statistics. */
+struct vy_compact_stat {
+	int32_t count;
+	/** Number of input statements. */
+	struct vy_stmt_counter in;
+	/** Number of output statements. */
+	struct vy_stmt_counter out;
+};
+
 /** Vinyl index statistics. */
 struct vy_index_stat {
 	/** Memory related statistics. */
@@ -105,6 +114,10 @@ struct vy_index_stat {
 		struct vy_disk_stmt_counter count;
 		/** Run iterator statistics. */
 		struct vy_run_iterator_stat iterator;
+		/** Dump statistics. */
+		struct vy_compact_stat dump;
+		/** Compaction statistics. */
+		struct vy_compact_stat compact;
 	} disk;
 };
 
@@ -124,6 +137,14 @@ vy_stmt_counter_sub(struct vy_stmt_counter *c1,
 	c1->bytes -= c2->bytes;
 }
 
+static inline void
+vy_stmt_counter_add_disk(struct vy_stmt_counter *c1,
+			 const struct vy_disk_stmt_counter *c2)
+{
+	c1->rows += c2->rows;
+	c1->bytes += c2->bytes;
+}
+
 static inline void
 vy_disk_stmt_counter_add(struct vy_disk_stmt_counter *c1,
 			 const struct vy_disk_stmt_counter *c2)
-- 
GitLab