static void _dump_chunks_xml_DUPLI(const struct loc_context_s *lc, GString **s) { chunk_pair_t *base = NULL; chunk_pair_t *current = NULL; int copies = 0; GString *urls = NULL; void _append(void) { GByteArray *hash = CHUNKS_get_hash(base->chunk); char str_hash[1 + sizeof(chunk_hash_t) * 2]; oio_str_bin2hex(hash->data, hash->len, str_hash, sizeof(str_hash)); g_string_append_printf(*s, " <chunk>\n" " <nb-copies>%d</nb-copies>" " <locations>\n" "%s" " </locations>\n" " <position>%d</position>\n" " <size>%"G_GINT64_FORMAT"</size>\n" " <md5>%s</md5>\n" " </chunk>\n", copies, urls->str, base->position.meta, CHUNKS_get_size(base->chunk), str_hash); g_string_free(urls, TRUE); }
static void _dump_chunks_xml_NORMAL(const struct loc_context_s *lc, GString **s) { chunk_pair_t *current = NULL; for(guint i=0; i < lc->rc->pairs->len; i++) { current = &g_array_index(lc->rc->pairs, chunk_pair_t, i); GByteArray *hash = CHUNKS_get_hash(current->chunk); char str_hash[1 + sizeof(chunk_hash_t) * 2]; oio_str_bin2hex(hash->data, hash->len, str_hash, sizeof(str_hash)); char *loc = _chunk_location_row_xml(lc, CHUNKS_get_id(current->chunk)->str, ""); g_string_append_printf(*s, " <chunk>\n" " <locations>\n" "%s" " </locations>\n" " <position>%d</position>\n" " <size>%"G_GINT64_FORMAT"</size>\n" " <md5>%s</md5>\n" " </chunk>\n", loc, current->position.meta, CHUNKS_get_size(current->chunk), str_hash); g_free(loc); } }
static void test_content_dedup(gconstpointer test_data) { guint num_duplicates = *(guint*)test_data; void change_chunk_hash(GSList *beans, guint start) { guint8 counter = start; for (GSList *cursor = beans; cursor; cursor = cursor->next) { if (DESCR(cursor->data) == &descr_struct_CHUNKS) { GByteArray *hash = CHUNKS_get_hash(cursor->data); hash->data[0] = counter; CHUNKS_set_hash(cursor->data, hash); // no-op because same pointer counter++; } else if (DESCR(cursor->data) == &descr_struct_CONTENTS_HEADERS) { GByteArray *hash = g_byte_array_sized_new(16); GRID_INFO("---- forging content hash ----"); for (guint8 i = 0; i < 16; i++) { hash->data[i] = i + 1; } CONTENTS_HEADERS_set_hash(cursor->data, hash); } } }
static void encode_chunk (GString *g, gpointer bean) { g_string_append_printf(g, "\"id\":\"%s\",\"hash\":\"", CHUNKS_get_id(bean)->str); metautils_gba_to_hexgstr(g, CHUNKS_get_hash(bean)); g_string_append_printf(g, "\",\"size\":%"G_GINT64_FORMAT, CHUNKS_get_size(bean)); }
/** * Inserts a bean (chunk or contents_headers) in a hashtable, * the key being the hash of the bean */ static void _add_to_hashtable_cb(gpointer hashtable, gpointer bean) { GHashTable *_chunks_by_hash = (GHashTable *)hashtable; GByteArray *hash = NULL; if (DESCR(bean) == &descr_struct_CHUNKS) { hash = CHUNKS_get_hash(bean); } else if (DESCR(bean) == &descr_struct_CONTENTS_HEADERS) { hash = CONTENTS_HEADERS_get_hash(bean); } else { g_assert_not_reached(); } GSList *chunk_list = g_hash_table_lookup(_chunks_by_hash, hash); if (chunk_list != NULL) { /* Remove it without freeing it */ g_hash_table_steal(_chunks_by_hash, hash); } /* No problem if the key was not found: NULL is a valid GSList* */ g_hash_table_insert(_chunks_by_hash, hash, g_slist_prepend(chunk_list, bean)); }