Exemple #1
0
gboolean
sqlx_name_extract (struct sqlx_name_s *n, struct hc_url_s *url,
		const char *srvtype, gint64 *pseq)
{
	SQLXNAME_CHECK(n);
	EXTRA_ASSERT (url != NULL);
	EXTRA_ASSERT (srvtype != NULL);
	EXTRA_ASSERT (pseq != NULL);

	int rc = 0;
	gchar **tokens;

	if (NULL != (tokens = g_strsplit (n->type, ".", 2))) {
		if (tokens[0])
			rc = !strcmp(tokens[0], srvtype);
		hc_url_set (url, HCURL_TYPE, tokens[1] ? tokens[1] : HCURL_DEFAULT_TYPE);
		g_strfreev (tokens);
	}

	if (NULL != (tokens = g_strsplit (n->base, ".", 2))) {
		if (tokens[0])
			hc_url_set (url, HCURL_HEXID, tokens[0]);
		*pseq = tokens[1] ? g_ascii_strtoll (tokens[1], NULL, 10) : 1;
		g_strfreev (tokens);
	}

	return BOOL(rc);
}
static struct hc_url_s *
_forge_url(struct meta1_backend_s *m1, const char *vns, const char *hexid)
{
	struct hc_url_s *url = hc_url_empty();
	if(vns) {
		hc_url_set(url, HCURL_NS, vns);
	} else {
		char *ns = meta1_backend_get_ns_name(m1);
		hc_url_set(url, HCURL_NS, ns);
		g_free(ns);
	}
	hc_url_set(url, HCURL_HEXID, hexid);

	return url;
}
static void
wrapper(void (*cb)(void))
{
	gboolean rc = FALSE;
	GError *err = NULL;

	g_printerr("\n");
	hc_url_set(url, HCURL_REFERENCE, next_name("container"));
	hc_url_set(url, HCURL_PATH, next_name("content"));
	g_debug("ROUND with [%s] %s", hc_url_get(url, HCURL_HEXID),
			hc_url_get(url, HCURL_WHOLE));

	rc = meta2_remote_container_create(&addr, timeout, &err, hc_url_get_id(url),
			hc_url_get(url, HCURL_REFERENCE));
	CHECK_RC_ERR(rc, err, "CREATE");

	if (cb)
		cb();
}
Exemple #4
0
	gs_error_t*
hcadmin_meta1_policy_update(char *ns,gchar *action, gboolean checkonly, gchar **globalresult, gchar ***result, char ** args)
{
	gs_error_t    *err     = NULL;
	GPtrArray     *gpa     = NULL;
	gchar         *m1pAction  = NULL;
	struct global_cpt_s *cpts = NULL;
	gchar         *excludesrv = NULL;
	gchar         *srvtype = "meta2";
	gchar         *hexID   = NULL;
	GError        *gerr    = NULL;
	container_id_t cid;
	gchar        **tmp     = NULL;

	if ((!args) || ( g_strv_length(args) == 0)) {
		GSERRORCODE(&err,500, "Invalid argument list\n");
		goto failed;
	}

	// extract ID
    hexID = args[0];

	// extract specific arg / action type
	if ( g_strcmp0(action, "meta1_policy_apply") == 0) {
		m1pAction = g_strdup_printf("UPDATE");
		if ( g_strv_length(args) > 1 )
			if (strlen(args[1]) > 0)
	            srvtype = args[1];

	} else if ( g_strcmp0(action, "meta1_policy_exclude") == 0 ) {
		m1pAction = g_strdup_printf("EXCLUDE");
		if ( g_strv_length(args) > 1 )
			excludesrv = args[1];
		else {
			GSERRORCODE(&err, 500, "Missing service url \n");
		}
	} else {	
		GSERRORCODE(&err, 500, "INVALID meta1 policy action %s\n",action);
	}
	if (err)
		goto failed;

	if ( g_strcmp0(hexID,"ALL") == 0) {
		guint idx;
		struct thread_user_data_s *user_data = NULL;
		GThreadPool *pool = NULL;
		cpts = g_malloc0(sizeof(struct global_cpt_s));
		user_data = g_malloc0(sizeof(struct thread_user_data_s));
		user_data->ns = ns;
		user_data->action = m1pAction;
		user_data->type = g_strdup_printf(srvtype);
		user_data->excludesrv = excludesrv;
		user_data->checkonly = checkonly;
		user_data->lock = g_mutex_new();
		user_data->indexreach=0;
		user_data->cpts = cpts;
		user_data->gpa = NULL;
		pool = g_thread_pool_new (_m1policy_update_thread,user_data,10,TRUE,&gerr);
		for ( idx=0; idx<65536 ;idx++) {
			gchar base[5];
			guint8 *prefix=(guint8 *)(&idx);
			g_snprintf(base, sizeof(base), "%02X%02X",
					prefix[0], prefix[1]);
			g_thread_pool_push(pool, g_strdup(base) ,&gerr);
			if ( gerr != NULL ) {
				GRID_WARN("Failed to push new data thread %d, %d %s",idx,gerr->code,gerr->message);
				g_clear_error(&gerr);
				gerr = NULL;
			}
		}
		guint lastindex = 0;
		while(1) {
			if ( user_data->indexreach - lastindex > 500) {
				lastindex = user_data->indexreach;
				GRID_INFO("%d prefix checked",user_data->indexreach);
			}
			if ( user_data->indexreach >= 65536 )
				break;
			usleep(1000000);
		}
		if ( excludesrv && excludesrv[0] ) {
			struct hc_url_s *url = NULL;
			url = hc_url_empty();
			hc_url_set(url,HCURL_NS,ns);
			m2v2_remote_execute_EXITELECTION(excludesrv,NULL,url);
			hc_url_clean(url);
		}
		g_thread_pool_free(pool, FALSE, TRUE);
		g_mutex_free(user_data->lock);
		g_free(user_data);
		gpa = user_data->gpa;

	} else {
		// prefix ??
		if ( strlen(hexID) == 4 ) {
			if(!hex2bin(hexID, cid, 2, &gerr)) {
				GSERRORCAUSE(&err, gerr, "Invalid prefix\n");
				goto failed;
			}
			err = _m1policy_update(m1pAction,ns,TRUE,cid, srvtype, excludesrv, checkonly, &tmp);
			_pack_result(&gpa,hexID,tmp,err,NULL);
			if ( err ) {
				gs_error_free(err);
				err = NULL;
			} else {
				if ( excludesrv && excludesrv[0] ) {
					struct hc_url_s *url = NULL;
					url = hc_url_empty();
					hc_url_set(url,HCURL_NS,ns);
					m2v2_remote_execute_EXITELECTION(excludesrv,NULL,url);
					hc_url_clean(url);
				}
			}

		// CID ??
		} else if (strlen(hexID) == 64 ) {
			if (!hex2bin(hexID, cid, sizeof(container_id_t), &gerr)) {
				GSERRORCAUSE(&err, gerr, "Invalid container_id\n");
				goto failed;
			}
			err = _m1policy_update(m1pAction,ns,FALSE,cid, srvtype, excludesrv, checkonly, &tmp);
			_pack_result(&gpa,hexID,tmp,err,NULL);
			if ( err ) {
				gs_error_free(err);
				err = NULL;
			} else {
				if ( excludesrv && excludesrv[0] ) {
					struct hc_url_s *url = NULL;
					url = hc_url_empty();
					hc_url_set(url,HCURL_NS,ns);
					hc_url_set(url,HCURL_HEXID,hexID);
					m2v2_remote_execute_EXITELECTION(excludesrv,NULL,url);
					hc_url_clean(url);
				}
			}

		// other ? --> error
		} else {
			GSERRORCODE(&err,500,"invalid ID %s, %d \n",hexID, sizeof(hexID));
		}
	}

	// free all memory
	if ( gerr)
		g_clear_error(&gerr);

	if ( gpa ) {
		g_ptr_array_add(gpa, NULL);
		if ( cpts ) {
			*globalresult = g_strdup_printf("Global result : References checked %lu , updated %lu , failed %lu",cpts->checkedRef,cpts->updatedRef,cpts->failedRef);
		}
		*result = (gchar**)g_ptr_array_free(gpa,FALSE);
	}
	if ( tmp )
		g_strfreev (tmp);
	if ( cpts )
		g_free(cpts);

failed :
	if (m1pAction)
		g_free(m1pAction);

	return err;
}