135 lines
5.0 KiB
Diff
135 lines
5.0 KiB
Diff
|
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||
|
Date: Wed, 21 Aug 2019 16:14:27 +0100
|
||
|
Subject: [PATCH] tests: make filemonitor test more robust to event ordering
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
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.
|
||
|
|
||
|
Tested-by: Peter Xu <peterx@redhat.com>
|
||
|
Tested-by: Wei Yang <richardw.yang@linux.intel.com>
|
||
|
Tested-by: Cornelia Huck <cohuck@redhat.com>
|
||
|
Reviewed-by: Thomas Huth <thuth@redhat.com>
|
||
|
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||
|
(cherry picked from commit bf9e0313c27d8e6ecd7f7de3d63e1cb25d8f6311)
|
||
|
---
|
||
|
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:
|