mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
tools/xenstored: Dump delayed requests
Currently, only Live-Update request can be delayed. In a follow-up, we will want to delay more requests (e.g. transaction start). Therefore we want to preserve delayed requests across Live-Update. Delayed requests are just complete "in" buffer. So the code is refactored to allow sharing the code to dump "in" buffer. 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:
1 parent
76a0aa9c4d
commit
54f73e6fc6
1 file changed
+37
-10
@@ -2403,25 +2403,52 @@ const char *dump_state_global(FILE *fp)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *dump_input_buffered_data(FILE *fp,
|
||||
const struct buffered_data *in,
|
||||
unsigned int *total_len)
|
||||
{
|
||||
unsigned int hlen = in->inhdr ? in->used : sizeof(in->hdr);
|
||||
|
||||
*total_len += hlen;
|
||||
if (fp && fwrite(&in->hdr, hlen, 1, fp) != 1)
|
||||
return "Dump read data error";
|
||||
if (!in->inhdr && in->used) {
|
||||
*total_len += in->used;
|
||||
if (fp && fwrite(in->buffer, in->used, 1, fp) != 1)
|
||||
return "Dump read data error";
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Called twice: first with fp == NULL to get length, then for writing data. */
|
||||
const char *dump_state_buffered_data(FILE *fp, const struct connection *c,
|
||||
struct xs_state_connection *sc)
|
||||
{
|
||||
unsigned int len = 0, used;
|
||||
struct buffered_data *out, *in = c->in;
|
||||
struct buffered_data *out;
|
||||
bool partial = true;
|
||||
struct delayed_request *req;
|
||||
const char *ret;
|
||||
|
||||
if (in) {
|
||||
len = in->inhdr ? in->used : sizeof(in->hdr);
|
||||
if (fp && fwrite(&in->hdr, len, 1, fp) != 1)
|
||||
return "Dump read data error";
|
||||
if (!in->inhdr && in->used) {
|
||||
len += in->used;
|
||||
if (fp && fwrite(in->buffer, in->used, 1, fp) != 1)
|
||||
return "Dump read data error";
|
||||
}
|
||||
/* Dump any command that was delayed */
|
||||
list_for_each_entry(req, &c->delayed, list) {
|
||||
/*
|
||||
* We only want to preserve commands that weren't processed at
|
||||
* all. All the other delayed requests (such as do_lu_start())
|
||||
* must be processed before Live-Update.
|
||||
*/
|
||||
if (req->func != process_delayed_message)
|
||||
continue;
|
||||
|
||||
assert(!req->in->inhdr);
|
||||
if ((ret = dump_input_buffered_data(fp, req->in, &len)))
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (c->in && (ret = dump_input_buffered_data(fp, c->in, &len)))
|
||||
return ret;
|
||||
|
||||
if (sc) {
|
||||
sc->data_in_len = len;
|
||||
sc->data_resp_len = 0;
|
||||
|
||||