[ostree/wip/delta2] delta: Move to-commit into superblock



commit f8fb633d255b630bd0b1aa5f45ffd1713e3c8a2d
Author: Colin Walters <walters verbum org>
Date:   Sun Apr 27 16:38:29 2014 -0400

    delta: Move to-commit into superblock
    
    Also, add the from/to checksums there as well.  The idea here is that
    if we want to do any kind of version comparisons, we can just get that
    from the superblock directly, rather than doing another fetch for the
    to-commit.

 src/libostree/ostree-repo-pull.c                   |   37 ++++++++++++++++++-
 .../ostree-repo-static-delta-compilation.c         |   20 +++++++++-
 src/libostree/ostree-repo-static-delta-core.c      |   32 ++++++++++++++++-
 src/libostree/ostree-repo-static-delta-private.h   |    7 +++-
 4 files changed, 88 insertions(+), 8 deletions(-)
---
diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c
index 1183a98..061f2cf 100644
--- a/src/libostree/ostree-repo-pull.c
+++ b/src/libostree/ostree-repo-pull.c
@@ -1240,8 +1240,8 @@ process_one_static_delta (OtPullData   *pull_data,
   guint i, n;
 
   /* Parsing OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT */
-  headers = g_variant_get_child_value (delta_superblock, 3);
-  fallback_objects = g_variant_get_child_value (delta_superblock, 4);
+  headers = g_variant_get_child_value (delta_superblock, 6);
+  fallback_objects = g_variant_get_child_value (delta_superblock, 7);
 
   /* First process the fallbacks */
   n = g_variant_n_children (fallback_objects);
@@ -1256,6 +1256,39 @@ process_one_static_delta (OtPullData   *pull_data,
         goto out;
     }
 
+  /* Write the to-commit object */
+  {
+    gs_unref_variant GVariant *to_csum_v = NULL;
+    gs_free char *to_checksum = NULL;
+    gs_unref_variant GVariant *to_commit = NULL;
+    gboolean have_to_commit;
+
+    to_csum_v = g_variant_get_child_value (delta_superblock, 3);
+    if (!ostree_validate_structureof_csum_v (to_csum_v, error))
+      goto out;
+    to_checksum = ostree_checksum_from_bytes_v (to_csum_v);
+
+    if (!ostree_repo_has_object (pull_data->repo, OSTREE_OBJECT_TYPE_COMMIT, to_checksum,
+                                 &have_to_commit, cancellable, error))
+      goto out;
+    
+    if (!have_to_commit)
+      {
+        FetchObjectData *fetch_data = g_new0 (FetchObjectData, 1);
+        fetch_data->pull_data = pull_data;
+        fetch_data->object = ostree_object_name_serialize (to_checksum, OSTREE_OBJECT_TYPE_COMMIT);
+        fetch_data->is_detached_meta = FALSE;
+
+        to_commit = g_variant_get_child_value (delta_superblock, 4);
+
+        ostree_repo_write_metadata_async (pull_data->repo, OSTREE_OBJECT_TYPE_COMMIT, to_checksum,
+                                          to_commit,
+                                          pull_data->cancellable,
+                                          on_metadata_writed, fetch_data);
+        pull_data->n_outstanding_metadata_write_requests++;
+      }
+  }
+
   n = g_variant_n_children (headers);
   for (i = 0; i < n; i++)
     {
diff --git a/src/libostree/ostree-repo-static-delta-compilation.c 
b/src/libostree/ostree-repo-static-delta-compilation.c
index cfef30b..cf5d7a1 100644
--- a/src/libostree/ostree-repo-static-delta-compilation.c
+++ b/src/libostree/ostree-repo-static-delta-compilation.c
@@ -74,7 +74,6 @@ objtype_checksum_array_new (GPtrArray *objects)
   guint i;
   GByteArray *ret = g_byte_array_new ();
 
-  g_assert (objects->len > 0);
   for (i = 0; i < objects->len; i++)
     {
       GVariant *serialized_key = objects->pdata[i];
@@ -260,6 +259,10 @@ generate_delta_lowlatency (OstreeRepo                       *repo,
               g_hash_table_size (new_reachable_metadata),
               g_hash_table_size (new_reachable_content));
 
+  /* We already ship the to commit in the superblock, don't ship it twice */
+  g_hash_table_remove (new_reachable_metadata,
+                       ostree_object_name_serialize (to, OSTREE_OBJECT_TYPE_COMMIT));
+
   /* Scan for large objects, so we can fall back to plain HTTP-based
    * fetch.  In the future this should come after an rsync-style
    * rolling delta check for modified files.
@@ -453,6 +456,7 @@ ostree_repo_static_delta_generate (OstreeRepo                   *self,
   gs_unref_variant_builder GVariantBuilder *part_headers = NULL;
   gs_unref_ptrarray GPtrArray *part_tempfiles = NULL;
   gs_unref_variant GVariant *delta_descriptor = NULL;
+  gs_unref_variant GVariant *to_commit = NULL;
   gs_free char *descriptor_relpath = NULL;
   gs_unref_object GFile *descriptor_path = NULL;
   gs_unref_object GFile *descriptor_dir = NULL;
@@ -466,6 +470,10 @@ ostree_repo_static_delta_generate (OstreeRepo                   *self,
     max_usize = 32;
   builder.max_usize_bytes = ((guint64)max_usize) * 1000 * 1000;
 
+  if (!ostree_repo_load_variant (self, OSTREE_OBJECT_TYPE_COMMIT, to,
+                                 &to_commit, error))
+    goto out;
+
   /* Ignore optimization flags */
   if (!generate_delta_lowlatency (self, from, to, &builder,
                                   cancellable, error))
@@ -585,13 +593,21 @@ ostree_repo_static_delta_generate (OstreeRepo                   *self,
                              cancellable, error))
     goto out;
 
+  /* Generate OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT */
   {
     GDateTime *now = g_date_time_new_now_utc ();
-    delta_descriptor = g_variant_new ("(@(a(ss)a(say))tay"
+    /* floating */ GVariant *from_csum_v =
+      ostree_checksum_to_bytes_v (from);
+    /* floating */ GVariant *to_csum_v =
+      ostree_checksum_to_bytes_v (to);
+    delta_descriptor = g_variant_new ("(@(a(ss)a(say))t ay@ay@" OSTREE_COMMIT_GVARIANT_STRING "ay"
                                       "a" OSTREE_STATIC_DELTA_META_ENTRY_FORMAT
                                       "@a" OSTREE_STATIC_DELTA_FALLBACK_FORMAT ")",
                                       metadata_source,
                                       GUINT64_TO_BE (g_date_time_to_unix (now)),
+                                      from_csum_v,
+                                      to_csum_v,
+                                      to_commit,
                                       g_variant_builder_new (G_VARIANT_TYPE ("ay")),
                                       part_headers,
                                       fallback_headers);
diff --git a/src/libostree/ostree-repo-static-delta-core.c b/src/libostree/ostree-repo-static-delta-core.c
index 7eb211b..c404b13 100644
--- a/src/libostree/ostree-repo-static-delta-core.c
+++ b/src/libostree/ostree-repo-static-delta-core.c
@@ -191,7 +191,35 @@ ostree_repo_static_delta_execute_offline (OstreeRepo                    *self,
                             FALSE, &meta, error))
     goto out;
 
-  fallback = g_variant_get_child_value (meta, 4);
+  /* Parsing OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT */
+
+  /* Write the to-commit object */
+  {
+    gs_unref_variant GVariant *to_csum_v = NULL;
+    gs_free char *to_checksum = NULL;
+    gs_unref_variant GVariant *to_commit = NULL;
+    gboolean have_to_commit;
+
+    to_csum_v = g_variant_get_child_value (meta, 3);
+    if (!ostree_validate_structureof_csum_v (to_csum_v, error))
+      goto out;
+    to_checksum = ostree_checksum_from_bytes_v (to_csum_v);
+
+    if (!ostree_repo_has_object (self, OSTREE_OBJECT_TYPE_COMMIT, to_checksum,
+                                 &have_to_commit, cancellable, error))
+      goto out;
+    
+    if (!have_to_commit)
+      {
+        to_commit = g_variant_get_child_value (meta, 4);
+        if (!ostree_repo_write_metadata (self, OSTREE_OBJECT_TYPE_COMMIT,
+                                         to_checksum, to_commit, NULL,
+                                         cancellable, error))
+          goto out;
+      }
+  }
+
+  fallback = g_variant_get_child_value (meta, 7);
   if (g_variant_n_children (fallback) > 0)
     {
       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
@@ -199,7 +227,7 @@ ostree_repo_static_delta_execute_offline (OstreeRepo                    *self,
       goto out;
     }
 
-  headers = g_variant_get_child_value (meta, 3);
+  headers = g_variant_get_child_value (meta, 6);
   n = g_variant_n_children (headers);
   for (i = 0; i < n; i++)
     {
diff --git a/src/libostree/ostree-repo-static-delta-private.h 
b/src/libostree/ostree-repo-static-delta-private.h
index 3329b3e..a6f8583 100644
--- a/src/libostree/ostree-repo-static-delta-private.h
+++ b/src/libostree/ostree-repo-static-delta-private.h
@@ -74,7 +74,10 @@ G_BEGIN_DECLS
  *
  * delta-descriptor:
  *   metadata: a{sv}
- *   timestamp: guint64
+ *   t: timestamp
+ *   from: ay checksum
+ *   to: ay checksum
+ *   commit: new commit object
  *   ARRAY[(csum from, csum to)]: ay
  *   ARRAY[delta-meta-entry]
  *   array[fallback]
@@ -93,7 +96,7 @@ G_BEGIN_DECLS
  * fetch individually - the compiler determined it wasn't worth
  * duplicating the space.
  */ 
-#define OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT "(a{sv}taya" OSTREE_STATIC_DELTA_META_ENTRY_FORMAT "a" 
OSTREE_STATIC_DELTA_FALLBACK_FORMAT ")"
+#define OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT "(a{sv}tayay" OSTREE_COMMIT_GVARIANT_STRING "aya" 
OSTREE_STATIC_DELTA_META_ENTRY_FORMAT "a" OSTREE_STATIC_DELTA_FALLBACK_FORMAT ")"
 
 gboolean _ostree_static_delta_part_validate (OstreeRepo     *repo,
                                              GFile          *part_path,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]