Use dedicated (shorter) timeout for proxy requests.

This will prevent the overall MCU timeout to expire on the first proxy
request if that takes too long. With the shorter proxy timeout, the other
proxy servers will be retried if the first request timed out.
This commit is contained in:
Joachim Bauch 2020-09-16 10:13:09 +02:00
parent 612b1d7217
commit 7e3a7af9a3
Failed to extract signature
2 changed files with 17 additions and 1 deletions

View file

@ -116,6 +116,9 @@ connectionsperhost = 8
# Default is 2 mbit/sec. # Default is 2 mbit/sec.
#maxscreenbitrate = 2097152 #maxscreenbitrate = 2097152
# For type "proxy": timeout in seconds for requests to the proxy server.
#proxytimeout = 2
# For type "proxy": type of URL configuration for proxy servers. # For type "proxy": type of URL configuration for proxy servers.
# Defaults to "static". # Defaults to "static".
# #

View file

@ -63,6 +63,8 @@ const (
initialWaitDelay = time.Second initialWaitDelay = time.Second
maxWaitDelay = 8 * time.Second maxWaitDelay = 8 * time.Second
defaultProxyTimeoutSeconds = 2
) )
type mcuProxyPubSubCommon struct { type mcuProxyPubSubCommon struct {
@ -912,6 +914,7 @@ type mcuProxy struct {
connectionsMu sync.RWMutex connectionsMu sync.RWMutex
connRequests int64 connRequests int64
nextSort int64 nextSort int64
proxyTimeout time.Duration
mu sync.RWMutex mu sync.RWMutex
publishers map[string]*mcuProxyConnection publishers map[string]*mcuProxyConnection
@ -940,11 +943,19 @@ func NewMcuProxy(config *goconf.ConfigFile) (Mcu, error) {
return nil, fmt.Errorf("Could not parse private key from %s: %s", tokenKeyFilename, err) return nil, fmt.Errorf("Could not parse private key from %s: %s", tokenKeyFilename, err)
} }
proxyTimeoutSeconds, _ := config.GetInt("mcu", "proxytimeout")
if proxyTimeoutSeconds <= 0 {
proxyTimeoutSeconds = defaultProxyTimeoutSeconds
}
proxyTimeout := time.Duration(proxyTimeoutSeconds) * time.Second
log.Printf("Using a timeout of %s for proxy requests", proxyTimeout)
mcu := &mcuProxy{ mcu := &mcuProxy{
tokenId: tokenId, tokenId: tokenId,
tokenKey: tokenKey, tokenKey: tokenKey,
connectionsMap: make(map[string]*mcuProxyConnection), connectionsMap: make(map[string]*mcuProxyConnection),
proxyTimeout: proxyTimeout,
publishers: make(map[string]*mcuProxyConnection), publishers: make(map[string]*mcuProxyConnection),
@ -1490,7 +1501,9 @@ func (m *mcuProxy) NewPublisher(ctx context.Context, listener McuListener, id st
continue continue
} }
publisher, err := conn.newPublisher(ctx, listener, id, streamType) subctx, cancel := context.WithTimeout(ctx, m.proxyTimeout)
defer cancel()
publisher, err := conn.newPublisher(subctx, listener, id, streamType)
if err != nil { if err != nil {
log.Printf("Could not create %s publisher for %s on %s: %s", streamType, id, conn.url, err) log.Printf("Could not create %s publisher for %s on %s: %s", streamType, id, conn.url, err)
continue continue