[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] tests: make filemonitor test more robust to eve
From: |
Wei Yang |
Subject: |
Re: [Qemu-devel] [PATCH] tests: make filemonitor test more robust to event ordering |
Date: |
Thu, 22 Aug 2019 08:35:47 +0800 |
User-agent: |
Mutt/1.9.4 (2018-02-28) |
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é <address@hidden>
Tested-by: Wei Yang <address@hidden>
>---
> 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