gs_status_t gs_delete_services_for_paths(gs_container_t * container, const char *srvtype, char **paths, char ***really_removed, gs_service_t ***services_used, gs_error_t ** err) { status_t rc; char **path; struct metacnx_ctx_s ctx; GError *gerr; GSList *removed, *to_be_removed, *used; if (!container || !paths) { GSERR_EINVAL(err); if (really_removed) *really_removed = NULL; return GS_ERROR; } gerr = NULL; removed = to_be_removed = used = NULL; for (path=paths; *path ;path++) to_be_removed = g_slist_prepend(to_be_removed,*path); init_cnx_with_container(&ctx,container); rc = meta2_remote_service_delete_contents(&ctx, C0_ID(container), srvtype, to_be_removed, &removed, &used, &gerr); if (!rc) metacnx_close(&ctx); merge_cnx_in_container(&ctx,container); g_slist_free(to_be_removed); if (!rc) { GSERRORCAUSE(err,gerr,"Failed to remove (at least one of) the pahs"); if (really_removed) *really_removed = NULL; if (services_used) *services_used = NULL; } else { if (really_removed) *really_removed = strlist_make_deep_copy(removed); if (services_used) *services_used = addrlist_make_service_array(used, srvtype, container); } if (gerr) g_error_free(gerr); if (removed) { g_slist_foreach(removed,g_free1,NULL); g_slist_free(removed); } if (used) { g_slist_foreach(used,g_free1,NULL); g_slist_free(used); } return rc ? GS_OK : GS_ERROR; }
static void _update_master(gs_container_t *c, char *master) { if(!master) return; gs_update_meta1_master(c->info.gs, C0_ID(c), master); g_free(master); }
gs_service_t * gs_choose_service_for_paths(gs_container_t * container, const char *srvtype, char **paths, gs_error_t ** err) { char **path; GSList *paths_list; GError *gerr; struct service_info_s *si; struct metacnx_ctx_s ctx; if (!container || !paths || !*paths) { GSERR_EINVAL(err); return NULL; } /*make the request on a path list, then free the list*/ paths_list = NULL; for (path=paths; *path ;path++) paths_list = g_slist_prepend(paths_list,*path); gerr = NULL; init_cnx_with_container(&ctx,container); si = meta2_remote_service_add_contents(&ctx, C0_ID(container), srvtype, paths_list, &gerr); if (!si) metacnx_close(&ctx); merge_cnx_in_container(&ctx,container); g_slist_free(paths_list); if (!si) { GSERRORCAUSE(err,gerr,"Failed to add at least one of the paths"); if (gerr) g_error_free(gerr); return NULL; } /*Wrap the service_info_s in gs_service_t*/ return _make_service_from_srvinfo(container, si); }
static gs_error_t* _m2_touch(struct hc_url_s *hcurl, guint32 flags) { GError* err = NULL; gs_error_t* gserr = NULL; gs_container_t* cid = NULL; gs_grid_storage_t* hc = NULL; GSList* m2list = NULL; addr_info_t* m2addr = NULL; char str_addr[STRLEN_ADDRINFO] = ""; const char* ns = NULL; const char* content = NULL; const char* container_name = NULL; ns = hc_url_get(hcurl, HCURL_NS); container_name = hc_url_get(hcurl, HCURL_REFERENCE); content = hc_url_get(hcurl, HCURL_PATH); /* init grid client */ if ((ns==NULL) || (strlen(ns)==0)) { GSERRORCODE(&gserr, -1, "Invalid namespace"); return gserr; } hc = gs_grid_storage_init(ns, &gserr); if (!hc) { return gserr; } /* init container_id */ if ((container_name==NULL) || (strlen(container_name)==0)) { GSERRORCODE(&gserr, -1, "Invalid container_name"); return gserr; } cid = gs_init_container(hc, container_name, FALSE, &gserr); if (!gserr) { if (!cid) { gs_grid_storage_free(hc); GSERRORCODE(&gserr, -1, "Invalid container_name %s/%s", ns, container_name); return gserr; } } else return gserr; /* search meta2 master */ m2list = gs_resolve_meta2(hc, C0_ID(cid), &err); if (!m2list) { GSERRORCODE(&gserr, -1, "Meta2 Resolution error for NAME=[%s] ID=[%s]", C0_NAME(cid), C0_IDSTR(cid)); if (cid) gs_container_free (cid); gs_grid_storage_free(hc); return gserr; } m2addr = (addr_info_t*) m2list->data; addr_info_to_string (m2addr, str_addr, sizeof(str_addr)); /* execute touch command */ if (content && strlen(content)>0) err = m2v2_remote_touch_content(str_addr, NULL, hcurl); else err = m2v2_remote_touch_container_ex(str_addr, NULL, hcurl, flags); /* an error occurs ? */ if (err) { GSERRORCAUSE(&gserr, err, "Failed to execute touch command"); g_clear_error(&err); } gs_grid_storage_free(hc); if (cid) gs_container_free (cid); return gserr; }