[tarantool-patches] [PATCH 4/6] swim: expose enum swim_member_status to public API

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Wed Mar 20 13:49:17 MSK 2019


At least for testing it is necessary to be able to get status of
a member. Now it is always 'alive', but forthcoming
failure-detection component would change it.

Part of #3234
---
 src/lib/swim/swim.c         |  6 ++++++
 src/lib/swim/swim.h         |  6 ++++++
 src/lib/swim/swim_proto.h   | 14 +++++++++++---
 test/unit/swim.c            | 11 ++++++++++-
 test/unit/swim.result       |  6 +++++-
 test/unit/swim_test_utils.c | 22 +++++++++++++++++++++-
 test/unit/swim_test_utils.h |  6 +++++-
 7 files changed, 64 insertions(+), 7 deletions(-)

diff --git a/src/lib/swim/swim.c b/src/lib/swim/swim.c
index c2b2132a2..df34ce247 100644
--- a/src/lib/swim/swim.c
+++ b/src/lib/swim/swim.c
@@ -962,6 +962,12 @@ swim_member_by_uuid(struct swim *swim, const struct tt_uuid *uuid)
 	return swim_find_member(swim, uuid);
 }
 
+enum swim_member_status
+swim_member_status(const struct swim_member *member)
+{
+	return member->status;
+}
+
 struct swim_iterator *
 swim_iterator_open(struct swim *swim)
 {
diff --git a/src/lib/swim/swim.h b/src/lib/swim/swim.h
index 744214371..ddb759c3d 100644
--- a/src/lib/swim/swim.h
+++ b/src/lib/swim/swim.h
@@ -31,6 +31,8 @@
  * SUCH DAMAGE.
  */
 #include <stdbool.h>
+#define SWIM_PUBLIC_API
+#include "swim_proto.h"
 
 #if defined(__cplusplus)
 extern "C" {
@@ -112,6 +114,10 @@ swim_self(struct swim *swim);
 const struct swim_member *
 swim_member_by_uuid(struct swim *swim, const struct tt_uuid *uuid);
 
+/** Member's current status. */
+enum swim_member_status
+swim_member_status(const struct swim_member *member);
+
 /**
  * Open an iterator to scan the whole member table. The iterator
  * is not stable. It means, that a caller can not yield between
diff --git a/src/lib/swim/swim_proto.h b/src/lib/swim/swim_proto.h
index 300a08c1f..4f3cdf03d 100644
--- a/src/lib/swim/swim_proto.h
+++ b/src/lib/swim/swim_proto.h
@@ -1,5 +1,3 @@
-#ifndef TARANTOOL_SWIM_PROTO_H_INCLUDED
-#define TARANTOOL_SWIM_PROTO_H_INCLUDED
 /*
  * Copyright 2010-2019, Tarantool AUTHORS, please see AUTHORS file.
  *
@@ -64,6 +62,9 @@
  * +-------------------------------------------------------------+
  */
 
+#ifndef TARANTOOL_SWIM_PUBLIC_PROTO_H_INCLUDED
+#define TARANTOOL_SWIM_PUBLIC_PROTO_H_INCLUDED
+
 enum swim_member_status {
 	/** The instance is ok, responds to requests. */
 	MEMBER_ALIVE = 0,
@@ -72,6 +73,13 @@ enum swim_member_status {
 
 extern const char *swim_member_status_strs[];
 
+#endif /* TARANTOOL_SWIM_PUBLIC_PROTO_H_INCLUDED */
+
+#ifdef SWIM_PUBLIC_API
+#undef SWIM_PUBLIC_API
+#elif !defined(TARANTOOL_SWIM_PRIVATE_PROTO_H_INCLUDED)
+#define TARANTOOL_SWIM_PRIVATE_PROTO_H_INCLUDED
+
 /**
  * SWIM member attributes from anti-entropy and dissemination
  * messages.
@@ -317,4 +325,4 @@ int
 swim_decode_uuid(struct tt_uuid *uuid, const char **pos, const char *end,
 		 const char *prefix, const char *param_name);
 
-#endif /* TARANTOOL_SWIM_PROTO_H_INCLUDED */
+#endif /* TARANTOOL_SWIM_PRIVATE_PROTO_H_INCLUDED */
diff --git a/test/unit/swim.c b/test/unit/swim.c
index 2c04e25b9..ea60be4ae 100644
--- a/test/unit/swim.c
+++ b/test/unit/swim.c
@@ -50,7 +50,7 @@ static int test_result;
 static void
 swim_test_one_link(void)
 {
-	swim_start_test(2);
+	swim_start_test(6);
 	/*
 	 * Run a simple cluster of two elements. One of them
 	 * learns about another explicitly. Another should add the
@@ -61,6 +61,15 @@ swim_test_one_link(void)
 	is(swim_cluster_wait_fullmesh(cluster, 0.9), -1,
 	   "no rounds - no fullmesh");
 	is(swim_cluster_wait_fullmesh(cluster, 0.1), 0, "one link");
+
+	is(swim_cluster_member_status(cluster, 0, 0), MEMBER_ALIVE,
+	   "self 0 is alive");
+	is(swim_cluster_member_status(cluster, 1, 1), MEMBER_ALIVE,
+	   "self 1 is alive");
+	is(swim_cluster_member_status(cluster, 0, 1), MEMBER_ALIVE,
+	   "0 sees 1 as alive");
+	is(swim_cluster_member_status(cluster, 1, 0), MEMBER_ALIVE,
+	   "1 sees 0 as alive");
 	swim_cluster_delete(cluster);
 
 	swim_finish_test();
diff --git a/test/unit/swim.result b/test/unit/swim.result
index b58325b73..42cef1612 100644
--- a/test/unit/swim.result
+++ b/test/unit/swim.result
@@ -1,9 +1,13 @@
 	*** main_f ***
 1..5
 	*** swim_test_one_link ***
-    1..2
+    1..6
     ok 1 - no rounds - no fullmesh
     ok 2 - one link
+    ok 3 - self 0 is alive
+    ok 4 - self 1 is alive
+    ok 5 - 0 sees 1 as alive
+    ok 6 - 1 sees 0 as alive
 ok 1 - subtests
 	*** swim_test_one_link: done ***
 	*** swim_test_sequence ***
diff --git a/test/unit/swim_test_utils.c b/test/unit/swim_test_utils.c
index ee24b0320..0d62bb26c 100644
--- a/test/unit/swim_test_utils.c
+++ b/test/unit/swim_test_utils.c
@@ -31,7 +31,6 @@
 #include "swim_test_utils.h"
 #include "swim_test_ev.h"
 #include "swim_test_transport.h"
-#include "swim/swim.h"
 #include "swim/swim_ev.h"
 #include "uuid/tt_uuid.h"
 #include "trivia/util.h"
@@ -87,6 +86,27 @@ swim_cluster_add_link(struct swim_cluster *cluster, int to_id, int from_id)
 			       swim_member_uuid(from));
 }
 
+static const struct swim_member *
+swim_cluster_member_view(struct swim_cluster *cluster, int node_id,
+			 int member_id)
+{
+	struct swim *node = cluster->node[node_id];
+	const struct swim_member *member = swim_self(cluster->node[member_id]);
+	const struct tt_uuid *member_uuid = swim_member_uuid(member);
+	return swim_member_by_uuid(node, member_uuid);
+}
+
+enum swim_member_status
+swim_cluster_member_status(struct swim_cluster *cluster, int node_id,
+			   int member_id)
+{
+	const struct swim_member *m =
+		swim_cluster_member_view(cluster, node_id, member_id);
+	if (m == NULL)
+		return swim_member_status_MAX;
+	return swim_member_status(m);
+}
+
 struct swim *
 swim_cluster_node(struct swim_cluster *cluster, int i)
 {
diff --git a/test/unit/swim_test_utils.h b/test/unit/swim_test_utils.h
index 56fc2f57d..befb95420 100644
--- a/test/unit/swim_test_utils.h
+++ b/test/unit/swim_test_utils.h
@@ -31,9 +31,9 @@
  * SUCH DAMAGE.
  */
 #include <stdbool.h>
+#include "swim/swim.h"
 
 struct swim_cluster;
-struct swim;
 
 /**
  * Create a new cluster of SWIM instances. Instances are assigned
@@ -71,6 +71,10 @@ swim_cluster_unblock_io(struct swim_cluster *cluster, int i);
 int
 swim_cluster_add_link(struct swim_cluster *cluster, int to_id, int from_id);
 
+enum swim_member_status
+swim_cluster_member_status(struct swim_cluster *cluster, int node_id,
+			   int member_id);
+
 /**
  * Check if in the cluster every instance knowns the about other
  * instances.
-- 
2.17.2 (Apple Git-113)





More information about the Tarantool-patches mailing list