IfaceStats *api.InterfaceStats
ErrStats *api.ErrorStats
BufStats *api.BufferStats
+ MemStats *api.MemoryStats
}
// StatsRPC is a RPC server for proxying client request to api.StatsProvider.
// proxying request to given api.StatsProvider.
func NewStatsRPC(stats adapter.StatsAPI) (*StatsRPC, error) {
rpc := new(StatsRPC)
- if err := rpc.Connect(stats); err != nil {
+ if err := rpc.connect(stats); err != nil {
return nil, err
}
return rpc, nil
func (s *StatsRPC) watchConnection() {
heartbeatTicker := time.NewTicker(10 * time.Second).C
atomic.StoreUint32(&s.available, 1)
- log.Println("enabling statsRPC service")
+ log.Debugln("enabling statsRPC service")
count := 0
prev := new(api.SystemStats)
s.mu.Lock()
if err := s.statsConn.GetSystemStats(prev); err != nil {
atomic.StoreUint32(&s.available, 0)
- log.Warnf("disabling statsRPC service, reason:", err)
+ log.Warnf("disabling statsRPC service, reason: %v", err)
}
s.mu.Unlock()
s.mu.Lock()
if err := s.statsConn.GetSystemStats(curr); err != nil {
atomic.StoreUint32(&s.available, 0)
- log.Warnf("disabling statsRPC service, reason:", err)
+ log.Warnf("disabling statsRPC service, reason: %v", err)
}
s.mu.Unlock()
s.statsConn, err = core.ConnectStats(s.stats)
if err == nil {
atomic.StoreUint32(&s.available, 1)
- log.Println("enabling statsRPC service")
+ log.Debugln("enabling statsRPC service")
break
}
time.Sleep(5 * time.Second)
}
}
-func (s *StatsRPC) Connect(stats adapter.StatsAPI) error {
+func (s *StatsRPC) connect(stats adapter.StatsAPI) error {
if atomic.LoadUint32(&s.isConnected) == 1 {
return errors.New("connection already exists")
}
return nil
}
-func (s *StatsRPC) Disconnect() {
+func (s *StatsRPC) disconnect() {
if atomic.LoadUint32(&s.isConnected) == 1 {
atomic.StoreUint32(&s.isConnected, 0)
close(s.done)
case "buffer":
resp.BufStats = new(api.BufferStats)
return s.statsConn.GetBufferStats(resp.BufStats)
+ case "memory":
+ resp.MemStats = new(api.MemoryStats)
+ return s.statsConn.GetMemoryStats(resp.MemStats)
default:
return fmt.Errorf("unknown stats type: %s", req.StatsType)
}
}
type BinapiCompatibilityResponse struct {
- CompatibleMsgs []string
- IncompatibleMsgs []string
+ CompatibleMsgs map[string][]string
+ IncompatibleMsgs map[string][]string
}
// BinapiRPC is a RPC server for proxying client request to api.Channel.
// proxying request to given api.Channel.
func NewBinapiRPC(binapi adapter.VppAPI) (*BinapiRPC, error) {
rpc := new(BinapiRPC)
- if err := rpc.Connect(binapi); err != nil {
+ if err := rpc.connect(binapi); err != nil {
return nil, err
}
return rpc, nil
case core.Connected:
if !s.serviceAvailable() {
atomic.StoreUint32(&s.available, 1)
- log.Println("enabling binapiRPC service")
+ log.Debugln("enabling binapiRPC service")
}
case core.Disconnected:
if s.serviceAvailable() {
}
}
-func (s *BinapiRPC) Connect(binapi adapter.VppAPI) error {
+func (s *BinapiRPC) connect(binapi adapter.VppAPI) error {
if atomic.LoadUint32(&s.isConnected) == 1 {
return errors.New("connection already exists")
}
return nil
}
-func (s *BinapiRPC) Disconnect() {
+func (s *BinapiRPC) disconnect() {
if atomic.LoadUint32(&s.isConnected) == 1 {
atomic.StoreUint32(&s.isConnected, 0)
close(s.done)
}
defer ch.Close()
- resp.CompatibleMsgs = make([]string, 0, len(req.MsgNameCrcs))
- resp.IncompatibleMsgs = make([]string, 0, len(req.MsgNameCrcs))
+ resp.CompatibleMsgs = make(map[string][]string)
+ resp.IncompatibleMsgs = make(map[string][]string)
- for _, msg := range req.MsgNameCrcs {
- val, ok := api.GetRegisteredMessages()[msg]
- if !ok {
- resp.IncompatibleMsgs = append(resp.IncompatibleMsgs, msg)
- continue
+ for path, messages := range api.GetRegisteredMessages() {
+ if resp.IncompatibleMsgs[path] == nil {
+ resp.IncompatibleMsgs[path] = make([]string, 0, len(req.MsgNameCrcs))
}
-
- if err = ch.CheckCompatiblity(val); err != nil {
- resp.IncompatibleMsgs = append(resp.IncompatibleMsgs, msg)
- } else {
- resp.CompatibleMsgs = append(resp.CompatibleMsgs, msg)
+ if resp.CompatibleMsgs[path] == nil {
+ resp.CompatibleMsgs[path] = make([]string, 0, len(req.MsgNameCrcs))
+ }
+ for _, msg := range req.MsgNameCrcs {
+ val, ok := messages[msg]
+ if !ok {
+ resp.IncompatibleMsgs[path] = append(resp.IncompatibleMsgs[path], msg)
+ continue
+ }
+ if err = ch.CheckCompatiblity(val); err != nil {
+ resp.IncompatibleMsgs[path] = append(resp.IncompatibleMsgs[path], msg)
+ } else {
+ resp.CompatibleMsgs[path] = append(resp.CompatibleMsgs[path], msg)
+ }
}
}
-
- if len(resp.IncompatibleMsgs) > 0 {
- return fmt.Errorf("compatibility check failed for messages: %v", resp.IncompatibleMsgs)
+ for _, messages := range resp.IncompatibleMsgs {
+ if len(messages) > 0 {
+ return fmt.Errorf("compatibility check failed for messages: %v", resp.IncompatibleMsgs)
+ }
}
return nil