[ovs-dev] [PATCH 2/2] ovsdb: timestamp database records to millisecond resolution.

Paul Ingram pingram at nicira.com
Mon Sep 9 00:37:49 UTC 2013


The ovsdb-server compaction timing logic is written assuming milliscond
resolution timestamps but ovsdb-server wrote second resolution timestamps.

This commit changes ovsdb-server to write millisecond resolution timestamps
and ovsdb-tool to report millisecond timestamps.

This raises two compatibility issues:
1. When a new ovsdb-server or ovsdb-tool reads an old database, it will
multiply by 1000 any timestamp it reads which is less than 1<<31. Since
this date corresponds to Jan 16 1970 this is unlikely to cause a problem.
2. When an old ovsdb-tool reads a new database, it will interpret the
millisecond timestamps as seconds and report dates in the far future; the
time of this commit is reported as the year 45645 (each second since the
epoch is interpreted as 16 minutes). (When an old ovsdb-server reads a
new database there is no problem, it is already interpreting the timestamps
in milliseconds).
---
 ovsdb/file.c       |    6 +++++-
 ovsdb/ovsdb-tool.c |    4 ++--
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/ovsdb/file.c b/ovsdb/file.c
index b02d5a3..5b79f8c 100644
--- a/ovsdb/file.c
+++ b/ovsdb/file.c
@@ -408,6 +408,10 @@ ovsdb_file_txn_from_json(struct ovsdb *db, const struct json *json,
             if (!strcmp(table_name, "_date")
                 && node_json->type == JSON_INTEGER) {
                 *date = json_integer(node_json);
+                if (*date < INT_MAX) {
+                    /* Older versions of ovsdb wrote timestamps in seconds. */
+                    *date *= 1000;
+                }
                 continue;
             } else if (!strcmp(table_name, "_comment") || converting) {
                 continue;
@@ -787,7 +791,7 @@ ovsdb_file_txn_commit(struct json *json, const char *comment,
     if (comment) {
         json_object_put_string(json, "_comment", comment);
     }
-    json_object_put(json, "_date", json_integer_create(time_wall()));
+    json_object_put(json, "_date", json_integer_create(time_wall_msec()));
 
     error = ovsdb_log_write(log, json);
     json_destroy(json);
diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c
index 7cd0485..9c7eeb2 100644
--- a/ovsdb/ovsdb-tool.c
+++ b/ovsdb/ovsdb-tool.c
@@ -518,8 +518,8 @@ do_show_log(int argc, char *argv[])
 
             date = shash_find_data(json_object(json), "_date");
             if (date && date->type == JSON_INTEGER) {
-                time_t t = json_integer(date);
-                char *s = xastrftime(" %Y-%m-%d %H:%M:%S", t, true);
+                long long int t = json_integer(date);
+                char *s = xastrftime_msec(" %Y-%m-%d %H:%M:%S.%.", t, true);
                 fputs(s, stdout);
                 free(s);
             }
-- 
1.7.9.5




More information about the dev mailing list