-
Notifications
You must be signed in to change notification settings - Fork 140
/
metadata.go
150 lines (132 loc) · 5.33 KB
/
metadata.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package metadata
import (
"sync"
"github.com/go-graphite/carbonapi/expr/interfaces"
"github.com/go-graphite/carbonapi/expr/types"
"github.com/lomik/zapwriter"
"go.uber.org/zap"
)
// RegisterRewriteFunctionWithFilename registers function for a rewrite phase in metadata and fills out all Description structs
func RegisterRewriteFunctionWithFilename(name, filename string, function interfaces.RewriteFunction) {
FunctionMD.Lock()
defer FunctionMD.Unlock()
function.SetEvaluator(FunctionMD.evaluator)
if _, ok := FunctionMD.RewriteFunctions[name]; ok {
n := FunctionMD.RewriteFunctionsFilenames[name]
logger := zapwriter.Logger("registerRewriteFunction")
logger.Warn("function already registered, will register new anyway",
zap.String("name", name),
zap.String("current_filename", filename),
zap.Strings("previous_filenames", n),
zap.Stack("stack"),
)
} else {
FunctionMD.RewriteFunctionsFilenames[name] = make([]string, 0)
}
// Check if we are colliding with non-rewrite Functions
if _, ok := FunctionMD.Functions[name]; ok {
n := FunctionMD.FunctionsFilenames[name]
logger := zapwriter.Logger("registerRewriteFunction")
logger.Warn("non-rewrite function with the same name already registered",
zap.String("name", name),
zap.String("current_filename", filename),
zap.Strings("previous_filenames", n),
zap.Stack("stack"),
)
}
FunctionMD.RewriteFunctionsFilenames[name] = append(FunctionMD.RewriteFunctionsFilenames[name], filename)
FunctionMD.RewriteFunctions[name] = function
for k, v := range function.Description() {
FunctionMD.Descriptions[k] = v
if _, ok := FunctionMD.DescriptionsGrouped[v.Group]; !ok {
FunctionMD.DescriptionsGrouped[v.Group] = make(map[string]types.FunctionDescription)
}
FunctionMD.DescriptionsGrouped[v.Group][k] = v
}
}
// RegisterRewriteFunction registers function for a rewrite phase in metadata and fills out all Description structs
func RegisterRewriteFunction(name string, function interfaces.RewriteFunction) {
RegisterRewriteFunctionWithFilename(name, "", function)
}
// RegisterFunctionWithFilename registers function in metadata and fills out all Description structs
func RegisterFunctionWithFilename(name, filename string, function interfaces.Function) {
FunctionMD.Lock()
defer FunctionMD.Unlock()
function.SetEvaluator(FunctionMD.evaluator)
if _, ok := FunctionMD.Functions[name]; ok {
n := FunctionMD.FunctionsFilenames[name]
logger := zapwriter.Logger("registerFunction")
logger.Warn("function already registered, will register new anyway",
zap.String("name", name),
zap.String("current_filename", filename),
zap.Strings("previous_filenames", n),
zap.Stack("stack"),
)
} else {
FunctionMD.FunctionsFilenames[name] = make([]string, 0)
}
// Check if we are colliding with non-rewrite Functions
if _, ok := FunctionMD.RewriteFunctions[name]; ok {
n := FunctionMD.RewriteFunctionsFilenames[name]
logger := zapwriter.Logger("registerRewriteFunction")
logger.Warn("rewrite function with the same name already registered",
zap.String("name", name),
zap.String("current_filename", filename),
zap.Strings("previous_filenames", n),
zap.Stack("stack"),
)
}
FunctionMD.Functions[name] = function
FunctionMD.FunctionsFilenames[name] = append(FunctionMD.FunctionsFilenames[name], filename)
for k, v := range function.Description() {
FunctionMD.Descriptions[k] = v
if _, ok := FunctionMD.DescriptionsGrouped[v.Group]; !ok {
FunctionMD.DescriptionsGrouped[v.Group] = make(map[string]types.FunctionDescription)
}
FunctionMD.DescriptionsGrouped[v.Group][k] = v
}
}
// RegisterFunction registers function in metadata and fills out all Description structs
func RegisterFunction(name string, function interfaces.Function) {
RegisterFunctionWithFilename(name, "", function)
}
// SetEvaluator sets new evaluator function to be default for everything that needs it
func SetEvaluator(evaluator interfaces.Evaluator) {
FunctionMD.Lock()
defer FunctionMD.Unlock()
FunctionMD.evaluator = evaluator
for _, v := range FunctionMD.Functions {
v.SetEvaluator(evaluator)
}
for _, v := range FunctionMD.RewriteFunctions {
v.SetEvaluator(evaluator)
}
}
// GetEvaluator returns evaluator
func GetEvaluator() interfaces.Evaluator {
FunctionMD.RLock()
defer FunctionMD.RUnlock()
return FunctionMD.evaluator
}
// Metadata is a type to store global function metadata
type Metadata struct {
sync.RWMutex
Functions map[string]interfaces.Function
RewriteFunctions map[string]interfaces.RewriteFunction
Descriptions map[string]types.FunctionDescription
DescriptionsGrouped map[string]map[string]types.FunctionDescription
FunctionConfigFiles map[string]string
FunctionsFilenames map[string][]string
RewriteFunctionsFilenames map[string][]string
evaluator interfaces.Evaluator
}
// FunctionMD is actual global variable that stores metadata
var FunctionMD = Metadata{
RewriteFunctions: make(map[string]interfaces.RewriteFunction),
Functions: make(map[string]interfaces.Function),
Descriptions: make(map[string]types.FunctionDescription),
DescriptionsGrouped: make(map[string]map[string]types.FunctionDescription),
FunctionConfigFiles: make(map[string]string),
FunctionsFilenames: make(map[string][]string),
RewriteFunctionsFilenames: make(map[string][]string),
}