GError* hc_resolve_reference_service(struct hc_resolver_s *r, struct hc_url_s *url, const gchar *srvtype, gchar ***result) { GError *err; struct hashstr_s *hk; GRID_TRACE2("%s(%s,%s)", __FUNCTION__, hc_url_get(url, HCURL_WHOLE), srvtype); g_assert(r != NULL); g_assert(url != NULL); g_assert(srvtype != NULL); g_assert(result != NULL); g_assert(*result == NULL); if (!hc_url_get_id(url) || !hc_url_has(url, HCURL_NS)) return NEWERROR(400, "Incomplete URL [%s]", hc_url_get(url, HCURL_WHOLE)); hk = hashstr_printf("%s|%s|%s", srvtype, hc_url_get(url, HCURL_NSPHYS), hc_url_get(url, HCURL_HEXID)); err = _resolve_reference_service(r, hk, url, srvtype, result); g_free(hk); return err; }
static GError * _resolve_meta1(struct hc_resolver_s *r, struct hc_url_s *u, gchar ***result) { struct hashstr_s *hk; GError *err = NULL; GRID_TRACE2("%s(%s)", __FUNCTION__, hc_url_get(u, HCURL_WHOLE)); hk = hashstr_printf("meta1|%s|%.4s", hc_url_get(u, HCURL_NSPHYS), hc_url_get(u, HCURL_HEXID)); /* Try to hit the cache */ if (!(*result = hc_resolver_get_cached(r, r->csm0.cache, hk))) { /* get a meta0, then store it in the cache */ gchar **m0urlv = NULL; err = _resolve_meta0(r, hc_url_get(u, HCURL_NSPHYS), &m0urlv); if (err != NULL) g_prefix_error(&err, "M0 resolution error: "); else { err = _resolve_m1_through_many_m0(m0urlv, hc_url_get_id(u), result); if (!err) hc_resolver_store(r, r->csm0.cache, hk, *result); g_strfreev(m0urlv); } } g_free(hk); return err; }
static GError* _resolve_meta0(struct hc_resolver_s *r, const gchar *ns, gchar ***result) { struct hashstr_s *hk; GError *err = NULL; GRID_TRACE2("%s(%s)", __FUNCTION__, ns); hk = hashstr_printf("meta0|%s", ns); /* Try to hit the cache */ if (!(*result = hc_resolver_get_cached(r, r->csm0.cache, hk))) { GSList *allm0; /* Now attempt a real resolution */ if (!(allm0 = list_namespace_services2(ns, "meta0", &err))) { if (!err) err = NEWERROR(500, "No meta0 available"); *result = NULL; } else { *result = _srvlit_to_urlv(allm0); g_slist_foreach(allm0, service_info_gclean, NULL); g_slist_free(allm0); allm0 = NULL; /* then fill the cache */ hc_resolver_store(r, r->csm0.cache, hk, *result); err = NULL; } } g_free(hk); return err; }
static struct object_version_s * version_getslen(gboolean init, GTree *t, const guint8 *ks, gsize ks_len) { hashstr_t *k = hashstr_printf("%.*s", ks_len, ks); struct object_version_s *o = version_get(init, t, k); g_free(k); return o; }
void hc_decache_reference(struct hc_resolver_s *r, struct hc_url_s *url) { struct hashstr_s *hk; GRID_TRACE2("%s(%s)", __FUNCTION__, hc_url_get(url, HCURL_WHOLE)); g_assert(r != NULL); g_assert(url != NULL); if (r->flags & HC_RESOLVER_NOCACHE) return; hk = hashstr_printf("meta0|%s", hc_url_get(url, HCURL_NSPHYS)); hc_resolver_forget(r, r->csm0.cache, hk); g_free(hk); hk = hashstr_printf("meta1|%s|%.4s", hc_url_get(url, HCURL_NSPHYS), hc_url_get(url, HCURL_HEXID)); hc_resolver_forget(r, r->csm0.cache, hk); g_free(hk); }
void hc_decache_reference_service(struct hc_resolver_s *r, struct hc_url_s *url, const gchar *srvtype) { struct hashstr_s *hk; GRID_TRACE2("%s(%s,%s)", __FUNCTION__, hc_url_get(url, HCURL_WHOLE), srvtype); EXTRA_ASSERT(r != NULL); EXTRA_ASSERT(url != NULL); EXTRA_ASSERT(srvtype != NULL); if (r->flags & HC_RESOLVER_NOCACHE) return; hk = hashstr_printf("%s|%s|%s", srvtype, hc_url_get(url, HCURL_NS), hc_url_get(url, HCURL_HEXID)); hc_resolver_forget(r, r->services.cache, hk); g_free(hk); }