[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