int meta2_filter_action_deduplicate_container(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply) { GString *status_message = NULL; // M2V2_MODE_DRYRUN, ... guint32 flags = 0; const char *fstr = meta2_filter_ctx_get_param(ctx, M2_KEY_GET_FLAGS); if (NULL != fstr) flags = (guint32) g_ascii_strtoull(fstr, NULL, 10); GError *err = meta2_backend_deduplicate_contents( meta2_filter_ctx_get_backend(ctx), meta2_filter_ctx_get_url(ctx), flags, &status_message); reply->did_write = TRUE; if (!err) { if (status_message != NULL) reply->add_body(metautils_gba_from_string(status_message->str)); return FILTER_OK; } else { meta2_filter_ctx_set_error(ctx, err); return FILTER_KO; } }
int meta2_filter_action_purge_container(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply) { reply->did_write = TRUE; // M2V2_MODE_DRYRUN, ... guint32 flags = 0; struct on_bean_ctx_s *obc = _on_bean_ctx_init(ctx, reply); const char *fstr = meta2_filter_ctx_get_param(ctx, M2_KEY_GET_FLAGS); if (NULL != fstr) flags = (guint32) g_ascii_strtoull(fstr, NULL, 10); GError *err = meta2_backend_purge_container( meta2_filter_ctx_get_backend(ctx), meta2_filter_ctx_get_url(ctx), flags, _get_cb, obc); if (NULL != err) { GRID_DEBUG("Container purge failed (%d): %s", err->code, err->message); meta2_filter_ctx_set_error(ctx, err); return FILTER_KO; } _on_bean_ctx_send_list(obc, TRUE); _on_bean_ctx_clean(obc); return FILTER_OK; }
static int _meta2_filter_check_ns_name(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply, int optional) { (void) reply; TRACE_FILTER(); const struct meta2_backend_s *backend = meta2_filter_ctx_get_backend(ctx); const char *req_ns = oio_url_get(meta2_filter_ctx_get_url(ctx), OIOURL_NS); if (!backend || !backend->ns_name[0]) { GRID_DEBUG("Missing information for namespace checking"); meta2_filter_ctx_set_error(ctx, NEWERROR(CODE_INTERNAL_ERROR, "Missing backend information, cannot check namespace")); return FILTER_KO; } if (!req_ns) { if (optional) return FILTER_OK; GRID_DEBUG("Missing namespace name in request"); meta2_filter_ctx_set_error(ctx, NEWERROR(CODE_BAD_REQUEST, "Bad Request: Missing namespace name information")); return FILTER_KO; } if (0 != g_ascii_strcasecmp(backend->ns_name, req_ns)) { meta2_filter_ctx_set_error(ctx, NEWERROR(CODE_BAD_REQUEST, "Request namespace [%s] does not match server namespace [%s]", req_ns, backend->ns_name)); return FILTER_KO; } return FILTER_OK; }
static int _list_NORMAL(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply, struct list_params_s *lp) { GError *e = NULL; struct meta2_backend_s *m2b = meta2_filter_ctx_get_backend(ctx); struct hc_url_s *url = meta2_filter_ctx_get_url(ctx); struct on_bean_ctx_s *obc = _on_bean_ctx_init(ctx, reply); if (hc_url_has(url, HCURL_SNAPSHOT)) { lp->snapshot_name = hc_url_get(url, HCURL_SNAPSHOT); } else if (hc_url_has(url, HCURL_VERSION)) { lp->snapshot_name = hc_url_get(url, HCURL_VERSION); } e = meta2_backend_list_aliases(m2b, url, lp, _get_cb, obc); if (NULL != e) { GRID_DEBUG("Fail to return alias for url: %s", hc_url_get(url, HCURL_WHOLE)); _on_bean_ctx_clean(obc); meta2_filter_ctx_set_error(ctx, e); return FILTER_KO; } _on_bean_ctx_send_list(obc, TRUE); _on_bean_ctx_clean(obc); return FILTER_OK; }
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 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; }
static int _meta2_filter_check_ns_name(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply, int optional) { (void) reply; TRACE_FILTER(); const struct meta2_backend_s *backend = meta2_filter_ctx_get_backend(ctx); const char *req_ns = oio_url_get(meta2_filter_ctx_get_url(ctx), OIOURL_NS); if (!backend || !backend->ns_name[0]) { GRID_DEBUG("Missing information for namespace checking"); meta2_filter_ctx_set_error(ctx, SYSERR("backend not ready")); return FILTER_KO; } if (!req_ns) { if (optional) return FILTER_OK; GRID_DEBUG("Missing namespace name in request"); meta2_filter_ctx_set_error(ctx, BADREQ("No namespace")); return FILTER_KO; } if (0 != g_ascii_strcasecmp(backend->ns_name, req_ns)) { meta2_filter_ctx_set_error(ctx, BADNS()); return FILTER_KO; } return FILTER_OK; }
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; }
int meta2_filter_check_url_cid (struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply) { (void) reply; struct oio_url_s *url = meta2_filter_ctx_get_url(ctx); TRACE_FILTER(); if (url && oio_url_has(url, OIOURL_HEXID)) return FILTER_OK; meta2_filter_ctx_set_error (ctx, NEWERROR(CODE_BAD_REQUEST, "No/partial URL")); return FILTER_KO; }
int meta2_filter_check_url_cid (struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply) { (void) reply; struct oio_url_s *url = meta2_filter_ctx_get_url(ctx); TRACE_FILTER(); if (url && oio_url_has(url, OIOURL_HEXID)) return FILTER_OK; meta2_filter_ctx_set_error (ctx, BADREQ("Invalid URL")); return FILTER_KO; }
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; }
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; }
static int _list_S3(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply, struct list_params_s *lp, GSList *headers) { GError *e = NULL; struct meta2_backend_s *m2b = meta2_filter_ctx_get_backend(ctx); struct hc_url_s *url = meta2_filter_ctx_get_url(ctx); struct on_bean_ctx_s *obc = _on_bean_ctx_init(ctx, reply); gboolean truncated = FALSE; char *next_marker = NULL; gchar **properties = NULL; if (lp->maxkeys <= 0) lp->maxkeys = OIO_M2V2_LISTRESULT_BATCH; GRID_DEBUG("LP H:%d A:%d D:%d prefix:%s marker:%s end:%s max:%"G_GINT64_FORMAT, lp->flag_headers, lp->flag_allversion, lp->flag_nodeleted, lp->prefix, lp->marker_start, lp->marker_end, lp->maxkeys); // XXX the underlying meta2_backend_list_aliases() function MUST // return headers before the associated alias. gint64 max = lp->maxkeys; void s3_list_cb(gpointer ignored, gpointer bean) { (void) ignored; if (max > 0) { if (DESCR(bean) == &descr_struct_ALIASES) { _bean_list_cb(&obc->l, bean); if (0 == --max) next_marker = g_strdup(ALIASES_get_alias(bean)->str); } else { _bean_list_cb(&obc->l, bean); } } else { if (DESCR(bean) == &descr_struct_ALIASES) truncated = TRUE; _bean_clean(bean); } }
int meta2_filter_action_delete_container(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply) { guint32 flags = 0; flags |= meta2_filter_ctx_get_param(ctx, NAME_MSGKEY_FORCE) ? M2V2_DESTROY_FORCE : 0; flags |= meta2_filter_ctx_get_param(ctx, NAME_MSGKEY_FLUSH) ? M2V2_DESTROY_FLUSH : 0; flags |= meta2_filter_ctx_get_param(ctx, NAME_MSGKEY_PURGE) ? M2V2_DESTROY_PURGE : 0; flags |= meta2_filter_ctx_get_param(ctx, NAME_MSGKEY_LOCAL) ? M2V2_DESTROY_LOCAL : 0; GError *err = meta2_backend_destroy_container( meta2_filter_ctx_get_backend(ctx), meta2_filter_ctx_get_url(ctx), flags); (void) reply; if (!err) return FILTER_OK; meta2_filter_ctx_set_error(ctx, err); return FILTER_KO; }
int meta2_filter_action_delete_container(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply) { guint32 flags = 0; flags |= meta2_filter_ctx_get_param(ctx, "FORCE") ? M2V2_DESTROY_FORCE : 0; flags |= meta2_filter_ctx_get_param(ctx, "FLUSH") ? M2V2_DESTROY_FLUSH : 0; flags |= meta2_filter_ctx_get_param(ctx, "PURGE") ? M2V2_DESTROY_PURGE : 0; flags |= meta2_filter_ctx_get_param(ctx, "LOCAL") ? M2V2_DESTROY_LOCAL : 0; GError *err = meta2_backend_destroy_container( meta2_filter_ctx_get_backend(ctx), meta2_filter_ctx_get_url(ctx), flags); reply->did_write = TRUE; if (!err) return FILTER_OK; meta2_filter_ctx_set_error(ctx, err); return FILTER_KO; }
static int _list_S3(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply, struct list_params_s *lp) { GError *e = NULL; struct meta2_backend_s *m2b = meta2_filter_ctx_get_backend(ctx); struct hc_url_s *url = meta2_filter_ctx_get_url(ctx); struct on_bean_ctx_s *obc = _on_bean_ctx_init(ctx, reply); GSList *common_prefixes = NULL; gint64 max = 0; gboolean truncated = FALSE; char *next_marker = NULL; GRID_DEBUG("S3 LISTING"); lp->type = S3; lp->flags = lp->flags | M2V2_FLAG_HEADERS; lp->params.s3.prefix = meta2_filter_ctx_get_param(ctx, M2_KEY_PREFIX); lp->params.s3.marker = meta2_filter_ctx_get_param(ctx, M2_KEY_MARKER); lp->params.s3.delimiter = meta2_filter_ctx_get_param(ctx, M2_KEY_DELIMITER); const char *maxkeys_str = meta2_filter_ctx_get_param(ctx, M2_KEY_MAX_KEYS); if(NULL != maxkeys_str) lp->params.s3.maxkeys = g_ascii_strtoll(maxkeys_str, NULL, 10); lp->params.s3.maxkeys = (lp->params.s3.maxkeys > 0) ? lp->params.s3.maxkeys + 1 : 1001; max = lp->params.s3.maxkeys - 1; gboolean _is_directory(gpointer alias) { char *mtype = strstr(ALIASES_get_mdsys(alias)->str, "mime-type="); if (!mtype) return FALSE; return !g_ascii_strncasecmp("application/x-directory", mtype + 10, 23); }
void _on_bean_ctx_append_udata_list(struct on_bean_ctx_s *obc) { struct meta2_backend_s *m2b = meta2_filter_ctx_get_backend(obc->ctx); struct hc_url_s *url = meta2_filter_ctx_get_url(obc->ctx); struct event_config_s * evt_config = meta2_backend_get_event_config(m2b, hc_url_get(url, HCURL_NS)); if (event_is_enabled(evt_config) || event_is_notifier_enabled(evt_config)) { if (obc->first) { obc->first = FALSE; meta2_filter_ctx_set_input_udata(obc->ctx, obc->l, (GDestroyNotify)_bean_cleanl2); } else { meta2_filter_ctx_set_input_udata2(obc->ctx, g_slist_concat(obc->l, (GSList*)meta2_filter_ctx_get_input_udata(obc->ctx)), (GDestroyNotify) _bean_cleanl2, FALSE); } } else { GRID_TRACE("Events disabled, cleaning beans immediately"); _bean_cleanl2(obc->l); } }
} g_strfreev(params.properties); params.properties = NULL; if (!err) return FILTER_OK; meta2_filter_ctx_set_error(ctx, err); return FILTER_KO; } int meta2_filter_action_empty_container(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply UNUSED) { struct meta2_backend_s *m2b = meta2_filter_ctx_get_backend(ctx); struct oio_url_s *url = meta2_filter_ctx_get_url(ctx); GError *e = meta2_backend_container_isempty(m2b, url); if (NULL != e) { 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; } int meta2_filter_action_has_container(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply)