ovsdb: Save some space in the log for newly inserted records.
authorBen Pfaff <blp@nicira.com>
Mon, 11 Jan 2010 21:14:54 +0000 (13:14 -0800)
committerBen Pfaff <blp@nicira.com>
Mon, 11 Jan 2010 21:14:54 +0000 (13:14 -0800)
When a new record is inserted into a database, ovsdb logs the values of all
of the fields in the record.  However, often new records have many columns
that contain default values.  There is no need to log those values, so this
commit causes them to be omitted.

As a side effect, this also makes "ovsdb-tool show-log --more --more"
output easier to read, because record insertions print less noise.  (Adding
--more --more to this command makes it print changes to database records.
The --more option will be introduced in an upcoming commit.)

lib/ovsdb-data.c
lib/ovsdb-data.h
lib/uuid.c
lib/uuid.h
ovsdb/file.c

index 0d7749b17fc3912606128384c781d250e32212ee..65fd43e693b78c56cae8a8d1bd8c97e082f67925 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009 Nicira Networks
+/* Copyright (c) 2009, 2010 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -65,6 +65,35 @@ ovsdb_atom_init_default(union ovsdb_atom *atom, enum ovsdb_atomic_type type)
     }
 }
 
+bool
+ovsdb_atom_is_default(const union ovsdb_atom *atom,
+                      enum ovsdb_atomic_type type)
+{
+    switch (type) {
+    case OVSDB_TYPE_VOID:
+        NOT_REACHED();
+
+    case OVSDB_TYPE_INTEGER:
+        return atom->integer == 0;
+
+    case OVSDB_TYPE_REAL:
+        return atom->real == 0.0;
+
+    case OVSDB_TYPE_BOOLEAN:
+        return atom->boolean == false;
+
+    case OVSDB_TYPE_STRING:
+        return atom->string[0] == '\0';
+
+    case OVSDB_TYPE_UUID:
+        return uuid_is_zero(&atom->uuid);
+
+    case OVSDB_N_TYPES:
+    default:
+        NOT_REACHED();
+    }
+}
+
 void
 ovsdb_atom_clone(union ovsdb_atom *new, const union ovsdb_atom *old,
                  enum ovsdb_atomic_type type)
@@ -351,6 +380,28 @@ ovsdb_datum_init_default(struct ovsdb_datum *datum,
     datum->values = alloc_default_atoms(type->value_type, datum->n);
 }
 
+bool
+ovsdb_datum_is_default(const struct ovsdb_datum *datum,
+                       const struct ovsdb_type *type)
+{
+    size_t i;
+
+    if (datum->n != type->n_min) {
+        return false;
+    }
+    for (i = 0; i < datum->n; i++) {
+        if (!ovsdb_atom_is_default(&datum->keys[i], type->key_type)) {
+            return false;
+        }
+        if (type->value_type != OVSDB_TYPE_VOID
+            && !ovsdb_atom_is_default(&datum->values[i], type->value_type)) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
 static union ovsdb_atom *
 clone_atoms(const union ovsdb_atom *old, enum ovsdb_atomic_type type, size_t n)
 {
index 3f2d489437e5a42d067626a273382a11eae13029..18b8841c7045f12db5387c198576eb2d01b74453 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009 Nicira Networks
+/* Copyright (c) 2009, 2010 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@ union ovsdb_atom {
 };
 
 void ovsdb_atom_init_default(union ovsdb_atom *, enum ovsdb_atomic_type);
+bool ovsdb_atom_is_default(const union ovsdb_atom *, enum ovsdb_atomic_type);
 void ovsdb_atom_clone(union ovsdb_atom *, const union ovsdb_atom *,
                       enum ovsdb_atomic_type);
 void ovsdb_atom_swap(union ovsdb_atom *, union ovsdb_atom *);
@@ -80,6 +81,8 @@ struct ovsdb_datum {
 };
 
 void ovsdb_datum_init_default(struct ovsdb_datum *, const struct ovsdb_type *);
+bool ovsdb_datum_is_default(const struct ovsdb_datum *,
+                            const struct ovsdb_type *);
 void ovsdb_datum_clone(struct ovsdb_datum *, const struct ovsdb_datum *,
                        const struct ovsdb_type *);
 void ovsdb_datum_destroy(struct ovsdb_datum *, const struct ovsdb_type *);
index 264d9bf5afb113f0dc1813d08ca9f90447a66c6f..620c039cb94318fce788ca15c320ee6c8994248f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008, 2009 Nicira Networks
+/* Copyright (c) 2008, 2009, 2010 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -107,6 +107,14 @@ uuid_zero(struct uuid *uuid)
     uuid->parts[0] = uuid->parts[1] = uuid->parts[2] = uuid->parts[3] = 0;
 }
 
+/* Returns true if 'uuid' is all zero, otherwise false. */
+bool
+uuid_is_zero(const struct uuid *uuid)
+{
+    return (!uuid->parts[0] && !uuid->parts[1]
+            && !uuid->parts[2] && !uuid->parts[3]);
+}
+
 /* Compares 'a' and 'b'.  Returns a negative value if 'a < b', zero if 'a ==
  * b', or positive if 'a > b'.  The ordering is lexicographical order of the
  * conventional way of writing out UUIDs as strings. */
index 5dcaa25d8ffd21d1822a2951d8ae6d288ee39a64..1059c26d1276fa39297e12cb7173c0227dfc7608 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008, 2009 Nicira Networks
+/* Copyright (c) 2008, 2009, 2010 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -74,6 +74,7 @@ uuid_equals(const struct uuid *a, const struct uuid *b)
 void uuid_init(void);
 void uuid_generate(struct uuid *);
 void uuid_zero(struct uuid *);
+bool uuid_is_zero(const struct uuid *);
 int uuid_compare_3way(const struct uuid *, const struct uuid *);
 bool uuid_from_string(struct uuid *, const char *);
 
index 97359d0359b34c7dd05028a8214d22aab7f4c37d..716ea89c5c7ea2c01be234ef86dd75feac4394e6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009 Nicira Networks
+/* Copyright (c) 2009, 2010 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -261,8 +261,10 @@ ovsdb_file_replica_change_cb(const struct ovsdb_row *old,
             unsigned int idx = column->index;
 
             if (idx != OVSDB_COL_UUID && column->persistent
-                && (!old || !ovsdb_datum_equals(&old->fields[idx],
-                                                &new->fields[idx], type)))
+                && (old
+                    ? !ovsdb_datum_equals(&old->fields[idx], &new->fields[idx],
+                                          type)
+                    : !ovsdb_datum_is_default(&new->fields[idx], type)))
             {
                 if (!row) {
                     row = json_object_create();