Ejemplo n.º 1
0
gs_content_t*
gs_container_get_content_from_raw(gs_grid_storage_t *client,
		struct meta2_raw_content_s *raw, gs_error_t **gserr)
{
	gchar str_hex[STRLEN_CONTAINERID];
	struct gs_container_location_s *location;
	gs_content_t *result = NULL;

	if (!client || !raw) {
		GSERRORSET(gserr, "Invalid parameter (%p %p)", client, raw);
		return NULL;
	}

	/* Now locates the content's container */
	container_id_to_string(raw->container_id, str_hex, sizeof(str_hex));
	location = gs_locate_container_by_hexid(client, str_hex, gserr);
	if (!location) {
		GSERRORSET(gserr, "Container reference not found for CID[%s]", str_hex);
		return NULL;
	}

	/* Container found, alright ... */

	result = calloc(1, sizeof(gs_content_t));
	if (!result) {
		gs_container_location_free(location);
		GSERRORCODE(gserr, ENOMEM, "Memory allocation failure");
		return NULL;
	}

	/* Initiates the content part */
	g_strlcpy(result->info.path, raw->path, MIN(sizeof(result->info.path)-1,sizeof(raw->path)));
	result->info.size = raw->size;
	map_content_from_raw(result, raw);

	/* Initiates the container part */
	result->info.container = gs_container_init_from_location(client, location, gserr);
	if (!result->info.container) {
		gs_container_location_free(location);
		gs_content_free(result);
		GSERRORCODE(gserr, ENOMEM, "Memory allocation failure");
		return NULL;
	}

	DEBUG("Resolved container ID[%s]", location->container_hexid);
	gs_container_location_free(location);
	return result;
}
Ejemplo n.º 2
0
gs_error_t * hcadmin_touch(char *url,gchar *action, gboolean checkonly, gchar **globalresult, gchar ***result, char ** args)
{
	gchar *option = NULL;
	guint32 flags = 0;
	gs_error_t *err = NULL;
	struct hc_url_s *hcurl = NULL;

	(void) action;
	(void) checkonly;
	(void) result;

	/* check poptionnal option*/
	if (args != NULL) {
		option = args[0];
		if ( g_strcmp0(option,"UPDATE_CSIZE") == 0) {
			flags = META2TOUCH_FLAGS_UPDATECSIZE;

		} else if ( g_strcmp0(option,"RECALC_CSIZE") == 0) {
			flags = META2TOUCH_FLAGS_RECALCCSIZE;

		} else {
			if ((option) && (strlen(option) > 0)) {
				GSERRORCODE(&err,-1,"invalid option %s\n", option);
				return err;
			}
		} 
	}

	/* check and convert NS/REF/PATH */
	if (!(hcurl = hc_url_init(url))) {
		GSERRORCODE(&err,-1,"invalid URL: %s\n", url);
		return err;
	}

	err = _m2_touch(hcurl, flags);
	if (!err) {
		*globalresult = g_strdup_printf("TOUCH done for %s", url);
	}
	hc_url_clean(hcurl);
	return err;
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 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;
}
Ejemplo n.º 5
0
static status_t
_get_container_global_property(gs_grid_storage_t *hc, struct metacnx_ctx_s *cnx, container_id_t cid,
			GHashTable **ht, gs_error_t **gserr)
{
	GSList *prop_list = NULL, *l = NULL;
	GError *gerr = NULL;

	// get all properties with current meta2
	if (!meta2_remote_list_all_container_properties(cnx, cid, &prop_list, &gerr)) {

		GSList     *m2_list = NULL;
		addr_info_t *addr    = NULL;
		GSList      *m2      = NULL;
		gchar       str_addr[STRLEN_ADDRINFO];
		struct metacnx_ctx_s cnxOther;
		gs_error_t  *e       = NULL;
		gboolean    bResult  = FALSE;

		// search all meta2 fo current contener
		m2_list = gs_resolve_meta2(hc, cid, &gerr);
		if (!m2_list) {
			GSERRORCAUSE(gserr, gerr, "Failed to get container admin entries, Cannot find meta2(s)");
			if (gerr)
				g_error_free(gerr);
			return 0;
		}

		// test each meta2...
		for (m2=m2_list; m2 ;m2=m2->next) {
			addr = m2->data;
			if (addr) {
				addr_info_to_string(addr, str_addr, sizeof(str_addr));
				DEBUG("Failed to get container admin entries -> test with next meta2 [%s]", str_addr);

				if (!_open_meta2_connection(&cnxOther, str_addr/*ctx->loc->m2_url[0]*/, &e)) {
					GSERRORCODE(gserr, e->code,
							"Failed to open connection to meta2 (%s)\n", str_addr);
					gs_error_free(e);
					continue;
				}

				if (!meta2_remote_list_all_container_properties(&cnxOther, cid, &prop_list, &gerr)) {
					_close_meta2_connection(&cnxOther);
					GSERRORCAUSE(gserr, gerr, "Failed to get container admin entries: %s\n",str_addr);
					continue;

				} else {
					_close_meta2_connection(&cnxOther);
					// no error
					bResult = TRUE;
					break;
				}
			}
		}

		if (m2_list) { 
			g_slist_foreach(m2_list, addr_info_gclean, NULL); 
			g_slist_free(m2_list); 
		}

		if (gerr)
			g_error_free(gerr);

		if (bResult == FALSE) 
			return 0;

	}

	// here: reading properties ok

	*ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
	for (l = prop_list; l && l->data; l = l->next) {
		gchar *tmp = l->data;
		gchar **tok = g_strsplit(tmp, "=", 2);
		if (tok[0] && tok[1])
			g_hash_table_insert(*ht, g_strdup(tok[0]), g_strdup(tok[1]));
		g_strfreev(tok);
	}
	g_slist_free_full(prop_list, g_free);

	/* Ensure we have some mandatory properties */
	if(!g_hash_table_lookup(*ht, M2V2_ADMIN_STORAGE_POLICY))
		g_hash_table_insert(*ht, g_strdup(M2V2_ADMIN_STORAGE_POLICY), g_strdup("namespace default"));
	if(!g_hash_table_lookup(*ht, M2V2_ADMIN_VERSIONING_POLICY))
		g_hash_table_insert(*ht, g_strdup(M2V2_ADMIN_VERSIONING_POLICY), g_strdup("namespace default"));
	if(!g_hash_table_lookup(*ht, M2V2_ADMIN_QUOTA))
		g_hash_table_insert(*ht, g_strdup(M2V2_ADMIN_QUOTA), g_strdup("namespace default"));

	return 1;
}