MCPcopy
hub / github.com/uber/aresdb / extendEnumCase

Method extendEnumCase

controller/mutators/etcd/enum_mutator.go:123–212  ·  view source on GitHub ↗
(namespace, tableName string, incarnation, columnID int, fromEnumNodeID int, newEnumCases []string)

Source from the content-addressed store, hash-verified

121}
122
123func (e *enumMutator) extendEnumCase(namespace, tableName string, incarnation, columnID int, fromEnumNodeID int, newEnumCases []string) ([]int, error) {
124 // track result resolvedEnumIDs
125 resolvedEnumIDs := make([]int, len(newEnumCases))
126 // newEnumCaseDict records the resolved resolvedEnumIDs for newEnumCases
127 newEnumCaseDict := make(map[string]int)
128
129 // fetch current enum node list
130 nodeListKey := utils.EnumNodeListKey(namespace, tableName, incarnation, columnID)
131 v, err := e.txnStore.Get(nodeListKey)
132 if err != nil {
133 return nil, err
134 }
135
136 var (
137 enumNodeList proto.EnumNodeList
138 // track enumNode's enum cases
139 enumCases []string
140 // track enumNode's version
141 nodeVersion int
142 // track enumNode's key in etcd
143 nodeKey string
144 )
145
146 nodeListVersion := v.Version()
147 err = v.Unmarshal(&enumNodeList)
148 if err != nil {
149 return nil, err
150 }
151
152 // it is guaranteed to have at least one enum node
153 lastEnumNodeID := int(enumNodeList.NumEnumNodes - 1)
154
155 // fetch all enum cases from fromEnumNode to lastEnumNode
156 // and update newEnumCaseDict
157 for i := fromEnumNodeID; i <= lastEnumNodeID; i++ {
158 nodeKey = utils.EnumNodeKey(namespace, tableName, incarnation, columnID, i)
159 enumCases, nodeVersion, err = e.fetchEnumCases(nodeKey)
160 if err != nil {
161 return nil, err
162 }
163 for id, enum := range enumCases {
164 enumID := getEnumID(i, id)
165 newEnumCaseDict[enum] = enumID
166 }
167 }
168
169 // variables needed for write transaction to etcd
170 var (
171 // track the last enum node
172 lastEnumNode = &proto.EnumCases{Cases: enumCases}
173 // transaction
174 txn = kvstore.NewTransaction().AddKeyValue(nodeKey, nodeVersion, lastEnumNode)
175 // only when there are new enum cases not in cache, we need to write to etcd for update
176 updated = false
177 )
178
179 for index, newCase := range newEnumCases {
180 if enumID, exist := newEnumCaseDict[newCase]; exist {

Callers 1

ExtendEnumCasesMethod · 0.95

Calls 11

fetchEnumCasesMethod · 0.95
updateCacheMethod · 0.95
EnumNodeListKeyFunction · 0.92
EnumNodeKeyFunction · 0.92
NewTransactionFunction · 0.92
getEnumIDFunction · 0.85
getCacheKeyFunction · 0.85
VersionMethod · 0.80
AddKeyValueMethod · 0.80
WriteToMethod · 0.80
GetMethod · 0.65

Tested by

no test coverage detected