@@ -52,20 +52,11 @@ type statSegment struct {
52
52
legacyVersion bool
53
53
}
54
54
55
- func (c * statSegment ) getStatDirVector () unsafe.Pointer {
56
- dirOffset , _ , _ := c .getOffsets ()
57
- return unsafe .Pointer (& c .sharedHeader [dirOffset ])
58
- }
59
-
60
- func (c * statSegment ) getStatDirIndex (p unsafe.Pointer , index uint32 ) * statSegDirectoryEntry {
61
- return (* statSegDirectoryEntry )(unsafe .Pointer (uintptr (p ) + uintptr (index )* unsafe .Sizeof (statSegDirectoryEntry {})))
62
- }
63
-
64
- func (c * statSegment ) getHeader () (header statSegSharedHeader ) {
55
+ func (c * statSegment ) getHeader () (header sharedHeader ) {
65
56
if c .legacyVersion {
66
- return statSegHeaderLegacy (c .sharedHeader )
57
+ return loadSharedHeaderLegacy (c .sharedHeader )
67
58
}
68
- return statSegHeader (c .sharedHeader )
59
+ return loadSharedHeader (c .sharedHeader )
69
60
}
70
61
71
62
func (c * statSegment ) getEpoch () (int64 , bool ) {
@@ -129,17 +120,17 @@ func (c *statSegment) connect(sockName string) error {
129
120
return fmt .Errorf ("mapping shared memory failed: %v" , err )
130
121
}
131
122
123
+ Log .Debugf ("successfuly mmapped shared memory segment (size: %v) %v" , size , len (data ))
124
+
132
125
c .sharedHeader = data
133
126
c .memorySize = size
134
127
135
- Log .Debugf ("successfuly mmapped shared memory segment (size: %v)" , size )
136
-
137
- hdr := statSegHeader (c .sharedHeader )
128
+ hdr := loadSharedHeader (c .sharedHeader )
138
129
Log .Debugf ("stat segment header: %+v" , hdr )
139
130
140
131
if hdr .legacyVersion () {
141
132
c .legacyVersion = true
142
- hdr = statSegHeaderLegacy (c .sharedHeader )
133
+ hdr = loadSharedHeaderLegacy (c .sharedHeader )
143
134
Log .Debugf ("falling back to legacy version (VPP <=19.04) of stat segment (header: %+v)" , hdr )
144
135
}
145
136
@@ -167,6 +158,16 @@ func (c *statSegment) disconnect() error {
167
158
168
159
type statDirectoryType int32
169
160
161
+ const (
162
+ statDirIllegal = 0
163
+ statDirScalarIndex = 1
164
+ statDirCounterVectorSimple = 2
165
+ statDirCounterVectorCombined = 3
166
+ statDirErrorIndex = 4
167
+ statDirNameVector = 5
168
+ statDirEmpty = 6
169
+ )
170
+
170
171
func (t statDirectoryType ) String () string {
171
172
return adapter .StatType (t ).String ()
172
173
}
@@ -182,14 +183,23 @@ type statSegDirectoryEntry struct {
182
183
name [128 ]byte
183
184
}
184
185
186
+ func (c * statSegment ) getStatDirVector () unsafe.Pointer {
187
+ dirOffset , _ , _ := c .getOffsets ()
188
+ return unsafe .Pointer (& c .sharedHeader [dirOffset ])
189
+ }
190
+
191
+ func (c * statSegment ) getStatDirIndex (p unsafe.Pointer , index uint32 ) * statSegDirectoryEntry {
192
+ return (* statSegDirectoryEntry )(unsafe .Pointer (uintptr (p ) + uintptr (index )* unsafe .Sizeof (statSegDirectoryEntry {})))
193
+ }
194
+
185
195
func (c * statSegment ) copyEntryData (dirEntry * statSegDirectoryEntry ) adapter.Stat {
186
196
dirType := adapter .StatType (dirEntry .directoryType )
187
197
188
198
switch dirType {
189
- case adapter . ScalarIndex :
199
+ case statDirScalarIndex :
190
200
return adapter .ScalarStat (dirEntry .unionData )
191
201
192
- case adapter . ErrorIndex :
202
+ case statDirErrorIndex :
193
203
_ , errOffset , _ := c .getOffsets ()
194
204
offsetVector := unsafe .Pointer (& c .sharedHeader [errOffset ])
195
205
@@ -200,17 +210,19 @@ func (c *statSegment) copyEntryData(dirEntry *statSegDirectoryEntry) adapter.Sta
200
210
val := * (* adapter .Counter )(statSegPointer (offsetVector , offset ))
201
211
errData = val
202
212
} else {
203
- vecLen := vectorLen (offsetVector )
204
- for i := uint64 (0 ); i < vecLen ; i ++ {
213
+ vecLen := uint32 (vectorLen (offsetVector ))
214
+
215
+ for i := uint32 (0 ); i < vecLen ; i ++ {
205
216
cb := * (* uint64 )(statSegPointer (offsetVector , uintptr (i )* unsafe .Sizeof (uint64 (0 ))))
206
217
offset := uintptr (cb ) + uintptr (dirEntry .unionData )* unsafe .Sizeof (adapter .Counter (0 ))
218
+ debugf ("error index, cb: %d, offset: %d" , cb , offset )
207
219
val := * (* adapter .Counter )(statSegPointer (unsafe .Pointer (& c .sharedHeader [0 ]), offset ))
208
220
errData += val
209
221
}
210
222
}
211
223
return adapter .ErrorStat (errData )
212
224
213
- case adapter . SimpleCounterVector :
225
+ case statDirCounterVectorSimple :
214
226
if dirEntry .unionData == 0 {
215
227
debugf ("offset invalid for %s" , dirEntry .name )
216
228
break
@@ -219,24 +231,24 @@ func (c *statSegment) copyEntryData(dirEntry *statSegDirectoryEntry) adapter.Sta
219
231
break
220
232
}
221
233
222
- vecLen := vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]))
234
+ vecLen := uint32 ( vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]) ))
223
235
offsetVector := statSegPointer (unsafe .Pointer (& c .sharedHeader [0 ]), uintptr (dirEntry .offsetVector ))
224
236
225
237
data := make ([][]adapter.Counter , vecLen )
226
- for i := uint64 (0 ); i < vecLen ; i ++ {
238
+ for i := uint32 (0 ); i < vecLen ; i ++ {
227
239
cb := * (* uint64 )(statSegPointer (offsetVector , uintptr (i )* unsafe .Sizeof (uint64 (0 ))))
228
240
counterVec := unsafe .Pointer (& c .sharedHeader [uintptr (cb )])
229
- vecLen2 := vectorLen (counterVec )
241
+ vecLen2 := uint32 ( vectorLen (counterVec ) )
230
242
data [i ] = make ([]adapter.Counter , vecLen2 )
231
- for j := uint64 (0 ); j < vecLen2 ; j ++ {
243
+ for j := uint32 (0 ); j < vecLen2 ; j ++ {
232
244
offset := uintptr (j ) * unsafe .Sizeof (adapter .Counter (0 ))
233
245
val := * (* adapter .Counter )(statSegPointer (counterVec , offset ))
234
246
data [i ][j ] = val
235
247
}
236
248
}
237
249
return adapter .SimpleCounterStat (data )
238
250
239
- case adapter . CombinedCounterVector :
251
+ case statDirCounterVectorCombined :
240
252
if dirEntry .unionData == 0 {
241
253
debugf ("offset invalid for %s" , dirEntry .name )
242
254
break
@@ -245,24 +257,24 @@ func (c *statSegment) copyEntryData(dirEntry *statSegDirectoryEntry) adapter.Sta
245
257
break
246
258
}
247
259
248
- vecLen := vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]))
260
+ vecLen := uint32 ( vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]) ))
249
261
offsetVector := statSegPointer (unsafe .Pointer (& c .sharedHeader [0 ]), uintptr (dirEntry .offsetVector ))
250
262
251
263
data := make ([][]adapter.CombinedCounter , vecLen )
252
- for i := uint64 (0 ); i < vecLen ; i ++ {
264
+ for i := uint32 (0 ); i < vecLen ; i ++ {
253
265
cb := * (* uint64 )(statSegPointer (offsetVector , uintptr (i )* unsafe .Sizeof (uint64 (0 ))))
254
266
counterVec := unsafe .Pointer (& c .sharedHeader [uintptr (cb )])
255
- vecLen2 := vectorLen (counterVec )
267
+ vecLen2 := uint32 ( vectorLen (counterVec ) )
256
268
data [i ] = make ([]adapter.CombinedCounter , vecLen2 )
257
- for j := uint64 (0 ); j < vecLen2 ; j ++ {
269
+ for j := uint32 (0 ); j < vecLen2 ; j ++ {
258
270
offset := uintptr (j ) * unsafe .Sizeof (adapter.CombinedCounter {})
259
271
val := * (* adapter .CombinedCounter )(statSegPointer (counterVec , offset ))
260
272
data [i ][j ] = val
261
273
}
262
274
}
263
275
return adapter .CombinedCounterStat (data )
264
276
265
- case adapter . NameVector :
277
+ case statDirNameVector :
266
278
if dirEntry .unionData == 0 {
267
279
debugf ("offset invalid for %s" , dirEntry .name )
268
280
break
@@ -271,21 +283,21 @@ func (c *statSegment) copyEntryData(dirEntry *statSegDirectoryEntry) adapter.Sta
271
283
break
272
284
}
273
285
274
- vecLen := vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]))
286
+ vecLen := uint32 ( vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]) ))
275
287
offsetVector := statSegPointer (unsafe .Pointer (& c .sharedHeader [0 ]), uintptr (dirEntry .offsetVector ))
276
288
277
289
data := make ([]adapter.Name , vecLen )
278
- for i := uint64 (0 ); i < vecLen ; i ++ {
290
+ for i := uint32 (0 ); i < vecLen ; i ++ {
279
291
cb := * (* uint64 )(statSegPointer (offsetVector , uintptr (i )* unsafe .Sizeof (uint64 (0 ))))
280
292
if cb == 0 {
281
293
debugf ("name vector out of range for %s (%v)" , dirEntry .name , i )
282
294
continue
283
295
}
284
296
nameVec := unsafe .Pointer (& c .sharedHeader [cb ])
285
- vecLen2 := vectorLen (nameVec )
297
+ vecLen2 := uint32 ( vectorLen (nameVec ) )
286
298
287
299
nameStr := make ([]byte , 0 , vecLen2 )
288
- for j := uint64 (0 ); j < vecLen2 ; j ++ {
300
+ for j := uint32 (0 ); j < vecLen2 ; j ++ {
289
301
offset := uintptr (j ) * unsafe .Sizeof (byte (0 ))
290
302
val := * (* byte )(statSegPointer (nameVec , offset ))
291
303
if val > 0 {
@@ -296,11 +308,13 @@ func (c *statSegment) copyEntryData(dirEntry *statSegDirectoryEntry) adapter.Sta
296
308
}
297
309
return adapter .NameStat (data )
298
310
311
+ case statDirEmpty :
312
+ // no-op
313
+
299
314
default :
300
315
// TODO: monitor occurrences with metrics
301
316
debugf ("Unknown type %d for stat entry: %q" , dirEntry .directoryType , dirEntry .name )
302
317
}
303
-
304
318
return nil
305
319
}
306
320
0 commit comments