[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