Skip to content

Commit e706028

Browse files
committed
Fixed buggy concurrent SendBulkEmail() (would hang on error)
1 parent 04c2a5f commit e706028

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

serverutils.go

+19-9
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,38 @@ import (
99

1010
func SendBulkEmail(emailAccounts []*EmailAccount, sendBulkEmailReq *SendBulkEmailRequest, emailPool *emailLib.Pool) (failedIds []string) {
1111
failedIdsChan := make(chan string)
12+
var total int
1213
wg := new(sync.WaitGroup)
13-
for _, email := range emailAccounts {
14+
for i, email := range emailAccounts {
1415
if sendBulkEmailReq.SecureOnly && !email.HasPubKey() {
1516
failedIds = append(failedIds, email.Id)
1617
continue
1718
}
1819

20+
total++
1921
wg.Add(1)
20-
go func(email *EmailAccount) {
21-
defer wg.Done()
22+
go func(i int, email *EmailAccount) {
23+
var maybeFailedId string
24+
log.Debugf("Sending bulk email #%v", i+1)
2225
err := email.Send(sendBulkEmailReq.EmailData, emailPool)
2326
if err != nil {
24-
log.Errorf("Error sending email: %v", err)
25-
failedIdsChan <- email.Id
27+
log.Errorf("Error sending (instance of bulk) email: %v", err)
28+
maybeFailedId = email.Id
2629
}
27-
}(email)
30+
wg.Done()
31+
failedIdsChan <- maybeFailedId
32+
}(i, email)
2833
}
2934

35+
log.Debugf("SendBulkEmailRequest: waiting for %v email(s) to send", total)
3036
wg.Wait()
31-
close(failedIdsChan)
32-
for failedId := range failedIdsChan {
33-
failedIds = append(failedIds, failedId)
37+
38+
var failedId string
39+
for i := 0; i < total; i++ {
40+
failedId = <-failedIdsChan
41+
if failedId != "" {
42+
failedIds = append(failedIds, failedId)
43+
}
3444
}
3545

3646
return failedIds

0 commit comments

Comments
 (0)