示例#1
0
static service_info_t *
_find_matching_rawx(GSList *rawx, GSList *used_loc, gint64 distance,
		const gchar *stg_class, GSList **rawx_garbage)
{
	GRID_DEBUG("Searching rawx distant of %"G_GINT64_FORMAT
			" with storage class '%s'", distance, stg_class);
	GSList *l = NULL;
	gchar loc[1024];
	struct service_tag_s * loc_tag = NULL;
	GRID_DEBUG("Checking for an available rawx in a list of %d elements",
			g_slist_length(rawx));
	for (l = rawx; l && l->data; l = l->next) {
		GRID_DEBUG("Checking one rawx...");
		/* ensure service score */
		if(((service_info_t*)l->data)->score.value <= 0) {
			GRID_DEBUG("Rawx score <= 0");
			continue;
		}
		/* ensure not spotted as unreachable */
		if(_is_rawx_in_garbage((service_info_t*)l->data, *rawx_garbage)) {
			GRID_DEBUG("Rawx already in unreachable list");
			continue;
		}
		/* check rawx reachable */
		if(!is_rawx_reachable((service_info_t*)l->data)) {
			GRID_DEBUG("Rawx unreachable");
			*rawx_garbage = g_slist_prepend(*rawx_garbage, l->data);
			continue;
		}

		/* check rawx has appropriate storage class (strictly) */
		if (!service_info_check_storage_class(l->data, stg_class)) {
			GRID_DEBUG(MSG_DONT_MATCH_CRITERIA, "storage class");
			continue;
		}

		/* ensure distance match with our policy */
		bzero(loc, sizeof(loc));
		loc_tag = service_info_get_tag(((service_info_t*)l->data)->tags, NAME_TAGNAME_RAWX_LOC);
		GRID_DEBUG("service tag extracted");
		if(!loc_tag) {
			if(distance > 1) {
				continue;
			}
			return ((service_info_t*)l->data);
		}
		service_tag_get_value_string(loc_tag, loc, sizeof(loc), NULL);
		if(__test_location(loc, used_loc, distance)) {
			return ((service_info_t*)l->data);
		} else {
			GRID_DEBUG(MSG_DONT_MATCH_CRITERIA, "distance");
		}
	}
	return NULL;
}
/**
 * @return TRUE if "agent_check" tag is missing or is true,
 *   false otherwise
 */
static gboolean
_agent_check_enabled(struct service_info_s *si)
{
	if (!si)
		return FALSE;
	gboolean srv_check_enabled = TRUE;
	service_tag_t *tag = service_info_get_tag(si->tags,
			NAME_TAGNAME_AGENT_CHECK);
	if (tag) {
		GError *err = NULL;
		if (tag->type == STVT_BOOL) {
			service_tag_get_value_boolean(tag, &srv_check_enabled, &err);
		} else {
			gchar buf[64] = {0};
			service_tag_get_value_string(tag, buf, sizeof(buf), &err);
			srv_check_enabled = metautils_cfg_get_bool(buf, TRUE);
		}
		g_clear_error(&err);
	}
	return srv_check_enabled;
}
示例#3
0
gboolean
fill_scanning_info_for_chunk_checker(struct volume_scanning_info_s *scanning_info, service_info_t * service_info,
    struct integrity_loop_config_s *config, GError ** error)
{
	gchar volume_path[LIMIT_LENGTH_VOLUMENAME];
	struct chunk_checker_data_s cc_data;
        struct service_tag_s *tag = NULL;

        CHECK_ARG_POINTER(scanning_info, error);
        CHECK_ARG_POINTER(service_info, error);
        CHECK_ARG_POINTER(config, error);

	bzero(volume_path, sizeof(volume_path));
	bzero(scanning_info, sizeof(*scanning_info));
	bzero(&cc_data, sizeof(cc_data));

        tag = service_info_get_tag(service_info->tags, NAME_TAGNAME_RAWX_VOL);
        if (tag == NULL) {
                GSETERROR(error, "Failed to retrieve tag [%s]", NAME_TAGNAME_RAWX_VOL);
                return FALSE;
        }

        /* Fill volume_path */
        if (!service_tag_get_value_string(tag, volume_path, sizeof(volume_path), error)) {
                GSETERROR(error, "Failed to extract string value from tag [%s]", NAME_TAGNAME_RAWX_VOL);
                return FALSE;
        }

        /* Fill callback and callback data */
	scanning_info->volume_path = g_strdup(volume_path);
        scanning_info->file_action = check_chunk_and_sleep;
	scanning_info->dir_exit = sleep_after_directory;

	cc_data.volume_path = g_strdup(volume_path);
        cc_data.sleep_time = config->chunk_checker_sleep_time;
	cc_data.si = service_info_dup(service_info);
	scanning_info->callback_data = g_memdup(&cc_data, sizeof(cc_data));

        return TRUE;
}
示例#4
0
static void
_extract_location(gpointer data, gpointer udata)
{
	GRID_DEBUG("extracting services locations");
	struct service_tag_s * loc_tag = NULL;
	gchar loc[1024];
	GSList **used_loc = (GSList **) udata;

	bzero(loc, sizeof(loc));

	if(data)
		loc_tag = service_info_get_tag(((service_info_t*)data)->tags, NAME_TAGNAME_RAWX_LOC);

	GRID_DEBUG("service tag extracted");
	if(!loc_tag)
		return;

	service_tag_get_value_string(loc_tag, loc, sizeof(loc), NULL);

	if(strlen(loc) > 0)
		*used_loc = g_slist_prepend(*used_loc, g_strdup(loc));
}
示例#5
0
static void
allservice_check_start_HT(struct namespace_data_s *ns_data, GHashTable *ht)
{
	gsize offset;
	struct taskdata_checksrv_s td_scheme;
	GHashTableIter iter_serv;
	gpointer k, v;


	g_hash_table_iter_init(&iter_serv, ht);
	while (g_hash_table_iter_next(&iter_serv, &k, &v)) {
		struct service_info_s *si = v;
		gboolean srv_check_enabled = TRUE;

		/* Services can disable TCP checks (enabled by default) */
		service_tag_t *tag = service_info_get_tag(si->tags,
				NAME_TAGNAME_AGENT_CHECK);
		if (tag) {
			GError *err = NULL;
			if (tag->type == STVT_BOOL) {
				service_tag_get_value_boolean(tag, &srv_check_enabled, &err);
			} else {
				gchar buf[64] = {0};
				service_tag_get_value_string(tag, buf, sizeof(buf), &err);
				srv_check_enabled = metautils_cfg_get_bool(buf, TRUE);
			}
			g_clear_error(&err);
		}

		memset(&td_scheme, 0x00, sizeof(td_scheme));
		offset = g_snprintf(td_scheme.task_name, sizeof(td_scheme.task_name), "%s.", TASK_ID);
		addr_info_to_string(&(si->addr), td_scheme.task_name+offset, sizeof(td_scheme.task_name)-offset);
		g_strlcpy(td_scheme.ns_name, ns_data->name, sizeof(td_scheme.ns_name)-1);

		if (!srv_check_enabled) {
			GRID_DEBUG("Task [%s] disabled by "
					NAME_TAGNAME_AGENT_CHECK, td_scheme.task_name);
		} else if (!is_task_scheduled(td_scheme.task_name)) {
			GError *error_local = NULL;
			task_t *task = NULL;
			struct taskdata_checksrv_s *task_data;


			agent_get_service_key(si, td_scheme.srv_key, sizeof(td_scheme.srv_key));
			g_strlcpy(td_scheme.srv_key, (gchar*)k, sizeof(td_scheme.srv_key)-1);

			/* prepare the task structure */
			task_data = g_memdup(&td_scheme, sizeof(td_scheme));
			if (!task_data) {
				ERROR("Memory allocation failure");
				continue;
			}

			task = create_task(period_check_services, td_scheme.task_name);
			task = set_task_callbacks(task, _check_tcp_service_task,
					g_free, task_data);
			if (!task) {
				ERROR("Memory allocation failure");
				continue;
			}
			
			/* now start the task! */
			if (add_task_to_schedule(task, &error_local))
				INFO("Task started: %s", td_scheme.task_name);
			else {
				ERROR("Failed to add task to scheduler [%s] : %s", td_scheme.task_name, gerror_get_message(error_local));
				g_free(task);
			}
			if (error_local)
				g_clear_error(&error_local);
		}
	}
}