static GPtrArray* build_meta0_cache (struct resolver_direct_s *r, GError **err) { GSList *m0_list=NULL; GPtrArray *array=NULL; /*now call the meta0 reference*/ if (!(m0_list = meta0_remote_get_meta1_all (&(r->meta0), r->timeout.m0.op, err))) { gchar str_addr[128]; memset(str_addr, 0x00, sizeof(str_addr)); addr_info_to_string(&(r->meta0), str_addr, sizeof(str_addr)); GSETERROR (err,"META0 error : Cannot get the reference from %s", str_addr); WARN ("Cannot get the META0 reference from %s", str_addr); return NULL; } array = meta0_utils_list_to_array(m0_list); g_slist_foreach (m0_list, meta0_info_gclean, NULL); g_slist_free (m0_list); return array; }
// TODO: factorize the two following functions enum http_rc_e action_admin_meta0_list(struct req_args_s *args) { GError *err = NULL; GSList *m0_lst = NULL; GSList *m1_lst = NULL; GString *json = NULL; err = conscience_get_services(NS(), NAME_SRVTYPE_META0, FALSE, &m0_lst); if (!err) { for (GSList *l = m0_lst; l; l = l->next) { g_clear_error(&err); service_info_t *m0 = l->data; gchar m0_url[STRLEN_ADDRINFO] = {0}; grid_addrinfo_to_string(&(m0->addr), m0_url, sizeof(m0_url)); err = meta0_remote_get_meta1_all(m0_url, &m1_lst); if (!err || !CODE_IS_NETWORK_ERROR(err->code)) break; } g_slist_free_full(m0_lst, (GDestroyNotify)service_info_clean); } if (m1_lst) { json = _m0_mapping_from_m1_list(m1_lst); meta0_utils_list_clean(m1_lst); return _reply_json(args, HTTP_CODE_OK, "OK", json); } return _reply_common_error(args, err); }
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; }