fix race condition in packets.Stats

This commit is contained in:
Murilo Santana 2018-03-22 01:03:20 -03:00
commit 03ee8a4d32
2 changed files with 23 additions and 18 deletions

View file

@ -19,9 +19,7 @@ func (p *Prober) sendProbeUDP(from net.IP, from_hw net.HardwareAddr, ip net.IP)
wrote, _ := con.Write([]byte{0x00}) wrote, _ := con.Write([]byte{0x00})
if wrote > 0 { if wrote > 0 {
p.Session.Queue.Stats.Lock() p.Session.Queue.Stats.UpdateSent(uint64(wrote))
p.Session.Queue.Stats.Sent += uint64(wrote)
p.Session.Queue.Stats.Unlock()
} }
} }
} }

View file

@ -33,6 +33,25 @@ type Stats struct {
Errors uint64 Errors uint64
} }
func (s Stats) incrementErrors() {
s.Lock()
s.Errors++
s.Unlock()
}
func (s Stats) UpdateSent(raw uint64) {
s.Lock()
s.Sent += raw
s.Unlock()
}
func (s Stats) updateReceived(pktSize uint64) {
s.Lock()
s.PktReceived++
s.Received += pktSize
s.Unlock()
}
type PacketCallback func(pkt gopacket.Packet) type PacketCallback func(pkt gopacket.Packet)
type Queue struct { type Queue struct {
@ -148,16 +167,8 @@ func (q *Queue) worker() {
} }
q.trackProtocols(pkt) q.trackProtocols(pkt)
pktSize := uint64(len(pkt.Data())) pktSize := uint64(len(pkt.Data()))
q.Stats.UpdateReceived(pktSize)
q.Stats.Lock()
q.Stats.PktReceived++
q.Stats.Received += pktSize
q.Stats.Unlock()
q.onPacketCallback(pkt) q.onPacketCallback(pkt)
// decode eth and ipv4 layers // decode eth and ipv4 layers
@ -200,14 +211,10 @@ func (q *Queue) Send(raw []byte) error {
defer q.writes.Done() defer q.writes.Done()
if err := q.handle.WritePacketData(raw); err != nil { if err := q.handle.WritePacketData(raw); err != nil {
q.Stats.Lock() q.Stats.incrementErrors()
q.Stats.Errors++
q.Stats.Unlock()
return err return err
} else { } else {
q.Stats.Lock() q.Stats.UpdateSent(uint64(len(raw)))
q.Stats.Sent += uint64(len(raw))
q.Stats.Unlock()
} }
return nil return nil