[ovs-dev] [PATCH] ovsdb: Allow recovery from transient write errors in log implementation.

Ethan Jackson ethan at nicira.com
Tue Mar 12 01:18:40 UTC 2013


Seems fine to me, I don't know this code well though.

Acked-by: Ethan Jackson <ethan at nicira.com>



On Fri, Mar 1, 2013 at 11:16 AM, Ben Pfaff <blp at nicira.com> wrote:

> Until now, the OVSDB data journaling implementation has made write errors
> "sticky", so that a single write error persists as long as ovsdb-server is
> alive.  However, some kinds of write errors (such as ENOSPC) can be
> transient in practice.  I don't know of a good reason to make such errors
> sticky, so this commit makes the journaling code retry writes even after
> an error occurs, allowing ovsdb-server to recover from transient errors.
>
> Reported-by: likunyun <kunyunli at hotmail.com>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
>  ovsdb/log.c |   14 ++++++--------
>  1 files changed, 6 insertions(+), 8 deletions(-)
>
> diff --git a/ovsdb/log.c b/ovsdb/log.c
> index 440e8d0..ea3c3f3 100644
> --- a/ovsdb/log.c
> +++ b/ovsdb/log.c
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
> +/* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -48,7 +48,7 @@ struct ovsdb_log {
>      struct lockfile *lockfile;
>      FILE *stream;
>      struct ovsdb_error *read_error;
> -    struct ovsdb_error *write_error;
> +    bool write_error;
>      enum ovsdb_log_mode mode;
>  };
>
> @@ -133,7 +133,7 @@ ovsdb_log_open(const char *name, enum
> ovsdb_log_open_mode open_mode,
>      file->prev_offset = 0;
>      file->offset = 0;
>      file->read_error = NULL;
> -    file->write_error = NULL;
> +    file->write_error = false;
>      file->mode = OVSDB_LOG_READ;
>      *filep = file;
>      return NULL;
> @@ -154,7 +154,6 @@ ovsdb_log_close(struct ovsdb_log *file)
>          fclose(file->stream);
>          lockfile_unlock(file->lockfile);
>          ovsdb_error_destroy(file->read_error);
> -        ovsdb_error_destroy(file->write_error);
>          free(file);
>      }
>  }
> @@ -332,10 +331,9 @@ ovsdb_log_write(struct ovsdb_log *file, struct json
> *json)
>
>      json_string = NULL;
>
> -    if (file->write_error) {
> -        return ovsdb_error_clone(file->write_error);
> -    } else if (file->mode == OVSDB_LOG_READ) {
> +    if (file->mode == OVSDB_LOG_READ || file->write_error) {
>          file->mode = OVSDB_LOG_WRITE;
> +        file->write_error = false;
>          if (fseeko(file->stream, file->offset, SEEK_SET)) {
>              error = ovsdb_io_error(errno, "%s: cannot seek to offset
> %lld",
>                                     file->name, (long long int)
> file->offset);
> @@ -383,7 +381,7 @@ ovsdb_log_write(struct ovsdb_log *file, struct json
> *json)
>      return NULL;
>
>  error:
> -    file->write_error = ovsdb_error_clone(error);
> +    file->write_error = true;
>      free(json_string);
>      return error;
>  }
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20130311/27708324/attachment-0003.html>


More information about the dev mailing list