]> git.proxmox.com Git - mirror_ovs.git/blobdiff - ovsdb/log.h
vconn: Allow timeout configuration for blocking connection.
[mirror_ovs.git] / ovsdb / log.h
index 2daa635ba48be08371856c86ba008f05697a143b..90714ea13190e14009c9d4229d4729b5b7aab145 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009 Nicira Networks
+/* Copyright (c) 2009, 2010, 2011, 2017 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #ifndef OVSDB_LOG_H
 #define OVSDB_LOG_H 1
 
+/* OVSDB log.
+ *
+ * A log consists of a series of records.  After opening or creating a log with
+ * ovsdb_log_open(), the client may use ovsdb_log_read() to read any existing
+ * records, one by one.  The client may also use ovsdb_log_write() to write new
+ * records (if some records have not yet been read at this point, then the
+ * first write truncates them).
+ *
+ * Log writes are atomic.  A client may use ovsdb_log_commit() to ensure that
+ * they are durable.
+ *
+ * Logs provide a mechansim to allow the client to tell when they have grown
+ * enough that compacting may be warranted.  After reading existing log
+ * contents, the client uses ovsdb_log_mark_base() to mark the "base" to be
+ * considered as the initial size of the log.  Thereafter, a client may call
+ * ovsdb_log_grew_lots() to get an indication whether the log has grown enough
+ * that compacting is advised.
+ */
+
+#include <stdint.h>
 #include <sys/types.h>
 #include "compiler.h"
 
+struct ds;
 struct json;
 struct ovsdb_log;
 
-struct ovsdb_error *ovsdb_log_open(const char *name, int flags,
-                                   struct ovsdb_log **) WARN_UNUSED_RESULT;
+/* Access mode for opening an OVSDB log. */
+enum ovsdb_log_open_mode {
+    OVSDB_LOG_READ_ONLY,        /* Open existing file, read-only. */
+    OVSDB_LOG_READ_WRITE,       /* Open existing file, read/write. */
+    OVSDB_LOG_CREATE_EXCL,      /* Create new file, read/write. */
+    OVSDB_LOG_CREATE            /* Create or open file, read/write. */
+};
+
+/* 'magic' for use with ovsdb_log_open() for OVSDB databases (see ovsdb(5)). */
+#define OVSDB_MAGIC "JSON"
+
+struct ovsdb_error *ovsdb_log_open(const char *name, const char *magic,
+                                   enum ovsdb_log_open_mode,
+                                   int locking, struct ovsdb_log **)
+    OVS_WARN_UNUSED_RESULT;
 void ovsdb_log_close(struct ovsdb_log *);
 
+const char *ovsdb_log_get_magic(const struct ovsdb_log *);
+
 struct ovsdb_error *ovsdb_log_read(struct ovsdb_log *, struct json **)
-    WARN_UNUSED_RESULT;
-struct ovsdb_error *ovsdb_log_write(struct ovsdb_log *, struct json *)
-    WARN_UNUSED_RESULT;
-struct ovsdb_error *ovsdb_log_commit(struct ovsdb_log *)
-    WARN_UNUSED_RESULT;
+    OVS_WARN_UNUSED_RESULT;
+void ovsdb_log_unread(struct ovsdb_log *);
+
+void ovsdb_log_compose_record(const struct json *, const char *magic,
+                              struct ds *header, struct ds *data);
+
+struct ovsdb_error *ovsdb_log_write(struct ovsdb_log *, const struct json *)
+    OVS_WARN_UNUSED_RESULT;
+struct ovsdb_error *ovsdb_log_write_and_free(struct ovsdb_log *, struct json *)
+    OVS_WARN_UNUSED_RESULT;
+
+uint64_t ovsdb_log_commit_start(struct ovsdb_log *);
+uint64_t ovsdb_log_commit_progress(struct ovsdb_log *);
+void ovsdb_log_commit_wait(struct ovsdb_log *, uint64_t);
+struct ovsdb_error *ovsdb_log_commit_block(struct ovsdb_log *)
+    OVS_WARN_UNUSED_RESULT;
+
+void ovsdb_log_mark_base(struct ovsdb_log *);
+bool ovsdb_log_grew_lots(const struct ovsdb_log *);
+
+struct ovsdb_error *ovsdb_log_replace(struct ovsdb_log *,
+                                      struct json **entries, size_t n)
+    OVS_WARN_UNUSED_RESULT;
+struct ovsdb_error *ovsdb_log_replace_start(struct ovsdb_log *old,
+                                            struct ovsdb_log **newp)
+    OVS_WARN_UNUSED_RESULT;
+struct ovsdb_error *ovsdb_log_replace_commit(struct ovsdb_log *old,
+                                             struct ovsdb_log *new)
+    OVS_WARN_UNUSED_RESULT;
+void ovsdb_log_replace_abort(struct ovsdb_log *new);
+
+/* For testing. */
+void ovsdb_log_disable_renaming_open_files(void);
 
 #endif /* ovsdb/log.h */