-func (c *StatsClient) copyData(dirEntry *statSegDirectoryEntry) adapter.Stat {
- switch typ := adapter.StatType(dirEntry.directoryType); typ {
- case adapter.ScalarIndex:
- return adapter.ScalarStat(dirEntry.unionData)
-
- case adapter.ErrorIndex:
- _, errOffset, _ := c.readOffsets()
- offsetVector := unsafe.Pointer(&c.sharedHeader[errOffset])
- vecLen := vectorLen(offsetVector)
-
- var errData adapter.Counter
- for i := uint64(0); i < vecLen; i++ {
- cb := *(*uint64)(add(offsetVector, uintptr(i)*unsafe.Sizeof(uint64(0))))
- offset := uintptr(cb) + uintptr(dirEntry.unionData)*unsafe.Sizeof(adapter.Counter(0))
- val := *(*adapter.Counter)(add(unsafe.Pointer(&c.sharedHeader[0]), offset))
- errData += val
- }
- return adapter.ErrorStat(errData)
-
- case adapter.SimpleCounterVector:
- if dirEntry.unionData == 0 {
- Log.Debugf("\toffset is not valid")
- break
- } else if dirEntry.unionData >= uint64(len(c.sharedHeader)) {
- Log.Debugf("\toffset out of range")
- break
- }
+// reconnect disconnects from the socket, re-validates it and
+// connects again
+func (sc *StatsClient) reconnect() (err error) {
+ if err = sc.disconnect(); err != nil {
+ return fmt.Errorf("error disconnecting socket: %v", err)
+ }
+ if err = sc.checkSocketValid(); err != nil {
+ return fmt.Errorf("error validating socket: %v", err)
+ }
+ if sc.statSegment, err = sc.connect(); err != nil {
+ return fmt.Errorf("error connecting socket: %v", err)
+ }
+ return nil
+}