// ScalarStat represents stat for ScalarIndex.
type ScalarStat float64
-// ErrorStat represents stat for ErrorIndex.
-type ErrorStat Counter
+// ErrorStat represents stat for ErrorIndex. The array represents workers.
+type ErrorStat []Counter
// SimpleCounterStat represents stat for SimpleCounterVector.
// The outer array represents workers and the inner array represents interface/node/.. indexes.
return s == 0
}
func (s ErrorStat) IsZero() bool {
- return s == 0
+ if s == nil {
+ return true
+ }
+ for _, ss := range s {
+ if ss != 0 {
+ return false
+ }
+ }
+ return true
}
func (s SimpleCounterStat) IsZero() bool {
if s == nil {
_, errOffset, _ := ss.getOffsets()
offsetVector := unsafe.Pointer(&ss.sharedHeader[errOffset])
- var errData adapter.Counter
+ var errData []adapter.Counter
vecLen := *(*uint32)(vectorLen(offsetVector))
for i := uint32(0); i < vecLen; i++ {
offset := uintptr(cb) + uintptr(dirEntry.unionData)*unsafe.Sizeof(adapter.Counter(0))
debugf("error index, cb: %d, offset: %d", cb, offset)
val := *(*adapter.Counter)(statSegPointer(unsafe.Pointer(&ss.sharedHeader[0]), offset))
- errData += val
+ errData = append(errData, val)
}
return adapter.ErrorStat(errData)
_, errOffset, _ := ss.getOffsets()
offsetVector := unsafe.Pointer(&ss.sharedHeader[errOffset])
- var errData adapter.Counter
+ var errData []adapter.Counter
vecLen := *(*uint32)(vectorLen(unsafe.Pointer(&ss.sharedHeader[errOffset])))
for i := uint32(0); i < vecLen; i++ {
cb := *(*uint64)(statSegPointer(offsetVector, uintptr(i)*unsafe.Sizeof(uint64(0))))
offset := uintptr(cb) + uintptr(dirEntry.unionData)*unsafe.Sizeof(adapter.Counter(0))
val := *(*adapter.Counter)(statSegPointer(unsafe.Pointer(&ss.sharedHeader[0]), offset))
- errData += val
+ errData = append(errData, val)
}
*stat = adapter.ErrorStat(errData)
return nil
}
vecLen := *(*uint32)(vectorLen(dirVector))
- var errData adapter.Counter
+ var errData []adapter.Counter
for i := uint32(0); i < vecLen; i++ {
cb := statSegPointer(dirVector, uintptr(i+1)*unsafe.Sizeof(uint64(0)))
cbVal := ss.adjust(vectorLen(cb))
}
offset := uintptr(dirEntry.unionData) * unsafe.Sizeof(adapter.Counter(0))
val := *(*adapter.Counter)(statSegPointer(cbVal, offset))
- errData += val
+ errData = append(errData, val)
}
return adapter.ErrorStat(errData)
return nil
}
vecLen := *(*uint32)(vectorLen(dirVector))
- var errData adapter.Counter
+ var errData []adapter.Counter
for i := uint32(0); i < vecLen; i++ {
cb := statSegPointer(dirVector, uintptr(i+1)*unsafe.Sizeof(uint64(0)))
cbVal := ss.adjust(vectorLen(cb))
}
offset := uintptr(dirEntry.unionData) * unsafe.Sizeof(adapter.Counter(0))
val := *(*adapter.Counter)(statSegPointer(cbVal, offset))
- errData += val
+ errData = append(errData, val)
}
*stat = adapter.ErrorStat(errData)
stat.Data = adapter.ScalarStat(C.govpp_stat_segment_data_get_scalar_value(&v))
case adapter.ErrorIndex:
- stat.Data = adapter.ErrorStat(C.govpp_stat_segment_data_get_error_value(&v))
+ stat.Data = adapter.ErrorStat([]adapter.Counter{adapter.Counter(C.govpp_stat_segment_data_get_error_value(&v))})
case adapter.SimpleCounterVector:
length := int(C.govpp_stat_segment_vec_len(unsafe.Pointer(C.govpp_stat_segment_data_get_simple_counter(&v))))
type ErrorCounter struct {
CounterName string
- Value uint64
+ Values []uint64
}
// BufferStats represents statistics per buffer pool.
continue
}
if errStat, ok := stat.Data.(adapter.ErrorStat); ok {
- errorStats.Errors[i].Value = uint64(errStat)
+ values := make([]uint64, len(errStat))
+ for j, errStatW := range errStat {
+ values[j] = uint64(errStatW)
+ }
+ errorStats.Errors[i].Values = values
}
}
}
n := 0
for _, counter := range stats.Errors {
- if skipZeros && counter.Value == 0 {
+ var sum uint32
+ for _, valuePerWorker := range counter.Values {
+ sum += uint32(valuePerWorker)
+ }
+
+ if skipZeros && sum == 0 {
continue
}
- fmt.Printf(" - %v\n", counter)
+ fmt.Printf(" - %v %d (per worker: %v)\n", counter.CounterName, sum, counter.Values)
n++
}
fmt.Printf("Listed %d (%d) error counters\n", n, len(stats.Errors))