GODT-2266: Pause event stream while sending

This commit is contained in:
James Houlahan
2023-01-25 09:43:58 +01:00
parent 5d4c10c56e
commit e8a778feca
2 changed files with 10 additions and 3 deletions

View File

@ -158,7 +158,7 @@ func (user *User) sendMail(authID string, from string, to []string, r io.Reader)
return nil return nil
}) })
}, user.apiUserLock, user.apiAddrsLock) }, user.apiUserLock, user.apiAddrsLock, user.eventLock)
} }
// sendWithKey sends the message with the given address key. // sendWithKey sends the message with the given address key.

View File

@ -60,9 +60,11 @@ type User struct {
vault *vault.User vault *vault.User
client *proton.Client client *proton.Client
reporter reporter.Reporter reporter reporter.Reporter
eventCh *queue.QueuedChannel[events.Event]
sendHash *sendRecorder sendHash *sendRecorder
eventCh *queue.QueuedChannel[events.Event]
eventLock safe.RWMutex
apiUser proton.User apiUser proton.User
apiUserLock safe.RWMutex apiUserLock safe.RWMutex
@ -120,9 +122,11 @@ func New(
vault: encVault, vault: encVault,
client: client, client: client,
reporter: reporter, reporter: reporter,
eventCh: queue.NewQueuedChannel[events.Event](0, 0),
sendHash: newSendRecorder(sendEntryExpiry), sendHash: newSendRecorder(sendEntryExpiry),
eventCh: queue.NewQueuedChannel[events.Event](0, 0),
eventLock: safe.NewRWMutex(),
apiUser: apiUser, apiUser: apiUser,
apiUserLock: safe.NewRWMutex(), apiUserLock: safe.NewRWMutex(),
@ -548,6 +552,9 @@ func (user *User) initUpdateCh(mode vault.AddressMode) {
// doEventPoll is called whenever API events should be polled. // doEventPoll is called whenever API events should be polled.
func (user *User) doEventPoll(ctx context.Context) error { func (user *User) doEventPoll(ctx context.Context) error {
user.eventLock.Lock()
defer user.eventLock.Unlock()
event, err := user.client.GetEvent(ctx, user.vault.EventID()) event, err := user.client.GetEvent(ctx, user.vault.EventID())
if err != nil { if err != nil {
return fmt.Errorf("failed to get event: %w", err) return fmt.Errorf("failed to get event: %w", err)