Esempio n. 1
0
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);
	}
Esempio n. 2
0
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);
	}
}
Esempio n. 3
0
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);
			}
		}
	}
Esempio n. 4
0
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));
}