tools/xenstored: Limit the number of requests a connection can delay

Currently, only liveupdate request can be delayed. The request can only
be performed by a privileged connection (e.g. dom0). So it is fine to
have no limits.

In a follow-up patch we will want to delay request for unprivileged
connection as well. So it is best to apply a limit.

For now and for simplicity, only a single request can be delayed
for a given unprivileged connection.

Take the opportunity to tweak the prototype and provide a way to
bypass the quota check. This would be useful when the function
is called from the restore code.

Signed-off-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Luca Fancellu <luca.fancellu@arm.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
Julien Grall committed 2021-06-24 09:07:30 +01:00
1 parent 65f19ed62a
commit 2aa9e00bd3
3 files changed
+13 -3

No files matched your search

+1 -1
View File
@@ -737,7 +737,7 @@ static const char *lu_start(const void *ctx, struct connection *conn,
lu_status->timeout = to;
lu_status->started_at = time(NULL);
errno = delay_request(conn, conn->in, do_lu_start, NULL);
errno = delay_request(conn, conn->in, do_lu_start, NULL, false);
return NULL;
}
+10 -1
View File
@@ -279,10 +279,19 @@ static void call_delayed(struct delayed_request *req)
}
int delay_request(struct connection *conn, struct buffered_data *in,
bool (*func)(struct delayed_request *), void *data)
bool (*func)(struct delayed_request *), void *data,
bool no_quota_check)
{
struct delayed_request *req;
/*
* Only allow one request can be delayed for an unprivileged
* connection.
*/
if (!no_quota_check && domain_is_unprivileged(conn) &&
!list_empty(&conn->delayed))
return ENOSPC;
req = talloc(in, struct delayed_request);
if (!req)
return ENOMEM;
+2 -1
View File
@@ -213,7 +213,8 @@ char *get_parent(const void *ctx, const char *node);
/* Delay a request. */
int delay_request(struct connection *conn, struct buffered_data *in,
bool (*func)(struct delayed_request *), void *data);
bool (*func)(struct delayed_request *), void *data,
bool no_quota_check);
/* Tracing infrastructure. */
void trace_create(const void *data, const char *type);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.