summaryrefslogtreecommitdiff
path: root/tests/test-rollsum.c
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2014-02-09 16:11:37 -0500
committerGiuseppe Scrivano <gscrivan@redhat.com>2014-12-18 12:48:47 +0100
commitca678224bed203b15b96002dc7b2a949e77281d4 (patch)
treeb5785c97002b84c9337b79d31cd42daa4836ee02 /tests/test-rollsum.c
parenta23b3b332e51de13e563ae247d57a9bc15b5964c (diff)
downloadostree-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.c102
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
{