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(); }
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; }