Skip to content

Commit

Permalink
tools/xenstored: liveupdate: Properly check long transaction
Browse files Browse the repository at this point in the history
As XenStored is single-threaded, conn->ta_start_time will always be
smaller than now. As we substract the latter from the former, it means
a transaction will never be considered long running.

Invert the two operands of the substraction in both lu_reject_reason()
and lu_check_allowed(). In addition to that, the former also needs to
check that conn->ta_start_time is not 0 (i.e the transaction is not
active).

Take the opportunity to document the return condition of
lu_check_allowed().

Fixes: e04e53a ("tools/xenstore: allow live update only with no transaction active")
Reported-by: Bjoern Doebel <doebel@amazon.de>
Signed-off-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Release-Acked-by: Ian Jackson <iwj@xenproject.org>
  • Loading branch information
Julien Grall committed Mar 4, 2021
1 parent 243036d commit 5d16679
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions tools/xenstore/xenstored_control.c
Original file line number Diff line number Diff line change
Expand Up @@ -459,11 +459,18 @@ static bool lu_check_lu_allowed(void)
list_for_each_entry(conn, &connections, list) {
if (conn->ta_start_time) {
ta_total++;
if (conn->ta_start_time - now >= lu_status->timeout)
if (now - conn->ta_start_time >= lu_status->timeout)
ta_long++;
}
}

/*
* Allow LiveUpdate if one of the following conditions is met:
* - There is no active transactions
* - All transactions are long running (e.g. they have been
* active for more than lu_status->timeout sec) and the admin as
* requested to force the operation.
*/
return ta_total ? (lu_status->force && ta_long == ta_total) : true;
}

Expand All @@ -474,11 +481,12 @@ static const char *lu_reject_reason(const void *ctx)
time_t now = time(NULL);

list_for_each_entry(conn, &connections, list) {
if (conn->ta_start_time - now >= lu_status->timeout) {
if (conn->ta_start_time &&
(now - conn->ta_start_time >= lu_status->timeout)) {
ret = talloc_asprintf(ctx, "%s\nDomain %u: %ld s",
ret ? : "Domains with long running transactions:",
conn->id,
conn->ta_start_time - now);
now - conn->ta_start_time);
}
}

Expand Down

0 comments on commit 5d16679

Please sign in to comment.