enum http_rc_e action_dir_srv_renew (struct req_args_s *args, struct json_object *jargs) { (void) jargs; const gchar *type = TYPE(); if (!type) return _reply_format_error (args, NEWERROR(CODE_BAD_REQUEST, "No service type provided")); gboolean autocreate = _request_has_flag (args, PROXYD_HEADER_MODE, "autocreate"); gboolean dryrun = _request_has_flag (args, PROXYD_HEADER_MODE, "dryrun"); gchar **urlv = NULL; GError *hook (const gchar * m1) { struct addr_info_s m1a; if (!grid_string_to_addrinfo (m1, NULL, &m1a)) return NEWERROR (CODE_NETWORK_ERROR, "Invalid M1 address"); GError *err = NULL; urlv = meta1v2_remote_poll_reference_service (&m1a, &err, args->url, type, dryrun, autocreate); return err; } GError *err = _m1_locate_and_action (args, hook); if (!err || CODE_IS_NETWORK_ERROR(err->code)) { /* Also decache on timeout, a majority of request succeed, * and it will probably silently succeed */ hc_decache_reference_service (resolver, args->url, type); } if (err) return _reply_common_error (args, err); EXTRA_ASSERT (urlv != NULL); return _reply_success_json (args, _pack_and_freev_m1url_list (NULL, urlv)); }
enum http_rc_e action_dir_srv_unlink (struct req_args_s *args) { const gchar *type = TYPE(); if (!type) return _reply_format_error (args, NEWERROR( CODE_BAD_REQUEST, "No service type provided")); GError *hook (const gchar * m1) { struct addr_info_s m1a; if (!grid_string_to_addrinfo (m1, NULL, &m1a)) return NEWERROR (CODE_NETWORK_ERROR, "Invalid M1 address"); GError *err = NULL; meta1v2_remote_unlink_service (&m1a, &err, args->url, type); return err; } GError *err = _m1_locate_and_action (args, hook); if (!err || CODE_IS_NETWORK_ERROR(err->code)) { /* Also decache on timeout, a majority of request succeed, * and it will probably silently succeed */ hc_decache_reference_service (resolver, args->url, type); } if (!err) return _reply_success_json (args, NULL); return _reply_common_error (args, err); }
int meta2_filter_action_has_container(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply) { (void) reply; struct meta2_backend_s *m2b = meta2_filter_ctx_get_backend(ctx); struct hc_url_s *url = meta2_filter_ctx_get_url(ctx); if (!url) { GRID_WARN("BUG : Checking container's presence : URL not set"); return FILTER_OK; } GError *e = meta2_backend_has_container(m2b, url); if(NULL != e) { if (e->code == CODE_UNAVAILABLE) GRID_DEBUG("Container %s exists but could not open it: %s", hc_url_get(url, HCURL_WHOLE), e->message); else GRID_DEBUG("No such container (%s)", hc_url_get(url, HCURL_WHOLE)); if (e->code == CODE_CONTAINER_NOTFOUND) { hc_decache_reference_service(m2b->resolver, url, META2_TYPE_NAME); } meta2_filter_ctx_set_error(ctx, e); return FILTER_KO; } return FILTER_OK; }
static int _create_container(struct gridd_filter_ctx_s *ctx) { struct m2v2_create_params_s params; struct meta2_backend_s *m2b = meta2_filter_ctx_get_backend(ctx); struct hc_url_s *url = meta2_filter_ctx_get_url(ctx); GError *err = NULL; int retry = 2; params.storage_policy = meta2_filter_ctx_get_param(ctx, M2_KEY_STORAGE_POLICY); params.version_policy = meta2_filter_ctx_get_param(ctx, M2_KEY_VERSION_POLICY); params.local = (meta2_filter_ctx_get_param(ctx, "LOCAL") != NULL); retry: err = meta2_backend_create_container(m2b, url, ¶ms); if (err != NULL && err->code == CODE_REDIRECT && retry-- > 0 && !g_strcmp0(err->message, meta2_backend_get_local_addr(m2b))) { GRID_WARN("Redirecting on myself!?! Retrying request immediately"); g_clear_error(&err); hc_decache_reference_service(m2b->resolver, url, META2_TYPE_NAME); goto retry; } if (!err) return FILTER_OK; meta2_filter_ctx_set_error(ctx, err); return FILTER_KO; }
int meta2_filter_action_has_container(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply) { (void) reply; struct meta2_backend_s *m2b = meta2_filter_ctx_get_backend(ctx); struct hc_url_s *url = meta2_filter_ctx_get_url(ctx); if (!url) { GRID_WARN("BUG : Checking container's presence : URL not set"); meta2_filter_ctx_set_error (ctx, NEWERROR(CODE_BAD_REQUEST, "No URL")); return FILTER_KO; } GError *e = meta2_backend_has_container(m2b, url); if (NULL != e) { GRID_DEBUG("Container test error for [%s] : (%d) %s", hc_url_get(url, HCURL_WHOLE), e->code, e->message); if (e->code == CODE_CONTAINER_NOTFOUND) hc_decache_reference_service(m2b->resolver, url, NAME_SRVTYPE_META2); meta2_filter_ctx_set_error(ctx, e); return FILTER_KO; } return FILTER_OK; }
static GError * _get_peers(struct sqlx_service_s *ss, struct sqlx_name_s *n, gboolean nocache, gchar ***result) { EXTRA_ASSERT(ss != NULL); EXTRA_ASSERT(result != NULL); gint retries = 1; gchar **peers = NULL; GError *err = NULL; gint64 seq = 1; struct oio_url_s *u = oio_url_empty (); oio_url_set(u, OIOURL_NS, ss->ns_name); if (!sqlx_name_extract (n, u, NAME_SRVTYPE_META2, &seq)) { oio_url_pclean (&u); return BADREQ("Invalid type name: '%s'", n->type); } retry: if (nocache) { hc_decache_reference_service(ss->resolver, u, n->type); if (!result) { oio_url_pclean (&u); return NULL; } } peers = NULL; err = hc_resolve_reference_service(ss->resolver, u, n->type, &peers); if (NULL != err) { g_prefix_error(&err, "Peer resolution error: "); oio_url_clean(u); return err; } gchar **out = filter_services_and_clean(ss, peers, seq, n->type); if (!out) { if (retries-- > 0) { nocache = TRUE; goto retry; } err = NEWERROR(CODE_CONTAINER_NOTFOUND, "Base not managed"); } if (err) { if (out) g_strfreev (out); *result = NULL; } else { *result = out; } oio_url_clean(u); return err; }
int meta2_filter_action_create_container(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply) { (void) reply; struct m2v2_create_params_s params = {NULL,NULL,NULL,0}; struct meta2_backend_s *m2b = meta2_filter_ctx_get_backend(ctx); struct hc_url_s *url = meta2_filter_ctx_get_url(ctx); GError *err = NULL; int retry = 2; params.storage_policy = meta2_filter_ctx_get_param(ctx, NAME_MSGKEY_STGPOLICY); params.version_policy = meta2_filter_ctx_get_param(ctx, NAME_MSGKEY_VERPOLICY); params.local = (meta2_filter_ctx_get_param(ctx, NAME_MSGKEY_LOCAL) != NULL); gchar **headers = metautils_message_get_field_names (reply->request); GPtrArray *tmp = g_ptr_array_new (); for (gchar **p=headers; *p ;++p) { if (!g_str_has_prefix(*p, NAME_MSGKEY_PREFIX_PROPERTY)) continue; g_ptr_array_add (tmp, g_strdup((*p) + sizeof(NAME_MSGKEY_PREFIX_PROPERTY) - 1)); g_ptr_array_add (tmp, metautils_message_extract_string_copy (reply->request, *p)); } params.properties = (gchar**) metautils_gpa_to_array (tmp, TRUE); g_strfreev (headers); headers = NULL; retry: err = meta2_backend_create_container(m2b, url, ¶ms); if (err != NULL && err->code == CODE_REDIRECT && retry-- > 0 && !g_strcmp0(err->message, meta2_backend_get_local_addr(m2b))) { GRID_WARN("Redirecting on myself!?! Retrying request immediately"); g_clear_error(&err); hc_decache_reference_service(m2b->resolver, url, NAME_SRVTYPE_META2); goto retry; } g_strfreev (params.properties); params.properties = NULL; if (!err) return FILTER_OK; meta2_filter_ctx_set_error(ctx, err); return FILTER_KO; }
static void meta2_on_close(struct sqlx_sqlite3_s *sq3, gboolean deleted, gpointer cb_data) { gint64 seq = 1; EXTRA_ASSERT(sq3 != NULL); if (!deleted) return; struct oio_url_s *u = oio_url_empty (); oio_url_set (u, OIOURL_NS, PSRV(cb_data)->ns_name); if (!sqlx_name_extract ((struct sqlx_name_s*)&sq3->name, u, NAME_SRVTYPE_META2, &seq)) { GRID_WARN("Invalid base name [%s]", sq3->name.base); return; } hc_decache_reference_service(PSRV(cb_data)->resolver, u, NAME_SRVTYPE_META2); oio_url_pclean(&u); }
int meta2_filter_action_create_container(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply) { struct m2v2_create_params_s params = {NULL,NULL,NULL,0}; struct meta2_backend_s *m2b = meta2_filter_ctx_get_backend(ctx); struct oio_url_s *url = meta2_filter_ctx_get_url(ctx); GError *err = NULL; int retry = 2; params.storage_policy = meta2_filter_ctx_get_param(ctx, NAME_MSGKEY_STGPOLICY); params.version_policy = meta2_filter_ctx_get_param(ctx, NAME_MSGKEY_VERPOLICY); params.local = (meta2_filter_ctx_get_param(ctx, NAME_MSGKEY_LOCAL) != NULL); gsize len = 0; void *buf = metautils_message_get_BODY(reply->request, &len); err = KV_decode_buffer(buf, len, ¶ms.properties); if (err) { meta2_filter_ctx_set_error(ctx, err); return FILTER_KO; } while (!err) { if (!(err = meta2_backend_create_container(m2b, url, ¶ms))) break; if (err != NULL && err->code == CODE_REDIRECT && retry-- > 0 && !g_strcmp0(err->message, meta2_backend_get_local_addr(m2b))) { GRID_WARN( "Redirecting on myself!?! Retrying request immediately"); g_clear_error(&err); hc_decache_reference_service(m2b->resolver, url, NAME_SRVTYPE_META2); } } g_strfreev(params.properties); params.properties = NULL; if (!err) return FILTER_OK; meta2_filter_ctx_set_error(ctx, err); return FILTER_KO; }
enum http_rc_e action_dir_srv_force (struct req_args_s *args, struct json_object *jargs) { struct meta1_service_url_s *m1u = NULL; const gchar *type = TYPE(); if (!type) return _reply_format_error (args, NEWERROR(CODE_BAD_REQUEST, "No service type provided")); gboolean force = _request_has_flag (args, PROXYD_HEADER_MODE, "replace"); gboolean autocreate = _request_has_flag (args, PROXYD_HEADER_MODE, "autocreate"); GError *hook (const gchar * m1) { struct addr_info_s m1a; if (!grid_string_to_addrinfo (m1, NULL, &m1a)) return NEWERROR (CODE_NETWORK_ERROR, "Invalid M1 address"); GError *e = NULL; gchar *packed = meta1_pack_url (m1u); meta1v2_remote_force_reference_service (&m1a, &e, args->url, packed, autocreate, force); g_free (packed); return e; } GError *err = meta1_service_url_load_json_object (jargs, &m1u); if (!err) err = _m1_locate_and_action (args, hook); if (m1u) { meta1_service_url_clean (m1u); m1u = NULL; } if (!err || CODE_IS_NETWORK_ERROR(err->code)) { /* Also decache on timeout, a majority of request succeed, * and it will probably silently succeed */ hc_decache_reference_service (resolver, args->url, type); } if (err) return _reply_common_error (args, err); return _reply_success_json (args, NULL); }