|
|
964eff |
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
|
|
964eff |
Date: Wed, 21 Aug 2019 16:14:27 +0100
|
|
|
964eff |
Subject: [PATCH] tests: make filemonitor test more robust to event ordering
|
|
|
964eff |
MIME-Version: 1.0
|
|
|
964eff |
Content-Type: text/plain; charset=UTF-8
|
|
|
964eff |
Content-Transfer-Encoding: 8bit
|
|
|
964eff |
|
|
|
964eff |
The ordering of events that are emitted during the rmdir
|
|
|
964eff |
test have changed with kernel >= 5.3. Semantically both
|
|
|
964eff |
new & old orderings are correct, so we must be able to
|
|
|
964eff |
cope with either.
|
|
|
964eff |
|
|
|
964eff |
To cope with this, when we see an unexpected event, we
|
|
|
964eff |
push it back onto the queue and look and the subsequent
|
|
|
964eff |
event to see if that matches instead.
|
|
|
964eff |
|
|
|
964eff |
Tested-by: Peter Xu <peterx@redhat.com>
|
|
|
964eff |
Tested-by: Wei Yang <richardw.yang@linux.intel.com>
|
|
|
964eff |
Tested-by: Cornelia Huck <cohuck@redhat.com>
|
|
|
964eff |
Reviewed-by: Thomas Huth <thuth@redhat.com>
|
|
|
964eff |
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
|
964eff |
(cherry picked from commit bf9e0313c27d8e6ecd7f7de3d63e1cb25d8f6311)
|
|
|
964eff |
---
|
|
|
964eff |
tests/test-util-filemonitor.c | 43 +++++++++++++++++++++++++++--------
|
|
|
964eff |
1 file changed, 34 insertions(+), 9 deletions(-)
|
|
|
964eff |
|
|
|
964eff |
diff --git a/tests/test-util-filemonitor.c b/tests/test-util-filemonitor.c
|
|
|
964eff |
index 46e781c022..301cd2db61 100644
|
|
|
964eff |
--- a/tests/test-util-filemonitor.c
|
|
|
964eff |
+++ b/tests/test-util-filemonitor.c
|
|
|
964eff |
@@ -45,6 +45,11 @@ typedef struct {
|
|
|
964eff |
const char *filedst;
|
|
|
964eff |
int64_t *watchid;
|
|
|
964eff |
int eventid;
|
|
|
964eff |
+ /*
|
|
|
964eff |
+ * Only valid with OP_EVENT - this event might be
|
|
|
964eff |
+ * swapped with the next OP_EVENT
|
|
|
964eff |
+ */
|
|
|
964eff |
+ bool swapnext;
|
|
|
964eff |
} QFileMonitorTestOp;
|
|
|
964eff |
|
|
|
964eff |
typedef struct {
|
|
|
964eff |
@@ -98,6 +103,10 @@ qemu_file_monitor_test_handler(int64_t id,
|
|
|
964eff |
QFileMonitorTestData *data = opaque;
|
|
|
964eff |
QFileMonitorTestRecord *rec = g_new0(QFileMonitorTestRecord, 1);
|
|
|
964eff |
|
|
|
964eff |
+ if (debug) {
|
|
|
964eff |
+ g_printerr("Queue event id %" PRIx64 " event %d file %s\n",
|
|
|
964eff |
+ id, event, filename);
|
|
|
964eff |
+ }
|
|
|
964eff |
rec->id = id;
|
|
|
964eff |
rec->event = event;
|
|
|
964eff |
rec->filename = g_strdup(filename);
|
|
|
964eff |
@@ -125,7 +134,8 @@ qemu_file_monitor_test_record_free(QFileMonitorTestRecord *rec)
|
|
|
964eff |
* to wait for the event to be queued for us.
|
|
|
964eff |
*/
|
|
|
964eff |
static QFileMonitorTestRecord *
|
|
|
964eff |
-qemu_file_monitor_test_next_record(QFileMonitorTestData *data)
|
|
|
964eff |
+qemu_file_monitor_test_next_record(QFileMonitorTestData *data,
|
|
|
964eff |
+ QFileMonitorTestRecord *pushback)
|
|
|
964eff |
{
|
|
|
964eff |
GTimer *timer = g_timer_new();
|
|
|
964eff |
QFileMonitorTestRecord *record = NULL;
|
|
|
964eff |
@@ -139,9 +149,15 @@ qemu_file_monitor_test_next_record(QFileMonitorTestData *data)
|
|
|
964eff |
}
|
|
|
964eff |
if (data->records) {
|
|
|
964eff |
record = data->records->data;
|
|
|
964eff |
- tmp = data->records;
|
|
|
964eff |
- data->records = g_list_remove_link(data->records, tmp);
|
|
|
964eff |
- g_list_free(tmp);
|
|
|
964eff |
+ if (pushback) {
|
|
|
964eff |
+ data->records->data = pushback;
|
|
|
964eff |
+ } else {
|
|
|
964eff |
+ tmp = data->records;
|
|
|
964eff |
+ data->records = g_list_remove_link(data->records, tmp);
|
|
|
964eff |
+ g_list_free(tmp);
|
|
|
964eff |
+ }
|
|
|
964eff |
+ } else if (pushback) {
|
|
|
964eff |
+ qemu_file_monitor_test_record_free(pushback);
|
|
|
964eff |
}
|
|
|
964eff |
qemu_mutex_unlock(&data->lock);
|
|
|
964eff |
|
|
|
964eff |
@@ -158,13 +174,15 @@ static bool
|
|
|
964eff |
qemu_file_monitor_test_expect(QFileMonitorTestData *data,
|
|
|
964eff |
int64_t id,
|
|
|
964eff |
QFileMonitorEvent event,
|
|
|
964eff |
- const char *filename)
|
|
|
964eff |
+ const char *filename,
|
|
|
964eff |
+ bool swapnext)
|
|
|
964eff |
{
|
|
|
964eff |
QFileMonitorTestRecord *rec;
|
|
|
964eff |
bool ret = false;
|
|
|
964eff |
|
|
|
964eff |
- rec = qemu_file_monitor_test_next_record(data);
|
|
|
964eff |
+ rec = qemu_file_monitor_test_next_record(data, NULL);
|
|
|
964eff |
|
|
|
964eff |
+ retry:
|
|
|
964eff |
if (!rec) {
|
|
|
964eff |
g_printerr("Missing event watch id %" PRIx64 " event %d file %s\n",
|
|
|
964eff |
id, event, filename);
|
|
|
964eff |
@@ -172,6 +190,11 @@ qemu_file_monitor_test_expect(QFileMonitorTestData *data,
|
|
|
964eff |
}
|
|
|
964eff |
|
|
|
964eff |
if (id != rec->id) {
|
|
|
964eff |
+ if (swapnext) {
|
|
|
964eff |
+ rec = qemu_file_monitor_test_next_record(data, rec);
|
|
|
964eff |
+ swapnext = false;
|
|
|
964eff |
+ goto retry;
|
|
|
964eff |
+ }
|
|
|
964eff |
g_printerr("Expected watch id %" PRIx64 " but got %" PRIx64 "\n",
|
|
|
964eff |
id, rec->id);
|
|
|
964eff |
goto cleanup;
|
|
|
964eff |
@@ -347,7 +370,8 @@ test_file_monitor_events(void)
|
|
|
964eff |
.filesrc = "fish", },
|
|
|
964eff |
{ .type = QFILE_MONITOR_TEST_OP_EVENT,
|
|
|
964eff |
.filesrc = "", .watchid = &watch4,
|
|
|
964eff |
- .eventid = QFILE_MONITOR_EVENT_IGNORED },
|
|
|
964eff |
+ .eventid = QFILE_MONITOR_EVENT_IGNORED,
|
|
|
964eff |
+ .swapnext = true },
|
|
|
964eff |
{ .type = QFILE_MONITOR_TEST_OP_EVENT,
|
|
|
964eff |
.filesrc = "fish", .watchid = &watch0,
|
|
|
964eff |
.eventid = QFILE_MONITOR_EVENT_DELETED },
|
|
|
964eff |
@@ -493,8 +517,9 @@ test_file_monitor_events(void)
|
|
|
964eff |
g_printerr("Event id=%" PRIx64 " event=%d file=%s\n",
|
|
|
964eff |
*op->watchid, op->eventid, op->filesrc);
|
|
|
964eff |
}
|
|
|
964eff |
- if (!qemu_file_monitor_test_expect(
|
|
|
964eff |
- &data, *op->watchid, op->eventid, op->filesrc))
|
|
|
964eff |
+ if (!qemu_file_monitor_test_expect(&data, *op->watchid,
|
|
|
964eff |
+ op->eventid, op->filesrc,
|
|
|
964eff |
+ op->swapnext))
|
|
|
964eff |
goto cleanup;
|
|
|
964eff |
break;
|
|
|
964eff |
case QFILE_MONITOR_TEST_OP_CREATE:
|