diff options
author | Colin Walters <walters@verbum.org> | 2014-02-09 16:11:37 -0500 |
---|---|---|
committer | Giuseppe Scrivano <gscrivan@redhat.com> | 2014-12-18 12:48:47 +0100 |
commit | ca678224bed203b15b96002dc7b2a949e77281d4 (patch) | |
tree | b5785c97002b84c9337b79d31cd42daa4836ee02 /tests/test-rollsum.c | |
parent | a23b3b332e51de13e563ae247d57a9bc15b5964c (diff) | |
download | ostree-ca678224bed203b15b96002dc7b2a949e77281d4.tar.gz |
Static deltas support
https://bugzilla.gnome.org/show_bug.cgi?id=721799
Diffstat (limited to 'tests/test-rollsum.c')
-rw-r--r-- | tests/test-rollsum.c | 102 |
1 files changed, 86 insertions, 16 deletions
diff --git a/tests/test-rollsum.c b/tests/test-rollsum.c index 4d7f50ef..f33ec2bb 100644 --- a/tests/test-rollsum.c +++ b/tests/test-rollsum.c @@ -25,7 +25,49 @@ #include "bupsplit.h" #define BLOB_MAX (8192*4) -#define BLOB_READ_SIZE (1024*1024) + +static GPtrArray * +rollsum_checksums_for_data (GBytes *bytes) +{ + const guint8 *start; + gsize len; + GPtrArray *ret = g_ptr_array_new_with_free_func ((GDestroyNotify)g_variant_unref); + + start = g_bytes_get_data (bytes, &len); + while (TRUE) + { + int offset, bits; + offset = bupsplit_find_ofs (start, MIN(G_MAXINT32, len), &bits); + if (offset == 0) + break; + if (offset > BLOB_MAX) + offset = BLOB_MAX; + { + gs_free char *blobcsum = + g_compute_checksum_for_data (G_CHECKSUM_SHA256, + start, offset); + g_ptr_array_add (ret, g_variant_ref_sink (g_variant_new ("(st)", + blobcsum, (guint64)offset))); + } + start += offset; + len -= offset; + } + return ret; +} + +static void +print_rollsums (GPtrArray *rollsums) +{ + guint i; + for (i = 0; i < rollsums->len; i++) + { + GVariant *sum = rollsums->pdata[i]; + const char *csum; + guint64 val; + g_variant_get (sum, "(&st)", &csum, &val); + g_print ("chunk %s %" G_GUINT64_FORMAT "\n", csum, val); + } +} int main (int argc, char **argv) @@ -38,29 +80,57 @@ main (int argc, char **argv) g_setenv ("GIO_USE_VFS", "local", TRUE); - if (argc > 1) + if (argc == 2) { - const guint8 *start; - gsize len; + gs_unref_ptrarray GPtrArray *rollsums = NULL; path = g_file_new_for_path (argv[1]); bytes = gs_file_map_readonly (path, cancellable, error); if (!bytes) goto out; - start = g_bytes_get_data (bytes, &len); - while (TRUE) - { - int offset, bits; - offset = bupsplit_find_ofs (start, MIN(G_MAXINT32, len), &bits); - if (offset == 0) - break; - if (offset > BLOB_MAX) - offset = BLOB_MAX; - g_print ("%" G_GUINT64_FORMAT "\n", (guint64)offset); - start += offset; - len -= offset; + rollsums = rollsum_checksums_for_data (bytes); + print_rollsums (rollsums); + } + else if (argc > 2) + { + guint i; + gs_unref_hashtable GHashTable *sums = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + guint64 input_size = 0; + guint64 rollsum_size = 0; + + for (i = 1; i < argc; i++) + { + guint j; + gs_unref_ptrarray GPtrArray *rollsums = NULL; + + path = g_file_new_for_path (argv[i]); + bytes = gs_file_map_readonly (path, cancellable, error); + if (!bytes) + goto out; + + input_size += g_bytes_get_size (bytes); + + g_print ("input: %s size: %" G_GUINT64_FORMAT "\n", argv[i], g_bytes_get_size (bytes)); + + rollsums = rollsum_checksums_for_data (bytes); + print_rollsums (rollsums); + for (j = 0; j < rollsums->len; j++) + { + GVariant *sum = rollsums->pdata[j]; + const char *csum; + guint64 ofs; + g_variant_get (sum, "(&st)", &csum, &ofs); + if (!g_hash_table_contains (sums, csum)) + { + g_hash_table_add (sums, g_strdup (csum)); + rollsum_size += ofs; + } + } } + g_print ("rollsums:%u input:%" G_GUINT64_FORMAT " output: %" G_GUINT64_FORMAT " speedup:%f\n", + g_hash_table_size (sums), input_size, rollsum_size, + (((double)(input_size+1)) / ((double) rollsum_size + 1))); } else { |