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 GError* _list (const char *target, GByteArray *request, struct list_result_s *out, gchar ***out_properties) { GError *err = NULL; GTree *props = NULL; gboolean _cb(gpointer ctx, MESSAGE reply) { (void) ctx; /* Extract replied aliases */ GSList *l = NULL; GError *e = metautils_message_extract_body_encoded(reply, FALSE, &l, bean_sequence_decoder); if (e) { GRID_DEBUG("Callback error : %s", e->message); err = e; return FALSE; } out->beans = metautils_gslist_precat (out->beans, l); /* Extract list flags */ e = metautils_message_extract_boolean (reply, NAME_MSGKEY_TRUNCATED, FALSE, &out->truncated); if (e) g_clear_error (&e); gchar *tok = NULL; tok = metautils_message_extract_string_copy (reply, NAME_MSGKEY_NEXTMARKER); oio_str_reuse (&out->next_marker, tok); /* Extract properties and merge them into the temporary TreeSet. */ if (out_properties) { gchar **names = metautils_message_get_field_names (reply); for (gchar **n=names ; n && *n ;++n) { if (!g_str_has_prefix (*n, NAME_MSGKEY_PREFIX_PROPERTY)) continue; g_tree_replace (props, g_strdup((*n) + sizeof(NAME_MSGKEY_PREFIX_PROPERTY) - 1), metautils_message_extract_string_copy(reply, *n)); } if (names) g_strfreev (names); } return TRUE; }
static gboolean field_extractor(GError **e, gpointer u, gint code, MESSAGE r) { (void) code; if (!r) { GSETERROR(e, "invalid parameter"); return FALSE; } gchar **fields = metautils_message_get_field_names (r); if (fields) { for (gchar **field=fields; *field ;field++) { gchar *str_val = NULL; gdouble val; if (!g_str_has_prefix(*field, MSGFIELD_STATPREFIX)) continue; if (!(str_val = metautils_message_extract_string_copy(r, *field))) continue; if (strchr(str_val, '.')) val = g_ascii_strtod (str_val, NULL); else { gint64 i64 = g_ascii_strtoll(str_val, NULL, 10); val = i64; } g_free(str_val); if (errno==ERANGE) { WARN("wrong stat for '%s' : overflow/underflow", *field); continue; } g_hash_table_insert(*((GHashTable**)u), g_strdup((*field) + strlen(MSGFIELD_STATPREFIX)), g_memdup(&val, sizeof(val))); } } g_strfreev(fields); return TRUE; }