From: Wei Yang <richardw.yang@linux.intel.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>
Cc: qemu-devel@nongnu.org, Peter Xu <peterx@redhat.com>,
Wei Yang <richardw.yang@linux.intel.com>
Subject: Re: [Qemu-devel] [PATCH] tests: make filemonitor test more robust to event ordering
Date: Thu, 22 Aug 2019 08:35:47 +0800 [thread overview]
Message-ID: <20190822003547.GA11547@richard> (raw)
In-Reply-To: <20190821155327.25208-1-berrange@redhat.com>
On Wed, Aug 21, 2019 at 04:53:27PM +0100, Daniel P. Berrangé wrote:
>The ordering of events that are emitted during the rmdir
>test have changed with kernel >= 5.3. Semantically both
>new & old orderings are correct, so we must be able to
>cope with either.
>
>To cope with this, when we see an unexpected event, we
>push it back onto the queue and look and the subsequent
>event to see if that matches instead.
>
>Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Tested-by: Wei Yang <richardw.yang@linux.intel.com>
>---
> tests/test-util-filemonitor.c | 43 +++++++++++++++++++++++++++--------
> 1 file changed, 34 insertions(+), 9 deletions(-)
>
>diff --git a/tests/test-util-filemonitor.c b/tests/test-util-filemonitor.c
>index 46e781c022..301cd2db61 100644
>--- a/tests/test-util-filemonitor.c
>+++ b/tests/test-util-filemonitor.c
>@@ -45,6 +45,11 @@ typedef struct {
> const char *filedst;
> int64_t *watchid;
> int eventid;
>+ /*
>+ * Only valid with OP_EVENT - this event might be
>+ * swapped with the next OP_EVENT
>+ */
>+ bool swapnext;
> } QFileMonitorTestOp;
>
> typedef struct {
>@@ -98,6 +103,10 @@ qemu_file_monitor_test_handler(int64_t id,
> QFileMonitorTestData *data = opaque;
> QFileMonitorTestRecord *rec = g_new0(QFileMonitorTestRecord, 1);
>
>+ if (debug) {
>+ g_printerr("Queue event id %" PRIx64 " event %d file %s\n",
>+ id, event, filename);
>+ }
> rec->id = id;
> rec->event = event;
> rec->filename = g_strdup(filename);
>@@ -125,7 +134,8 @@ qemu_file_monitor_test_record_free(QFileMonitorTestRecord *rec)
> * to wait for the event to be queued for us.
> */
> static QFileMonitorTestRecord *
>-qemu_file_monitor_test_next_record(QFileMonitorTestData *data)
>+qemu_file_monitor_test_next_record(QFileMonitorTestData *data,
>+ QFileMonitorTestRecord *pushback)
> {
> GTimer *timer = g_timer_new();
> QFileMonitorTestRecord *record = NULL;
>@@ -139,9 +149,15 @@ qemu_file_monitor_test_next_record(QFileMonitorTestData *data)
> }
> if (data->records) {
> record = data->records->data;
>- tmp = data->records;
>- data->records = g_list_remove_link(data->records, tmp);
>- g_list_free(tmp);
>+ if (pushback) {
>+ data->records->data = pushback;
>+ } else {
>+ tmp = data->records;
>+ data->records = g_list_remove_link(data->records, tmp);
>+ g_list_free(tmp);
>+ }
>+ } else if (pushback) {
>+ qemu_file_monitor_test_record_free(pushback);
> }
> qemu_mutex_unlock(&data->lock);
>
>@@ -158,13 +174,15 @@ static bool
> qemu_file_monitor_test_expect(QFileMonitorTestData *data,
> int64_t id,
> QFileMonitorEvent event,
>- const char *filename)
>+ const char *filename,
>+ bool swapnext)
> {
> QFileMonitorTestRecord *rec;
> bool ret = false;
>
>- rec = qemu_file_monitor_test_next_record(data);
>+ rec = qemu_file_monitor_test_next_record(data, NULL);
>
>+ retry:
> if (!rec) {
> g_printerr("Missing event watch id %" PRIx64 " event %d file %s\n",
> id, event, filename);
>@@ -172,6 +190,11 @@ qemu_file_monitor_test_expect(QFileMonitorTestData *data,
> }
>
> if (id != rec->id) {
>+ if (swapnext) {
>+ rec = qemu_file_monitor_test_next_record(data, rec);
>+ swapnext = false;
>+ goto retry;
>+ }
> g_printerr("Expected watch id %" PRIx64 " but got %" PRIx64 "\n",
> id, rec->id);
> goto cleanup;
>@@ -347,7 +370,8 @@ test_file_monitor_events(void)
> .filesrc = "fish", },
> { .type = QFILE_MONITOR_TEST_OP_EVENT,
> .filesrc = "", .watchid = &watch4,
>- .eventid = QFILE_MONITOR_EVENT_IGNORED },
>+ .eventid = QFILE_MONITOR_EVENT_IGNORED,
>+ .swapnext = true },
> { .type = QFILE_MONITOR_TEST_OP_EVENT,
> .filesrc = "fish", .watchid = &watch0,
> .eventid = QFILE_MONITOR_EVENT_DELETED },
>@@ -493,8 +517,9 @@ test_file_monitor_events(void)
> g_printerr("Event id=%" PRIx64 " event=%d file=%s\n",
> *op->watchid, op->eventid, op->filesrc);
> }
>- if (!qemu_file_monitor_test_expect(
>- &data, *op->watchid, op->eventid, op->filesrc))
>+ if (!qemu_file_monitor_test_expect(&data, *op->watchid,
>+ op->eventid, op->filesrc,
>+ op->swapnext))
> goto cleanup;
> break;
> case QFILE_MONITOR_TEST_OP_CREATE:
>--
>2.21.0
--
Wei Yang
Help you, Help me
next prev parent reply other threads:[~2019-08-22 0:36 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-21 15:53 [Qemu-devel] [PATCH] tests: make filemonitor test more robust to event ordering Daniel P. Berrangé
2019-08-22 0:35 ` Wei Yang [this message]
2019-08-22 3:37 ` Peter Xu
2019-08-22 16:21 ` Cornelia Huck
2019-09-04 10:10 ` Thomas Huth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190822003547.GA11547@richard \
--to=richardw.yang@linux.intel.com \
--cc=berrange@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).