qemu-devel
[Top][All Lists]
Advanced

[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: Thomas Huth
Subject: Re: [Qemu-devel] [PATCH] tests: make filemonitor test more robust to event ordering
Date: Wed, 4 Sep 2019 12:10:40 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0

On 21/08/2019 17.53, 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>
> ---
>  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:
> 

I don't know that part of the code, but this looks ok to me at a quick
glance. So FWIW, from my side a light
Reviewed-by: Thomas Huth <address@hidden>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]