Commit 54c13049 authored by Daniel P. Berrangé's avatar Daniel P. Berrangé Committed by Michael Roth
Browse files

tests: make filemonitor test more robust to event ordering



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: default avatarPeter Xu <peterx@redhat.com>
Tested-by: default avatarWei Yang <richardw.yang@linux.intel.com>
Tested-by: default avatarCornelia Huck <cohuck@redhat.com>
Reviewed-by: default avatarThomas Huth <thuth@redhat.com>
Signed-off-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
(cherry picked from commit bf9e0313)
Signed-off-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
parent 3d018ff3
Loading
Loading
Loading
Loading
+34 −9
Original line number Diff line number Diff line
@@ -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,10 +149,16 @@ qemu_file_monitor_test_next_record(QFileMonitorTestData *data)
    }
    if (data->records) {
        record = data->records->data;
        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);

    g_timer_destroy(timer);
@@ -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: