persister/whisper_schema.go
func ReadWhisperSchemas(filename string) (WhisperSchemas, error) {
	config, err := parseIniFile(filename)
	if err != nil {
		return nil, err
	}

	var schemas WhisperSchemas

	for i, section := range config {
		schema := Schema{}
		schema.Name = section["name"]

		if section["pattern"] == "" {
			return nil, fmt.Errorf("[persister] Empty pattern for [%s]", schema.Name)
		}
		schema.Pattern, err = regexp.Compile(section["pattern"])
		if err != nil {
			return nil, fmt.Errorf("[persister] Failed to parse pattern %q for [%s]: %s",
				section["pattern"], schema.Name, err.Error())
		}
		schema.RetentionStr = section["retentions"]
		schema.Retentions, err = ParseRetentionDefs(schema.RetentionStr)

		if err != nil {
			return nil, fmt.Errorf("[persister] Failed to parse retentions %q for [%s]: %s",
				schema.RetentionStr, schema.Name, err.Error())
		}

		p := int64(0)
		if section["priority"] != "" {
			p, err = strconv.ParseInt(section["priority"], 10, 0)
			if err != nil {
				return nil, fmt.Errorf("[persister] Failed to parse priority %q for [%s]: %s", section["priority"], schema.Name, err)
			}
		}
		schema.Priority = int64(p)<<32 - int64(i) // to sort records with same priority by position in file

		schemas = append(schemas, schema)
	}

	sort.Sort(schemas)
	return schemas, nil
}
func ReadWhisperSchemas(filename string) (WhisperSchemas, error) {
	config, err := parseIniFile(filename)
	if err != nil {
		return nil, err
	}

	var schemas WhisperSchemas

	for i, section := range config {
		schema := Schema{}
		schema.Name = section["name"]

		if section["pattern"] == "" {
			return nil, fmt.Errorf("[persister] Empty pattern for [%s]", schema.Name)
		}
		schema.Pattern, err = regexp.Compile(section["pattern"])
		if err != nil {
			return nil, fmt.Errorf("[persister] Failed to parse pattern %q for [%s]: %s",
				section["pattern"], schema.Name, err.Error())
		}
		schema.RetentionStr = section["retentions"]
		schema.Retentions, err = ParseRetentionDefs(schema.RetentionStr)

		if err != nil {
			return nil, fmt.Errorf("[persister] Failed to parse retentions %q for [%s]: %s",
				schema.RetentionStr, schema.Name, err.Error())
		}

		p := int64(0)
		if section["priority"] != "" {
			p, err = strconv.ParseInt(section["priority"], 10, 0)
			if err != nil {
				return nil, fmt.Errorf("[persister] Failed to parse priority %q for [%s]: %s", section["priority"], schema.Name, err)
			}
		}
		schema.Priority = int64(p)<<32 - int64(i) // to sort records with same priority by position in file

		schemas = append(schemas, schema)
	}

	sort.Sort(schemas)
	return schemas, nil
}
// ReadWhisperSchemas reads and parses a storage-schemas.conf file and returns a sorted
// schemas structure
// see https://graphite.readthedocs.io/en/0.9.9/config-carbon.html#storage-schemas-conf