diff --git a/app/handle-auth.go b/app/handle-auth.go index dc1362e..a835de1 100644 --- a/app/handle-auth.go +++ b/app/handle-auth.go @@ -14,6 +14,11 @@ func (l *Listener) HandleAuth(b []byte) (err error) { if rem, err = env.Unmarshal(b); chk.E(err) { return } + defer func() { + if env != nil && env.Event != nil { + env.Event.Free() + } + }() if len(rem) > 0 { log.I.F("extra '%s'", rem) } diff --git a/app/handle-event.go b/app/handle-event.go index 50f5d73..3a69ebf 100644 --- a/app/handle-event.go +++ b/app/handle-event.go @@ -21,6 +21,11 @@ func (l *Listener) HandleEvent(msg []byte) (err error) { if msg, err = env.Unmarshal(msg); chk.E(err) { return } + defer func() { + if env != nil && env.E != nil { + env.E.Free() + } + }() if len(msg) > 0 { log.I.F("extra '%s'", msg) } diff --git a/pkg/database/export.go b/pkg/database/export.go index 4339e99..c2576b8 100644 --- a/pkg/database/export.go +++ b/pkg/database/export.go @@ -49,6 +49,7 @@ func (d *D) Export(c context.Context, w io.Writer, pubkeys ...[]byte) { if _, err = w.Write([]byte{'\n'}); chk.E(err) { return } + ev.Free() evBuf.Reset() } return @@ -86,14 +87,15 @@ func (d *D) Export(c context.Context, w io.Writer, pubkeys ...[]byte) { if err = ev.UnmarshalBinary(evBuf); chk.E(err) { continue } - // Serialize the event to JSON and write it to the output - if _, err = w.Write(ev.Serialize()); chk.E(err) { - continue - } - if _, err = w.Write([]byte{'\n'}); chk.E(err) { - continue - } - evBuf.Reset() + // Serialize the event to JSON and write it to the output + if _, err = w.Write(ev.Serialize()); chk.E(err) { + continue + } + if _, err = w.Write([]byte{'\n'}); chk.E(err) { + continue + } + ev.Free() + evBuf.Reset() } return }, diff --git a/pkg/database/import.go b/pkg/database/import.go index 3008733..6e30586 100644 --- a/pkg/database/import.go +++ b/pkg/database/import.go @@ -52,17 +52,22 @@ func (d *D) Import(rr io.Reader) { continue } - ev := &event.E{} + ev := event.New() if _, err = ev.Unmarshal(b); err != nil { + // return the pooled buffer on error + ev.Free() continue } if _, _, err = d.SaveEvent(d.ctx, ev); err != nil { + // return the pooled buffer on error paths too + ev.Free() continue } + // return the pooled buffer after successful save + ev.Free() b = nil - ev = nil count++ if count%100 == 0 { log.I.F("received %d events", count)