Bläddra i källkod

Handle cases where sync response handling takes too long

Tulir Asokan 4 år sedan
förälder
incheckning
36bb15fbd6
1 ändrade filer med 18 tillägg och 1 borttagningar
  1. 18 1
      crypto.go

+ 18 - 1
crypto.go

@@ -23,6 +23,7 @@ import (
 	"crypto/sha512"
 	"encoding/hex"
 	"fmt"
+	"runtime/debug"
 	"time"
 
 	"maunium.net/go/maulogger/v2"
@@ -207,7 +208,23 @@ type cryptoSyncer struct {
 }
 
 func (syncer *cryptoSyncer) ProcessResponse(resp *mautrix.RespSync, since string) error {
-	syncer.ProcessSyncResponse(resp, since)
+	done := make(chan struct{})
+	go func() {
+		defer func() {
+			if err := recover(); err != nil {
+				syncer.Log.Error("Processing sync response (%s) panicked: %v\n%s", since, err, debug.Stack())
+			}
+			done <- struct{}{}
+		}()
+		syncer.Log.Trace("Starting sync response handling (%s)", since)
+		syncer.ProcessSyncResponse(resp, since)
+		syncer.Log.Trace("Successfully handled sync response (%s)", since)
+	}()
+	select {
+	case <-done:
+	case <-time.After(30 * time.Second):
+		syncer.Log.Warn("Handling sync response (%s) is taking unusually long", since)
+	}
 	return nil
 }