1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-17 17:47:03 +00:00
Files
go-inbucket/pkg/storage/mem/maxsize.go
James Hillyerd 69a0d355f9 doc: Add doc/config.md to document config for #86
- Increase default max message size to 10MB.
2018-03-25 14:12:18 -07:00

74 lines
1.4 KiB
Go

package mem
import "container/list"
type msgDone struct {
msg *Message
done chan struct{}
}
// maxSizeEnforcer will delete the oldest message until the entire mail store is equal to or less
// than maxSize bytes.
func (s *Store) maxSizeEnforcer(maxSize int64) {
all := &list.List{}
curSize := int64(0)
for {
select {
case md, ok := <-s.incoming:
if !ok {
return
}
// Add message to all.
m := md.msg
el := all.PushBack(m)
m.el = el
curSize += int64(m.Size())
for curSize > maxSize {
// Remove oldest message.
el := all.Front()
all.Remove(el)
m := el.Value.(*Message)
if s.removeMessage(m.mailbox, m.id) != nil {
curSize -= int64(m.Size())
}
}
close(md.done)
case md, ok := <-s.remove:
if !ok {
return
}
// Remove message from all.
m := md.msg
el := all.Remove(m.el)
if el != nil {
curSize -= int64(m.Size())
}
close(md.done)
}
}
}
// enforcerDeliver sends delivery to enforcer if configured, and waits for completion.
func (s *Store) enforcerDeliver(m *Message) {
if s.incoming != nil {
md := &msgDone{
msg: m,
done: make(chan struct{}),
}
s.incoming <- md
<-md.done
}
}
// enforcerRemove sends removal to enforcer if configured, and waits for completion.
func (s *Store) enforcerRemove(m *Message) {
if s.remove != nil {
md := &msgDone{
msg: m,
done: make(chan struct{}),
}
s.remove <- md
<-md.done
}
}