Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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;
}