improve timeouts for x-check-mailserver

This commit is contained in:
Adam Babik 2018-12-07 10:43:07 +01:00
parent b0cbb6effc
commit 3d890ae63a
No known key found for this signature in database
GPG Key ID: ED02515A1FC0D1B4
3 changed files with 22 additions and 8 deletions

View File

@ -14,11 +14,11 @@ image:
build: bin/pubchats bin/bench-mailserver bin/x-check-mailserver
bin/pubchats:
pubchats:
go build -o ./bin/pubchats ./cmd/pubchats
bin/bench-mailserver:
bench-mailserver:
go build -o ./bin/bench-mailserver ./cmd/bench-mailserver
bin/x-check-mailserver:
x-check-mailserver:
go build -o ./bin/x-check-mailserver ./cmd/x-check-mailserver
clean:

View File

@ -93,7 +93,7 @@ func main() {
work := NewWorkUnit(enode, &nodeConfig)
go func(work *WorkUnit) {
if err := work.Execute(workConfig, mailSignalsForwarder); err != nil {
log.Crit("failed to execute work", "err", err)
log.Crit("failed to execute work", "err", err, "enode", work.MailServerEnode)
}
wg.Done()
}(work)

View File

@ -96,7 +96,7 @@ func (u *WorkUnit) Execute(config WorkUnitConfig, mailSignals *signalForwarder)
To: config.To,
Limit: 1000,
Topics: topics,
Timeout: 30,
Timeout: 15,
})
if err != nil {
return fmt.Errorf("failed to request %s for messages: %v", u.MailServerEnode, err)
@ -107,6 +107,11 @@ func (u *WorkUnit) Execute(config WorkUnitConfig, mailSignals *signalForwarder)
signals, cancelSignalsFilter := mailSignals.Filter([]byte(reqID))
defer cancelSignalsFilter()
timeout := time.NewTimer(16 * time.Second) // greater than request messages timeout
defer timeout.Stop()
start := time.Now()
var lastEnvelopeID []byte
for {
@ -114,14 +119,14 @@ func (u *WorkUnit) Execute(config WorkUnitConfig, mailSignals *signalForwarder)
case m := <-messages:
log.Debug("received a message", "hash", hex.EncodeToString(m.Hash))
u.Messages = append(u.Messages, m)
case <-time.After(time.Second * 5):
case <-timeout.C:
// As we can not predict when messages finish to come in,
// we timeout after 5 seconds of silence.
// we timeout after some time.
// If lastEnvelopeID is found amoung received messages,
// it's a successful request. Otherwise, an error is returned.
for i, m := range u.Messages {
if bytes.Equal(lastEnvelopeID, m.Hash) {
log.Debug("received lastEnvelopeID",
log.Info("received lastEnvelopeID",
"hash", hex.EncodeToString(lastEnvelopeID),
"index", i,
"messagesCount", len(u.Messages))
@ -135,6 +140,15 @@ func (u *WorkUnit) Execute(config WorkUnitConfig, mailSignals *signalForwarder)
switch s.Type {
case signal.EventMailServerRequestCompleted:
lastEnvelopeID = s.LastEnvelopeID
log.Info("received EventMailServerRequestCompleted", "latency", time.Since(start), "enode", u.MailServerEnode)
// After receiving a request complete event,
// we reduce the timeout to 5 seconds.
if !timeout.Stop() {
<-timeout.C
}
timeout.Reset(time.Second * 5)
case signal.EventMailServerRequestExpired:
return fmt.Errorf("request for messages expired")
}