[lttng-dev] [lttng-tools PATCH] Fix: Relayd and sessiond version check

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Mon Dec 10 12:59:05 EST 2012


* David Goulet (dgoulet at efficios.com) wrote:
> Now only checks for the major version to be equal. After 2.1 stable
> release, both components will adapt to the lowest minor version for the
> same major version. For this, the session daemon now send it's version

it's -> its

> values to the relayd so slight change in the protocol here.
> 

Please state that those are "made up" version numbers.

> For instance, a relayd 2.4 talking to a sessiond 2.8, the communication
> and available feature will only be those of 2.4 version.
> 
> For a relayd let say 3.2 and a sessiond 2.2, the communication stops
> right there since both major version differs.
> 
> Signed-off-by: David Goulet <dgoulet at efficios.com>
> ---
>  src/bin/lttng-relayd/main.c |   17 ++++++++++++++-
>  src/common/relayd/relayd.c  |   51 +++++++++++++++++++++++++++++--------------
>  2 files changed, 51 insertions(+), 17 deletions(-)
> 
> diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c
> index a00fb3c..bd19a32 100644
> --- a/src/bin/lttng-relayd/main.c
> +++ b/src/bin/lttng-relayd/main.c
> @@ -1281,7 +1281,7 @@ int relay_send_version(struct lttcomm_relayd_hdr *recv_hdr,
>  		struct relay_command *cmd)
>  {
>  	int ret;
> -	struct lttcomm_relayd_version reply;
> +	struct lttcomm_relayd_version reply, msg;
>  	struct relay_session *session;
>  
>  	if (cmd->session == NULL) {
> @@ -1299,6 +1299,21 @@ int relay_send_version(struct lttcomm_relayd_hdr *recv_hdr,
>  	}
>  	session->version_check_done = 1;
>  
> +	/* Get version from the other side. */
> +	ret = cmd->sock->ops->recvmsg(cmd->sock, &msg, sizeof(msg), MSG_WAITALL);
> +	if (ret < 0 || ret != sizeof(msg)) {
> +		ret = -1;
> +		ERR("Relay failed to receive the version values.");
> +		goto end;
> +	}
> +
> +	/*
> +	 * For now, we just ignore the received version but after 2.1 stable
> +	 * release, a check must be done to see if we either adapt to the other
> +	 * side version (which MUST be lower than us) or keep the latest data
> +	 * structure considering that the other side will adapt.
> +	 */
> +
>  	ret = sscanf(VERSION, "%u.%u", &reply.major, &reply.minor);
>  	if (ret < 2) {
>  		ERR("Error in scanning version");
> diff --git a/src/common/relayd/relayd.c b/src/common/relayd/relayd.c
> index daaf44e..5adb977 100644
> --- a/src/common/relayd/relayd.c
> +++ b/src/common/relayd/relayd.c
> @@ -163,42 +163,61 @@ int relayd_version_check(struct lttcomm_sock *sock, uint32_t major,
>  		uint32_t minor)
>  {
>  	int ret;
> -	struct lttcomm_relayd_version reply;
> +	struct lttcomm_relayd_version msg;
>  
>  	/* Code flow error. Safety net. */
>  	assert(sock);
>  
>  	DBG("Relayd version check for major.minor %u.%u", major, minor);
>  
> +	/* Prepare network byte order before transmission. */
> +	msg.major = htobe32(major);
> +	msg.minor = htobe32(minor);
> +
>  	/* Send command */
> -	ret = send_command(sock, RELAYD_VERSION, NULL, 0, 0);
> +	ret = send_command(sock, RELAYD_VERSION, (void *) &msg, sizeof(msg), 0);
>  	if (ret < 0) {
>  		goto error;
>  	}
>  
>  	/* Recevie response */
> -	ret = recv_reply(sock, (void *) &reply, sizeof(reply));
> +	ret = recv_reply(sock, (void *) &msg, sizeof(msg));
>  	if (ret < 0) {
>  		goto error;
>  	}
>  
>  	/* Set back to host bytes order */
> -	reply.major = be32toh(reply.major);
> -	reply.minor = be32toh(reply.minor);
> -
> -	/* Validate version */
> -	if (reply.major <= major) {
> -		if (reply.minor <= minor) {
> -			/* Compatible */
> -			ret = 0;
> -			DBG2("Relayd version is compatible");
> -			goto error;
> -		}
> +	msg.major = be32toh(msg.major);
> +	msg.minor = be32toh(msg.minor);
> +
> +	/*
> +	 * Only validate the major version. If the other side is higher,

higher -> different ?

> +	 * communication is not possible. Only major version equal can talk to each
> +	 * other. If the minor version differs, the lowest version is used by both
> +	 * sides.
> +	 *
> +	 * For now, before 2.1.0 stable release, we don't have to check the minor
> +	 * because this new mechanism with the relayd will only be available with
> +	 * 2.1 and NOT 2.0.x.
> +	 */
> +	if (msg.major == major) {
> +		/* Compatible */
> +		ret = 0;
> +		DBG2("Relayd version is compatible");
> +		goto error;

ret = 0   goto error.... weird ?

You might want to inverse the code flow here: it might be more
straightforward to think about "incompatible" things to check (errors)
rather than a whitelist of "ok" criterions. So I would recommend that
the checks be e.g. "if (msg.major != major) {" and as soon as one check
fail, we goto error. And leave the complete code flow reach "OK".

>  	}
>  
> +	/*
> +	 * After 2.1.0 release, for the 2.2 release, at this point will have to
> +	 * check the minor version in order for the session daemon to know which
> +	 * structure to use to communicate with the relayd. If the relayd's minor
> +	 * version is higher, it will adapt to our version so we can continue to
> +	 * use the latest relayd communication data structure.
> +	 */
> +
>  	/* Version number not compatible */
> -	DBG2("Relayd version is NOT compatible %u.%u > %u.%u", reply.major,
> -			reply.minor, major, minor);
> +	DBG2("Relayd version is NOT compatible %u.%u > %u.%u", msg.major,

 > -> !=


> +			msg.minor, major, minor);
>  	ret = -1;
>  
>  error:

Thanks,

Mathieu

> -- 
> 1.7.10.4
> 
> 
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list