@@ -22,6 +22,12 @@ import (
2222 "github.com/rs/zerolog/log"
2323)
2424
25+ type perfReader interface {
26+ ReadInto (r * perf.Record ) error
27+ Close () error
28+ SetDeadline (t time.Time )
29+ }
30+
2531// Buffer pool for pktBuffer objects to avoid large allocations
2632var pktBufferPool = sync.Pool {
2733 New : func () interface {} {
@@ -118,7 +124,7 @@ type PacketsPoller struct {
118124 pktsMaps []map [uint64 ]* pktBuffer // one map per CPU
119125 maxCPUs int
120126 // Original fields
121- chunksReader * perf. Reader
127+ chunksReader perfReader
122128 gopacketWriter bpf.GopacketWriter
123129 rawPacketWriter rawpacket.RawPacketWriter
124130 receivedPackets uint64
@@ -342,6 +348,7 @@ func (p *PacketsPoller) handlePktChunk(chunk *pktBuffer) (bool, error) {
342348
343349func (p * PacketsPoller ) writePacket (pktBuf * pktBuffer , ptr * tracerPacketsData ) (bool , error ) {
344350 if p .gopacketWriter == nil {
351+ pktBufferPool .Put (pktBuf )
345352 return false , nil
346353 }
347354
@@ -379,9 +386,11 @@ func (p *PacketsPoller) writePacket(pktBuf *pktBuffer, ptr *tracerPacketsData) (
379386
380387 packet , parseErr := pktBuf .layerParser .CreatePacket (pkt , ptr .CgroupID , unixpacket .PacketDirection (ptr .Direction ), ci , decodeOptions )
381388 if parseErr != nil {
382- log .Error ().Err (parseErr ).Msg ("DecodingLayerParser failed" )
389+ log .Debug ().Err (parseErr ).Msg ("DecodingLayerParser failed" )
383390 p .stats .PacketsError ++
384- return false , parseErr
391+ pktBufferPool .Put (pktBuf )
392+ // gopacket.NewPacket is recovers in case of errors, so we can return nil
393+ return false , nil
385394 }
386395 p .stats .PacketsGot ++
387396 p .stats .BytesProcessed += uint64 (len (pkt ))
0 commit comments