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; }
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; }
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); }
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); }
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; }
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; }
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; }