Example #1
0
static GError *
_reload(struct meta0_backend_s *m0, gboolean lazy)
{
	GError *err = NULL;

	EXTRA_ASSERT(m0 != NULL);
	GRID_TRACE("%s(%p,lazy=%d)", __FUNCTION__, m0, lazy);

	g_rw_lock_writer_lock(&(m0->rwlock));

	if (!lazy || m0->reload_requested || !m0->array_by_prefix || !m0->array_meta1_ref) {
		if (m0->array_by_prefix) {
			meta0_utils_array_clean(m0->array_by_prefix);
			m0->array_by_prefix = NULL;
		}
		if (m0->array_meta1_ref) {
			meta0_utils_array_meta1ref_clean(m0->array_meta1_ref);
			m0->array_meta1_ref = NULL;
		}

		err = _load(m0);
		m0->reload_requested = FALSE;
		if (NULL != err)
			g_prefix_error(&err, "Loading error: ");
	}

	g_rw_lock_writer_unlock(&(m0->rwlock));
	return err;
}
Example #2
0
static GString*
_m0_mapping_from_m1_list(GSList *m1_list)
{
	gboolean first = TRUE;
	GString *out = g_string_sized_new(65536 * 20);
	GPtrArray *array = meta0_utils_list_to_array(m1_list);

	g_string_append_c(out, '{');
	for (guint i = 0; i < array->len; i++) {
		gchar **v;
		if ((v = array->pdata[i]) != NULL) {
			if (!first)
				g_string_append_c(out, ',');
			guint16 p = i;
			gboolean first2 = TRUE;
			g_string_append_printf(out, "\"%04X\":[", p);
			for (gchar **m1 = v; m1 && *m1; m1++) {
				if (!first2)
					g_string_append_c(out, ',');
				first2 = FALSE;
				g_string_append_printf(out, "\"%s\"", *m1);
			}
			g_string_append_c(out, ']');
			first = FALSE;
		}
	}
	g_string_append_c(out, '}');

	meta0_utils_array_clean(array);
	return out;
}
Example #3
0
void
meta1_prefixes_clean(struct meta1_prefixes_set_s *m1ps)
{
	if (!m1ps)
		return;
	if (m1ps->cache)
		g_free(m1ps->cache);
	if (m1ps->by_prefix)
		meta0_utils_array_clean(m1ps->by_prefix);
	g_mutex_clear(&m1ps->lock);
	memset(m1ps, 0, sizeof(*m1ps));
	g_free(m1ps);
}
Example #4
0
void
meta0_backend_clean(struct meta0_backend_s *m0)
{
	if (!m0)
		return;
	oio_str_clean (&m0->ns);
	oio_str_clean (&m0->id);
	if (m0->array_by_prefix)
		meta0_utils_array_clean(m0->array_by_prefix);
	if (m0->array_meta1_ref)
		meta0_utils_array_meta1ref_clean(m0->array_meta1_ref);
	g_rw_lock_clear (&m0->rwlock);
	g_free(m0);
}
Example #5
0
GError*
meta1_prefixes_manage_all(struct meta1_prefixes_set_s *m1ps,
		const gchar *local_url)
{
	gint32 i32;
	guint16 u16;

	EXTRA_ASSERT(m1ps != NULL);

	g_mutex_lock(&m1ps->lock);
	memset(m1ps->cache, ~0, 8192);
	if (m1ps->by_prefix)
		meta0_utils_array_clean(m1ps->by_prefix);
	m1ps->by_prefix = meta0_utils_array_create();
	for (i32=0; i32<65536 ;i32++) {
		u16 = i32;
		meta0_utils_array_add(m1ps->by_prefix, (guint8*)(&u16), local_url);
	}
	g_mutex_unlock(&m1ps->lock);

	return NULL;
}
Example #6
0
static void 
_resetContext() {

	if (context->working_map_meta1_ref) {
		g_hash_table_destroy(context->working_map_meta1_ref);
		context->working_map_meta1_ref=NULL;
	}
	if (context->array_meta1_by_prefix) {
		meta0_utils_array_clean(context->array_meta1_by_prefix);
		context->array_meta1_by_prefix=NULL;
	}

	if (context->map_meta1_ref) {
		g_hash_table_destroy(context->map_meta1_ref);
		context->map_meta1_ref=NULL;
	}

	if (context->treat_prefixes) {
		g_free(context->treat_prefixes);
		context->treat_prefixes=NULL;
	}
	
	context->replica=0;  context->avgscore=0;
}
Example #7
0
static GError*
_cache_load_from_m0(struct meta1_prefixes_set_s *m1ps,
		const gchar *ns_name,
		const struct addr_info_s *local_addr,
		struct addr_info_s *m0_addr,
		GArray **updated_prefixes,
		gboolean *meta0_ok)
{
	GError *err = NULL;
	GSList *m0info_list = NULL;

	EXTRA_ASSERT(m1ps != NULL);
	GRID_TRACE2("%s(%p,%s,%p,%p)", __FUNCTION__, m1ps, ns_name, local_addr,
			m0_addr);

	(void)ns_name;
	gchar m0[STRLEN_ADDRINFO];
	grid_addrinfo_to_string (m0_addr, m0, sizeof(m0));
	err = meta0_remote_get_meta1_all(m0, &m0info_list);
	if (err) {
		g_prefix_error(&err, "Remote error: ");
		return err;
	}
	if (!m0info_list) {
		GRID_DEBUG("META0 has no prefix configured!");
		return NULL;
	}

	*meta0_ok = TRUE;
	guint8 *cache = _cache_from_m0l(m0info_list, local_addr);
	GPtrArray *by_prefix = meta0_utils_list_to_array(m0info_list);

	g_mutex_lock(&m1ps->lock);
	GRID_DEBUG("Got %u prefixes from M0, %u in place",
			by_prefix->len, m1ps->by_prefix ? m1ps->by_prefix->len : 0);

	if ( m1ps->by_prefix ) {
		guint prefix;
		*updated_prefixes = g_array_new(FALSE, FALSE, sizeof(guint16));
		for( prefix=0 ; prefix <65536 ;prefix++) {
			if ( _cache_is_managed(m1ps->cache,(guint8 *)&prefix) != _cache_is_managed( cache,(guint8 *)&prefix)) {
				g_array_append_vals(*updated_prefixes, &prefix, 1);
			}
		}
	}

	SWAP_PTR(m1ps->by_prefix, by_prefix);
	SWAP_PTR(m1ps->cache, cache);
	g_mutex_unlock(&m1ps->lock);

	if (by_prefix)
		meta0_utils_array_clean(by_prefix);
	by_prefix = NULL;

	if (cache)
		g_free(cache);
	cache = NULL;

	g_slist_foreach(m0info_list, meta0_info_gclean, NULL);
	g_slist_free(m0info_list);
	return NULL;
}