static void test_configure_valid (void) { static struct test_data_s tab[] = { { "/NS/ACCT/JFS", "NS/ACCT/JFS/", "NS", "ACCT", "JFS", OIOURL_DEFAULT_TYPE, NULL, "9006CE70B59E5777D6BB410C57944812EB05FCDB5BA85D520A14B3051D1D094F"}, { "NS/ACCT/JFS//1.", "NS/ACCT/JFS//1.", "NS", "ACCT", "JFS", OIOURL_DEFAULT_TYPE, "1.", "9006CE70B59E5777D6BB410C57944812EB05FCDB5BA85D520A14B3051D1D094F"}, TEST_END }; guint idx = 0; for (struct test_data_s *th=tab; th->url ;th++) { struct oio_url_s *url; url = oio_url_init(th->url); g_assert(url != NULL); _test_url (idx++, url, th); oio_url_pclean (&url); url = _init_url (th); g_assert(url != NULL); _test_url (idx++, url, th); oio_url_pclean (&url); } }
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; }
/* Plays rounds of allocations/librations on partial URL */ static void test_dup (void) { struct oio_url_s *u0 = oio_url_empty (); oio_url_set (u0, OIOURL_NS, "NS"); _round_dup_cleanup (u0); oio_url_set (u0, OIOURL_ACCOUNT, "ACCT"); _round_dup_cleanup (u0); oio_url_set (u0, OIOURL_USER, "JFS"); _round_dup_cleanup (u0); (void) oio_url_get_id (u0); (void) oio_url_get_id_size (u0); _round_dup_cleanup (u0); oio_url_set (u0, OIOURL_TYPE, "mail"); _round_dup_cleanup (u0); oio_url_set (u0, OIOURL_PATH, "path"); _round_dup_cleanup (u0); oio_url_set (u0, OIOURL_CONTENTID, "XYZT"); _round_dup_cleanup (u0); oio_url_set (u0, OIOURL_CONTENTID, "0000"); _round_dup_cleanup (u0); oio_url_set (u0, OIOURL_VERSION, "0"); _round_dup_cleanup (u0); oio_url_pclean (&u0); }
static gboolean meta1_dispatch_v2_SRVRELINK(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored) { GError *err = NULL; gchar *replaced = NULL, *kept = NULL, **newset = NULL; struct oio_url_s *url = NULL; (void) ignored; url = metautils_message_extract_url (reply->request); kept = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_OLD); replaced = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_NOTIN); gboolean dryrun = metautils_message_extract_flag (reply->request, NAME_MSGKEY_DRYRUN, FALSE); reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); if (!url) { reply->send_error (0, NEWERROR(CODE_BAD_REQUEST, "Missing field (%s)", "url")); } else { err = meta1_backend_services_relink (m1, url, kept, replaced, dryrun, &newset); if (NULL != err) { reply->send_error (0, err); } else { reply->add_body(marshall_stringv_and_clean(&newset)); reply->send_reply (CODE_FINAL_OK, "OK"); } } oio_url_pclean (&url); g_free0 (kept); g_free0 (replaced); if (newset) g_strfreev (newset); return TRUE; }
static enum http_rc_e handler_action (struct http_request_s *rq, struct http_reply_ctx_s *rp) { // Get a request id for the current request const gchar *reqid = g_tree_lookup (rq->tree_headers, PROXYD_HEADER_REQID); if (reqid) oio_ext_set_reqid(reqid); else oio_ext_set_random_reqid(); // Then parse the request to find a handler struct oio_url_s *url = NULL; struct oio_requri_s ruri = {NULL, NULL, NULL, NULL}; oio_requri_parse (rq->req_uri, &ruri); struct path_matching_s **matchings = _metacd_match (rq->cmd, ruri.path); GRID_TRACE2("URI path[%s] query[%s] fragment[%s] matches[%u]", ruri.path, ruri.query, ruri.fragment, g_strv_length((gchar**)matchings)); GQuark gq_count = gq_count_unexpected; GQuark gq_time = gq_time_unexpected; enum http_rc_e rc; if (!*matchings) { rp->set_content_type ("application/json"); rp->set_body_gstr (g_string_new("{\"status\":404,\"message\":\"No handler found\"}")); rp->set_status (HTTP_CODE_NOT_FOUND, "No handler found"); rp->finalize (); rc = HTTPRC_DONE; } else { struct req_args_s args = {0}; args.req_uri = &ruri; args.matchings = matchings; args.rq = rq; args.rp = rp; args.url = url = _metacd_load_url (&args); rp->subject(oio_url_get(url, OIOURL_HEXID)); gq_count = (*matchings)->last->gq_count; gq_time = (*matchings)->last->gq_time; GRID_TRACE("%s %s URL %s", __FUNCTION__, ruri.path, oio_url_get(args.url, OIOURL_WHOLE)); req_handler_f handler = (*matchings)->last->u; rc = (*handler) (&args); } gint64 spent = oio_ext_monotonic_time () - rq->client->time.evt_in; network_server_stat_push4 (rq->client->server, TRUE, gq_count, 1, gq_count_all, 1, gq_time, spent, gq_time_all, spent); path_matching_cleanv (matchings); oio_requri_clear (&ruri); oio_url_pclean (&url); oio_ext_set_reqid (NULL); return rc; }
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); }
static void _test_reference_cycle_round (void) { GError *err = NULL; struct oio_url_s *url = oio_url_empty (); _random_url (url); struct oio_directory_s *dir = oio_directory__create_proxy (ns); g_assert_nonnull (dir); /* link with no reference */ gchar **srvtab = NULL; err = oio_directory__link (dir, url, NAME_SRVTYPE_META2, FALSE, &srvtab); g_assert_error (err, GQ(), CODE_USER_NOTFOUND); g_assert_null (srvtab); g_clear_error (&err); /* create */ err = oio_directory__create (dir, url); g_assert_no_error (err); /* link with a reference */ err = oio_directory__link (dir, url, NAME_SRVTYPE_META2, FALSE, &srvtab); g_assert_no_error (err); g_assert_nonnull (srvtab); g_strfreev (srvtab); /* list */ gchar **dirtab = NULL; err = oio_directory__list (dir, url, NAME_SRVTYPE_META2, &dirtab, &srvtab); g_assert_no_error (err); g_assert_nonnull (dirtab); g_assert_nonnull (srvtab); g_strfreev (dirtab); g_strfreev (srvtab); oio_url_pclean (&url); oio_directory__destroy (dir); }
static struct oio_error_s * _roundtrip_common (struct oio_sds_s *client, struct oio_url_s *url, const char *path) { struct file_info_s fi, fi0; struct oio_error_s *err = NULL; int has = 0; err = (struct oio_error_s*) _checksum_file (path, &fi0); MAYBERETURN(err, "Checksum error (original): "); gchar tmppath[256] = ""; g_snprintf (tmppath, sizeof(tmppath), "/tmp/test-roundtrip-%d-%lu-", getpid(), time(0)); _append_random_chars (tmppath, random_chars, 16); gchar content_id[65] = ""; _append_random_chars (content_id, hex_chars, 64); GRID_INFO ("Roundtrip on local(%s) distant(%s) content_id(%s)", tmppath, oio_url_get (url, OIOURL_WHOLE), content_id); /* Check the content is not preset yet */ err = oio_sds_has (client, url, &has); if (!err && has) err = (struct oio_error_s*) NEWERROR(0,"content already present"); MAYBERETURN(err, "Check error"); GRID_INFO("Content absent as expected"); /* Then upload it */ struct oio_sds_ul_src_s ul_src = { .type = OIO_UL_SRC_FILE, .data = { .file = { .path = path, .offset = 0, .size = 0, }, }, }; struct oio_sds_ul_dst_s ul_dst = { .url = url, .autocreate = 1, .out_size = 0, .content_id = content_id, }; err = oio_sds_upload (client, &ul_src, &ul_dst); MAYBERETURN(err, "Upload error"); GRID_INFO("Content uploaded"); /* Check it is now present */ has = 0; err = oio_sds_has (client, url, &has); if (!err && !has) err = (struct oio_error_s*) NEWERROR(0, "content not found"); MAYBERETURN(err, "Check error"); GRID_INFO("Content present as expected"); /* Get it to validate the content is accessible */ err = oio_sds_download_to_file (client, url, tmppath); MAYBERETURN(err, "Download error"); GRID_INFO("Content downloaded to a file"); /* Validate the original and the copy match */ err = (struct oio_error_s*) _checksum_file (tmppath, &fi); MAYBERETURN(err, "Checksum error (copy): "); if (fi.fs != fi0.fs) MAYBERETURN(NEWERROR(0, "Copy sizes mismatch"), "Validation error"); if (0 != memcmp(fi.h, fi0.h, fi.hs)) MAYBERETURN(NEWERROR(0, "Copy hash mismatch"), "Validation error"); GRID_INFO("The original file and its copy match"); /* Get it an other way in a buffer. */ guint8 buf[1024]; struct oio_sds_dl_dst_s dl_dst = { .type = OIO_DL_DST_BUFFER, .data = {.buffer = {.ptr = buf, .length=1024}} }; struct oio_sds_dl_src_s dl_src = { .url = url, .ranges = NULL, }; err = oio_sds_download (client, &dl_src, &dl_dst); MAYBERETURN(err, "Download error"); GRID_INFO("Content downloaded to a buffer"); /* link the container */ struct oio_url_s *url1 = oio_url_dup (url); oio_url_set (url1, OIOURL_PATH, tmppath); err = oio_sds_link (client, url1, content_id); oio_url_pclean (&url1); MAYBERETURN(err, "Link error: "); /* List the container, the content must appear */ struct oio_sds_list_param_s list_in = { .url = url, .prefix = NULL, .marker = NULL, .end = NULL, .delimiter = 0, .flag_allversions = 0, .flag_nodeleted = 0, }; struct oio_sds_list_listener_s list_out = { .ctx = NULL, .on_item = _on_item, .on_prefix = NULL, .on_bound = NULL, }; err = oio_sds_list (client, &list_in, &list_out); MAYBERETURN(err, "List error"); /* Remove the content from the content */ err = oio_sds_delete (client, url); MAYBERETURN(err, "Delete error"); GRID_INFO("Content removed"); /* Check the content is not preset anymore */ has = 0; err = oio_sds_has (client, url, &has); if (!err && has) err = (struct oio_error_s*) NEWERROR(0, "content still present"); MAYBERETURN(err, "Check error"); GRID_INFO("Content absent as expected"); g_remove (tmppath); oio_error_pfree (&err); return NULL; } static struct oio_error_s * _roundtrip_autocontainer (struct oio_sds_s *client, struct oio_url_s *url, const char *path) { struct file_info_s fi; GError *err = _checksum_file (path, &fi); /* compute the autocontainer with the SHA1, consider only the first 17 bits */ struct oio_str_autocontainer_config_s cfg = { .src_offset = 0, .src_size = 0, .dst_bits = 17, }; char tmp[65]; const char *auto_container = oio_str_autocontainer_hash (fi.h, fi.hs, tmp, &cfg); /* build a new URL with the computed container name */ struct oio_url_s *url_auto = oio_url_dup (url); oio_url_set (url_auto, OIOURL_USER, auto_container); err = (GError*) _roundtrip_common (client, url_auto, path); oio_url_pclean (&url_auto); return (struct oio_error_s*) err; } int main(int argc, char **argv) { oio_log_to_stderr(); oio_sds_default_autocreate = 1; for (int i=0; i<4 ;i++) oio_log_more (); prng = g_rand_new (); if (argc != 2) { g_printerr ("Usage: %s PATH\n", argv[0]); return 1; } const char *path = argv[1]; struct oio_url_s *url = oio_url_empty (); oio_url_set (url, OIOURL_NS, g_getenv("OIO_NS")); oio_url_set (url, OIOURL_ACCOUNT, g_getenv("OIO_ACCOUNT")); oio_url_set (url, OIOURL_USER, g_getenv("OIO_USER")); oio_url_set (url, OIOURL_PATH, g_getenv("OIO_PATH")); if (!oio_url_has_fq_path(url)) { g_printerr ("Partial URL [%s]: requires a NS (%s), an ACCOUNT (%s)," " an USER (%s) and a PATH (%s)\n", oio_url_get (url, OIOURL_WHOLE), oio_url_has (url, OIOURL_NS)?"ok":"missing", oio_url_has (url, OIOURL_ACCOUNT)?"ok":"missing", oio_url_has (url, OIOURL_USER)?"ok":"missing", oio_url_has (url, OIOURL_PATH)?"ok":"missing"); return 3; } GRID_INFO("URL valid [%s]", oio_url_get (url, OIOURL_WHOLE)); struct oio_sds_s *client = NULL; struct oio_error_s *err = NULL; /* Initiate a client */ err = oio_sds_init (&client, oio_url_get(url, OIOURL_NS)); if (err) { g_printerr ("Client init error: (%d) %s\n", oio_error_code(err), oio_error_message(err)); return 4; } GRID_INFO("Client ready to [%s]", oio_url_get (url, OIOURL_NS)); err = _roundtrip_common (client, url, path); if (!err) err = _roundtrip_autocontainer (client, url, path); int rc = err != NULL; oio_error_pfree (&err); oio_sds_pfree (&client); oio_url_pclean (&url); return rc; }