[PATCH 3/4] session: introduce 'dead' type

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Fri Dec 7 18:46:34 MSK 2018


If an iproto connection is closed, there are no way
how to determine if this happened. Except setting an
on_disconnect trigger which sets a global flag or
something.

To deal with such orphan requests a new session type
is introduced that can be checked inside a request.

Needed for #3859
---
 src/box/session.cc |  2 ++
 src/box/session.h  | 14 ++++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/src/box/session.cc b/src/box/session.cc
index f868e9ecc..b8e20609b 100644
--- a/src/box/session.cc
+++ b/src/box/session.cc
@@ -42,6 +42,7 @@ const char *session_type_strs[] = {
 	"console",
 	"repl",
 	"applier",
+	"dead",
 	"unknown",
 };
 
@@ -57,6 +58,7 @@ struct session_vtab session_vtab_registry[] = {
 	/* CONSOLE */ generic_session_vtab,
 	/* REPL */ generic_session_vtab,
 	/* APPLIER */ generic_session_vtab,
+	/* DEAD */ generic_session_vtab,
 };
 
 static struct mh_i64ptr_t *session_registry;
diff --git a/src/box/session.h b/src/box/session.h
index 6ed97dc46..d998d06a0 100644
--- a/src/box/session.h
+++ b/src/box/session.h
@@ -56,6 +56,7 @@ enum session_type {
 	SESSION_TYPE_CONSOLE,
 	SESSION_TYPE_REPL,
 	SESSION_TYPE_APPLIER,
+	SESSION_TYPE_DEAD,
 	session_type_MAX,
 };
 
@@ -306,6 +307,19 @@ session_sync(struct session *session)
 	return session_vtab_registry[session->type].sync(session);
 }
 
+/**
+ * Make a session invalid. Its type is changed to 'dead' that
+ * automatically changes its vtab to a generic implementation,
+ * returning errors on everything. Mostly it is used to be able
+ * to determine if an iproto connection is closed inside a running
+ * request.
+ */
+static inline void
+session_kill(struct session *session)
+{
+	session->type = SESSION_TYPE_DEAD;
+}
+
 /**
  * In a common case, a session does not support push. This
  * function always returns -1 and sets ER_UNSUPPORTED error.
-- 
2.17.2 (Apple Git-113)




More information about the Tarantool-patches mailing list