[tarantool-patches] [PATCH v2 06/10] session: introduce session vtab and meta

Konstantin Osipov kostja at tarantool.org
Thu May 10 22:20:12 MSK 2018


* Vladislav Shpilevoy <v.shpilevoy at tarantool.org> [18/04/20 16:25]:
> +int
> +iproto_session_fd(struct session *session)
> +{
> +	struct iproto_connection *conn =
> +		(struct iproto_connection *) session->meta.conn;
> +	return conn->output.fd;
> +}

Nitpick: I would not abbreviate connection when in a member, and
use 'con' as in other places for name of the variable declared on
the stack.

> +/**
> + * Push a message using a protocol, depending on a session type.
> + * @param data Data to push, first argument on a stack.
> + * @retval true Success.
> + * @retval nil, error Error occured.
> + */
> +static int
> +lbox_session_push(struct lua_State *L)
> +{
> +	if (lua_gettop(L) != 1)
> +		return luaL_error(L, "Usage: box.session.push(data)");
> +
> +	if (session_push(current_session(), NULL) != 0) {
> +		lua_pushnil(L);
> +		luaT_pusherror(L, box_error_last());
> +		return 2;
> +	} else {
> +		lua_pushboolean(L, true);
> +		return 1;
> +	}
> +}

I'm not sure we the calling convention should differ from the rest
of box API, i.e. we should return nil, error rather than
exceptions. Could you run a poll in the community chat?

> +
>  /**
>   * Sets trigger on_access_denied.
>   * For test purposes only.
> @@ -429,6 +451,7 @@ box_lua_session_init(struct lua_State *L)
>  		{"on_disconnect", lbox_session_on_disconnect},
>  		{"on_auth", lbox_session_on_auth},
>  		{"on_access_denied", lbox_session_on_access_denied},
> +		{"push", lbox_session_push},
>  		{NULL, NULL}
>  	};
>  	luaL_register_module(L, sessionlib_name, sessionlib);
> diff --git a/src/box/session.cc b/src/box/session.cc
> index 3d787bd51..4a1397c24 100644
> --- a/src/box/session.cc
> +++ b/src/box/session.cc
> @@ -45,6 +45,20 @@ const char *session_type_strs[] = {
>  	"unknown",
>  };
>  
> +static struct session_vtab generic_session_vtab = {
> +	/* .push = */ generic_session_push,
> +	/* .fd = */ generic_session_fd,
> +	/* .sync = */ generic_session_sync,
> +};
> +
> +struct session_vtab session_vtab_registry[] = {
> +	/* BACKGROUND */ generic_session_vtab,
> +	/* BINARY */ generic_session_vtab,
> +	/* CONSOLE */ generic_session_vtab,
> +	/* REPL */ generic_session_vtab,
> +	/* APPLIER */ generic_session_vtab,
> +};
> +
>  static struct mh_i64ptr_t *session_registry;
>  
>  struct mempool session_pool;
> @@ -79,7 +93,7 @@ session_on_stop(struct trigger *trigger, void * /* event */)
>  }
>  
>  struct session *
> -session_create(int fd, enum session_type type)
> +session_create(enum session_type type)
>  {
>  	struct session *session =
>  		(struct session *) mempool_alloc(&session_pool);
> @@ -89,8 +103,7 @@ session_create(int fd, enum session_type type)
>  		return NULL;
>  	}
>  	session->id = sid_max();
> -	session->fd =  fd;
> -	session->sync = 0;
> +	memset(&session->meta, 0, sizeof(session->meta));
>  	session->type = type;
>  	/* For on_connect triggers. */
>  	credentials_init(&session->credentials, guest_user->auth_token,
> @@ -110,12 +123,12 @@ session_create(int fd, enum session_type type)
>  }
>  
>  struct session *
> -session_create_on_demand(int fd)
> +session_create_on_demand()
>  {
>  	assert(fiber_get_session(fiber()) == NULL);
>  
>  	/* Create session on demand */
> -	struct session *s = session_create(fd, SESSION_TYPE_BACKGROUND);
> +	struct session *s = session_create(SESSION_TYPE_BACKGROUND);
>  	if (s == NULL)
>  		return NULL;
>  	s->fiber_on_stop = {
> @@ -278,3 +291,27 @@ access_check_universe(user_access_t access)
>  	}
>  	return 0;
>  }
> +
> +int
> +generic_session_push(struct session *session, struct port *port)
> +{
> +	(void) port;
> +	const char *name =
> +		tt_sprintf("Session '%s'", session_type_strs[session->type]);
> +	diag_set(ClientError, ER_UNSUPPORTED, name, "push()");
> +	return -1;
> +}
> +
> +int
> +generic_session_fd(struct session *session)
> +{
> +	(void) session;
> +	return -1;
> +}
> +
> +int64_t
> +generic_session_sync(struct session *session)
> +{
> +	(void) session;
> +	return 0;
> +}
> diff --git a/src/box/session.h b/src/box/session.h
> index c387e6f95..e583c8c6b 100644
> --- a/src/box/session.h
> +++ b/src/box/session.h
> @@ -41,6 +41,9 @@
>  extern "C" {
>  #endif /* defined(__cplusplus) */
>  
> +struct port;
> +struct session_vtab;
> +
>  void
>  session_init();
>  
> @@ -58,6 +61,23 @@ enum session_type {
>  
>  extern const char *session_type_strs[];
>  
> +/**
> + * Session meta is used in different ways by sessions of different
> + * types, and allows to do not store attributes in struct session,
> + * that are used only by a session of particular type.
> + */
> +struct session_meta {
> +	union {
> +		/** IProto connection meta. */
> +		struct {
> +			uint64_t sync;
> +			void *conn;
> +		};
> +		/** Only by console is used. */
> +		int fd;
> +	};
> +};
> +
>  /**

Otherwise the patch LGTM.

-- 
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.io - www.twitter.com/kostja_osipov



More information about the Tarantool-patches mailing list